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

    • 又一年
    • 不是柠檬、为何心酸
    • Music音乐鱼
    • CAIException
白俊遥博客
请先登录后发表评论
  • latest comments
  • 总共18条评论
白俊遥博客

CAIException 白俊遥博客

2020-08-06 21:35:49 回复

白俊遥博客

黑暗鼠标 :https://baijunyao.com/article/220

2020-05-27 00:37:57 回复

白俊遥博客

qq851145971 :3

2020-04-07 01:03:05 回复

白俊遥博客

Cxb :1

2020-04-02 00:14:15 回复

白俊遥博客

不是柠檬、为何心酸 :2

2020-04-02 00:17:51 回复

白俊遥博客

Butonix 白俊遥博客

2020-02-04 01:48:56 回复

白俊遥博客

ihz :大佬,装完你这个博客模板后,写文章换行不起作用

2020-01-15 16:21:07 回复

白俊遥博客

哈哈 :aaaaaaaaaaa

2020-01-07 21:31:19 回复

白俊遥博客

碗杯碟筷勺 :php环境在docker容器里面,请问怎么执行composer命令安装laravel项目中的扩展包。要在宿主机安装php环境再安装composer这样的方式吗?

2020-01-02 17:37:01 回复

白俊遥博客

. 白俊遥博客白俊遥博客白俊遥博客

2019-12-25 10:23:29 回复

白俊遥博客

素手挽歌✨ :赞

2019-12-21 00:04:22 回复

白俊遥博客

rantrism :作者,你好!我是腾讯云+社区的小编,关注了您分享的技术文章,觉得很棒,我们诚挚邀请您加入云+社区,与我们众多的社区作者一起为开发者分享技术干货。这个是我们云+社区【腾讯云自媒体分享计划】入驻流程和权益介绍的地址:https://cloud.tencent.com/developer/support-plan 如果您愿意加入或者想了解更多的信息请联系我~微信:techou002,我们对您的加入充满期待。

2019-12-20 15:04:57 回复

白俊遥博客

. :6666

2019-12-25 10:27:31 回复

白俊遥博客

momostar :咯恐怕

2020-03-07 18:53:47 回复

白俊遥博客

Music音乐鱼 :你好

2020-05-10 08:17:09 回复

白俊遥博客

momostar 白俊遥博客

2020-03-07 19:03:28 回复

白俊遥博客

ÒwÓ 白俊遥博客

2019-12-18 13:29:40 回复

白俊遥博客

nxshare :赞

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