Docker 是一个开放平台,帮助开发和运维在笔记本、数据中心虚拟机、甚至云环境里,以统一的方式构建、打包和运行应用。

这篇文章是一份 Docker 命令速查表:方便我自己忘了某条命令的时候快速翻一眼就能用。


安装 Docker(Installation)

先把 Docker 装起来,后面所有命令才有用。不同系统的安装方式略有差异。

Linux

curl -sSL https://get.docker.com/ | sh

使用官方脚本一键安装 Docker。 用于本地开发很方便,生产环境建议优先参考各发行版的官方指南。

Mac

下载 Docker Desktop 的 dmg 安装包:

下载 Docker for Mac

Windows

使用 MSI 安装包:

下载 Docker for Windows


镜像仓库与镜像仓库操作(Docker Registries & Repositories)

这一部分是和镜像仓库打交道:登录、搜索、拉取、推送等日常操作。

登录到镜像仓库(Login to a Registry)

docker login
docker login localhost:8080

退出镜像仓库(Logout from a Registry)

docker logout
docker logout localhost:8080

搜索镜像(Searching an Image)

docker search nginx
docker search nginx --stars=3 --no-trunc busybox

可以通过星级、是否截断等参数做简单筛选。

拉取镜像(Pulling an Image)

docker pull nginx
docker pull eon01/nginx localhost:5000/myadmin/nginx

推送镜像(Pushing an Image)

docker push eon01/nginx
docker push eon01/nginx localhost:5000/myadmin/nginx

推送前记得先登录对应 registry,并配置好 tag。


运行容器(Running Containers)

这里是一组把镜像“变成跑起来的容器”的基本操作。

创建容器(但不启动)(Creating a Container)

docker create -t -i eon01/infinite --name infinite

只创建,不马上运行。适合先创建好容器,再手动调整配置或启动。

直接运行容器(Running a Container)

docker run -it --name infinite -d eon01/infinite

最常用的一条:基于镜像新建并启动容器。

  • -it:交互式终端
  • -d:后台运行

重命名容器(Renaming a Container)

docker rename infinite infinity

删除容器(Removing a Container)

docker rm infinite

更新容器资源限制(Updating a Container)

docker update --cpu-shares 512 -m 300M infinite

运行中也可以调整容器的 CPU / 内存限制。


启动与停止容器(Starting & Stopping Containers)

日常使用中,最常用的就是这一组启停命令。

启动(Starting)

docker start nginx

停止(Stopping)

docker stop nginx

重启(Restarting)

docker restart nginx

暂停(Pausing)

docker pause nginx

恢复(Unpausing)

docker unpause nginx

阻塞等待容器退出(Blocking a Container)

docker wait nginx

等待容器退出,并返回退出码。常用于脚本中做流程控制。

发送 SIGKILL(Sending a SIGKILL)

docker kill nginx

直接“强杀”。比 docker stop 粗暴,除非必要,一般先用 stop

附着到已有容器(Connecting to an Existing Container)

docker attach nginx

把当前终端“接”到正在运行的容器上,查看输出或交互。


查看容器信息(Getting Information about Containers)

想知道“有哪些容器在跑”“里面在干嘛”“资源占用如何”,就看这里。

查看运行中的容器(Running Containers)

docker ps
docker ps -a

查看容器日志(Container Logs)

docker logs infinite

排查问题时第一反应通常就是看日志。

检查容器详情(Inspecting Containers)

docker inspect infinite
docker inspect infinite --format '' $(docker ps -q)

inspect 会给出非常详细的 JSON 信息,可以配合 --format 提取需要的字段。

容器事件(Container Events)

docker events infinite

暴露端口(Public Ports)

docker port infinite

查看容器进程(Running Processes)

docker top infinite

容器资源使用情况(Container Resource Usage)

docker stats infinite

类似一个“docker 版的 top/htop”。

查看容器文件系统变更(Inspecting Changes to Files or Directories)

docker diff infinite

看看容器相对于镜像,哪些文件被新增、修改或删除。


镜像管理(Manipulating Images)

列出、构建、保存和删除镜像的常用命令都在这里。

列出镜像(Listing Images)

docker images

构建镜像(Building Images)

docker build .
docker build github.com/creack/docker-firefox
docker build - < Dockerfile
docker build - < context.tar.gz
docker build -t eon/infinite .
docker build -f myOtherDockerfile .
curl example.com/remote/Dockerfile | docker build -f - .

Docker 支持多种构建上下文:本地目录、tar 包,甚至远程 Dockerfile。

删除镜像(Removing an Image)

docker rmi nginx

从文件或标准输入加载镜像(Loading a Tarred Repository)

docker load < ubuntu.tar.gz
docker load --input ubuntu.tar

将镜像保存为 tar(Saving an Image)

docker save busybox > ubuntu.tar

查看镜像历史(Showing the History of an Image)

docker history

从容器创建镜像(Creating an Image From a Container)

docker commit nginx

适用于“调试完一个临时容器,想把当前状态固化成镜像”的场景。

给镜像打标签(Tagging an Image)

docker tag nginx eon01/nginx

推送镜像(Pushing an Image)

docker push eon01/nginx

网络(Networking)

当你开始有多个容器、多个服务,需要它们“互相说话”时,就会用到这些命令。

创建网络(Creating Networks)

docker network create -d overlay MyOverlayNetwork
docker network create -d bridge MyBridgeNetwork
docker network create -d overlay \
  --subnet=192.168.0.0/16 \
  --subnet=192.170.0.0/16 \
  --gateway=192.168.0.100 \
  --gateway=192.170.0.100 \
  --ip-range=192.168.1.0/24 \
  --aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" \
  --aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" \
  MyOverlayNetwork

删除网络(Removing a Network)

docker network rm MyOverlayNetwork

列出网络(Listing Networks)

docker network ls

查看网络详情(Getting Information About a Network)

docker network inspect MyOverlayNetwork

将运行中的容器接入网络(Connecting a Running Container)

docker network connect MyOverlayNetwork nginx

容器启动时指定网络(Connecting a Container When it Starts)

docker run -it -d --network=MyOverlayNetwork nginx

将容器从网络中断开(Disconnecting a Container)

docker network disconnect MyOverlayNetwork nginx

清理 Docker 环境(Cleaning Docker)

这一节大多是“重锤操作”,可以帮你快速清理环境,但也很容易删多了。尤其在生产环境,动手前务必三思。

删除运行中的容器(Removing a Running Container)

docker rm nginx

删除容器及其卷(Removing a Container and its Volume)

docker rm -v nginx

删除所有已退出容器(Removing all Exited Containers)

docker rm $(docker ps -a -f status=exited -q)

删除所有停止容器(Removing All Stopped Containers)

docker rm `docker ps -a -q`

删除镜像(Removing a Docker Image)

docker rmi nginx

删除悬空镜像(Removing Dangling Images)

docker rmi $(docker images -f dangling=true -q)

删除所有镜像(Removing all Images)

docker rmi $(docker images -a -q)

停止并删除所有容器(Stopping & Removing all Containers)

docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)

删除悬空卷(Removing Dangling Volumes)

docker volume rm $(docker volume ls -f dangling=true -q)

Docker Swarm 简要速查(Docker Swarm)

最后是一小节 docker swarm 的命令,用于快速搭建和管理一个简单的 Docker 集群。

安装 Docker Swarm(Installing Docker Swarm)

curl -ssl https://get.docker.com | bash

初始化 Swarm(Initializing the Swarm)

docker swarm init --advertise-addr 192.168.10.1

获取 worker 加入集群的命令(Getting a Worker to Join)

docker swarm join-token worker

获取 manager 加入集群的命令(Getting a Manager to Join)

docker swarm join-token manager

查看服务(Listing Services)

docker service ls

查看节点(Listing Nodes)

docker node ls

创建服务(Creating a Service)

docker service create --name vote -p 8080:80 instavote/vote

查看 Swarm 任务(Listing Swarm Tasks)

docker service ps

扩缩容服务(Scaling a Service)

docker service scale vote=3

更新服务(Updating a Service)

docker service update --image instavote/vote:movies vote
docker service update --force --update-parallelism 1 \
  --update-delay 30s nginx
docker service update --update-parallelism 5 \
  --update-delay 2s --image instavote/vote:indent vote
docker service update --limit-cpu 2 nginx
docker service update --replicas=5 nginx