Skip to main content

Docker 命令

本篇将 Docker 命令分为以下几个部分介绍

  • 镜像命令
  • 容器命令
  • 镜像容器持久化命令
  • 其他命令
tip

docker build 相关参考

docker compose 相关参考

镜像

拉取镜像 (pull)

docker pull REPO[:TAG]

列出现有镜像 (iamges)

docker images

删除镜像 (image rm)

docker image rm IMAGEID

其他技巧

组合起来删除所有镜像

docker image rm $(docker image ls -q)

容器

列出容器 (ps)

docker ps
docker ps -a # 列出所有容器(包括停止的)
docker ps -aq # 只列出容器 id (用于批量删除)

创建容器 (run)

docker run IMAGENAME
docker run -it IMAGENAME # 交互式运行容器,并分配一个伪终端
docker run -d IMAGENAME # 后台运行容器
# ps: 容器是否会长久运行,是和 docker run 指定的命令有关,和 -d 参数无关。
# 其他参数

# --name: 指定容器名字
# -p: 端口映射,格式为 host_port:container_port
# -v: 挂载卷,格式为 host_dir:container_dir
# --rm: 用完即删
# -e: 环境变量
info

可以查看下方的样例进行练习

进入容器 (attach)

"进入" 容器,可以使用 docker attach CONTAINERID 命令,但并不推荐,原因在下面会说。该命令是直接连接到容器中运行的 tty

启动容器 (start)

"启动"容器和上面的"创建"容器容易造成歧义。

创建: 镜像的实例化,创建后一般会直接启动

启动:是对 exited 状态的容器,进行重启

当使用 docker run -it 创建容器后,此时使用 exit 命令,会发现容器为退出状态

此时如果我们想要使用 docker attach CONTAINERID 进入容器,就会报错

我们需要先使用 docker start CONTAINERID 命令启动容器,再进入容器。或者直接使用 docker start -i CONTAINERID,即可直接连入容器,其等价于 docker start CONTAINERID && docker attach CONTAINERID

删除容器 (rm / prune)

docker rm CONTAINERID # 删除停止的容器
docker rm -f CONTAINERID # 可以删除正在运行的容器
docker container prune # 删除所有停止的容器

容器运行命令 (exec)

docker exec 是一个很强大的命令,它的作用是在指定的容器中执行命令,其用法如下

docker exec CONTAINERID CMD
docker exec -it CONTAINERID CMD # 在容器中交互式执行 CMD
docker exec -d CONTIANERID CMD # 在容器中后台执行 CMD

可能听起来比较抽象,但是多用几次就明白了,最常用的就是 docker exec -it CONTAINERID bash。用这种方法也可以连接到容器中,而且如果从这个 stdin 中 exit,不会导致容器的停止。这也是这种方式比 docker attach 更好的原因

其他比较常用的有

docker exec -it CONTAINERID mysql -uroot -p
docker exec -d CONTIANERID npm run dev

查看容器配置 (inspect)

docker inspect CONTAINERID

查看容器日志 (logs)

docker logs CONTAINERID
docker logs -f CONTAINERID # 跟随输出,类似 tail -f
docker logs --tail n CONTAINERID # 输出最后 n 行

样例

tip

在 docker 中,ID 都是可以缩写的,确保不重复即可。比如上文中的容器 ID 为 8f08....bfd55 ,在调用时可以只取前几位,只要不和其他容器冲突即可

镜像容器持久化命令

这部分包含以下几个内容:

  • 容器打包为镜像
  • 容器打包
  • 镜像打包

各个命令的作用如下图,在使用前,要搞清楚自己要做什么。一般常见的两个需求是:

  • 要将修改好的容器持久化为镜像,以创建更多的容器 —— 使用 docker commit
  • 要将本地的镜像打包为文件,以传输到其他设备使用 —— 使用 docker save & docker load

一般不推荐使用 docker export

容器打包为镜像 (commit)

warning

由于 docker 的分层结构,其实并不推荐使用 docker commit,仅适用于小型项目 or 临时需要。关于这个,笔者也会写一篇详细说明

docker commit CONTAINERID REPO:TAG
# 部分参数
--author "Castamere <castamerego@gmail.com>"
--message "修改了nginx网页"

打包好可以用 docker images 查看

镜像打包 (save & load)

把镜像打包为一个文件,用于在多个设备之间传输

docker save -o FILENAME REPO:TAG 
# 可以将需要的多个镜像打包为一个文件,方便传输
docker save -o FILENAME REPO:TAG REPO2:TAG2 REPO3:TAG3 ...
warning

使用 docker save -o FILENAME IMAGEID 也可以打包,有时会不小心使用该命令。但会导致再次导入时,丢失镜像元信息,库和版本等信息会全部丢失。有时莫名其妙导入之后,信息全是 None,就是这个原因

在另一台设备用 docker load -i FILENAME 即可导入

容器打包 (export & import)

该命令可以将容器打包为一个 tar 文件

docker export -o FILENAME IMAGEID

该命令可以将这个 tar 文件重新导入为镜像。注意,是镜像

docker import FILENAME [REPO]:[TAG]

关于 docker export 的问题,笔者会再写一篇文章单独讲,省流版就是: 一般用不到,别用

其他命令

查看储存占用

docker system df
Buy me a coffee ☕:
This article is licensed under CC 4.0 BY-SA