Oct 14, 2017
Docker 容器互联和自动构建
这里面两个技术是基于我的一个 dechat_docker 技术, 可以在 https://github.com/yantze/dechat_docker 找到。
Docker 容器互联
搭建 docker 服务,一般数据库和服务要分开最好,方便部署和扩展。我用了 Dockerfile 构建了一个 node-server 容器,另外外连 mysql,这是一般情况都会做的事情。
但因为写多个 Dockerfile 太麻烦,我直接用 docker-compose.yaml 写了一个自动初始化 mysql 官方镜像的 service,所以需要用到 node-server 里面的数据库 schema 文件。于是要用到容器互联的方法,下面是我写的一个 docker-compose.yaml 文件:
1 | version: '2' |
这里的 volumes:
块就是指定要共享 volume 的名称。然后在 services:
块里面添加 volumes
,一般情况下,类似代码里面的 ./mariadb-data:/var/lib/mysql:rw
这种,有 ./
或者 /
或者 ~/
这种指定了绝对路径或者相对路径的,都是把宿主机 mount 到容器中, 如果只是一个名称,就是指定一个共享容器。
在这段代码里面,node-server
会把自己的 /app/design
mount 到 db-schema
,于是 mysql-server
能访问到 /app/design
的内容,并且对 /app/design
里面的 sql 文件进行初始化。
另外,由于 mysql 初始化要一段时间,可以用 wait-for-it.sh
等到 mysql 启动完成后,再启动服务器。只需要在docker-compose.yaml
中添加 command 命令就好,这个会覆盖 Dockerfile
中的CMD
命令。
自动构建
dechat_docker 项目是下面的结构:
1 | ├── docker-compose.yaml |
一般情况下,Dockerfile 是放在原生项目里面,但试过后发现暂时不需要,现在统一管理会方便一点。因为需要管理 docker-compose.yaml
文件,方便统一编辑。
使用 docker cloud 自动编译的时候,一般是一旦 git push
后,自动构建 node-server
,但是现在用独立的 repo,就会使得自动构建失效,于是可以在构建页面添加触发器。然后把触发器放在 github 或者 bitbucket 中的 Webhooks
,一旦原来的项目发生了一次推送,就自动构建。
在构建的时候,一般在本地构建的命令是 docker build -t yantze/dechat-server:v1 .
,这里最后的 .
是构建情景的上下文,所以要把 node-server 指定为上下文,否则有可能会把 node-server
文件夹之外的内容复制到容器中(取决于 Dockerfile 怎么写)