Docker 常用命令
镜像命令
# 查看本地镜像 # -a:列出本地所有的镜像(含中间映像层) # -q:只显示镜像ID。 # --digests:显示镜像的摘要信息 # --no-trunc:显示完整的镜像信息 docker images -a # 搜索仓库镜像 # --no-trunc:显示完整的镜像描述 # --filter=stars=100:列出收藏数不小于指定值的镜像 # --filter=is-automated=true:只列出 automated build 类型的镜像 # --filter=is-official=true:显示官方镜像 docker search mysql --filter=stars=100 # 下载 mysql 镜像最新版 docker pull mysql docker pull mysql:latest # 下载 mysql 镜像 5.7.27 版 docker pull mysql:5.7.27 # 删除 mysql 镜像最新版 docker rmi mysql docker rmi mysql:latest # 删除 mysql 镜像 5.7.27 版 docker rmi mysql:5.7.27 # 强制删除 docker rmi -f 镜像ID # 强制删除多个 docker rmi -f mysql:latest mysql:5.7.27 docker rmi -f $(docker images -qa) # 删除 none 镜像 docker images | grep none | awk '{print $3 }' | xargs docker rmi docker rmi `docker images | grep '<none>' | awk '{print $3}'` docker rmi `docker images -q -f dangling=true` docker rmi $(docker images -q -f dangling=true)
其它命令
# 清理磁盘,删除关闭的容器,无用的数据卷和网络
docker system prune -a
容器命令
# 新建并启动容器,格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...] # 常用 OPTIONS:有些是一个减号,有些是两个减号 # --name="xxx":为容器指定一个名称; # -d:后台运行容器,并返回容器 ID,即启动守护式容器; # -i:以交互模式运行容器,通常与 -t 同时使用; # -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用; # -P:(大写)随机端口映射; # -p:(小写)指定端口映射,有四种格式: # ip:hostPort:containerPort # ip::containerPort # hostPort:containerPort # containerPort docker run --name="test" -it centos /bin/bash
可以看到 shell 已经进入到容器内
关于 -d 参数:
Docker 容器后台运行,就必须有一个前台进程。
容器运行的命令如果不是那些一直挂起的命令(比如运行 top,tail),就会自动退出。例如 docker run -d centos,然后使用 docker ps -a 进行查看, 会发现容器已经退出。
# 容器停止退出
exit
# 容器不停止退出
ctrl + P + Q
# 查看容器 # -a:列出当前所有正在运行的容器 + 历史上运行过的。 # -l:显示最近创建的容器。 # -n:显示最近n个创建的容器。 # -q:静默模式,只显示容器编号。 # --no-trunc:不截断输出。 docker ps -a
管理容器
# 启动容器 docker start 容器ID或容器名 # 重启容器 docker restart 容器ID或容器名 # 停止容器 docker stop 容器lD或容器名 # 强制停止容器 docker kill 容器ID或容器名 # 删除已停止的容器 docker rm 容器ID # 删除多个容器 docker rm -f $(docker ps -a -q) docker ps -a -q l xargs docker rm docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
查看容器日志
# 新建容器并运行 docker run -d centos /bin/sh -c "while true;do echo hello zzyy;sleep 2;done" # 查看最后十条日志 # -t:是加入时间戳 # -f:跟随最新的日志打印 # --tail 数字:显示最后多少条 docker logs -f -t --tail 10 容器ID
其它命令
# 查看容器内运行的进程 docker top 容器ID # 查看容器详情信息 docker inspect 容器ID # 容器开机自启动 docker update --restart=always 容器ID # 修改容器名字 docker rename 容器ID 新名称 # 进入正在运行的容器并以命令行交互 # attach:直接进入容器启动命令的终端,不会启动新的进程 # exec:是在容器中打开新的终端,并且可以启动新的进程 docker exec -it --user root 容器ID /bin/bash docker attach 容器ID # 从容器内拷贝文件到主机上,格式:docker cp 容器ID:容器内路径 目的主机路径 docker cp 960f553ed428:/tmp/abc.txt tmp/def.txt
数据卷命令
Docker 容器产生的数据在可写层,如果不通过 docker commit 生成新的镜像,使得数据成为镜像的一部分保存下来,那么当容器删除后,数据就没有了。Docker 提供了三种数据 Mount 方式:
这里主要记录 Volumes 方式,也就是图中的 Docker area,也是 Docker 推荐的方式。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷。特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
# 查看 docker volume ls # 类似于挂载目录 docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash # 也可以使用 docker volume create,默认挂载在宿主机的 /var/lib/docker/volumes/ 目录下 docker volume create 卷名称 docker run -it --volume 卷名称:/容器内目录 centos /bin/bash
可以看到这里把宿主机 /tmp 目录挂载到容器内 /home 目录了。也可以使用命令查看数据卷是否挂载成功。
docker inspect 容器ID
关于宿主机和容器之间数据同步
无论容器是运行还是停止,对宿主机的挂载目录所做的修改,在容器启动后都会映射到容器内对应目录。同样的,在容器内,对挂载目录的操作都会映射到宿主机对应目录。
挂载目录权限:https://docs.docker.com/engine/reference/run/#volume-shared-filesystems
docker run -it -v /宿主机目录:/容器内目录:ro centos /bin/bash
数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个容器(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。容器间传递共享:--volumes-from
docker run --name="cent0" -it -v /tmp:/home1 centos /bin/bash docker run --name="cent1" -it -v /tmp:/home2 --volumes-from cent0 centos /bin/bash docker run --name="cent2" -it -v /tmp:/home3 --volumes-from cent0 centos /bin/bash
创建三个容器:
- 第一个容器挂载 /tmp:/home,后面子容器挂载的目录不会影响父容器
- 第二个容器基于第一个容器,且又挂载了 /tmp:/home2,所以可以看到两个目录:/home1、/home2
- 第三个容器基于第一个容器,且又挂载了 /tmp:/home3,所以可以看到两个目录:/home1、/home3,与第二个容器无关
删除掉父容器再看子容器目录挂载情况
可以到删除父容器后不影响子容器的挂载目录。
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
https://docs.docker.com/storage/volumes
网络命令
# 查看 docker network ls