Docker Compose 使用经验总结

摘要:最近使用 docker-compose 构建了一个 sonarqube 的 server,其中学习了若干 docker-compose 的知识,在此总结一下创建过程中遇到问题(坑)

docker-compose

简单的说就是把一系列 docker 相关的东西放到一起,通过一个文件来 compose 这些内容,从而让孤立的点连成一条线或者组成一个面。通过这个文件能够快速重现复杂系统的搭建。

比较典型的场景就是,一个 web 服务需要数据库支持,同时可能还有 nginx 的反向代理需求,这样搭建该系统实际上是需要三个 docker 的容器,如果我们逐一创建然后再配置,当然没问题,但是这样做有很多缺点:

  1. 配置过程容易出错
  2. 配置过程不容易记录,从而很难简单的重现,大部分情况需要附加说明配置文档
  3. 如果更改配置,可能需要重新部署

如果使用 docker-compose,就能将多个 container 的关系提前定义好,就像一个乐谱,然后再使用 docker-compose 一下将定义好的容器和关系逐一建立,将乐谱演奏出来。这样一方面我们可以使用这个乐谱完整记录配置过程,其次该乐谱可以无限重复使用。所以搭建复杂的 docker 服务组,建议使用 docker-compose

docker-compose 学习

这里简单介绍 docker-compose 的学习,由于目前没有系统学习,只是根据目标来及时的学习,所以这里只说一下目前个人感想。

docker-compose 的学习分两部分:docker-compose 命令选项docker-compose.yml 文件的编写

最权威肯定是参考官方的文档:
前者参考:docker-compose cli 参考
后者根据版本参考(比如第二版)Compose file version 2 reference

基本官方文档能够解决大部分问题。

docker-compose 搭建 sonarqube 服务实例

sonarqube官方的 docker 镜像,以及 dockfile 的 Github 主页,但是其 docker-compose.yml 很久没有更新过,这里需要注意一些问题。

docker-compose.yml 解释

这里使用第二版,然后有两个 service:dbsonarqube。 顾名思义一个是数据库,另外一个就是 sonarqube 服务。服务下面的定义类似于 dockerfile,需要参考不同的镜像手册。

比如 postgres 镜像,需要使用 POSTGRES_USERPOSTGRES_PASSWORD 来设定数据库访问的用户名和密码。而 sonarqube 镜像需要配置三个参数:SONARQUBE_JDBC_USERNAME, SONARQUBE_JDBC_PASSWORD and SONARQUBE_JDBC_URL

所以这里原始的配置 sonarqube 缺少了两个变量,需要自行加入 SONARQUBE_JDBC_USERNAMESONARQUBE_JDBC_PASSWORD

多个服务关系如何表示?

使用 depends_on。 因为 sonarqube 依赖 db,所以 sonarqube 服务需要 depends_on db

volumes 如何定义

一般我们只需要把本地的路径映射到容器内部的路径。其中 :z 选项为 SELinux 相关:如果宿主机开启了 SELinux,如果不加 “:Z”,会报错权限不足:Permission denied。这涉及到label权限的问题。 默认情况下 docker 会打上label: svirt_sandbox_file_t。 宿主机上需要 mount的目录,此时需要打上同样的label:使用:z相当于执行语句:

另外如果将 volume 列在最下面而不定义本地路径,则表示使用 docker 默认的路径映射 volume.

自动重启

通过设定 restart: always 可以实现服务自动重启。注意所有的服务都需要重启,这个选项的默认值为 no,一般在测试 compose 文件的时候不要开启,成功运行后再重新打开。

哪些常用命令?

执行 compose: docker-composer up
停止运行: docker-composer down
删除:docker-composer rm

容器启动后可以使用 docker 的命令和容器交互。

比如查看容器是否设置的重启 docker inspect sonarqube | grep Restarting

其他问题

如果在测试 compose 文件时出错了,尤其是数据出错,需要删除在 volume 中生成的文件,否则再次执行 up 的时候还会失败。