最近搞了挺多 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 做保姆的日子啊! 那天皇上说这句话的时候, 差点眼泪都出来了

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