docker的安装与部署
一、安装与部署
1.1安装环境概述
Docker划分为CE和EE,CE为社区版(免费,支持周期三个月),EE为企业版(强调安全,付费使用)。
Docker CE每月发布一个Edge版本(17.03,17.04,17.05……),每三个月发布一个Stable版本(17.03,17.06,17.09……);docker EE和stable版本号保持一致,每个版本提供一年维护。
(1)依赖的基础环境
-
64 位CPU
-
Linux kernel(内核) 3.10+
-
Linux kernel cgroups and namespaces
(2)查询自己服务器的环境
① 使用的操作系统版本
# cat /etc/redhat-release
Red Hat Enterprise Linux release 9.3 (Plow)
② 内核版本
# uname -r
5.14.0-362.8.1.el9_3.x86_64
③ ip地址
# hostname -I
④卸载旧版本,旧版本的Docker称为docker或者docker-engine:
# yum remove docker docker-common docker-selinux docker-engine
2.2 安装docker
docker的安装官方文档:Install Docker Engine on CentOS | Docker Docs
2.2.1 使用yum安装
(1)添加docker-ce 源信息
安装依赖包(yum-utils 提供了 yum-config-manager):
# yum install yum-utils -y
# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/rhel/docker-ce.repo
(2)修改docker-ce源
# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
##或者手动写仓库
# cat docker-ce.repo
[docker-ce]
name=cocker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0
(3)更新源
1 # yum makecache
(4)安装docker-ce
①默认安装docker-ce是最新版本
1 # yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
1 # rpm -q docker-ce
2 docker-ce-27.1.2-1.el9.x86_64
3 # systemctl start docker
4 # systemctl status docker
②安装指定版本
1 # yum list docker-ce --showduplicates | sort -r
1 # yum install docker-ce-26.1.4-1.el9 -y
2 # systemctl start docker
3 # systemctl status docker
2.2.2 二进制安装
官方指导文档:Install Docker Engine from binaries | Docker Docs
(1)下载二进制文件
二进制文件的下载路径:Index of linux/static/stable/
#此次安装的是docker-25.0.5
1 [root@rocky9 ~]# mkdir -p /data
2 [root@rocky9 ~]# wget -P /data/ https://download.docker.com/linux/static/stable/x86_64/docker-25.0.5.tgz
3 [root@rocky9 ~]# cd /data/
4 [root@rocky9 data]# tar xf docker-25.0.5.tgz
5 [root@rocky9 data]# cp docker/* /usr/bin/
6 [root@rocky9 data]# dockerd &
2.3 查看当前docker信息
在docker安装之后,默认会生成一个名称为docker0的网卡并且默认IP地址为172.17.0.1
1 [root@rhel9 ~]# ip a show docker0
2 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
3 link/ether 02:42:2e:42:6f:44 brd ff:ff:ff:ff:ff:ff
4 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
5 valid_lft forever preferred_lft forever
查看docker当前的版本
查看当前的容器、镜像、仓库等信息
容器的创建与管理过程:
1、dockerd进程:docker client直接访问dockerd(其父进程为宿主机的systemd守护进程)进程。dockerd通过grpc和containerd模块通信,dockerd和containerd通信的socket文件:/run/containerd/containerd.sock。
2、containerd进程:containerd在dockerd启动时被启动,然后containerd启动grpc请求监听,containerd根据grpc请求做相应动作。containerd可以在宿主机中管理完整的容器生命周期(容器镜像的传输和存储,容器的执行和管理,存储和网络等)。
3、containerd-shim进程:若是创建容器,containerd拉起一个/usr/bin/containerd-shim进程,并进行相应的创建操作。containerd-shim套件其目的主要是隔离containerd和容器。
4、containerd-shim-runc-v2进程: containerd-shim启动后会去启动/usr/bin/containerd-shim-runc-v2,然后立即退出,此时containerd-shim-runc-v2的父进程就变成了systemd(1),这样containerd-shim-runc-v2就和containerd脱离了关系,即便containerd退出也不会影响到容器(这也是containerd-shim套件的作用) 。
5、runc:OCl标准的具体实现就是runc,真正创建和维护容器便是由runc来完成的。/usr/bin/containerd-shim-runc-v2会启动runc去create、start容器,然后runc立即退出,容器的父进程就变成了containerd-shim-runc-v2。containerd-shim-runc-v2会收集容器进程的状态,上报给containerd。
6、docker-proxy:实现容器通信,其父进程为dockerd
[root@rhel9 yum.repos.d]# ps -ef | egrep "(docker|containerd)"
root 3751 1 1 09:45 ? 00:00:00 /usr/bin/containerd
root 3760 1 1 09:45 ? 00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
[root@rhel9 ~]# pstree -p | egrep "(systemd|docker|containerd)"
systemd(1)-+-ModemManager(886)-+-{ModemManager}(925)
|-containerd(3751)-+-{containerd}(3752)
| |-{containerd}(3753)
| |-{containerd}(3754)
| |-{containerd}(3755)
| |-{containerd}(3756)
| |-{containerd}(3758)
| `-{containerd}(3759)
|-dockerd(3760)-+-{dockerd}(3761)
| |-{dockerd}(3762)
| |-{dockerd}(3763)
| |-{dockerd}(3764)
| |-{dockerd}(3765)
| |-{dockerd}(3766)
| |-{dockerd}(3767)
| `-{dockerd}(3768)
#运行一个容器
[root@master0101 ~]# docker run -d nginx:1.27-alpine
4a2eb061a84206517b8645da5161e0711d752c5f2d3fb159f3b22164da86ed1b
#查看进程
[root@master0101 ~]# ps -ef | grep containerd
root 3751 1 0 09:45 ? 00:00:00 /usr/bin/containerd
root 3760 1 0 09:45 ? 00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root 11106 1 0 10:04 ? 00:00:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 4a2eb061a84206517b8645da5161e0711d752c5f2d3fb159f3b22164da86ed1b -address /run/containerd/containerd.sock
#再次运行容器,进行端口映射,可以通过宿主机端口访问容器
[root@master0101 ~]# docker run -d -P nginx:1.27-alpine
f134ebaabc20d266ab326a64d4ff521516dbdda2c0617114abb5bbae0922b247
#查看容器端口映射到宿主机的端口
[root@master0101 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f134ebaabc20 nginx:1.27-alpine "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:32768->80/tcp, [::]:32768->80/tcp happy_gauss
#查看docker-proxy进程
[root@master0101 ~]# ps -ef | grep docker-proxy
root 26183 3760 0 10:44 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 32768 -container-ip 172.17.0.2 -container-port 80
root 26195 3760 0 10:44 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 32768 -container-ip 172.17.0.2 -container-port 80
root 26601 9640 0 10:44 pts/1 00:00:00 grep --color=auto docker-proxy
2.4 docker镜像加速配置
国内从Docker Hub拉取镜像有时会遇到困难,可以通过修改docker配置文件的方式添加一个加速器,可以通过加速器达到下载镜像的目的。
(1)从2017年6月9日起,Docker 官方提供了在中国的加速器,以解决墙的问题。不用注册,直接使用加速器地址:https://registry.docker-cn.com 即可。
(2)中国科技大学的镜像加速器:中科大的加速器不用注册,直接使用地址 https://docker.mirrors.ustc.edu.cn/ 配置加速器即可。进一步的信息可以访问:Docker Hub - USTC Mirror Help
(3)阿里云加速器:注册阿里云开发账户(免费的)后,访问这个链接就可以看到加速器地址: 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
(4)DaoCloud 加速器:注册 DaoCloud 账户(支持微信登录),然后访问: https://www.daocloud.io/mirror#accelerator-doc
#配置docker镜像加速
[root@rhel9 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru",
"https://hub.oepkgs.net",
"https://dockerhub.timeweb.cloud"
]
}
[root@rhel9 ~]# systemctl daemon-reload
[root@rhel9 ~]# systemctl restart docker
[root@rhel9 ~]# docker info | grep -iA 4 registry
Registry Mirrors:
https://docker.m.daocloud.io/
https://huecker.io/
https://dockerhub.timeweb.cloud/
https://noohub.ru/
#出现该内容表示镜像加速配置成功
#拉取hello-world镜像,测试能否拉取
[root@rhel9 ~]# docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:53cc4d415d839c98be39331c948609b659ed725170ad2ca8eb36951288f81b75
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
[root@rhel9 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d2c94e258dcb 15 months ago 13.3kB
三、docker基础命令
3.1 镜像相关操作
3.1.1 增加镜像
(1)搜索镜像
这里使用的是27.1.2版本的docker

(2)拉取镜像
Docker Hub上有大量的高质量的镜像可以用。从Docker镜像仓库获取镜像的命令是docker pull,其命令格式为:
1 docker pull [选项] [Docker Registry地址[:端口号]/]仓库名[:标签]

docker镜像仓库地址:地址的格式一般是<域名/IP>:[端口号],不写的话默认地址是Docker Hub。
仓库名:仓库名是两段式名称,即<用户名>/<软件名>。对于Docker Hub,如果不给出用户名,则默认为library,也就是官方镜像。
一个仓库会包含同一个软件不同版本的镜像, 而标签就常用于对应该软件的各个版本。
1 #根据镜像名称(tag指定版本)拉取镜像
2 [root@localhost ~]# docker pull nginx:1.27.2-alpine
(3)导入镜像
#假设当前主机有之前提前下载好的镜像文件
[root@localhost dockerimages]# pwd
/dockerimages
[root@localhost dockerimages]# ll
总用量 16856
-rw------- 1 root root 17257984 10月 15 16:55 nginx-1.14-alpine.tar.gz
#可以使用以下命名导入之前旧的镜像【docker image load=docker load】
[root@localhost dockerimages]# docker image load -i nginx-1.14-alpine.tar.gz
a464c54f93a9: Loading layer 5.796MB/5.796MB
5ac9a5170bf2: Loading layer 11.43MB/11.43MB
b2cbae4b8c15: Loading layer 3.584kB/3.584kB
076c58d2644f: Loading layer 4.608kB/4.608kB
Loaded image: nginx:1.14-alpine
[root@localhost dockerimages]# docker images nginx:1.14-alpine
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.14-alpine 8a2fb25a19f5 5 years ago 16MB
3.1.2 查看镜像
(1)查看镜像信息
#查看所有镜像,也可以使用命令docker image ls -a
[root@localhost dockerimages]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.27.2-alpine cb8f91112b6b 12 days ago 47MB
nginx 1.14-alpine 8a2fb25a19f5 5 years ago 16MB
#列表包含了仓库名、标签、镜像ID、创建时间以及所占用的空间。
#其中镜像ID则是镜像的唯一标识,一个镜像可以对应多个标签。
[root@localhost dockerimages]# docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.27.2-alpine cb8f91112b6b 12 days ago 47MB
nginx 1.14-alpine 8a2fb25a19f5 5 years ago 16MB
[root@localhost dockerimages]# docker image ls nginx:1.14-alpine
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.14-alpine 8a2fb25a19f5 5 years ago 16MB
镜像体积说明:
这里标识的所占用空间和在Docker Hub上看到的镜像大小不同。Docker Hub中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。 而docker image ls 显示的是镜像下载到本地后展开的大小, 准确说是展开后的各层所占空间的总和, 因为镜像到本地后, 查看空间的时候, 更关心的是本地磁盘空间占用的大小。
另外一个需要注意的问题是, docker image ls 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。 由于 Docker 镜像是多层存储结构, 并且可以继承、 复用, 因此不同镜像可能会因为使用相同的基础镜像, 从而拥有共同的层。 由于 Docker 使用 Union FS, 相同的层只需要保存一份即可, 因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
(2)查看镜像的层数
[root@localhost dockerimages]# docker history nginx:1.14-alpine
IMAGE CREATED CREATED BY SIZE COMMENT
8a2fb25a19f5 5 years ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 5 years ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0B
<missing> 5 years ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 5 years ago /bin/sh -c #(nop) COPY file:ebf4f0eb33621cc0… 1.09kB
<missing> 5 years ago /bin/sh -c #(nop) COPY file:4c82b9f10b84c567… 643B
<missing> 5 years ago /bin/sh -c GPG_KEYS=B0F4253373F8F6F510D42178… 10.5MB
<missing> 5 years ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.14.2 0B
<missing> 5 years ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 5 years ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 5 years ago /bin/sh -c #(nop) ADD file:2e3a37883f56a4a27… 5.53MB
#missing表示这层,或者这个构建步骤在其他的系统上构建的,并且从DockerHub上拉取过来的。
(3)标签为none的镜像
如果查看镜像的显示结果中出现了没有仓库名,也没有标签,均为<none>的镜像,可能是因为旧的镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了<none>。除了 docker pull 可能导致这种情况, docker build 也同样可以导致这种现象。 由于新旧镜像同名, 旧镜像名称被取消, 从而出现仓库名、 标签均为 <none> 的镜像。 这类无标签镜像也被称为虚悬镜像 (dangling image) , 可以用下面的命令专门显示这类镜像:
[root@localhost ~]# docker image ls -f dangling=true
一般来说, 虚悬镜像已经失去了存在的价值, 是可以随意删除的, 可以用下面的命令删除。
[root@localhost ~]# docker image prune
(3)查看镜像详细信息
[root@localhost dockerimages]# docker image inspect nginx:1.27.2-alpine
3.1.3 修改镜像,导出镜像
(1)给镜像重新打标签
#拉取nginx:latest镜像并重新打标签
[root@localhost ~]# docker run -it --rm nginx:latest /bin/bash
root@589428e6a5f6:/# nginx -v
nginx version: nginx/1.27.2
root@589428e6a5f6:/# exit
#重新打标签
[root@localhost ~]# docker tag nginx:latest nginx:1.27.2
(2)导出镜像为文件
-
可以同时导出多个镜像为一个文件;
-
指定.tar.gz 可以导出并压缩。
#导出镜像,-o:指定导出镜像的位置; [root@localhost ~]# cd /dockerimages/ [root@localhost dockerimages]# docker image save -o nginx-1.27.2.tar.gz nginx:1.27.2 [root@localhost dockerimages]# ll nginx-1.27.2.tar.gz -rw------- 1 root root 195826176 10月 16 12:36 nginx-1.27.2.tar.gz3.1.4 删除镜像
#可以通过标签删除镜像 [root@localhost dockerimages]# docker image rm nginx:latest Untagged: nginx:latest #也可以使用ID删除镜像 [root@localhost dockerimages]# docker image ls nginx:1.27.2 REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.27.2 7f553e8bbc89 13 days ago 192MB [root@localhost dockerimages]# docker image rm 7f5 Untagged: nginx:1.27.2 Untagged: nginx@sha256:d2eb56950b84efe34f966a2b92efb1a1a2ea53e7e93b94cdf45a27cf3cd47fc0 Deleted: sha256:7f553e8bbc897571642d836b31eaf6ecbe395d7641c2b24291356ed28f3f2bd0 Deleted: sha256:3ba9e1b5feaec13b6ac4c4039ff77db13d386040a109f2c378707e70a16ceff0 Deleted: sha256:84bde598cdfbb8af5b5509ede416a448ab7b8e38a4b7e5f2808c096739cb10e8 Deleted: sha256:c51526393f89152369e3f34f04409221511ff198968d6e221a7f9f4ed47369c7 Deleted: sha256:9663f01c380b3953165314a61b7f06e064a1ca39914d7bf6bc047f11d2836df8 Deleted: sha256:eb228edcd2ea132c0353513e457bae71a4c06332541ac4517b06f70b71b7e977 Deleted: sha256:b3f70c08ab98515399e812f56f987b033a998abc2fceaa683f432cad5a8bd04a Deleted: sha256:8d853c8add5d1e7b0aafc4b68a3d9fb8e7a0da27970c2acf831fe63be4a0cd2c -
删除时的输出提示:
-
Untagged
-
镜像的唯一标识是其 ID 和摘要, 而一个镜像可以有多个标签,首先需要做的是将满足我们要求的所有镜像标签都取消,这就是我们看到的 Untagged 的信息。
因为一个镜像可以对应多个标签, 因此当我们删除了所指定的标签后, 可能还有别的标签指向了这个镜像, 如果是这种情况, 那么 Delete 行为就不会发生。 所以并非所有的 docker image rm 都会产生删除镜像的行为, 有可能仅仅是取消了某个标签而已。
-
Deleted
-
当该镜像所有的标签都被取消了, 该镜像很可能会失去了存在的意义, 因此会触发删除行为。
镜像是多层存储结构, 因此在删除的时候也是从上层向基础层方向依次进行判断删除。
镜像的多层结构让镜像复用变动非常容易, 因此很有可能某个其它镜像正依赖于当前镜像的某一层。 这种情况, 依旧不会触发删除该层的行为。 直到没有任何层依赖当前层时, 才会真实的删除当前层。
除了镜像依赖以外, 还需要注意的是容器对镜像的依赖。 如果有用这个镜像启动的容器存在( 即使容器没有运行), 那么同样不可以删除这个镜像
3.2 容器相关操作
3.2.1 启动容器
Docker运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker会从镜像仓库下载该镜像。容器内的第一个进程必须一直处于运行的状态,否则这个容器,就会处于退出状态!
(1)create,start运行容器——不推荐
docker create 镜像名
docker start 容器名
docker restart 容器名
[root@localhost dockerimages]# docker create nginx:1.27.2-alpine
28cf58a694d09b615e171e705b038fa26a1cc2065e7f4b324e7c3528c4a5563e
[root@localhost dockerimages]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28cf58a694d0 nginx:1.27.2-alpine "/docker-entrypoint.…" 2 seconds ago Created modest_hawking
#需要使用start启动容器
[root@localhost dockerimages]# docker start 28c
#查看正在运行的容器
[root@localhost dockerimages]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28cf58a694d0 nginx:1.27.2-alpine "/docker-entrypoint.…" 36 seconds ago Up 1 second 80/tcp modest_hawking
(2)run运行容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker execoptions 常用命令选项
-t :打开一个终端,像使用交换机一样使用容器
-i:交互式访问 --name:容器名字 --network:指定网络 --rm:容器一停,自动删除
-d:后台运行容器,返回容器ID;否则会一直占据着终端
-p:端口映射,将容器内服务的端口映射在宿主机的指定端口,格式为:宿主机端口:容器端口
-P: 随机端口映射,容器内部端口随机映射到主机的端口
[OPTIONS] CONTAINER COMMAND [ARG...]
-
交互式运行容器
[root@localhost dockerimages]# docker run --name busybox1 -it busybox:1.36 /bin/sh / # ls bin dev etc home lib lib64 proc root sys tmp usr var #退出容器 / # exit
3.2.3 删除容器
docker stop 关闭运行的容器
docker kill 杀死运行的容器
-s:指定信号,和kill 用法一样;-9 强制停止容器
docker rm [-f]
docker container prune #删除所有处于终止状态的容器
3.2.4 管理容器中的数据
如果正在运行中的容器生成了新的数据或者修改了现有的一个已经存在的文件内容,那么新产生的数据将会被复制到读写层进行持久化保存,这个读写层也就是容器的工作目录。这就是“写时复制(COW)copy on write”机制。
容器中修改的数据内容会随着容器的消亡而消失,如果想要将容器中数据永久保存,则需要将容器中的数据保存到宿主机的指定目录中,可以使用如下方式持久化容器数据:
-
使用docker管理的数据卷
数据卷的使用, 类似于 Linux 下对目录或文件进行 mount, 镜像中的被指定为挂载点的目录中的文件会隐藏掉, 能看到的是挂载的数据卷里面的内容。
-
使用宿主机本地的目录作为数据卷
-
将宿主机的目录挂载至容器,然后让其它容器通过该容器读写宿主机的数据
数据卷的特点:
1、数据卷是宿主机的目录或者文件,并且可以在多个容器之间共同使用。 2、在宿主机对数据卷内容更新后会在所有容器里面立即更新。 3、数据卷的数据可以持久保存,即使删除使用该数据卷的容器也不影响。 4、在容器里面写入的数据不会影响到镜像本身。
(1)运行容器后,数据默认存储位置
LowerDir:image镜像层(只读)
MergedDir:容器的文件系统,使用Union FS将lowerdir和upperdir合并给容器使用
UpperDir:容器的上层(读写)
WorkDir:容器在宿主机的工作目录,用来存放临时文件
(2)使用数据卷持久化数据
[root@localhost ~]# docker volume create my-vol
my-vol
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local my-vol
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)