接上篇文章中介绍了Docker容器基础的启动与停止. 这篇将会介绍几个Docker启动时的进阶操作, 包括磁盘挂载, 端口映射等.

容器磁盘挂载

我们什么时候会考虑将宿主机的文件或是目录挂载到容器中呢, 一般有这么几种情况:

  1. 公有配置文件
  2. 容器日志想保留在宿主机中
  3. 数据库目录
  4. 其他黑科技用法, 比如挂载socket, 挂载pid file, 之后会讲到

其实挂载的目的时为了当一个容器失效时, 其他容器再启动也能接着工作.

这里是Docker volumes官方文档, 挂载的命令很简单:

1
2
3
4
5
# 将本机的/tmp目录挂载为容器的/home/corvo/tmp目录
docker run -ti \
-v /tmp:/home/corvo/tmp \
debian\
/bin/bash

你不必担心文件或是文件夹不存在, 如果启动容器时, 挂载的文件夹不存在, Docker会主动 为你创建这一项.

端口映射

Docker 网络配置官方文档

端口映射主要是想将容器中的服务暴露给外部使用, 例如我们想要把容器中的80端口 当做宿主机的10080端口, 可以这样使用:

1
2
3
4
5
6
7
8
9
$ docker run \
-ti -p 10080:80 \
my_image \
python -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

$ netstat -tnlp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::10080 :::* LISTEN -

与宿主机网络和进程的交互

Docker run官方文档

这个部分主要介绍两个参数-net host, -pid host, 他们分别允许你使用宿主机的 网络空间以及进程空间.

对于-net host来说, 你可以直接访问到宿主机上开放的端口, 使用127.0.0.1即可. 而对于-pid host来说, 你可以使用ps -aux这种命令, 查看宿主机上的所有进程, 包括docker自己, 甚至, 如果你的docker用户有权限, 你甚至可以使用kill命令. 如果你还想进一步操作, 可以使用--privileged这种命令, 它可以保证你在容器中的 root用户与宿主机上的root用户拥有一样的权限.

上面的操作是有安全风险的, 如果我们只是想启动一个普通的web服务, 完全没必要使用, 写在这里, 只是为了说明docker有这么几项功能. 有关这几个命令的使用, 之后我会在Docker奇用的几个地方给出.

重启策略

官方的重启策略文档

使用--restart, 你可以指定重启的策略, 可以指定容器在什么时候应该重启或退出.

重启策略有4种, no, on-failure[:max-retries], always, unless-stopped,

详细的说明请大家参阅官方文档, 一般我使用unless-stopped居多, 也就是只要 容器没有自己退出, docker启动时就会将其启动. 假如机器重启了, docker能自动把 这些容器启动.