[Docker一马平川]使用docker-compose管理项目环境

很多时候我们需要写一些小东西, 标配一个 mysql, php, nginx, 有时候会接入 redis, 有时候会接入 node 环境. 各个项目之间存在环境上的差异, docker 技术可以将其隔离. 不过, 每次想要启动一个项目程序, 就得手动指定若干独立的 docker 容器, 很不方便. Docker compose 给我们提供了一个标准化的解决方案, 将项目的依赖通过一个配置文件组织起来, 通过 docker-compose.yml 文件初始化一系列项目的依赖.

什么是 Docker ?

Docker 是一种容器化技术, 它一个容器实例包含了运行在其中的业务程序以及运行该程序所需的最小运行环境依赖.

为什么要有 Docker compose ?

因为一个具体的业务场景往往需要若干个相互独立部署的服务程序, 相互协作完成某一功能.

例如我们有一个 PHP 的小程序, 其运行需要使用到 mysql, 我们计划让这个程序自己独自占用一个 mysql 服务. 通过 Docker compose 可以轻松实现.

version: '3'

services:
  mysql:
    image: mysql:5.6
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
      - '3306:3306'
  srv:
    image: budblack/tp32
    links:
      - mysql
    ports:
      - '80:80'
    environment:
      - DB_HOST=mysql
      - DB_PORT=3306
      - DB_USER=root
      - DB_PASS=root
    volumes:
      - ./src:/var/www/html

我们在项目根目录编写 docker-compose.yml 文件, 使用 docker-compose up 命令在当前目录启动工程.

docker-compose up

如何安装 docker compose ?

docker-compose 命令并非 docker 程序自带. 它是一个调用 docker api 实施辅助操作的工具. 使用它之前需要安装. 官方说明文档在这里.

我们可以使用 pip 快速安装它

sudo pip install -U docker-compose

如何编写 docker-compoes.yml ?

Docker compose 使用 YAML 风格的配置文件, 默认文件名称是 docker-compose.yml . 关于 YAML 语言的介绍可以参考另一篇简短文字.

最基本的 docker-compose.yml 包含两个配置节点:

  1. version, 配置文件标准版本号
  2. services, 服务清单

版本号决定了 Docker compose 解析该文件时所遵循的规则. 当前(2019年01月23日00:14:19) 主流版本是 3 .

我们现在先看 services 中单个节点所表示的一个服务单元如何配置:

# 服务的名称, 在 docker-compose.yml 
# 文件内部的配置中我通常会使用该名称做引用.
mysql:
  ...
srv:
  # 该容器实例所使用的镜像名称
  # version: 3 亦支持使用 build 指令, 指明一个目录. 
  # 从而根据该目录下的 Dockerfile 构建新镜像, 覆盖 image 字段.
  image: budblack/tp32
  # 等同于 `docker run --link mysql:mysql` 把另个一名为 `mysql` 的容器主机在该容器内部建立别名 mysql , 可直接通过主机名 `mysql` 访问.
  links:
    - mysql
  # 等同 `docker run --port 80:80`
  ports:
    - '80:80'
 # 等同 `docker run -e DB_HOST=mysql -e DB_PORT=3306 -e DB_USER=root -e DB_PASS=root`
  environment:
    - DB_HOST=mysql
    - DB_PORT=3306
    - DB_USER=root
    - DB_PASS=root
  # VOLUMES 的申明有两种写法. 这里是直接指明了容器路径在宿主机中的挂载路径
  volumes:
    - ./src:/var/www/html

关于 VOLUMES 的其它写法

version: '3'
services:
  vdc:
    volumes:
     - /data/path_1
     - volum_name:/data/path_2
  srv:
    volumes_from: 
    
volumes:

docker-compose.yml 的版本区别