Docker常用命令
1. 帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息
docker [命令] --help # 显示帮助信息
2. 镜像命令
2.1 登录镜像库
- 命令格式:
docker login [选项] [镜像仓库URL]
sudo docker login --username=用户名 registry.url.com/namespace/imagename
2.2 搜索镜像
- 命令格式:
docker search [镜像名称] [选项]
# 搜索镜像
docker search mysql
# 搜索镜像,过滤收藏超过300的mysql镜像
docker search -f stars=300 mysql
# 列出收藏不小于指定值的镜像
docker search python -s 300
# 只列出 automated build 类型的镜像
docker search python --automated
2.3 拉取镜像
- 命令格式:
docker pull [镜像仓库URL]/[命名空间]/[镜像仓库名称]:[镜像版本]
# 默认拉取最新的镜像
docker pull mysql
# 指定镜像版本
docker pull mysql:5.7
# 指定空间和镜像
docker pull docker.io/library/busybox:latest
2.4 查看镜像
查看基本信息
- 命令格式:
docker images [选项]
或docker images ls [选项]
# 查看镜像
docker images
# 查看所有镜像信息
docker images -a
# 查看所有的镜像id
docker images -aq
查看详细信息
- 命令格式:
docker inspect [镜像名称:版本号] / [镜像ID]
2.5 镜像TAG
为镜像添加标签、修改镜像名称和版本号
- 命令格式:
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag nginx:latest registry.url.com/xxng/nginx:v1
# 修改镜像名与TAG
docker tag nginx:latest nginx_1:v1
修改tag后,源镜像还会存在,ID则为同一个,在删除镜像时若指定的是ID则会删除所有匹配到ID的镜像,若指定的是镜像名称:版本
则仅删除指定名称的单个镜像。
2.6 删除镜像
使用docker rmi
命令,相当于docker image rm
命令。
- 命令格式:
docker rmi [镜像名称:版本号] / [镜像ID]
docker rmi nginx:v1
# -f : 强制删除。镜像已经运行为容器则无法删除,可以使用-f强制删除。
docker rmi -f nginx:latest
# 删除多个
docker rmi -f [镜像名1:TAG] [镜像名2:TAG]...
# 删除全部
docker rmi -f $(docker images -qa)
2.7 推送镜像
push将本地镜像推送到网上的个人的私有仓库中。
- 命令格式:
docker push [镜像仓库URL]/[命名空间]/[镜像名称]:[版本号]
# 先登录私有仓库
docker login --username=“xxx” 仓库URL
# 推送镜像
docker push registry.rul.com/xxng/mysql:v1
2.8 构建镜像
构建镜像一般有三种情况,基于容器、基于本地镜像文件、基于Dockerfile
创建,本节主讲基于容器提交镜像和本地镜像文件导入。
基于Dockerfile构建镜像可参考《Dockerfile构建镜像》
2.8.1 容器提交为镜像
- 格式:
docker commit [选项] [容器名称:版本号]/[容器ID]
# -a: 指定作者。 -m: 简介。 -p: 保存镜像时容器暂停运行。
docker commit -a 'moyusisi' -m 'nginx_demo' -p 50cf6c577510
2.8.2 容器的导出与导入
有时候需要将容器或镜像保存成文件,从一个系统迁移到另外一个系统,此时可以使用 Docker 的导入和导出功能,导出的文件是一个tar包,可以通过压缩命令进行压缩,然后进行传输。
导出:export
export将容器导出到标准输出,可以使用输出重定向
或-o选项
至tar文件中。
- 格式:
docker export [容器名或ID] > [文件名称]
导入:import
import是将export导出的文件导入为镜像,可以自定义导入的镜像名称和版本号。
- 格式:
docker import [文件名称] [自定义镜像名称]:[版本号]
# 导出到文件
docker export nginx > export_nginx.tar
# 导入为镜像
docker import export_nginx.tar import_nginx:v1
export导出的是容器,并没有源镜像的全部内容,比如会丢失构建历史和元数据信息等文件,相当于仅保存容器当时的快照状态,这会导致export导出的文件无法直接通过run命令运行,解决方法:运行时通过-it选项,给容器分配一个伪终端。
docker run -dit import_nginx:v1 sh
推荐使用commit来提交容器,然后再使用save保存镜像,能避免上述问题。
2.8.3 镜像的保存和载入
保存:save
save能将镜像完整的保存下来,包括镜像ID和构建历史。可用输出重定向
或-o选项
保存至tar包中,并且save支持将多个镜像保存至一个tar包中。
- 格式:
docker save -o [压缩包名称] [镜像名称或ID ...]
载入:load
load是将save保存的镜像文件载入为镜像。save保存时若使用镜像ID保存镜像,导入时则没有镜像名称,load在导入时也不能自定义镜像名称,可以在导入后使用docker tag命令修改。
- 格式:
docker load < [压缩包名称]
# 保存镜像到文件
docker save dc3bacd8b5ea > box_nginx.tar
# 将原镜像删除
docker rmi dc3bacd8b5ea
# 载入镜像(导入后ID还是原来的,但tag信息都为none)
docker load < box_nginx.tar
3. 容器命令
3.1 查看容器
docker ps
命令查看当前正在运行的容器
- 命令格式:
docker ps [选项]
# 查看正在运行中的容器
docker ps
# 查看所有容器(包括运行和停止)
docker ps -a
# 查看停止的容器(-f过滤)
docker ps -f status=exited
# -q: 静默模式,仅显示ID信息
docker ps -aq
# -n: 列出最近创建的 n 个容器。
docker ps -n 5
# -l: 查看最后一次运行的容器
docker ps -l
3.2 运行容器
docker run
命令将一个镜像运行为容器。
注意:Docker 容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为是空闲状态,就会自动退出。
- 命令格式:
docker run [选项] [镜像名称/镜像ID] [容器启动后内部执行的命令]
# -d : 以守护进程的方式运行。会创建一个守护式容器在后台运行,不会自动登录容器。(只加-it两个参数,创建容器后会自动进容器里)
# -p: 指定端口映射。格式: docker run -p 宿主机端口:容器对外暴露端口 [镜像名称:tag/镜像ID]
docker run -d -p 8090:80 nginx:1.19.2
# -P: 随机端口映射,随机使用宿主机的可用端口与容器内暴露的端口映射。
docker run -d -P nginx:1.19.2
# -i: 运行容器
# -t: 容器启动后会进入其命令行。加入这两个参数,容器创建就能登录进去。即分配一个伪终端,通常和-i连用
# 运行容器后执行bash命令。
docker run -ditP nginx bash
# -e: 在容器内设置一个环境变量。
docker run -d -e NGINX_NAME=nginx -e XX_NAME=xxx nginx:1.19.2
# -v: 映射存储卷,可以映射文件及目录。可以使用多个 -v 做多个文件映射。
docker run -d -v 宿主机文件路径:容器内文件路径 nginx:1.19.2
# --name: 指定容器的名称(为创建的容器命名),同一台宿主主机上的容器名称不能重复。
docker run -d --name 自定义容器名 -P nginx:1.19.2
# --rm: 当一个容器停止后,就立即删除。
docker run -d --rm nginx:1.19.2
3.3 进入容器
在使用容器的过程中,我们难免需要进入容器进行排查问题。
# 创建并进入容器
docker run -it --name 容器名称 镜像名称:标签 /bin/bash
# 注意:Docker容器运行必须有一个前台进程,如果没有前台进程执行,容器认为是空闲状态,就会自动退出。
下面来介绍进入正在运行的容器的四种方式。
3.3.1 attach
- 格式:
docker attach [容器名或ID]
通过管道,连接容器内PID=1的进程,容器至少有一个进程运行前台。attach 是最早 docker 官方推出的进入容器的命令了,使用该命令有一个问题,当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示,当所有窗口退出时,容器结束。
3.3.2 exec
(官方推荐)
- 格式:
docker exec [参数] [容器名或ID] [命令]
exec 是官方推出的有一个新的进入容器的命令,这也是目前推荐使用的进入容器的方式。这个命令相当于在容器中执行一个命令。
# 进入到指定容器内部并开启一个新的终端
docker exec -it 0cd4d9d94de2 sh
# 用这种方式相当于进入该容器,并且在退出时不会将容器停止。
# 守护方式创建容器
docker run -di --name 容器名称 镜像名称:标签
# 登录守护容器
docker exec -it 容器名称 /bin/bash
# 退出当前容器
exit
3.3.3 nsenter
- 格式示例:
nsenter --target $( docker inspect -f {{.State.Pid}} nginxv1 ) --mount --uts --ipc --net --pid
进入容器中,但不进入容器内的进程。
Nsenter 是 Linux 提供的命令,需要配合docker inspect
来使用(早期没有exec
命令时最常用的方式之一),Docker 是用 golang 语言开发,所以它也支持 go 语言的模板语法。
3.3.4 ssh
在容器里面安装一个 sshd 服务
在镜像(或容器)中安装 SSH Server,这样就能保证多人进入容器且相互之间不受干扰,没有使用 Docker 的情况就是这样做的,但是使用了 Docker 容器之后不建议使用 ssh 进入到 Docker 容器内。
3.4 退出容器
exit # 容器停止退出
Ctrl + P + Q # 容器不停止退出
3.5 容器的启动与停止
# 启动容器
docker start [容器ID / 容器名]
# 重启容器
docker restart [容器ID / 容器名]
# 停止容器
docker stop [容器ID / 容器名]
# 停止所有容器
docker stop -f $(docker ps -qa)
# 强制停止容器
docker kill [容器ID / 容器名]
3.6 刪除容器
- 命令:
docker rm [容器ID]
# 删除指定容器
docker rm bde00bc086cf
# 强制删除运行中的容器(使用SIGKILL信号)
docker rm -f bde00bc086cf
# 迭代删除所有容器
docker rm -f $(docker ps -aq)
3.7 查看容器日志
- 命令:
docker logs [option] [容器名称或ID]
# -t:显示时间戳。
docker logs -t b1a13dfe7105
# -f: 跟踪日志输出。类似tail -f命令。
docker logs -ft 容器id
# --tail N:仅列出最新N条容器日志。
docker logs --tail 10 b1a13dfe7105
3.7 容器文件拷贝
复制命令类似于 Linux 系统中的 scp 命令,是将宿主主机上的内容上传到容器中,也可能是将容器中的文件下载到宿主主机中。
- 从容器复制到宿主机:
docker cp [容器ID:容器内文件路径] 宿主机路径
- 从宿主机复制到容器:
docker cp 宿主机路径 [容器ID:容器内文件路径]
# 容器/usr 到 宿主机当前目录
docker cp d78575358e04:/usr ./
# 宿主机 到 容器/home下
docker cp ./export_nginx.tar d78575358e04:/home
3.8 目录挂载(容器数据卷)
在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,也就是说容器内的操作也会影响到宿主机,实现备份功能。
容器被删除的时候,宿主机的内容并不会被删除。如果多个容器挂载同一个目录,其中一个容器被删除,其他容器的内容也不会受到影响。
可通过docker volume
命令容器中挂载的数据卷信息
创建容器时添加 -v
参数,格式为宿主机目录:容器目录
,这属于指定目录挂载,有几种不同的挂载形式:
- 匿名挂载: 匿名挂载只需要写容器目录即可,容器外对应的目录会在
/var/lib/docker/volume
中生成。 - 具名挂载: 具名挂载就是给数据卷起了个名字,容器外对应的目录会在
/var/lib/docker/volume
中生成。 - 指定目录挂载: 上面示例的方式就属于指定目录挂载,这种方式的挂载不会在
/var/lib/docker/volume
目录生成内容。
# 匿名挂载
docker run -di -v /usr/local/data centos:7
# 具名挂载
docker run -di -v docker_centos_data:/usr/local/data centos:7
# 指定多目录挂载
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名
# 查看数据卷信息
docker volume ls
# 查看目录挂载关系: 通过 docker volume inspect 数据卷名称,可以查看该数据卷对应宿主机的目录地址。
docker volume inspect docker_centos_data