Docker FAQ

最近搞了挺多 docker 的事情, 已经快把涛涛烦死了… 涛涛说我觉得被你问久了我已经学会怎么使用 docker 了, 然后要我写一个 docker 的 FAQ, 暂时只能想到这么多, 以后慢慢补吧.


Q: 怎么样让一个 docker 容器跑好几个应用?

A: 官方并不推荐这么使用.

一个容器应该只跑一个应用, 相互有关联的应用应该通过 docker link 来联系起来.


Q: 如果我用一个 shell 脚本启动好几个应用, 他退出了, 怎么办?

A: docker 侦测到前台的进程都结束之后, 就会自动退出.

所以如果你一定要这么做并且不这么做会死的话, 请在 shell 最后加上

while true; do 
    sleep 1; 
done; …

实际上并不推荐这么做, 原因请看上面那个问题.

Q: 怎么样让 docker 只跑 nginx

A: 这个问题其实等价于怎么样关掉 nginx 的 daemon 模式.

在 nginx.conf 里加上 daemon off; 即可.

也可以在 Dockerfile 里这样:

RUN echo "daemon off;" >> /etc/nginx/nginx.conf

Q: 怎么样在 CentOS 7上安装 docker

A: 不用最新的可以参考6的.

CentOS 7 使用的 systemd 在 /usr/lib/systemd/system 下.

因此先获取 docker 的二进制可执行文件, 安装到比如 /usr/local/bin 下, 然后写一个 systemd 的 service, 例如:

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io
After=network.target

[Service]
Type=notify
ExecStart=/usr/local/bin/docker -d --selinux-enabled -H unix:///var/run/docker.sock
Restart=on-failure
LimitNOFILE=1048576
LImitNPROC=1048576

[Install]
WantedBy=multi-user.target

用 systemctl 加入 service, 然后 service docker start 即可. 直接 docker -d 是无法真正进入 daemon 模式的, 日志还在往 stdout 输出.


Q: CentOS 6 呢?

A: C6 更加简单, 加 epel, yum install docker-io.


Q: 我可以去哪里找到有用的 Dockerfile?

A: 这里


Q: 我怎么样在一个 docker 容器内部获得容器的消息?

A: 听起来很像一个人被关在一个暗室里, 怎么样知道自己的所处位置…

docker 的容器内部默认写了一个叫做 HOSTNAME 的环境变量, 这个变量就是所属容器的 container id, 12位长度, 已经足够区分了. 如果需要更多的容器信息, 可以在容器里也安装个 docker, 然后使用 inspect, 或者把 docker.sock 给映射进容器, 用 RESTful 的 API 去获取信息.


这几天除了在写部署的 master, 还兼职做了一些 SA 的工作, 部署 logstash, elasticsearch, 安装 docker, 安装 go 的环境… 我觉得我大学以后真的就没接触过这么多 Linux 的事情了, 而且还不是 Ubuntu, 还是可怕的 CentOS… 默认的 Python 居然是 2.6 的, 我写个 {c.id for c in containers} 都不行… 而且 2.6 下的 SQLAlchemy 的命名也不一样, scoped_session 叫做 ScopedSession … 总之真的是把人都搞醉哒. 话说最近醉了这个说法好流行哦, 是湖南台带起来的么, 这不是一句古老的长沙方言么¬ ¬

好怀念豆瓣有高大上的优秀 SA 做保姆的日子啊! 那天皇上说这句话的时候, 差点眼泪都出来了

好吧擦完眼泪明天还要继续干活… ¬ ¬ 车车还不到, 等死人了…