Docker 入门教程(九)Docker Compose

传统的本地环境一般是把 NGINX、MySQL、PHP 都在一台机器上安装好;
但是如果用于生产环境就非常不利于维护和扩展了;
Docker 中推崇一个服务就是一个容器;
我们上篇文章使用的 Dockerfile 都是定义的单个容器服务的镜像;
那容器与容器之间的关系怎么定义呢?
前面我们讲网络的时候通过命令行实现了容器的互通;
那有木有一种像 Dockerfile 类似的方案用来记录容器之间的关系?
没错这就是今天要讲的 Docker Compose ;

安装

还是以 Ubuntu 为例;
要使用 Docker Compose 同样是需要先安装;

apt install docker-compose

Dockerfile 类似的文件是 docker-compose.yml
根据后缀我们知道使用的是 YAML 语法;
如果对 YAML 不熟悉的可以先去搜索补补相关的知识再往下看了;
下面就是对 docker-compose.yml 的介绍了;

version

docker-compose.yml 的第一行是用来定义版本的;
允许的值我们可以从官网查询;
https://docs.docker.com/compose/compose-file

然后再查看我们的 Docker 版本号;

docker -v


也就是说我们最大可以使用 3.7 版本;

version: "3.7"

service

定义完版本接下来就是 service 了;
service 部分是我们的核心;
它定义了我们要使用那些服务;

比如说我们要使用Redis

version: "3.7"
services: 
  redis: # 服务名称
    image: redis:5 # 使用官方的 redis 5 镜像
    container_name: laravel-bjyblog-redis # 容器名称

image 跟我们前面教程中讲的是一个东西;

我们也可以指定自己制作的 image ;
比如说用我们上篇文章制作的 MySQL ;

version: "3.3"
services:
  # redis

  mysql:
    image: baijunyao/mysql
    container_name: laravel-bjyblog-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=laravel_bjyblog
      - MYSQL_DATABASE=laravel_bjyblog
      - MYSQL_USER=laravel-bjyblog
      - MYSQL_PASSWORD=laravel_bjyblog

这里用 environment 来定义环境变量;
作用是设置账号密码之类的;
更多可以定义的环境变量可以查看官方文档

再接下来我们把 NGINX 也加进来;

version: "3.3"
services:
  # Redis
  # MySQL

  nginx:
    image: baijunyao/nginx
    container_name: laravel-bjyblog-nginx
    ports:
      - "8082:80"

我们在 NGINX 服务中用 ports 定义了对外暴露的端口;

最后把 PHP 的镜像也加进来;

version: "3.3"
services:
  # Redis
  # MySQL
  # NGINX
  
  php:
    image: baijunyao/php:${APP_ENV}
    container_name: laravel-bjyblog-php
    tty: true

这里多了个没见过的 tty
它其实就是之前命令 docker -it 中的 t
表示需要一个交互界面启用 tty 特性;
另外这里还用了变量 ${APP_ENV}
但是我们并不能像 Dockerfile 中那样定义变量;
而是要把它定义在跟 docker-compose.yml 同目录的 .env 文件中;

APP_ENV=local

没错正好也就是 Laravel 中的 .env 文件;
还记得我们上篇文章中给 PHP 编写了两个镜像 localproduction
正是对应了 Laravel APP_ENV 的值 localproduction

volumes

我们需要持久化保存 MySQL 中的数据;
同时我们需要把我们的代码加载到容器中;
因此我们还需要 volumes
关于 volumes 可以参考之前的文章 Docker 入门教程(五)数据卷 Volumes

version: "3.3"
services:
  redis:
    image: redis:5
    container_name: laravel-bjyblog-redis

  mysql:
    image: baijunyao/mysql
    container_name: laravel-bjyblog-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=laravel_bjyblog
      - MYSQL_DATABASE=laravel_bjyblog
      - MYSQL_USER=laravel-bjyblog
      - MYSQL_PASSWORD=laravel_bjyblog
    volumes:
      - mysql:/var/lib/mysql

  nginx:
    image: baijunyao/nginx
    container_name: laravel-bjyblog-nginx
    volumes:
      - .:/app
      - ./docker/nginx/laravel-bjyblog.conf:/etc/nginx/conf.d/laravel-bjyblog.conf
    ports:
      - "8082:80"

  php:
    image: baijunyao/php:${APP_ENV}
    container_name: laravel-bjyblog-php
    tty: true
    volumes:
      - .:/app

volumes:
  mysql:

这里给 MySQL 创建了一个受管理的 volume
然后把当前目录下的代码分别挂载到了 NGINXPHP 容器的 /app 目录;
再给 NGINX 配置个虚拟主机;

server {
    listen       80;
    server_name  laravel-bjyblog.test;
    root   /app/public;
    index  index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
        include        fastcgi_params;
    }
}

完整的示例可以看这里 https://github.com/baijunyao/laravel-bjyblog

Docker Compose 命令

Docker Compose 也提供了跟 docker 类似的命令 docker-compose
比如说 docker-compose pull 就是对每个容器都执行 docker pull 命令;
docker-compose up 是启动所有容器;
还可以跟 docker run -d 一样 docker-compose up -d
docker-compose down 是停止所有容器;
如果想进入到 PHP 容器中就可以使用 docker-compose exec php bash

白俊遥博客
请先登录后发表评论
  • latest comments
  • 总共3条评论
白俊遥博客

gyp719:1 2 3

2019-12-06 14:16:09 回复

白俊遥博客

gyp719:123

2019-12-06 14:14:49 回复

白俊遥博客

nxshare:赞

2019-12-05 16:44:10 回复