docker 安装及常用命令介绍

环境信息

  • Centos 7.9.2009
  • docker-ce-19.03.15
  • docker-20.10.9

Docker 安装

yum 安装 docker

安装 yum 源,docker官方 centos 安装文档

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装 docker

yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

yum 离线安装 docker

参考链接下载rpm安装包

wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-19.03.15-3.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-19.03.15-3.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.4.13-3.1.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-compose-plugin-2.3.3-3.el7.x86_64.rpm

安装 docker

yum localinstall -y containerd.io-1.4.13-3.1.el7.x86_64.rpm \
docker-ce-cli-19.03.15-3.el7.x86_64.rpm \
docker-ce-19.03.15-3.el7.x86_64.rpm \
docker-compose-plugin-2.3.3-3.el7.x86_64.rpm

以上 2 条命令可以使用以下 1 条命令完成

yum localinstall -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-19.03.15-3.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-19.03.15-3.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.4.13-3.1.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-compose-plugin-2.3.3-3.el7.x86_64.rpm

启动docker

systemctl enable docker --now

docker-ce-19.03.15 升级到 docker-ce-20.10.9

yum update https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.6.9-3.1.el7.x86_64.rpm

yum install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-scan-plugin-0.9.0-3.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-rootless-extras-20.10.9-3.el7.x86_64.rpm

yum update https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-20.10.9-3.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-20.10.9-3.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-compose-plugin-2.6.0-3.el7.x86_64.rpm

安装 docker-20.10.9

yum install -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.6.9-3.1.el7.x86_64.rpm

yum install -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-20.10.9-3.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-scan-plugin-0.9.0-3.el7.x86_64.rpm


yum install -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-rootless-extras-20.10.9-3.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-20.10.9-3.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-rootless-extras-20.10.9-3.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-compose-plugin-2.6.0-3.el7.x86_64.rpm



安装 docker 26

# uname -r
6.8.9-1.el7.elrepo.x86_64

# yum install -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-26.1.1-1.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-scan-plugin-0.9.0-3.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-compose-plugin-2.6.0-3.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-buildx-plugin-0.14.0-1.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-26.1.1-1.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-26.1.1-1.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-rootless-extras-26.1.0-1.el7.x86_64.rpm \
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.6.31-3.1.el7.x86_64.rpm

Ubuntu 安装 docker

Ubuntu 安装 Docker 要注意系统使用的防火墙,默认 Docker 不会在 UFW 或者 Firewalld 防火墙规则中更新 Docker 暴露的端口。不支持使用 nft 创建的防火墙规则,Docker 仅兼容 iptables-nftiptables 命令兼容 nftables 的工具) 和 iptables-legacy [2]

Ubuntu 22.04 安装 iptables 服务

系统信息

Ubuntu 系统信息如下

User
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"

使用 apt-get 安装 docker-ce 步骤

  1. 更新软件包索引
    sudo apt update

  2. 安装必要的软件包。为了确保 apt 可以通过 HTTPS 使用软件包,需要安装以下软件包
    sudo apt install apt-transport-https ca-certificates curl software-properties-common

  3. 添加 Docker 的官方 GPG 密钥。这将确保你从 Docker 下载的软件包是真实的
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

  4. 添加 Docker 软件仓库
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

  5. 更新软件包索引
    sudo apt update

  6. 安装 Docker CE(社区版)
    sudo apt install docker-ce

  7. 启动 Docker 服务
    sudo systemctl enable docker

    sudo systemctl start docker

docker 常用命令

docker 镜像管理命令

获取(下载)镜像

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker pull centos:centos7.9.2009

未指定地址,默认是从 Docker Hub 上面获取镜像,参考说明
标签信息可从 Docker Hub 上面查看

运行镜像

获取(下载)镜像后,运行镜像并运行镜像中的bash命令进入对应容器

docker run -it --rm centos:centos7.9.2009 bash
cat /etc/os-release
exit

进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。例如执行 cat /etc/os-release。容器中执行exit命令可以退出容器

docker run 命令常用选项说明

选项 说明 示例
-i 启用交互式操作
-t 开启终端(输入输出)
--rm 容器退出(exit)后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm
--name 给启动的容器命名 docker run -d --name "centos7" centos:centos7.9.2009 bash
-d 后台运行,启动后返回容器id,并进入后台运行,容器的输出可使用 docker logs CONTAINERdocker container logs CONTAINER 查看
--entrypoint 覆盖(替换)镜像中默认的ENTRYPOINT

列出已下载的镜像

$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos centos7.9.2009 eeb6ee3f44bd 10 months ago 204MB

列表包含了 仓库名标签镜像 ID创建时间 以及 所占用的空间

IMAGE ID 是镜像的唯一标识,同一个镜像可以有多个标签

删除本地镜像

docker image rm centos:centos7.9.2009

docker image rm eeb6ee3f44bd

可以用镜像名(<仓库名>:<标签>) ,镜像 ID 删除镜像

也可以使用 镜像摘要 删除镜像
查看 镜像摘要

$ docker image ls --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
centos centos7.9.2009 sha256:c73f515d06b0fa0... eeb6ee3f44bd 10 months ago 204MB

使用 镜像摘要 删除镜像
命令格式 docker image rm REPOSITORY@DIGEST

$ docker image rm centos@sha256:c73f515d06b0fa0...
Untagged: centos@sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b407

删除行为分为两类,一类是 Untagged,另一类是 Deleted
因为一个镜像可以对应多个标签,当我们使用上面命令删除镜像的时候,实际上是在要求删除某个标签的镜像。
所以首先需要做的是将满足我们要求的所有镜像标签都取消,这就是我们看到的 Untagged 的信息 ,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像,如果是这种情况,那么 Delete 行为就不会发生。
所以并非所有的 docker image rm 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。
当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。

镜像导出和导入

通过镜像来导出导入

使用命令 docker savedocker load 可以根据镜像 ID 将镜像导出到文件,并在另一个 docker 节点导入。

$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 my f40e4ec9c0c7 3 weeks ago 485MB

$ docker save f40e4ec9c0c7 > centos7_my.tar

$ docker load < centos7_my.tar

容器制作成镜像

docker commit -m "describe info" -p CONTAINER [REPOSITORY[:TAG]]
选项 说明 示例
-m 描述信息
-p 打包镜像时暂停容器
a 提交的镜像作者

doker 容器管理命令

启动已终止的容器

docker container start CONTAINER
docker container restart CONTAINER
docker start CONTAINER

进入容器

docker attach CONTAINER
docker exec -it CONTAINER bash

docker attach 进入容器,如果再从这个 stdinexit,会导致容器的停止
docker exec 进入容器,如果再从这个 stdinexit,不会导致容器的停止,推荐进入容器使用 docker exec -it CONTAINER bash

删除容器

docker container rm CONTAINER

docker container rm 可以删除已终止的容器,要强制删除运行中的容器,可以使用选项 -f,Docker 会发送 SIGKILL 信号给容器。

docker container ls -a 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。

docker container prune

docker 数据管理命令

容器数据卷管理命令

数据卷 的使用,类似于 Linux 下对目录或文件进行 mount ,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅数据卷为空时会复制)。

创建数据卷

docker volume create DOCKERVOLUME

查看数据卷信息

$ docker volume ls
$ docker volume inspect DOCKERVOLUME

[
{
"CreatedAt": "2022-08-10T15:03:13+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/DOCKERVOLUME/_data",
"Name": "DOCKERVOLUME",
"Options": {},
"Scope": "local"
}
]

删除不在使用的数据卷

docker volume rm DOCKERVOLUME

挂载使用数据卷

docker run -d -it -v DOCKERVOLUME:/data/ --name centos7 centos:centos7
docker run -d -it --mount source=DOCKERVOLUME,target=/data, --name centos7 centos:centos7

挂载宿主机目录(文件)

docker run -d -it -v /data/:/data/ --name centos7 centos:centos7
docker run -d -it --mount type=bind,source=/data/,target=/data --name centos7 centos:centos7

本地目录的路径必须是绝对路径,以前使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用 --mount 参数时如果本地目录不存在,Docker 会报错。

挂载权限默认为 rw ,可以通过增加 readonly 指定为 只读

docker run -d -it -v /data/:/data/:ro --name centos7 centos:centos7
docker run -d -it --mount type=bind,source=/data/,target=/data,readonly --name centos7 centos:centos7

挂载本地宿主机目录(文件),使用选项 --mount 时,需要指定 type=bind, 否则 docker 会将源目录当做 数据卷 处理,可能报以下错误:
docker: Error response from daemon: create /data/: "/data/" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.

docker 网络管理命令

使用 docker run 命令的 -P 选项,Docker 会随机映射一个宿主机端口到内部容器开放的网络端口(DockerfileEXPOSE 的端口)。

$ docker run -d -P nginx:alpine

$ docker container ls -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fae320d08268 nginx:alpine "/docker-entrypoint.…" 24 seconds ago Up 20 seconds 0.0.0.0:32768->80/tcp bold_mcnulty

使用 docker run 命令的 -p 选项,则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有

  • hostPort:containerPort
    docker run -d -p 80:80 nginx:alpine
    这样会绑定到宿主机所有接口上的所有 ip 地址
  • ip:hostPort:containerPort
    docker run -d -p 127.0.0.1:80:80 nginx:alpine
    此种格式可以指定映射宿主机的一个特定地址(IP),比如 localhost 地址 127.0.0.1
  • ip::containerPort
    docker run -d -p 127.0.0.1::80 nginx:alpine
    使用 ip::containerPort 会绑定宿主机指定 ip 的任意端口到容器的指定端口,本地宿主机会自动分配一个随机端口。

-p 选项可以多次使用来绑定多个端口

docker run -d \
-p 80:80 \
-p 443:443 \
nginx:alpine

还可以使用 udp 标记来指定 udp 端口

docker run -d -p 127.0.0.1:80:80/udp nginx:alpine

查看容器映射的端口信息可以使用以下命令

$ docker port c8a91c8fafba
80/tcp -> 0.0.0.0:81

$ docker port c8a91c8fafba 80
0.0.0.0:81

docker 资源状态命令

查看 docker 各项功能占用的系统磁盘大小

$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 0 203.9MB 203.9MB (100%)
Containers 0 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B

结果中包含了 镜像容器数据卷 所占用的空间

清除 docker 中所有未使用的资源

$ docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache

Are you sure you want to continue? [y/N] y

查看 docker 容器中启动的脚本参数和完整的命令

docker ps -a --no-trunc

其他相关功能

获得容器运行时的命令

运行容器最好使用 compose ,不然时间长了,不记得创建/运行容器时的命令,需要重新找回创建/运行容器时的命令

runlike

若需要方便的查看容器 runcreate 时使用的命令,可以使用 runlike 命令

pip3 install runlike

runlike -p aa245f973a1c

get_command_4_run_container

get_command_4_run_container 类似 runlike 命令

docker pull cucker/get_command_4_run_container

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock cucker/get_command_4_run_container [容器名称]/[容器ID]

修改运行中的容器的配置

容器已经运行后,若需要在不删除容器的情况下修改配置,可以修改容器的配置文件,默认路径在 /var/lib/docker/containers/${CONTAINERID}/hostconfig.json,其内容为 json 格式,可以使用专门能解析 json 格式的工具打开,进行相应的修改。

修改之前要先停止 docker 服务,再修改,修改后在启动 docker 服务,否则无法更改成功。

常见错误

docker 启动容器时报错

docker 报以下错误

docker: Error response from daemon: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v1.linux/moby/f3cc24022c80fa1e12fcf91f31421ac7f1244abd03af1403edeeb01aceffb3fe/log.json: no such file or directory): runc did not terminate successfully: exit status 127: runc: symbol lookup error: runc: undefined symbol: seccomp_notify_respond
: unknown.

此错误由底层的 runc 返回,直接执行 runc 命令

$ runc
runc: symbol lookup error: runc: undefined symbol: seccomp_notify_respond

原因runc 缺乏依赖 libseccomp,centos7 中 yum 默认的版本是 2.3 的,版本不满足最新 containerd 的需求,需要下载 2.4 以上的 [1]

卸载旧版本

$ rpm -qa | grep libseccomp
libseccomp-2.3.1-4.el7.x86_64
libseccomp-devel-2.3.1-4.el7.x86_64

$ rpm -e libseccomp-2.3.1-4.el7.x86_64 libseccomp-devel-2.3.1-4.el7.x86_64 --nodeps

$ wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm

$ rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm
warning: libseccomp-2.5.1-1.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:libseccomp-2.5.1-1.el8 ################################# [100%]

$ rpm -qa | grep libseccomp
libseccomp-2.5.1-1.el8.x86_64

再次执行 runc,正常

$ runc
NAME:
runc - Open Container Initiative runtime

参考链接

docker官方 centos 安装文档

docker 官方 centos 版本下载地址

docker centos版本 阿里云下载地址

什么是 Docker

为什么要用 Docker

docker 从入门到实践

脚注