docker compose

简介

定义和运行多个 Docker 容器的应用,一个项目往往包含多个容器,每次重启都需要手动重启多个容器,显得太不简洁,而docker-compose就是一个完美的解决方案。

两个重要的概念

  1. 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
  2. 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

安装

# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
# yum install python-pip
# yum install gcc gcc-c++

$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose

$ docker-compose --version

命令

因为docker-compose 是根据docker提供的api进行的一层封装,因此,只需要我们熟练掌握docker的命令,docker-compose的命令我想只需要记住如下两个即可。

$docker-compose up

该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
链接的服务都将会被自动启动,除非已经处于运行状态。
可以说,大部分时候都可以直接通过该命令来启动一个项目。
默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。
当通过 Ctrl-C 停止命令时,所有容器将会停止。
如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。

$docker-compose down

此命令将会停止 up 命令所启动的容器,并移除网络.


Compose模板文件

模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 docker run 相关参数的含义都是类似的。

默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。

先举一个mysql的小栗子

version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
    volumes:
      - /data/mysql:/var/lib/mysql
    ports:
      - 3306:3306
    restart: always

下面介绍几个关键的指令,指令太多,生产环境下也不是都用得上,遵循二八原则嘛。

build

指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

version: '3'
services:

  webapp:
    build: ./dir

command

覆盖容器启动后默认执行的命令。

command: echo "hello world"

depends_on

解决容器的依赖、启动先后的问题。以下栗子会先启动db,redis,再启动web

version: '3'

services:
  web:
    build: .
    depends_on:
      - db
      - redis

  redis:
    image: redis

  db:
    image: postgres

image

指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像

ports

暴露端口信息。

使用宿主端口:容器端口

volumes

数据卷所挂载路径设置,但这里可以有两个选择:

  1. 绝对路径(见上述小栗子)
  2. 卷标
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
    volumes:
      - mysql:/var/lib/mysql
    ports:
      - 3306:3306
...
volumes:
  mysql:

container_name

指定容器名称

networks

$docker network create myNet # 新建网络
version: "3"
services:

  some-service:
    networks:
     - some-network
     - other-network

networks:
  some-network:
  other-network:

随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,多容器间通过容器名-DNS解析进行互联。

restart

重启机制

  • no,默认策略,在容器退出时不重启容器
  • on-failure,在容器非正常退出时(退出状态非0),才会重启容器
  • on-failure:3,在容器非正常退出时重启容器,最多重启3次
  • always,在容器退出时总是重启容器
  • unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
version: '2'
services:
  web:
    image: apache
    restart: always

environment

设置环境变量,语法有如下两种

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET
原文地址:https://www.cnblogs.com/zenan/p/10884058.html