KevinMeng

V1

2022/05/20阅读:26主题:自定义主题1

Docker-Cheat-Sheet

Docker Cheat Sheet

想要一起来完善这份速查表吗?参见贡献手册部分吧!

译者注:以下部分链接需科学上网后使用。

Due to GFW, varies links below could not be accessed in China Mainland.

目录

引言

什么是 Docker

Docker 是一个开源的虚拟化容器引擎,可以将开发的应用以及依赖包打包到一个可移植的容器中,便于开发、部署。

为何使用 Docker

「通过 Docker 开发者可以使用任何语言任何工具创建任何应用。“Dockerized” 的应用是完全可移植的,能在任何地方运行。不管是同事的 OS X 和 Windows 笔记本,或是在云端运行的 Ubuntu QA 服务,还是在虚拟机运行的 Red Hat 产品数据中心。

Docker Hub 上有 13000+ 的应用,开发者可以从中选取一个进行快速扩展开发。Docker 跟踪管理变更和依赖关系,让系统管理员能更容易理解开发人员是如何让应用运转起来的。而开发者可以通过 Docker Hub 的共有/私有仓库,构建他们的自动化编译,与其他合作者共享成果。

Docker 帮助开发者更快地构建和发布高质量的应用。」—— 什么是 Docker

仓管中心和仓库(Registry & Repository)

仓库 (repository) 镜像仓库是 被托管(hosted) 的已命名镜像 (tagged images) 的集合,是一组文件系统。

仓管中心 (registry) 除提供镜像仓库的*托管服务(host)*外,还提供镜像索引,以及 HTTP API,以便 管理仓库的上传和下载

Docker 官方的 仓管中心,包含着数量众多的仓库。有官方基础镜像,也有注册用户的镜像,这个仓管中心 并没有很好地验证镜像,所以如果你担心安全问题的话,慎重使用。

本地仓管中心

你可以使用 docker distribution 项目搭建本地的仓管中心,详情参阅 本地发布 (local deploy) 的介绍。

科学上网后,也可以看看 Google+ Group

登录、登出仓管中心

登录

docker login
sudo docker login --username=myadmin registry.cn-shanghai.aliyuncs.com

--username 用户名 默认 dockerhub, 可以改成私有或其他第三方仓库 eg:localhost:5000

登出管中心

docker logout
docker logout localhost:8080

查找

## 查找镜像
docker search nginx
docker search --no-trunc --automated -s 10 --limit 20 java

--no-trunc 完整描述信息

--automated 筛选自动构建的镜像

-s 10 收藏数 大于10

--limit 20 最多返回20条 (默认25)

镜像(Images)

镜像是 Docker 容器的模板

生命周期

  • docker pull 从仓管中心拉取镜像。

  • docker push 将镜像镜像推送至镜像仓管中心保存。

  • docker import 从归档文件创建镜像。

  • docker load 从标准输入 (STDIN) 加载归档包 (tar archive) 作为镜像,包括镜像本身和标签 (tags, 0.7 起)。

  • docker save 将镜像打包为归档包,并输出至标准输出 (STDOUT),包括所有的父层、标签和版本 (parent layers, tags, versions, 0.7 起)。

  • docker build 从 Dockerfile 创建镜像。

  • docker commit 为容器创建镜像,如果容器正在运行则会临时暂停。

  • docker rmi\docker image rm 删除镜像。

举例
## 拉取镜像
docker image pull nginx
docker image pull myadmin/nginx registry.cn-shanghai.aliyuncs.com/myadmin/nginx
## 推送镜像
docker image push eon01/nginx
docker image push eon01/nginx   localhost:5000/myadmin/nginx
# 打标签带仓库连接
docker image tag myadmin/nginx:latest    \
                 registry.cn-shanghai.aliyuncs.com/myadmin/nginx_new:v0.1
docker push registry.cn-shanghai.aliyuncs.com/myadmin/nginx_new:v0.1
## 构建镜像(build)
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 image rm nginx
## 载入镜像
docker image load < ubuntu.tar.gz
docker image load --input ubuntu.tar
##  将镜像保存为 Tar 包文件
docker image save busybox > ubuntu.tar
docker image save busybox --output  ubuntu.tar
##  将容器保存为镜像
docker container commit nginx

清理

虽然你可以用 docker rmi / docker image rm命令来删除指定的镜像,不过有个名为 docker-gc 的工具,它可以以一种安全的方式,清理掉那些不再被任何容器使用的镜像。Docker 1.13 起,使用 docker image prune 亦可删除未使用的镜像。参见 清理

举例

加载 / 保存镜像

从文件中加载镜像:

docker image load < my_image.tar.gz

保存既有镜像:

docker image save my_image:my_tag | gzip > my_image.tar.gz

导入 / 导出容器

从文件中导入容器镜像:

cat my_container.tar.gz | docker import - my_image:my_tag

导出既有容器:

docker export my_container | gzip > my_container.tar.gz

加载已保存的镜像 与 导入已导出为镜像的容器 的不同

通过 load 命令来加载镜像,会创建一个新的镜像,并继承原镜像的所有历史。

通过 import 将容器作为镜像导入,也会创建一个新的镜像,但并不包含原镜像的历史因此会比使用 load 方式生成的镜像更小。

其它信息

举例

## 列示镜像
docker image ls
docker image ls -a
## 镜像历史记录
docker image history busybox
## 为镜像打标签
docker image tag nginx eon01/nginx
## 推送镜像
docker image push eon01/nginx

容器(Container)

关于 Docker 进程隔离的基础

容器与虚拟机区别

vm与docker框架,直观上来讲vm多了一层guest OS,同时Hypervisor会对硬件资源进行虚拟化,docker直接使用硬件资源,所以资源利用率相对docker低

生命周期

通常情况下,不使用任何命令行选项启动一个容器,该容器将会立即启动并停止。若需保持其运行,使用 docker run -td container_id 命令。

  • -t 表示分配一个 pseudo-TTY 会话
  • -d 表示自动将容器与终端分离(也就是说在后台运行容器,并输出容器 ID)。

从 Docker 1.10 起,其内置一套各容器独立的 日志引擎,每个容器可以独立使用。你可以使用 docker run --log-driver=syslog 来自定义日志引擎(例如以上的 syslog)。

举例

# 创建 但不启动容器
docker container create --name infinite1 -it ubuntu:latest  /bin/bash
## 创建并运行容器
docker container run --name infinite -it ubuntu:latest  /bin/bash
docker run                \ 
    -it                    \
    --name mynginx          \
    -v ${PWD}/data:/data     \
    -p 3000:80                \
    --rm                       \
    nginx:1.13.12 

-it (i) 以交互模式运行容器,(t) 为容器重新分配一个伪输入终端

-v 绑定一个卷 宿主机目录:容器目录。 widows 下 -v "C:\Data":/data

-p 端口映射,格式为:宿主机端口:容器端口

--rm 容器结束运行时删除容器(临时容器)

# 更新容器
docker container update --cpu-shares 512 -m 300M infinite

--cpu-shares cpu 使用限制 0--1024 (100%)

-m 内存使用限制

# 重命名容器 (运行和停止的容器都可改名)
docker container rename oldNmae newName
## 删除容器
docker container rm myNginx
# 两个一样,删除所有停止的容器  -q 返回容器 id 
docker container rm  `docker container ls -a -q`
docker container rm  $(docker ps -a -q)

只有 stop 的容器才可以被删除,用 docker stop 停止容器. 为避免这种情况,启动时加上命令 --rm .

docker rm -v 删除容器时,同时删除与容器相关联的卷标。

启动和停止

SIGKILL 指令。

关于 Docker 实例崩溃后的重启策略,详见 本文

举例

## 在容器中执行命令
docker exec -it infinite ls -l
## 启动
docker container start infinite
## 关闭
docker container stop infinite
## 重新启动
docker container restart infinite
# 重连 进入容器
docker container attach infinite1
## 暂停容器
docker container pause infinite
## 继续运行
docker container unpause nginx

## 阻塞容器运行
docker container wait nginx

阻塞运行直到容器停止,然后打印出它的退出代码 (stop(0) kill(137))

## 杀掉容器 Sending a SIGKILL
docker container kill nginx
## 发送另外一个信号 -s  HUP 、KILL
docker container kill -s HUP nginx
docker container rm nginx
## 删除所有退出(exited)容器
docker container rm $(docker container ls -a -f status=exited -q)
## 删除所有停止容器
docker container rm `docker container ls -a -q`

信息

docker [container]

  • docker ps 查看运行中的所有容器。
  • docker stats 查看容器的资源使用量统计信息。
  • docker logs 从容器中读取日志。(你也可以使用自定义日志驱动,不过在 1.10 中,它只支持 json-filejournald)。
  • docker inspect 查看某个容器的所有信息(包括 IP 地址)。
  • docker events 从容器中获取事件 (events)。
  • docker port 查看容器的公开端口。
  • docker top 查看容器中活动进程
  • docker diff 查看容器文件系统中存在改动的文件。

举例

# 将显示所有容器,包括运行中和已停止的。
`docker ps -a` 
`docker container ps -a`
# 同样将显示所有容器,默认仅显示运行中的容器。
`docker stats -a` 
# 某个容器状态 cpu Mem
docker container stats infinite

docker logs mynginx
## 跟踪输出日志(Follow)
docker container logs mynginx -f
## 检查容器 所有信息
docker container inspect infinite
# 利用 GO 模板查看特定信息
docker container inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -q)
docker system events infinite
docker container port infinite
docker container top infinite
docker container diff infinite

导入 / 导出

  • docker cp 在容器和本地文件系统之间复制文件或目录。
  • docker export 将容器的文件系统打包为归档文件流 (tarball archive stream) 并输出至标准输出 (STDOUT)。

举例

docker cp /www/runoob 96f7f14e99ab:/www

执行命令

#  进入正在运行的 `foo` 容器,并连接 (attach) 到一个新的 Shell 进程
docker exec -it foo /bin/bash

CPU 限制

你可以限制容器 CPU 资源占用,无论是指定百分比,或是特定核心数。 设置 --c/--cpu-shares -- 1024 表示 100% CPU;512 表示 50%.

docker run -ti --c 512 agileek/cpuset-test

更多信息请参阅 https://goldmann.pl/blog/2014/09/11/resource-management-in-docker/#_cpu

通过 cpuset-cpus 可使用特定 CPU 内核。

docker run -ti --cpuset-cpus=0,4,6 agileek/cpuset-test

请参阅 https://agileek.github.io/docker/2014/08/06/docker-cpuset/ 获取更多细节以及一些不错的视频。

注意,Docker 在容器内仍然能够 看到 全部 CPU -- 它仅仅是不使用全部而已。请参阅 https://github.com/docker/docker/issues/20770 获取更多细节。

内存限制

同样,亦可给 Docker 设置 内存限制

docker run -it -m 300M ubuntu:14.04 /bin/bash

能力(Capabilities)

通过 cap-addcap-drop 设置Linux 的 Capability.参阅 capability ,助于提高安全性。

如需要挂载基于 FUSE 的文件系统,你需要结合 --cap-add--device 使用:

docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs
# 授予对某个设备的访问权限:
docker run -it --device=/dev/ttyUSB0 debian bash
# 授予对所有设备的访问权限:
docker run -it --privileged -v /dev/bus/usb:/dev/bus/usb debian bash

有关容器特权的更多信息请参阅 本文

网络(Networks)

Docker 具备 网络 功能。我并不是很了解它,所以这是一个扩展本文的好地方。文档 使用网络 指出,这是一种无需暴露端口即可实现 Docker 容器间通信的好方法。

生命周期

其它信息

建立连接

你可以 为容器指定 IP 地址

# 使用你自己的子网和网关创建一个桥接网络
docker network create --subnet 203.0.113.0/24 --gateway 203.0.113.254 iptastic

# 基于以上创建的网络,运行一个 Nginx 容器并指定 IP
$ docker run --rm -it --net iptastic --ip 203.0.113.2 nginx

# 在其他地方使用 CURL 访问这个 IP(假设该 IP 为公网)
$ curl 203.0.113.2

Dockerfile

当你执行 docker build 时,Docker 将会根据 配置文件 启动 Docker 容器。远优于使用 docker commit

以下是一些编写 Dockerfile 的常用编辑器,并链接到适配的语法高亮模块︰

指令

  • .dockerignore
  • FROM 为其他指令设置基础镜像 (Base Image)。
  • MAINTAINER (deprecated - use LABEL instead) 为生成的镜像设置作者字段。
  • RUN 在当前镜像构建的基础上生成一个新层并执行命令。
  • CMD 设置容器启动默认执行命令。
  • EXPOSE 告知 Docker 容器在运行时所要监听的网络端口。注意:并没有实际上将端口设置为可访问。
  • ENV 设置环境变量。
  • ADD 将文件、目录或远程文件复制到容器中。后续缓存无效。请尽量用 COPY 代替 ADD
  • COPY 将文件或文件夹复制到容器中。注意:将使用 ROOT 用户复制文件,故无论 USER / WORKDIR 指令如何配置,你都需要手动修改其所有者(chown),ADD 也是一样。
  • ENTRYPOINT 将容器设为可执行的。
  • VOLUME 在容器内部创建挂载点 (mount point) 指向外部挂载的卷标或其他容器。
  • USER 设置随后执行 RUN / CMD / ENTRYPOINT 命令的用户名。
  • WORKDIR 设置工作目录 (working directory)。
  • ARG 定义编译时 (build-time) 变量。
  • ONBUILD 添加触发指令,当该镜像被作为其他镜像的基础镜像时该指令会被触发。
  • STOPSIGNAL 设置停止容器时,向容器内发送的系统调用信号 (system call signal)。
  • LABEL 将键值对元数据 (key/value metadata) 应用到镜像、容器或是守护进程。

教程

例子

层(Layers)

Docker 的版本化文件系统是基于层的。就像 Git 的提交或文件变更系统 一样。

链接(Links)

链接 (links) 通过 TCP/IP 端口 实现 Docker 容器之间的通讯。Atlassian 展示了可用的例子。你还可以 通过主机名 (hostname) 链接

在某种意义上来说,该特性已经被 自定义网络 所替代。

注意: 如果你希望容器之间通过链接进行通讯,在启动 Docker 守护进程时,请使用 -icc=false 来禁用内部进程通讯。

假设你有一个名为 CONTAINER 的容器(通过 docker run --name CONTAINER 指定)并且在 Dockerfile 中,暴露了一个端口:

EXPOSE 1337

然后,我们创建另外一个名为 LINKED 的容器:

docker run -d --link CONTAINER:ALIAS --name LINKED user/wordpress

然后 CONTAINER 暴露的端口和别名将会以如下的环境变量出现在 LINKED 中:

$ALIAS_PORT_1337_TCP_PORT
$ALIAS_PORT_1337_TCP_ADDR

那么你便可以通过这种方式来连接它了。

使用 docker rm --link 即可删除链接。

通常,Docker 容器(亦可理解为「服务」)之间的链接,是「服务发现」的一个子集。如果你打算在生产中大规模使用 Docker,这将是一个很大的问题。请参阅The Docker Ecosystem: Service Discovery and Distributed Configuration Stores 获取更多信息。

卷标(Volumes)

Docker 的卷标 (volumes) 是 独立的文件系统。它们并非必须连接到特定的容器上。

生命周期

信息

卷标在不能使用链接(只有 TCP/IP)的情况下非常有用。例如,如果你有两个 Docker 实例需要通讯并在文件系统上留下记录。

你可以一次性将其挂载到多个 docker 容器上,通过 docker run --volumes-from

因为卷标是独立的文件系统,它们通常被用于存储各容器之间的瞬时状态。也就是说,你可以配置一个无状态临时容器,关掉之后,当你有第二个这种临时容器实例的时候,你可以从上一次保存的状态继续执行。

查看 卷标进阶 来获取更多细节。Container42 非常有用。

你可以 将宿主 MacOS 的文件夹映射为 Docker 卷标

docker run -v /Users/wsargent/myapp/src:/src

你也可以用远程 NFS 卷标,如果你觉得你 有足够勇气

还可以考虑运行一个纯数据容器,像 这里 所说的那样,提供可移植数据。

记得,文件也可以被挂载为卷标

暴露端口(Exposing ports)

通过宿主容器暴露输入端口相当 繁琐但有效的

例如使用 -p 将容器端口映射到宿主端口上(只使用本地主机 (localhost) 接口):

docker run -p 127.0.0.1:$HOSTPORT:$CONTAINERPORT --name CONTAINER -t someimage

你可以使用 EXPOSE 告知 Docker,该容器在运行时监听指定的端口:

EXPOSE <CONTAINERPORT>

但是注意 EXPOSE 并不会直接暴露端口,你需要用参数 -p 。比如说你要在 localhost 上暴露容器的端口:

iptables -t nat -A DOCKER -p tcp --dport <LOCALHOSTPORT> -j DNAT --to-destination <CONTAINERIP>:<PORT>

如果你是在 Virtualbox 中运行 Docker,那么你需要配置端口转发 (forward the port)。使用 forwarded_port 在 Vagrantfile 上配置暴露的端口范围,这样你就可以动态地映射了:

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  ...

  (49000..49900).each do |port|
    config.vm.network :forwarded_port, :host => port, :guest => port
  end

  ...
end

如果你忘记了将什么端口映射到宿主机上的话,可使用 docker port 查看:

docker port CONTAINER $CONTAINERPORT

最佳实践

这里有一些最佳实践,以及争论焦点:

安全(Security)

这节准备讨论一些关于 Docker 安全性的问题。Docker 官方文档 安全 页面讲述了更多细节。

首先第一件事:Docker 是有 root 权限的。如果你在 docker 组,那么你就有 root 权限。如果你将 Docker 的 Unix Socket 暴露给容器,意味着你赋予了容器 宿主机 root 权限

Docker 不应当作为唯一的防御措施。你应当使其更加安全可靠。

为了更好地理解容器暴露了什么,可参阅由 Aaron Grattafiori 编写的 Understanding and Hardening Linux Containers。这是一个完整全面且包含大量链接和脚注的容器问题指南,介绍了许多有用的内容。即使你已经加固过容器,以下的安全提示依然十分有帮助,但并不能代替理解的过程。

安全提示

为了最大的安全性,你应当考虑在虚拟机上运行 Docker。这是直接从 Docker 安全团队拿来的资料 -- slides / notes。之后,可使用 AppArmor、seccomp、SELinux、grsec 等来 限制容器的权限。更多细节,请查阅 Docker 1.10 security features

Docker 镜像 ID 属于 敏感信息 所以它不应该向外界公开。请将它们当作密码来对待。

阅读由 Thomas Sjögren 编写的 Docker Security Cheat Sheet:关于加固容器的不错的建议。

查看 Docker 安全测试脚本,下载 最佳实践白皮书

你应当远离使用非稳定版本 grsecurity / pax 的内核,比如 Alpine Linux。如果在产品中用了 grsecurity,那么你应该考虑使用有 商业支持稳定版本,就像你对待 RedHat 那样。虽然要 $200 每月,但对于你的运维预算来说不值一提。

从 Docker 1.11 开始,你可以轻松的限制在容器中可用的进程数,以防止 fork 炸弹。 这要求 Linux 内核 >= 4.3,并且要在内核配置中打开 CGROUP_PIDS=y。

docker run --pids-limit=64

同时,你也可以限制进程再获取新权限。该功能是 Linux 内核从 3.5 版本开始就拥有的。你可以从 这篇博客 中阅读到更多关于这方面的内容。

docker run --security-opt=no-new-privileges

以下内容摘选自 Container SolutionsDocker Security Cheat Sheet(PDF 版本,难以使用,故复制至此):

关闭内部进程通讯:

docker -d --icc=false --iptables

设置容器为只读:

docker run --read-only

通过 hashsum 来验证卷标:

docker pull debian@sha256:a25306f3850e1bd44541976aa7b5fd0a29be

设置卷标为只读:

docker run -v $(pwd)/secrets:/secrets:ro debian

在 Dockerfile 中定义用户并以该用户运行,避免在容器中以 ROOT 身份操作:

RUN groupadd -r user && useradd -r -g user user
USER user

用户命名空间(User Namespaces)

还可以通过使用 用户命名空间 -- 自 1.10 版本起已内置,但默认并未启用。

要在 Ubuntu 15.10 中启用用户命名空间 (remap the userns),请 跟着这篇博客的例子 来做。

安全相关视频

安全路线图

Docker 的路线图提到关于 seccomp 的支持。 一个名为 bane 的 AppArmor 策略生成器正在实现 安全配置文件

小贴士

链接:

清理

最新的 数据管理命令 已在 Docker 1.13 实现:

  • docker system prune
  • docker volume prune
  • docker network prune
  • docker container prune
  • docker image prune

df 命令

docker system df 将显示当前 Docker 各部分占用的磁盘空间。

Heredoc 声明 Docker 容器

docker build -t htop - << EOF
FROM alpine
RUN apk --no-cache add htop
EOF

最近一次的容器 ID

alias dl='docker ps -l -q'
docker run ubuntu echo hello world
docker commit $(dl) helloworld

带命令的提交(需要 Dockerfile)

docker commit -run='{"Cmd":["postgres", "-too -many -opts"]}' $(dl) postgres

获取 IP 地址

docker inspect $(dl) | grep -wm1 IPAddress | cut -d '"' -f 4

或使用 jq:

docker inspect $(dl) | jq -r '.[0].NetworkSettings.IPAddress'

或使用 go 模板

docker inspect -f '{{ .NetworkSettings.IPAddress }}' <container_name>

或在通过 Dockerfile 构建镜像时,通过构建参数 (build argument) 传入:

DOCKER_HOST_IP=`ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1`
echo DOCKER_HOST_IP = $DOCKER_HOST_IP
docker build \
  --build-arg ARTIFACTORY_ADDRESS=$DOCKER_HOST_IP 
  -t sometag \
  some-directory/

获取端口映射

docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' <containername>

通过正则匹配容器

for i in $(docker ps -a | grep "REGEXP_PATTERN" | cut -f1 -d" "); do echo $idone`

获取环境变量配置

docker run --rm ubuntu env

强行终止运行中的容器

docker kill $(docker ps -q)

删除所有容器(强行删除!无论容器运行或停止)

docker rm -f $(docker ps -qa)

删除旧容器

docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm

删除已停止的容器

docker rm -v `docker ps -a -q -f status=exited`

停止并删除容器

docker stop $(docker ps -aq) && docker rm -v $(docker ps -aq)

删除无用 (dangling) 的镜像

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

删除所有镜像

docker rmi $(docker images -q)

删除无用 (dangling) 的卷标

Docker 1.9 版本起:

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

1.9.0 中,参数 dangling=false 居然 用 - 它会被忽略然后列出所有的卷标。

查看镜像依赖

docker images -viz | dot -Tpng -o docker.png

Docker 容器瘦身

  • 在某层 (RUN layer) 清理 APT

这应当和其他 apt 命令在同一层中完成。 否则,前面的层将会保持原有信息,而你的镜像则依旧臃肿。

RUN {apt commands} \
  && apt-get clean \  
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
  • 压缩镜像
ID=$(docker run -d image-name /bin/bash)
docker export $ID | docker import – flat-image-name
  • 备份
ID=$(docker run -d image-name /bin/bash)
(docker export $ID | gzip -c > image.tgz)
gzip -dc image.tgz | docker import - flat-image-name

监视运行中容器的系统资源利用率

检查某个容器的 CPU、内存以及网络 I/O 使用情况,你可以:

docker stats <container>

按 ID 列出所有容器:

docker stats $(docker ps -q)

按名称列出所有容器:

docker stats $(docker ps --format '{{.Names}}')

按指定镜像名称列出所有容器:

docker ps -a -f ancestor=ubuntu

删除所有未标签命名 (untagged) 的容器:

## 删除无标签(untagged)镜像
docker image rm -f $(docker image ls | grep "^<none>" | awk "{print $3}")

通过正则匹配删除指定容器:

docker ps -a | grep wildfly | awk '{print $1}' | xargs docker rm -f

删除所有已退出 (exited) 的容器:

docker rm -f $(docker ps -a | grep Exit | awk '{ print $1 }')

将文件挂载为卷标

文件也可以被挂载为卷标。例如你可以仅仅注入单个配置文件:

# 从容器复制文件
docker run --rm httpd cat /usr/local/apache2/conf/httpd.conf > httpd.conf

# 编辑文件
vim httpd.conf

# 挂载修改后的配置启动容器
docker run --rm -ti -v "$PWD/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro" -p "80:80" httpd

系统环境

我用的是 Oh My ZshDocker 插件,它可以自动补全 Docker 命令。你的环境可能有所不同。

Linux

Docker 对于 Linux 内核版本的 最低要求3.10.x

MacOS

10.8「Mountain Lion」或更新版本。

检查版本

时刻关注你当前正在使用的 Docker 版本是十分重要的,这能够帮助你了解可用的特性。同时,可以让你在查找镜像时选择使用的版本。接下来让我们看看如何操作。

获取 Docker 服务版本:

docker version --format '{{.Server.Version}}'

你也可以输出原始的 JSON 数据:

docker version --format '{{json .}}'

附录

安装

Linux

Docker 官方提供了快速、易用的安装脚本:

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

如果你不想执行一个不明不白的 Shell 脚本,那么请看 安装说明,选择你在用的发行版本。

如果你是一个 Docker 超新手,那么你应当先去看看 系列教程

macOS

下载并安装 Docker Community Edition。如果你在使用 Homebrew-Cask,只需在命令行输入 brew cask install docker 即可。下载安装 Docker Toolbox 亦可。Docker For Mac 很赞,但是它的安装过程与 VirtualBox 不太一样。详情请查阅 比较

注意:Docker Toolbox 已经过时。你应当使用 Docker Community Edition,详见 Docker Toolbox

安装好 Docker Community Edition 后,点击 Launchpad 内的 Docker 图标。接着即可启动容器了:

docker run hello-world

好了,现在你有了一个运行中的 Docker 容器了。

分类:

后端

标签:

后端

作者介绍

KevinMeng
V1