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 |
安装 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 |
安装 docker
yum localinstall -y containerd.io-1.4.13-3.1.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 \ |
启动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 |
安装 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 |
安装 docker 26
uname -r |
Ubuntu 安装 docker
Ubuntu 安装 Docker 要注意系统使用的防火墙,默认 Docker 不会在 UFW 或者 Firewalld 防火墙规则中更新 Docker 暴露的端口。不支持使用 nft
创建的防火墙规则,Docker 仅兼容 iptables-nft
(iptables
命令兼容 nftables
的工具) 和 iptables-legacy
[2]
系统信息
Ubuntu 系统信息如下
User |
使用 apt-get 安装 docker-ce 步骤
- 更新软件包索引
sudo apt update
- 安装必要的软件包。为了确保 apt 可以通过 HTTPS 使用软件包,需要安装以下软件包
sudo apt install apt-transport-https ca-certificates curl software-properties-common
- 添加 Docker 的官方 GPG 密钥。这将确保你从 Docker 下载的软件包是真实的
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 添加 Docker 软件仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- 更新软件包索引
sudo apt update
- 安装 Docker CE(社区版)
sudo apt install docker-ce
- 启动 Docker 服务
sudo systemctl enable docker
sudo systemctl start docker
docker 常用命令
docker 镜像管理命令
获取(下载)镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] |
未指定地址,默认是从 Docker Hub 上面获取镜像,参考说明
标签信息可从 Docker Hub 上面查看
运行镜像
获取(下载)镜像后,运行镜像并运行镜像中的bash
命令进入对应容器
docker run -it --rm centos:centos7.9.2009 bash |
进入容器后,我们可以在 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 CONTAINER 或 docker container logs CONTAINER 查看 |
|
--entrypoint |
覆盖(替换)镜像中默认的ENTRYPOINT |
列出已下载的镜像
docker image ls |
列表包含了 仓库名
、标签
、镜像 ID
、创建时间
以及 所占用的空间
。
IMAGE ID
是镜像的唯一标识,同一个镜像可以有多个标签
删除本地镜像
docker image rm centos:centos7.9.2009 |
可以用镜像名(<仓库名>:<标签>
) ,镜像 ID
删除镜像
也可以使用 镜像摘要
删除镜像
查看 镜像摘要
docker image ls --digests |
使用 镜像摘要
删除镜像
命令格式 docker image rm REPOSITORY@DIGEST
docker image rm centos@sha256:c73f515d06b0fa0... |
删除行为分为两类,一类是 Untagged
,另一类是 Deleted
。
因为一个镜像可以对应多个标签,当我们使用上面命令删除镜像的时候,实际上是在要求删除某个标签的镜像。
所以首先需要做的是将满足我们要求的所有镜像标签都取消,这就是我们看到的 Untagged
的信息 ,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像,如果是这种情况,那么 Delete
行为就不会发生。
所以并非所有的 docker image rm
都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。
当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。
镜像导出和导入
通过镜像来导出导入
使用命令 docker save
和 docker load
可以根据镜像 ID 将镜像导出到文件,并在另一个 docker 节点导入。
docker image ls |
容器制作成镜像
docker commit -m "describe info" -p CONTAINER [REPOSITORY[:TAG]] |
选项 | 说明 | 示例 |
---|---|---|
-m |
描述信息 | |
-p |
打包镜像时暂停容器 | |
a |
提交的镜像作者 |
doker 容器管理命令
启动已终止的容器
docker container start CONTAINER |
进入容器
docker attach CONTAINER |
docker attach
进入容器,如果再从这个stdin
中exit
,会导致容器的停止docker exec
进入容器,如果再从这个stdin
中exit
,不会导致容器的停止,推荐进入容器使用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 rm DOCKERVOLUME |
挂载使用数据卷
docker run -d -it -v DOCKERVOLUME:/data/ --name centos7 centos:centos7 |
挂载宿主机目录(文件)
docker run -d -it -v /data/:/data/ --name centos7 centos:centos7 |
本地目录的路径必须是绝对路径,以前使用 -v
参数时如果本地目录不存在 Docker
会自动为你创建一个文件夹,现在使用 --mount
参数时如果本地目录不存在,Docker
会报错。
挂载权限默认为 rw
,可以通过增加 readonly
指定为 只读
docker run -d -it -v /data/:/data/:ro --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
会随机映射一个宿主机端口到内部容器开放的网络端口(Dockerfile
中 EXPOSE
的端口)。
docker run -d -P nginx:alpine |
使用 docker run
命令的 -p
选项,则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有
hostPort:containerPort
这样会绑定到宿主机所有接口上的所有 ip 地址docker run -d -p 80:80 nginx:alpine
ip:hostPort:containerPort
此种格式可以指定映射宿主机的一个特定地址(IP),比如docker run -d -p 127.0.0.1:80:80 nginx:alpine
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 \ |
还可以使用 udp
标记来指定 udp
端口
docker run -d -p 127.0.0.1:80:80/udp nginx:alpine |
查看容器映射的端口信息可以使用以下命令
docker port c8a91c8fafba |
docker 资源状态命令
查看 docker 各项功能占用的系统磁盘大小
docker system df |
结果中包含了 镜像
、容器
、数据卷
所占用的空间
清除 docker 中所有未使用的资源
docker system prune |
查看 docker 容器中启动的脚本参数和完整的命令
docker ps -a --no-trunc |
其他相关功能
获得容器运行时的命令
运行容器最好使用 compose ,不然时间长了,不记得创建/运行容器时的命令,需要重新找回创建/运行容器时的命令
runlike
若需要方便的查看容器 run
或 create
时使用的命令,可以使用 runlike
命令
pip3 install runlike |
get_command_4_run_container
get_command_4_run_container
类似 runlike
命令
docker pull cucker/get_command_4_run_container |
修改运行中的容器的配置
容器已经运行后,若需要在不删除容器的情况下修改配置,可以修改容器的配置文件,默认路径在 /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 |
此错误由底层的 runc
返回,直接执行 runc
命令
$ runc |
原因: runc
缺乏依赖 libseccomp
,centos7 中 yum 默认的版本是 2.3 的,版本不满足最新 containerd
的需求,需要下载 2.4 以上的 [1]
卸载旧版本
rpm -qa | grep libseccomp |
再次执行 runc
,正常
runc |