欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

docker compose

程序员文章站 2022-05-15 08:49:52
...

简介

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

两个重要的概念

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

安装

$pip install 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