Command-line reference: https://docs.docker.com/reference/
常用命令
帮助命令
docker version
docker info
docker <COMMAND> --help
镜像基本命令
# 查看所有本地主机上的镜像
docker images
-a, --all
-q, --quiet # 只显示镜像的 id
# 搜索镜像
docker search
-filter=STARS=3000 # 搜索 stars 大于 3000 的镜像
# 下载镜像
docker pull <IMAGENAME>[:<TAG>]
# 如果不写 tag, 默认是 latest
# 删除镜像
docker rmi -f <IMAGE ID> # 删除指定镜像, `rmi`=`remove image`
docker rmi -f <IMAGE ID> <IMAGE ID> <IMAGE ID> # 删除多个镜像
docker rmi -f $(docker images -aq) # 删除全部容器
容器基本命令
# 新建并启动容器
docker run [optional parameters] <IMAGE>
--name <NAME> # 将新容器命名为 NAME
-d # 以后台方式运行
-it # 使用交互方式运行
# 例如 sudo docker run -it centos /bin/bash
-p # 指定容器的端口, 有下面三种形式
-p <IP ADDRESS>:<HOST PORT>:<CONTAINER PORT>
-p <HOST PORT>:<CONTAINER PORT> # 最常用的一种形式
-p <CONTAINER PORT>
-P # 随机指定端口
# 列出所有运行中的容器
docker ps [optional parameters] # 列出当前正在运行的容器
-a # 列出所有容器, 包括正在运行的和历史上运行过的
-n=<NUMBER> # 显示最近创建的 NUMBER 个容器
-q # 只显示 container id
# 退出容器
exit # 退出并停止容器
`Ctrl`+`P`+`Q` # 退出但不停止容器
# 删除容器
docker rm [optional parameters] <CONTAINER ID> # 删除指定容器
-f # 强制删除指定容器
docker rm -f $(docker ps -aq) # 强制删除所有容器
sudo docker ps -aq | xargs sudo docker rm -f # 同上, 只不过使用了管道
# 启动和停止容器
docker start <CONTAINER ID>
docker restart <CONTAINER ID>
docker stop <CONTAINER ID> # 执行清理操作后停止指定容器
docker kill <CONTAINER ID> # 强制停止指定的容器
查看日志, 元数据, 进程
# 查看日志
docker logs -tf --tail <NUMBER> <CONGTAINER ID> # 打印容器的倒数 NUMBER 条日志
-t #一并打印时间
# 可以以 sudo docker run -d centos /bin/sh -c "while true;do echo oldiron666;sleep 1;done" 为例
# 坑:
# 新建容器 `docker run -d <IAMGE NAME>` 后, 使用 `docker ps` 查看新容器状态, 发现新容器停止了.
# 原因是 docker 容器使用 `-d` 后台运行时, 必须要有一个前台进程, 若 docker 发现没有后台进程,
# 则自动停止.
# 常见的坑还有部署 nginx 后, 发现自己并没有提供服务, 就会立刻停止.
# 查看容器的进程信息
docker top <CONTAINER ID> # 查看容器进程信息
# 查看容器的元数据
docker inspect <CONTAINER ID>
进入容器的命令和拷贝命令
# 进入当前正在运行的容器
# 方式一:
docker exec -it <CONTAINER ID> <SHELL PATH>
# 例如: sudo docker exec -it d6f5164b1a2b /bin/bash
# 方式二:
docker attach <CONTAINER ID>
# 两者的区别是: `docker exec` 会在进入容器后开启一个新的终端, 较为常用;
# `docker attach` 会进入容器正在执行的终端, 不会启动新的进程.
# 拷贝命令
docker cp <PATH> <PATH>
# 例如: sudo docker cp d6f5164b1a2b:/home/FileInDocker.java /home/wan
# 或 sudo docker cp /home/wan/FileInHost.java d6f5164b1a2b:/home/
# 拷贝是是个手动过程, 后面使用 `-v` 数据卷技术更方便