Docker Compose 跟 Dockerfile 类似的文件是 docker-compose.yml

根据后缀我们知道使用的是 YAML 语法

version

docker-compose.yml 的第一行是用来定义版本的;

允许的值我们可以从官网查询;https://docs.docker.com/compose/compose-file

version: "3.7"

service

定义完版本接下来就是 service 了;

service 部分是我们的核心;定义了要使用那些服务;

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

image 跟Docker image中是一个东西;

可以指定自己制作的 image ;

version: "3.3"
services:
  # redis

  mysql:
    image: xmlwch/mysql
    container_name: lnmp-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=hardwork
      - MYSQL_DATABASE=test
      - MYSQL_USER=Niord
      - MYSQL_PASSWORD=hardwork

这里用 environment 来定义环境变量;

作用是设置账号密码之类的;

更多可以定义的环境变量可以查看官方文档

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

version: "3.3"
services:
  # Redis
  # MySQL

  nginx:
    image: xmlwch/nginx
    container_name: lnmp-nginx
    ports:
      - "8082:80"

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

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

version: "3.3"
services:
  # Redis
  # MySQL
  # NGINX

  php:
    image: xmlwch/php:${APP_ENV}
    container_name: lnmp-php
    tty: true

这里的 tty 是之前命令 docker -it 中的 t

表示需要一个交互界面启用 tty 特性;

另外这里还用了变量 ${APP_ENV}

但是我们并不能像 Dockerfile 中那样定义变量;

而是要把它定义在跟 docker-compose.yml 同目录的 .env 文件中;

APP_ENV=local

volumes

我们需要持久化保存 MySQL 中的数据;

同时我们需要把我们的代码加载到容器中;

因此我们还需要 volumes

version: "3.3"
services:
  redis:
    image: redis:5 
    container_name: lnmp-redis 

  mysql:
    image: xmlwch/mysql
    container_name: lnmp-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=hardwork
      - MYSQL_DATABASE=test
      - MYSQL_USER=Niord
      - MYSQL_PASSWORD=hardwork
    volumes:
      - mysql:/var/lib/mysql

  nginx:
    image: xmlwch/nginx
    container_name: lnmp-nginx
    volumes:
      - .:/app
      - ./docker/nginx/vhost.conf:/etc/nginx/conf.d/vhost.conf
    ports:
      - "8082:80"

  php:
    image: xmlwch/php:${APP_ENV}
    container_name: lnmp-php
    tty: true
    volumes:
      - .:/app

volumes:
  mysql:

这里给 MySQL 创建了一个受管理的 volume

然后把当前目录下的代码分别挂载到了 NGINXPHP 容器的 /app 目录;

由于时间仓促,错误与疏忽之处在所难免,希望各位朋友们以邮件的形式反馈问题给我,再次表示感谢!