更详细的 Docker 操作方法

到目前为止,介绍了许多操作 Docker 的方法,现在来了解更详细的操作方法。

说穿了,其实还是下指令,今天指令将会介绍三个部分如下:

  1. Docker 子指令
  2. 操作 container
  3. 建立 container 的参数
  4. 检视元件的指令

Docker 子指令

目前已知道的元件有 image、container、volume、network 四种,其实它们分别有个自的子指令如下:

  • docker image
  • docker container
  • docker volume
  • docker network

今天简单介绍一下 docker imagedocker container 这两个子指令,这里同时复习过去提到的指令。

docker image

这个指令是用来管理 image 的,过去有提到的指令如下:

Docker image 子指令 对应过去提过的指令
docker image build docker build
docker image history docker history
docker image import docker import
docker image load docker load
docker image ls docker images
docker image pull docker pull
docker image push docker push
docker image rm docker rmi
docker image save docker rmi
docker image tag docker tag

这里有个很好用的指令是 docker image prune,它会把同时符合下面条件的「孤儿」image 移除。

  1. REPOSITORYTAG<none>
  2. 没有其他 image 或 container 依赖这个孤儿 image
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
<none>                       <none>              f9bb75ff4a9c        13 hours ago        56.2MB

以上面这个例子来说:

  1. 符合 REPOSITORYTAG<none> 条件
  2. 是否跟 image 有依赖关系可以用 docker image ls -f dangling=true | grep f9bb75ff4a9c 指令检查
  3. 是否跟 container 有依赖关系可以用 docker ps -a -f ancestor=f9bb75ff4a9c 指令检查

docker container

这个子指令也很直白,就是管理 container:

Docker container 子指令 对应过去提过的指令
docker container attach docker attach
docker container commit docker commit
docker container create docker create
docker container exec docker attach
docker container export docker export
docker container kill docker kill
docker container logs docker logs
docker container ls docker ps
docker container rm docker rm
docker container run docker run
docker container start docker start
docker container stop docker stop

过去已停止的 container 都是靠人工删,或是 --rm 让 Docker 自动删。现在介绍 docker container prune 指令,它可以清除没用的 container。清除的条件是所有停止的 container,包括刚建立未启动的状态也算停止的 container。

另外再介绍,如果是 Bash 的话,可以用下面这个指令无条件清除所有 container:

# -v 参数代表要顺便移除 volume。
docker rm -vf $(docker ps -aq)

操作 container

docker image 的操作方法几乎都说明过了,但 docker container 还有很多指令都没看过,下面会继续介绍。

docker container cp

这个指令与 Dockerfile COPY 有一半像,docker container cpCOPY 都可以把 host 的档案复制到 container,而只有 docker container cp 可以把 container 的档案复制到 host。

用法如下:

docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker container cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

一个例子如下:

# 把 container 里 build 好的 JAR 档复制出来
docker container cp jdk_container:/source/target ./

docker container diff

Hello Docker World 有提到,image 的内容是唯读的,而 container 内容是可读写。

这个指令可以查 container 档案系统,与 image 档案系统的差异,也就是 container 启动後,到底对档案系统做了哪些修改。

操控 process 状态

之前曾提到 docker stop 是送出 SIGTERM 信号、docker kill 则是送出 SIGKILL。这里笔者把相关的指令和对应的信号都列出来:

Docker 指令 信号
docker container kill SIGKILL
docker container pause SIGSTOP
docker container stop 先 SIGTERM,timeout 到了会改送 SIGKILL
docker container unpause SIGCONT

其他杂七杂八的指令

Docker 指令 用途
docker container port 查目前 host 与 container 有设定哪些 port forwarding
docker container rename 改 container 名称
docker container restart 先 stop 再 start
docker container stats 查看 container 的 CPU 与记忆体使用量
docker container top 观察 container process 状态,其实等於在 container 里下 ps 指令
docker container wait 执行後,会等到 container 结束,然後再把 exit code 印出

建立 container 的参数

使用 docker container create --help 指令,可以看到非常多参数可以使用。笔者也介绍蛮多参数了,这里列几个出来参考:

参数 用途
--add-host 新增 host 与 ip 的对照表,也就是 /etc/hosts 的表
--cpus 分配 CPU 资源
--device 分配 host 的装置
--dns 自定义 DNS server
--entrypoint 覆写 ENTRYPOINT 设定,注意这里会是 exec mode
--env-file 如果 env 族繁不及备载的话,可改用档案
--expose 揭露可以使用的 port
--gpus 分配 GPU 资源
--hostname 自定义 hostname
--ip 自定义 IP
--label 设定 metadata
--mac-address 自定义 MAC address
--memory 设定记忆体上限
--restart 设定自动重启机制
--volume-driver 使用 volume driver

以上面的例子可以发现几件事:

  1. Dockerfile 很多设定都可以在 docker run 阶段再覆盖
  2. CPU 与记忆体设定可以调整使用上限
  3. 网路设定几乎都可以客制化--网路是 container 对外沟通的重要管道之一
  4. Volume 设备也可以客制化--也是 container 对外沟通的管道

建议读者可以看过一轮,大致了解 Docker 可以控制 container 什麽样的设定。

docker container update

动态调整 container 的 CPU、memory、restart 机制等。

是的,volume 设定与网路设定是无法调整的,只能砍掉重练。但只要 docker volumedocker network 有配置好,砍掉重练是非常简单的。

检视元件的指令

四种元件都有各自的 inspect 指令:

docker image inspect
docker container inspect
docker volume inspect
docker network inspect

如 container,可以查出非常详细的 Volume 设定、网路设定、CPU、Memory 等资讯。

# Volume 设定
docker container inspect -f '{{json .Mounts}}' fdad097c5781

# 网路设定
docker container inspect -f '{{json .NetworkSettings}}' fdad097c5781

# CPU、Memory 资讯
docker container inspect -f '{{json .HostConfig}}' fdad097c5781

今日自我回顾

今天介绍的指令或参数,可以做更详细的设定,或查到更详细的资讯。Kubernetes 或其他 container orchestration 工具,其实就是用这些方法与资讯在管理 container 的,因此了解这些内容对於开发出适用於 container orchestration 工具的程序或 image,是非常有帮助的。


<<:  Button设计 自动跑码

>>:  Day28:Azure小白如何使用Azure Cache for Redis来存取常用资料

Day30 跟着官方文件学习Laravel-参赛心得

写铁人赛是一个非常有趣的过程,也让我在工作之余会继续接触程序,这次参赛的目的也算是整理自己在工作时需...

Day 17【ethers.js】ETHER. ETHER EVERYWHERE.

【前言】 这两天来记录 ethers.js 我觉得蛮重要的一些学习笔记,今天主要聚焦在一些常见名词...

InterSection

InterSection(集合) 以下会来实作怎麽找寻两个array的集合 先使用两个回圈来实作Bi...

[Day20] Google Map 评论爬虫详细教学

前一篇有提到url的连结不是Google店家页面的连结,需要透过Chrome的开发者工具才能找到~ ...

第28车厢-vw很好用我知道!但不小心就踩雷捏!

本篇介绍CSS单位,需要小心使用的观念 单位介绍 %: 相对父层的大小比例 vw(view por...