在macos下使用docker-compose

本文说明docker-composemacos下的使用方法,文章里面的大部分说明也适用于其他操作系统。我们可以用wordpressmysql服务作为例子,撰写docker-compose.yml如下(docker-compose-playground/docker-compose.yml at master · liweinan/docker-compose-playground · GitHub):

version: '3'

services:
  db:
    image: mysql:5.7
    volumes:
      - /backups/mysql:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:5.1.1-php7.3-apache
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
    working_dir: /var/www/html
    volumes:
      - ./wp-content:/var/www/html/wp-content
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini

上面的mysql数据库使用了host的本地目录,位于/backups/mysql。我们要创建这个目录:

$ sudo mkdir -p /backups/mysql

使用root权限创建完目录,要把目录的owner改为当前用户:

$ sudo chown -R `whoami` /backups/mysql

修改完成后查看目录权限设置正确了:

$ ls -ld /backups
drwxr-xr-x  3 weli  wheel  96 May  7 12:14 /backups
$ ls -dl /backups/mysql/
drwxr-xr-x  2 weli  wheel  64 May  7 12:14 /backups/mysql/

上面的目录创建过程完整记录如下:

可以看到目录的owner设置为当前用户了。接下来是配置macos的docker app,添加/backups为共享目录。点击docker app的menu icon,然后在弹出菜单选择Preferences...

进入配置菜单,选择File Sharing,添加/backups,然后点击Apply & Restart

等待docker app重启完成。此时在docker-compose.yml所在目录执行启动命令:

$ docker-compose up

可以看到docker-compose启动两个容器的过程:

启动过程如上所示,启动后,我们可以查看下两个容器的运行状态。命令如下:

$ docker ps

查询结果如下:

可以看到两个运行起来的容器。其中,wordpress_1这个容器的端口映射是8000->80。我们可以访问host映射出来的8000端口试试看:

可以看到,wordpress已经工作。此时查看docker-compose服务的输出:

可以看到wordpress_1容器输出的日志。此外,在上面的容器启动过程中,mysql这个容器会创建和初始化数据库,然后wordpress会试图连接mysql这个容器。mysql这个容器在启动过程中,wordpress这个容器会去尝试连接mysql这个容器的数据库,但是因为mysql这边还没启动完,所以wordpress会尝试多次连接。有关于容器的启动顺序的具体配置,可以查看docker的文档:

配置完成后,我们看看host的目录内容:

我们也可以像使用普通容器一样,登录docker-compose启动起来的容器:

当我们想停掉这两个容器的服务的时候,不要直接使用docker命令来关掉,而是要用docker-compose来关掉。还是回到docker-compose.yml所在的目录,执行关停命令:

$ docker-compose down

关停过程如下:

需要注意的一点是,在关停容器以后,docker-compose还会销毁掉它创建的容器。因此,不要在容器内部保存业务数据,,因为每次docker-compose的关停服务都会销毁它创建的容器,再次启动的时候会重新创建容器。

所以在设计docker-compose所使用的容器的时候,要注意把业务数据映射到host目录上进行保存。我们可以看看wordpressmysql两个容器所生成的数据。首先是wordpress容器在host上生成的数据:

可以看到uploads.iniwp-content两个数据目录,这个是wordpress容器所生成的。然后是mysql的数据库所生成的数据:

可以看到mysql的数据,按我们的设置,保存在host/backups/mysql/目录里面。上面的目录映射,是在docker-compose.yml里面配置的:

如上所示,我们对host目录和容器内目录做了映射。当我们再次启动这两个容器的时候,就不会再次创建这些业务数据了,下面是两个容器的再次启动过程:

可以看到,再次启动的时候,两个容器的启动速度快多了,因为没有了初始化数据的过程。所以说,docker-compose的容器设计也是要考虑到业务数据放在容器外的问题,要注意到容器是无状态的这个特性。

我们可以在docker-compose.yml这个文件里面看到两个容器所使用的images:

分别是mysql:5.7wordpress:5.1.1-php7.3-apache。所以这两个images,它们的Dockerfile,是要拿来学习的,看看他们的入口脚本和设置,就可以更好理解上面这些参数是怎么样被使用,并协同工作的。

以上就是关于docker-compose的一些使用说明,具体还是要在实战中多积累经验。