docker
docker介绍
Docker 是一种开源的容器化平台,用于开发、部署和运行应用。它通过将应用程序及其依赖项打包到称为"容器"的单一包中,使得应用能够在任何环境下运行,不受底层系统的限制。Docker提供了一种标准化的软件交付方式,使得应用在开发、测试和生产环境中的运行更加一致。
Docker的核心概念
-
镜像(Image):Docker镜像是容器的"模板",包含了操作系统、应用程序以及相关依赖库。镜像是只读的,用于创建和运行容器。
-
容器(Container):容器是镜像的一个运行实例,是一个隔离的进程环境,拥有独立的文件系统、网络等资源。一个镜像可以创建多个容器,每个容器之间是相互隔离的。
-
Dockerfile:Dockerfile是一个文本文件,定义了如何构建Docker镜像。它包含了一系列指令,用于描述镜像的构建步骤,例如选择基础镜像、安装依赖、复制文件、设置环境变量等。
-
仓库(Registry):Docker仓库用于存储和分发Docker镜像,类似于代码的版本控制系统。Docker Hub是官方的公共镜像仓库,用户也可以搭建私有仓库。
Docker的底层架构与组件
Docker的底层架构主要由以下几个核心组件组成:
Docker Daemon(守护进程):
- Docker Daemon是Docker的后台进程,负责管理容器的生命周期、构建和运行镜像。它接受客户端(CLI)命令并执行相应操作。
Docker CLI:
- Docker CLI是Docker的命令行界面,用于与Docker Daemon进行通信,执行容器的启动、停止、删除等操作。
Containerd:
- Containerd是一个容器管理的守护进程,负责管理容器的生命周期。它是Docker的一部分,但也可以作为独立组件使用,直接与OCI(Open Container Initiative)兼容。
RunC:
- RunC是一个轻量级的、符合OCI标准的容器运行时工具。RunC的核心作用是创建和启动容器,通过Namespace、Cgroups等
- Linux内核特性实现容器的隔离与资源控制。
Libnetwork:
- Libnetwork是Docker的网络管理库,用于处理容器的网络连接,包括创建虚拟网络、网络隔离等操作。
图像和存储管理:
Docker支持多种存储驱动(如OverlayFS、AUFS、Device Mapper等),用于管理镜像的分层存储结构。每一层只保存了增量数据,这种分层存储可以提高资源利用率并减少冗余。
Docker 使用客户端-服务器架构。Docker 客户端与 Docker 守护程序通信,后者负责构建、运行和分发 Docker 容器的繁重工作。Docker 客户端和守护程序可以在同一系统上运行,或者您可以将 Docker 客户端连接到远程 Docker 守护程序。Docker 客户端和守护程序使用 REST API、通过 UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许使用由一组容器组成的应用程序。
Docker的底层原理
Docker的底层原理主要依赖于Linux内核的几个关键技术,包括Namespace、Cgroups、Union File System等,这些技术实现了容器的隔离、资源管理和文件系统支持。
-
Namespace(命名空间)
Namespace是Linux内核提供的资源隔离技术,它允许系统资源(如进程ID、网络、文件系统等)被隔离到独立的命名空间中。不同命名空间内的资源是相互独立的,从而使得一个容器中的进程无法影响另一个容器中的进程。Docker主要使用了以下几种Namespace:
- PID Namespace:隔离进程ID,使得每个容器中的进程彼此独立。
NET Namespace:隔离网络资源,如网卡、IP地址、端口等,使得容器拥有独立的网络栈。
IPC Namespace:隔离进程间通信(如信号、消息队列等),确保容器间通信安全。
Mount Namespace:隔离文件系统挂载点,每个容器可以拥有独立的文件系统视图。
UTS Namespace:隔离主机名和域名,使得容器可以设置自己的主机名。
- PID Namespace:隔离进程ID,使得每个容器中的进程彼此独立。
-
Cgroups(Control Groups)
Cgroups是Linux内核提供的资源管理功能,可以限制和隔离进程组使用的资源(如CPU、内存、磁盘I/O等)。在Docker中,Cgroups用于限制每个容器的资源使用,确保系统稳定。比如,可以设置一个容器的CPU最大使用率不超过50%、内存不超过1GB等,从而避免单个容器过度占用资源影响其他容器。
-
Union File System(联合文件系统)
Docker的镜像由多层只读层叠加而成,这种分层结构依赖于Union File System的支持。常见的联合文件系统有AUFS、OverlayFS等。每层镜像都只记录了文件系统的增量,只有在容器运行时创建一个可写层。分层文件系统使得镜像可以高效共享、重复利用,提高了存储空间的利用率。
-
容器镜像的分层结构与存储管理
Docker镜像的分层结构使得不同镜像可以共享相同的底层资源。在镜像构建时,Docker会为每个操作创建一个新的层,这些层按顺序叠加构成完整的镜像。在容器启动时,Docker会在镜像的顶部添加一个可写层,即"容器层",以便容器可以对文件系统进行读写操作。
Docker的运行流程
构建镜像:根据Dockerfile构建镜像,镜像分为多个只读层,每层对应Dockerfile的一条指令。
启动容器:从镜像创建容器实例,并为容器创建一个可写层。
隔离资源:启动容器时,Docker通过Namespace隔离容器的进程、网络、文件系统等资源。
分配资源:Docker通过Cgroups为容器分配资源,并监控其资源使用情况。
容器网络:Docker使用Libnetwork为容器创建网络连接,实现容器间通信和网络隔离。
文件系统管理:Docker使用联合文件系统挂载镜像层,并为容器提供可写层。
Docker的优势与应用场景
一致性:Docker打包了应用和依赖,确保在不同环境中运行的一致性,解决了"运行在我电脑上"的问题。
资源高效:相比虚拟机,容器不需要完整的操作系统和硬件模拟,启动速度快,资源占用少。
弹性伸缩:通过编排工具(如Kubernetes)管理容器集群,容器化应用易于实现水平扩展和自动恢复。
快速交付:Docker简化了软件的开发、测试、部署流程,使得开发、测试、运维团队之间的协作更加高效。
容器与虚拟机 (VM)
简单来说,虚拟机是一个完整的操作系统,拥有自己的内核、硬件驱动程序、程序和应用程序。启动虚拟机只是为了隔离单个应用程序,这会带来很大的开销。
容器只是一个独立的进程,其中包含运行所需的所有文件。如果运行多个容器,它们都共享同一个内核,这样您就可以在更少的基础设施上运行更多的应用程序。
结合使用虚拟机和容器
容器和虚拟机经常一起使用。例如,在云环境中,配置的机器通常是虚拟机。但是,具有容器运行时的虚拟机可以运行多个容器化应用程序,而不是配置一台机器来运行一个应用程序,从而提高资源利用率并降低成本。
容器和镜像的关系
容器是一个独立的进程,它从哪里获取文件和配置?如何共享这些环境?这就是容器镜像发挥作用的地方!容器镜像是一个标准化包,其中包含运行容器所需的所有文件、二进制文件、库和配置。
对于 PostgreSQL映像,该映像将打包数据库二进制文件、配置文件和其他依赖项。对于 Python Web 应用,它将包括 Python 运行时、应用代码及其所有依赖项。
镜像有两个重要原则:
-
镜像是不可变的。镜像一旦创建,就无法修改。只能创建新镜像或在其上添加更改。
-
容器镜像由层组成。每层代表一组添加、删除或修改文件的文件系统更改。
可以理解为镜像就是一个流水线工厂,容器就是最终加工出来的产品
docker镜像命令
安装docker:Ubuntu2410使用阿里源安装最新docker
bash
apt -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get -y install docker-ce
bash
systemctl enable --now docker
bash
root@huhy:~# docker version
Client: Docker Engine - Community
Version: 27.3.1
API version: 1.47
Go version: go1.22.7
Git commit: ce12230
Built: Fri Sep 20 11:40:42 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 27.3.1
API version: 1.47 (minimum version 1.24)
Go version: go1.22.7
Git commit: 41ca978
Built: Fri Sep 20 11:40:42 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.22
GitCommit: 7f7fdf5fed64eb6a7caf99b3e12efcf9d60e311c
runc:
Version: 1.1.14
GitCommit: v1.1.14-0-g2c9f560
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Docker 使用 Linux 内核的 iptables 机制来处理容器的网络通信和地址转发。因此需要启用参数
加载 br_netfilter 内核模块。这是一个负责管理桥接网络过滤的模块
bash
modprobe br_netfilter
bash
vi /etc/sysctl.conf
bash
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
bash
root@huhy:~# sysctl -p
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
- 搜索镜像:docker search
可以指定全称,不然就返回包含名称的所有镜像
bash
root@huhy:~# docker search centos
NAME DESCRIPTION STARS OFFICIAL
centos DEPRECATED; The official build of CentOS. 7756 [OK]
centos/postgresql-10-centos7 PostgreSQL is an advanced Object-Relational ... 20
centos/httpd-24-centos8 3
corpusops/centos centos corpusops baseimage 0
centos/systemd systemd enabled base container. 115
centos/redis-5-centos8 0
centos/postgresql-96-centos7 PostgreSQL is an advanced Object-Relational ... 45
centos/mariadb-102-centos7 MariaDB 10.2 SQL database server 6
centos/postgresql-10-centos8 0
centos/mysql-80-centos8 0
centos/mongodb-36-centos7 MongoDB NoSQL database server 12
centos/nginx-112-centos7 Platform for running nginx 1.12 or building ... 16
centos/mariadb-103-centos8 2
centos/postgresql-12-centos8 0
centos/mysql-57-centos7 MySQL 5.7 SQL database server 95
centos/mariadb-101-centos7 MariaDB 10.1 SQL database server 13
centos/mysql-56-centos7 MySQL 5.6 SQL database server 23
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui... 46
centos/redis-32-centos7 Redis in-memory data structure store, used a... 6
centos/redis-5-centos7 Redis in-memory data structure store, used a... 0
centos/ruby-25-centos7 Platform for building and running Ruby 2.5 a... 3
centos/postgresql-12-centos7 PostgreSQL is an advanced Object-Relational ... 5
centos/php-56-centos7 Platform for building and running PHP 5.6 ap... 34
centos/postgresql-94-centos7 PostgreSQL is an advanced Object-Relational ... 16
centos/nginx-18-centos7 Platform for running nginx 1.8 or building n... 14
- 拉取镜像:docker pull
需要指定版本,否则默认拉取最新版本的镜像
bash
root@huhy:~# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
root@huhy:~#
- 查看镜像:docker images
获取镜像的名称大小,版本、id等信息
bash
root@huhy:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 3 years ago 231MB
- 删除镜像:docker rmi
通过名称或者id都可以删除:需要注意的是,删除的镜像是不能有已经启动过的容器实例,不然会失败
bash
root@huhy:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 3 years ago 231MB
root@huhy:~# docker rmi centos
Untagged: centos:latest
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
- 批量删除镜像
通过组合命令使用,先执行查看镜像,然后删除查看到的镜像
bash
root@huhy:~# docker rmi $(docker images)
Untagged: redis:latest
Untagged: redis@sha256:a06cea905344470eb49c972f3d030e22f28f632c1b4f43bbe4a26a4329dd6be5
Deleted: sha256:f02a7f56692880b88d5fabe631da5547ae1d8c30d7050c3d004347a9fa5e5a3c
Deleted: sha256:685583ae93732862468e2a7edba217ed8165dfc730c363c30bb9405c4c81aac5
Deleted: sha256:fd8efb49fd2763acfd6a07881e62713a246858a4cdfe4b9a31c9cb3336a9c710
Deleted: sha256:3895fdb072213028eed326869c37d52d4b4003c6b0d0b4e6faf57bf18e5d439a
Deleted: sha256:7c9bf6b85511bdf143188f915e200ff94b46dc75d6d218845a939bfa8701f1e2
Deleted: sha256:ba40754911b8313098bdacb32d5044d6105f72a3b9cfe4a9ea16b8f05861614d
Deleted: sha256:93588577b39273261aea628c7f6aab541a86ff37e1f2674ee421300a2ff34d02
Deleted: sha256:1408254577b9d64420dcf7d4ba1b0df9a3ddd7a29d3d4736ad2ff4672baf4a8a
Untagged: centos:latest
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
Untagged: nginx:latest
Untagged: nginx@sha256:28402db69fec7c17e179ea87882667f1e054391138f77ffaf0c3eb388efc3ffb
Deleted: sha256:3b25b682ea82b2db3cc4fd48db818be788ee3f902ac7378090cf2624ec2442df
Deleted: sha256:3e8a4396bcdb62aeb916ec1e4cf64500038080839f049c498c256742dd842334
Deleted: sha256:8dd6a711fbdd252eba01f96630aa132c4b4e96961f09010fbbdb11869865f994
Deleted: sha256:9368c52198f80c9fb87fc3eaf7770afb7abb3bfd4120a8defd8a8f1a68ff375d
Deleted: sha256:46834c975bf2d807053675d76098806736ee94604c650aac5fe8b5172ab008c8
Deleted: sha256:6e433330e8b1553bee0637fac3b1e66c994bb2c0cab7b2372d2584171d1c93d8
Deleted: sha256:fbc611fa4a4aff4cf0bfd963c49e2c416ff8047c9f84c2dc9328d3b833f1118d
Deleted: sha256:98b5f35ea9d3eca6ed1881b5fe5d1e02024e1450822879e4c13bb48c9386d0ad
- 清理镜像:docker image prune
默认情况下,docker image prune 只会删除 未被任何容器使用 的镜像。
使用 -a 标志,删除所有没有标签的镜像。
bash
root@huhy:/opt# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tmt v1 f77539e7e45f 2 weeks ago 467MB
tomcat latest f77539e7e45f 2 weeks ago 467MB
nginx latest 3b25b682ea82 7 weeks ago 192MB
root@huhy:/opt# docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: tmt:v1
untagged: tomcat:latest
deleted: sha256:f77539e7e45f7c6337c681589fe18ee6407640e4066c450fcfb8c6a4ba5575b2
untagged: nginx:latest
deleted: sha256:3b25b682ea82b2db3cc4fd48db818be788ee3f902ac7378090cf2624ec2442df
deleted: sha256:3e8a4396bcdb62aeb916ec1e4cf64500038080839f049c498c256742dd842334
deleted: sha256:8dd6a711fbdd252eba01f96630aa132c4b4e96961f09010fbbdb11869865f994
deleted: sha256:9368c52198f80c9fb87fc3eaf7770afb7abb3bfd4120a8defd8a8f1a68ff375d
deleted: sha256:46834c975bf2d807053675d76098806736ee94604c650aac5fe8b5172ab008c8
deleted: sha256:6e433330e8b1553bee0637fac3b1e66c994bb2c0cab7b2372d2584171d1c93d8
deleted: sha256:fbc611fa4a4aff4cf0bfd963c49e2c416ff8047c9f84c2dc9328d3b833f1118d
deleted: sha256:98b5f35ea9d3eca6ed1881b5fe5d1e02024e1450822879e4c13bb48c9386d0ad
Total reclaimed space: 191.7MB
root@huhy:/opt# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
root@huhy:/opt#
- 保存镜像:docker save
o, --output:指定保存的 tar 文件的名称或路径。默认为标准输出
保存单个镜像
bash
root@huhy:/opt# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest f77539e7e45f 2 weeks ago 467MB
nginx latest 3b25b682ea82 7 weeks ago 192MB
root@huhy:/opt# docker save -o nginx.tar nginx:latest
root@huhy:/opt# ls
nginx.tar
root@huhy:/opt#
保存两个镜像
bash
root@huhy:/opt# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest f77539e7e45f 2 weeks ago 467MB
nginx latest 3b25b682ea82 7 weeks ago 192MB
root@huhy:/opt# docker save -o image.tar nginx:latest tomcat:latest
root@huhy:/opt# ls
image.tar
批量保存所有镜像到一个压缩包里面
bash
#!/bin/bash
# 设置输出文件名称
output_file="all_docker_images.tar"
# 获取所有镜像名称和标签
images=$(docker images --format "{{.Repository}}:{{.Tag}}")
# 打包所有镜像
echo "正在将以下镜像保存到 $output_file:"
echo "$images"
docker save -o "$output_file" $images
echo "所有镜像已保存到 $output_file"
bash
root@huhy:/opt# vi images.sh
iroot@huhy:/opt# bash images.sh
正在将以下镜像保存到 all_docker_images.tar:
tomcat:latest
nginx:latest
所有镜像已保存到 all_docker_images.tar
root@huhy:/opt# ls
all_docker_images.tar images.sh
root@huhy:/opt#
- 导入镜像:docker load
-i, --input:指定要加载的 tar 文件路径
bash
root@huhy:/opt# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
root@huhy:/opt# docker load -i all_docker_images.tar
Loaded image: tomcat:latest
98b5f35ea9d3: Loading layer [==================================================>] 77.83MB/77.83MB
b33db0c3c3a8: Loading layer [==================================================>] 117.9MB/117.9MB
63d7ce983cd5: Loading layer [==================================================>] 3.584kB/3.584kB
296af1bd2844: Loading layer [==================================================>] 4.608kB/4.608kB
8ce189049cb5: Loading layer [==================================================>] 2.56kB/2.56kB
6ac729401225: Loading layer [==================================================>] 5.12kB/5.12kB
e4e9e9ad93c2: Loading layer [==================================================>] 7.168kB/7.168kB
Loaded image: nginx:latest
root@huhy:/opt# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest f77539e7e45f 2 weeks ago 467MB
nginx latest 3b25b682ea82 7 weeks ago 192MB
root@huhy:/opt#
- 添加标签:dockr tag
bash
root@huhy:/opt# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest f77539e7e45f 2 weeks ago 467MB
nginx latest 3b25b682ea82 7 weeks ago 192MB
root@huhy:/opt# docker tag tomcat:latest tmt:v1
root@huhy:/opt# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tmt v1 f77539e7e45f 2 weeks ago 467MB
tomcat latest f77539e7e45f 2 weeks ago 467MB
nginx latest 3b25b682ea82 7 weeks ago 192MB
docker容器命令
- 启动容器:docker run
- -d:表示后台运行容器(即"分离模式"),这样容器启动后会在后台运行,不会阻塞当前终端
- --name:指定容器的名称,方便后续管理。否则系统会随机生成一个名称
- -p:端口映射,将主机的端口映射到容器的端口,格式是 主机端口:容器端口(如果p是大写,就是随机分配端口)
- -v:数据卷挂载,用于将主机的文件夹挂载到容器中,这在 Web 服务中很常见,可以将 Nginx 配置文件或网页文件挂载到容器。格式是 主机路径:容器路径
- --rm:容器停止后自动删除容器。适用于临时测试环境
- -e:设置环境变量,用于在启动时配置容器内部的环境
- -it:用于交互模式启动容器,加上 -t 表示为容器分配一个伪终端
- --network:设置容器的网络模式。Docker 提供了多种网络模式,如 bridge、host、none 等,或使用自定义网络。
- -h, --hostname:设置容器的主机名。
- --memory:限制容器的内存使用。可以指定具体的内存大小。
- --cpu-shares:为容器设置 CPU 共享权重,用于调度时分配 CPU 资源
- --restart:设置容器的自动重启策略。常见的选项有:
no:不会自动重启容器(默认行为)。
always:容器停止时总是重启。
unless-stopped:除非容器被手动停止,否则总是重启。
on-failure:仅在容器非正常退出(退出码非 0)时重启
启动一个nginx容器
bash
root@huhy:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 3b25b682ea82 5 weeks ago 192MB
root@huhy:~# docker run -itd --name nginx -p 8081:80 3b25b682ea82
6eefa8c342cfef7142fb000172727b757f1686a4d0bcc835df19e310d3d18ef9
root@huhy:~# ss -tlun | grep 80
tcp LISTEN 0 4096 0.0.0.0:8081 0.0.0.0:*
tcp LISTEN 0 4096 [::]:8081 [::]:*
- 查看容器:docker ps
- -a:列出所有容器(包括已停止的容器)
- -q:仅显示容器 ID,不显示其他详细信息
bash
root@huhy:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6eefa8c342cf 3b25b682ea82 "/docker-entrypoint...." 4 minutes ago Up 4 minutes 0.0.0.0:8081->80/tcp, [::]:8081->80/tcp nginx
root@huhy:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6eefa8c342cf 3b25b682ea82 "/docker-entrypoint...." 4 minutes ago Up 4 minutes 0.0.0.0:8081->80/tcp, [::]:8081->80/tcp nginx
root@huhy:~# docker ps -q
6eefa8c342cf
- 查看容器详细信息:docker inspect
bash
root@huhy:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6eefa8c342cf 3b25b682ea82 "/docker-entrypoint...." 7 minutes ago Up 7 minutes 0.0.0.0:8081->80/tcp, [::]:8081->80/tcp nginx
root@huhy:~# docker inspect nginx
[
{
"Id": "6eefa8c342cfef7142fb000172727b757f1686a4d0bcc835df19e310d3d18ef9",
"Created": "2024-11-11T02:35:58.084126042Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
............
- 查看容器日志:docker logs
- -f:跟随实时输出日志
- --tail:查看日志的最后几行
bash
root@huhy:~# docker logs -f nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/11/11 02:35:58 [notice] 1#1: using the "epoll" event method
2024/11/11 02:35:58 [notice] 1#1: nginx/1.27.2
2024/11/11 02:35:58 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/11/11 02:35:58 [notice] 1#1: OS: Linux 6.8.0-45-generic
2024/11/11 02:35:58 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/11/11 02:35:58 [notice] 1#1: start worker processes
- 进入容器:docker exec
- -i(--interactive):开启交互模式,使得容器中的命令可以接收标准输入。适用于需要交互输入的命令
- -t(--tty):分配一个伪终端(TTY)。通常与 -i 一起使用来打开一个交互式的终端,比如 bash 或 sh
- -e(--env):设置环境变量,为执行的命令添加指定的环境变量。可以添加多个 -e 参数
- --privileged:允许容器有更多的权限,适用于执行一些需要高权限的操作
- --workdir:指定容器中执行命令的工作目录(工作路径),相当于切换到指定目录再执行命令
bash
root@huhy:~# docker exec -it nginx bash
root@6eefa8c342cf:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
root@6eefa8c342cf:/#
- 停止容器:docker stop
bash
root@huhy:~# docker stop nginx
nginx
root@huhy:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@huhy:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6eefa8c342cf 3b25b682ea82 "/docker-entrypoint...." 39 minutes ago Exited (0) 10 seconds ago nginx
root@huhy:~#
- 强制停止:docker kill
bash
root@huhy:/opt# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df30594547df nginx "/docker-entrypoint...." 5 seconds ago Up 5 seconds 80/tcp optimistic_mirzakhani
root@huhy:/opt# docker kill df30594547df
df30594547df
root@huhy:/opt# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@huhy:/opt#
- 启动容器:docker start
bash
root@huhy:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@huhy:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6eefa8c342cf 3b25b682ea82 "/docker-entrypoint...." 39 minutes ago Exited (0) 10 seconds ago nginx
root@huhy:~# docker start nginx
nginx
root@huhy:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6eefa8c342cf 3b25b682ea82 "/docker-entrypoint...." 40 minutes ago Up 3 seconds 0.0.0.0:8081->80/tcp, [::]:8081->80/tcp nginx
root@huhy:~#
- 暂停容器中所有进程:docker pause
bash
root@huhy:~# docker pause nginx
nginx
root@huhy:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6eefa8c342cf 3b25b682ea82 "/docker-entrypoint...." 41 minutes ago Up 57 seconds (Paused) 0.0.0.0:8081->80/tcp, [::]:8081->80/tcp nginx
root@huhy:~#
- 恢复被暂停的容器:docker unpause
bash
root@huhy:~# docker unpause nginx
nginx
root@huhy:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6eefa8c342cf 3b25b682ea82 "/docker-entrypoint...." 51 minutes ago Up 10 minutes 0.0.0.0:8081->80/tcp, [::]:8081->80/tcp nginx
root@huhy:~#
- 查看 Docker 的实时事件流:docker events
- --since:指定从特定时间开始获取事件。时间格式可以是时间戳或格式化的日期字符串。
例如,查看最近 1 小时的事件:
- --since:指定从特定时间开始获取事件。时间格式可以是时间戳或格式化的日期字符串。
bash
docker events --since 1h
- --until:指定事件结束时间,和 --since 搭配使用。
例如,查看指定时间段内的事件:
bash
docker events --since "2023-10-01T00:00:00" --until "2023-10-01T12:00:00"
- --filter:用于过滤特定的事件,docker events 支持多种过滤器,最常用的包括:
event:按事件类型过滤,例如 start、stop、die 等。
container:指定某个容器的事件。
image:指定某个镜像的事件。
label:按标签过滤事件。
例如,查看特定容器的事件:
bash
docker events --filter container=my-container
- 容器导出为镜像:docker commit
此命令只会记录文件系统和容器状态,不会记录启动参数和卷挂载等等,可搭配inspect使用,达到容器迁移的效果
bash
root@huhy:/opt# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9448eb29f64e nginx "/docker-entrypoint...." 14 seconds ago Up 13 seconds 80/tcp elated_beaver
root@huhy:/opt# docker commit 9448eb29f64e new_nginx:v1
sha256:885f36e25bdfc0dcff244ab96c0c6f4d4dd4f2e11fa7b1e38e2014e66070edac
root@huhy:/opt# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
new_nginx v1 885f36e25bdf 5 seconds ago 192MB
nginx latest 60c8a892f36f 7 weeks ago 192MB
- 容器导出为快照:docker export
Docker 支持将容器完整导出为文件快照,这个方式更适合迁移,可以间接保存所有数据
bash
root@huhy:/opt# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9448eb29f64e nginx "/docker-entrypoint...." 6 minutes ago Up 6 minutes 80/tcp elated_beaver
root@huhy:/opt# docker export -o nginx_test.tar 9448eb29f64e
root@huhy:/opt# cat nginx_test.tar | docker import - my_nginx_image:latest
sha256:6bf3501bd2b49601f158c5905d4eae05f135c19eb3a89fd9f201284a7153bf28
root@huhy:/opt#
root@huhy:/opt# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_nginx_image latest 6bf3501bd2b4 17 seconds ago 190MB
new_nginx v1 885f36e25bdf 8 minutes ago 192MB
nginx latest 60c8a892f36f 7 weeks ago 192MB
使用 docker commit:
- 在容器中做了修改(例如安装了软件、修改配置文件),希望将这些修改保存为镜像,供后续使用。
快速创建一个基于现有容器的自定义镜像。
希望能够在以后使用该镜像启动新容器,并保留容器的所有修改。
使用 docker export:
- 需要导出容器的文件系统以便迁移到其他地方(例如,将容器的文件系统导出为 tar 包,并上传到另一个机器上)。
只关心容器内的数据,不关心容器的配置。
备份容器的文件系统内容,但不需要容器的运行时配置。
docker仓库
Docker仓库是用于存储和管理Docker镜像的地方,可以是公共的也可以是私有的。通过Docker仓库,开发者可以方便地上传、下载和共享Docker镜像。常见的Docker仓库包括Docker Hub、Harbor、 Google ContainerRegistry(GCR)、Amazon Elastic ContainerRegistry(ECR)和 Azure ContainerRegistry(ACR)。这些仓库支持镜像的版本控制存储、分发,通常还提供镜像扫描、加密、权限管理等安全功能
配置最新harbor,安装要求:docker 20.10.10-ce+ and docker-compose 1.18.0+ .
bash
tar -xf harbor-offline-installer-v2.11.2.tgz
bash
root@huhy:~# cd harbor/
root@huhy:~/harbor# ls
common.sh harbor.v2.11.2.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
在 Docker 20.10 及更高版本中,Docker 引入了 docker compose 作为一个插件命令,逐渐取代了 docker-compose。这个命令作为 Docker CLI(命令行界面)的一部分,允许直接通过 docker 命令来管理 Docker Compose 功能,而不再需要单独安装docker-compose 工具
bash
root@huhy:~/harbor# docker compose version
Docker Compose version v2.29.7
配置daemon
bash
vi /etc/docker/daemon.json
bash
{
"registry-mirrors": ["https://o90diikg.mirror.aliyuncs.com"],
"insecure-registries" : ["0.0.0.0/0"]
}
bash
systemctl daemon-reload
systemctl restart docker
修改yml
bash
mv harbor.yml.tmpl harbor.yml
bash
vi harbor.yml
修改为本机IP,并注释https
bash
hostname: 192.168.200.160
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
# https related config
#https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
#certificate: /your/certificate/path
#private_key: /your/private/key/path
# enable strong ssl ciphers (default: false)
# strong_ssl_ciphers: false
使用默认启动
bash
./install.sh
启动harbor时可带一些可选参数
bash
--with-trivy # 启用 Trivy 漏洞扫描
--with-clair # 启用 Clair 漏洞扫描
--with-notary # 启用镜像签名与验证(Notary)
--with-chartmuseum # 启用 Helm Chart 仓库
--with-registry # 启用 Docker 镜像仓库
--with-database # 启用数据库服务(通常是 PostgreSQL)
--with-redis # 启用 Redis 服务
--with-log # 启用日志记录
--with-https # 启用 HTTPS 配置
--with-clair-scanner # 启用 Clair 扫描器
--with-clair-metadata # 启用 Clair 元数据
--with-jobservice # 启用任务服务
--with-core # 启用 Harbor 核心服务
--with-portal # 启用 Harbor Web UI
界面访问:IP(admin/Harbor12345)
界面创建公开项目
查看推送命令
推送镜像:打标签
bash
root@huhy:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
goharbor/harbor-exporter v2.11.2 520de0cd30c7 10 days ago 108MB
goharbor/redis-photon v2.11.2 bb0d92ddf3ec 10 days ago 165MB
goharbor/trivy-adapter-photon v2.11.2 0962772f9c8f 10 days ago 347MB
goharbor/harbor-registryctl v2.11.2 075c10d45191 10 days ago 162MB
goharbor/registry-photon v2.11.2 1365718c5208 10 days ago 84.8MB
goharbor/nginx-photon v2.11.2 2949037133e7 10 days ago 154MB
goharbor/harbor-log v2.11.2 9ae20475f5ca 10 days ago 163MB
goharbor/harbor-jobservice v2.11.2 8dbbe22ef281 10 days ago 159MB
goharbor/harbor-core v2.11.2 6c2be6bdb874 10 days ago 185MB
goharbor/harbor-portal v2.11.2 a3440cd04321 10 days ago 162MB
goharbor/harbor-db v2.11.2 a5fc5485967b 10 days ago 271MB
goharbor/prepare v2.11.2 74c41ed4e2a9 10 days ago 205MB
root@huhy:~# docker tag goharbor/prepare:v2.11.2 192.168.200.160/test/goharbor/prepare:test
登录harbor
bash
root@huhy:~# docker login -u "admin" -p "Harbor12345" "192.168.200.160"
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded
root@huhy:~#
bash
root@huhy:~# docker push 192.168.200.160/test/goharbor/prepare:test
The push refers to repository [192.168.200.160/test/goharbor/prepare]
c6844997789a: Pushed
ee793768fa5f: Pushed
659dc40ce3b7: Pushed
029c27b3f91b: Pushed
7db7ce7738f9: Pushed
771d6693db72: Pushed
9c15ef707b0c: Pushed
e8d8565c9983: Pushed
faebe453cc4b: Pushed
7e3e085aad00: Pushed
test: digest: sha256:3761801ca8f76e7df2ab1c4f7c35913cf0540a3d34510cb54274939568bcc346 size: 2413
root@huhy:~#
界面查看镜像已经推送成功