Docker三剑客之Compose

Docker三剑客之Compose

Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。

Compose 基本介绍

Compose 简介

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。
Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。

为什么使用Compose

Docker镜像构成和定制介绍中,我们可以使用Dockerfile文件很方便定义一个单独的应用容器。
然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

docker-compose.yml看起来像这样:
version: ‘3‘
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

Compose 中两个重要的概念

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

说明:

  • Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
  • Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

Compose 安装与卸载

Docker 版本

docker-ce-17.09.0.ce
系统环境是linux7.x

PIP 安装

pip install docker-compose

Compose 版本

docker-compose --version
docker-compose version 1.21.2, build a133471

卸载

如果是通过 pip 安装的,则执行如下命令即可删除。

pip uninstall docker-compose

实战--使用docker-compose部署Edusoho平台

项目目录结构

# pwd
/root/docker-lnmp
# tree -L 3
.
├── docker-compose.yml
├── mysql
│?? ├── data
│?? └── my.cnf
├── nginx
│?? ├── conf.d
│?? │?? └── default.conf
│?? ├── Dockerfile
│?? ├── edusoho
│?? │?? ├── api
│?? │?? ├── app
│?? │?? ├── bootstrap
│?? │?? ├── plugins
│?? │?? ├── src
│?? │?? ├── vendor
│?? │?? ├── vendor_user
│?? │?? └── web
│?? ├── edusoho-8.2.38.tar.gz
│?? ├── log
│?? │?? └── error.log
│?? ├── nginx.conf
│?? ├── ssl
│?? │?? ├── nginx.key
│?? │?? └── nginx.pem
│?? └── www
│??     ├── db.php
│??     ├── index.html
│??     ├── index.php
├── php
│?? ├── Dockerfile
│?? ├── log
│?? │?? └── php-fpm.log
│?? ├── php-fpm.conf
│?? ├── php.ini
│?? └── www.conf

项目docker-compose.yml文件

version: ‘3‘
# 定义三个服务nginx,php,mysql
services:
  nginx:
    # 依赖php服务,意味着在启动nginx之前先启动php
    depends_on:
      - php
      # nginx镜像的路径
    build: ./nginx
        # 这样使nginx容器把网站文件和目录存放到主机目录中,持久化和方便管理
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/log/error.log:/var/log/nginx/error.log
      - ./nginx/edusoho:/usr/share/nginx/html
        # nginx意外退出时自动重启
    restart: always

        # 映射80端口
    ports:
      - "80:80"
     # - "443:443"
    networks:
      - frontend

        # 容器名称
    container_name: nginx

  php:
    depends_on:
      - mysql
    build: ./php
    ports:
      - "9000"
    networks:
      - frontend
      - backend
    volumes:
      - ./php/php-fpm.conf:/usr/local/php/etc/php-fpm.conf
      - ./php/www.conf:/usr/local/php/etc/php-fpm.d/www.conf
      - ./php/php.ini:/usr/local/php/etc/php.ini
      - ./php/log/php-fpm.log:/usr/local/php/var/log/php-fpm.log
      - ./nginx/edusoho:/usr/share/nginx/html
    restart: always
    container_name: php

  # MySQL
  mysql:
    image: "dockerhub.datagrand.com/global/mysql:5.6"
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    command: [‘mysqld‘, ‘--character-set-server=utf8‘]
    networks:
      - backend
    restart: always
    container_name: mysql
  #Network
networks:
  frontend:
  backend:

后台启动并运行所有容器

docker-compose up -d

-d 在后台运行服务容器

docker-compose.yml 文件内容说明

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

version

Compose文件版本,详见Compose file versions and upgrading | Docker Documentation

depends_on

使用depends_on选项控制服务启动的顺序。详见Control startup order in Compose

services:
  nginx:
    # 依赖php服务,意味着在启动nginx之前先启动php
    depends_on:
      - php
说明:
nginx服务不会等待php完全启动之后才启动!

build

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

# nginx镜像的路径
    build: ./nginx

你也可以使用 context 指令指定 Dockerfile 所在文件夹的路径。
使用 dockerfile 指令指定 Dockerfile 文件名。
使用 arg 指令指定构建镜像时的变量。

version: ‘3‘
services:

  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1

volumes

数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。
该指令中路径支持相对路径。详见volumes

 volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/log/error.log:/var/log/nginx/error.log
      - ./nginx/edusoho:/usr/share/nginx/html

restart

no是默认的重新启动策略,它不会在任何情况下重新启动容器。当always指定时,容器总是重新启动。
该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。
详见restart

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

注意:使用(版本3)Compose文件在群集模式下部署堆栈时,将忽略此选项 。请改用restart_policy。

ports

暴露端口信息。
使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)。
详见ports

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"
 - "6060:6060/udp"

注意:以HOST:CONTAINER格式映射端口时,使用低于60的容器端口时可能会遇到错误的结果,因为YAML会将格式xx:yy中的数字解析为base-60值。因此,我们建议始终将端口映射明确指定为字符串。

networks

配置容器连接的网络。详见网络配置

创建frontend网络
docker network create frontend
查看网络
docker network ls
删除网络
docker network rm frontend

container_name

指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。
注意: 使用(版本3)Compose文件在群集模式下部署堆栈时,将忽略此选项。
详见container_name

 # 容器名称
    container_name: nginx

environment

详见environment

  • 设置环境变量。你可以使用数组或字典两种格式。
environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
或
environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
  • 如果变量名称或者值中用到 true|false,yes|no 等表达 布尔 含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。
    这些特定词汇,包括:
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
environment:
  RACK_ENV: development
  SHOW: ‘true‘
或
environment:
  - RACK_ENV=development
  - SHOW=true
  • 只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

command

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


command: bundle exec thin -p 3000
该命令也可以是一个列表,方式类似于 dockerfile:
command: ["bundle", "exec", "thin", "-p", "3000"]

原文地址:http://blog.51cto.com/wutengfei/2156792

时间: 2024-08-29 21:41:58

Docker三剑客之Compose的相关文章

docker三剑客之docker-compose和搭建wordpress的博客

一.简介 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排. 通过之前的介绍,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器.然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况.例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等. Compose 恰好满足了这样的需求.它允许用户通过一个单独的 docker-com

Docker 三剑客

Docker三剑客: Docker-Machine Docker Machine is a tool that lets you install Docker Engine on virtual hosts, and manage the hosts with docker-machine commands. Docker-Swarm 把多个Docker Engine聚集在一起,形成一个大的docker-engine,对外提供容器的集群服务. Docker-Compose 是一个编排多容器分布式

Docker容器之Compose编排、consul集群、template模板

docker compose容器编排 (1)docker compose的前身Fig,它是一个定义及运行多个docker容器的工具(2)使用docker compose不再需要使用shell脚本启动容器(3)docker compose非常适合组合使用多个容器进行开发的场景 YAML是一种标记语言很直观的数据序列化格式 文件格式及编写注意事项: 不支持制表符tab键缩进,需要使用空格缩进 通常开头缩进2个空格 字符后缩进1个空格,如冒号,逗号,横杆 用井号注释 如果包含特殊字符用单引号引起来 布

docker三剑客之docker compose

compose环境变量 以DOCKER_开头的变量和用来配置Docker命令行客户端的使用一样,如果使用boot2docker,${boot2dockershellinit}将会设置他们为正确的值 compose环境变量: COMPOSE_PROJECT_NAME: 设置compose的项目名称,默认是当前工作目录(docker-compose.yml文件所在目录)的名字 compose会为每一个启动的容器前添加项目名称.例如一个名称为proj的项目,其中的一个web容器,名称可能为proj_w

docker三剑客之一docker compose

compose有两个重要的概念: 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义 compose默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理 安装 pip安装,下载编译好的二进制文件,直接运行在docker容器中三种方案: pip安装: apt-get install python-pip -y pip install

docker三剑客之应用machine,compose,swarm

利用Docker-Machine创建虚拟Docker主机 ## 下载docker-machine https://github.com/docker/machine/releases [email protected]:~$ curl -L https://github.com/docker/machine/releases/download/v0.16.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && ch

docker——三剑客之Docker Compose

编排(Orchestration)功能是复杂系统实现灵活可操作性的关键.特别是在Docker应用场景中,编排意味着用户可以灵活的对各种容器资源实现定义和管理. 作为Docker官方编排工具,Compose的重要性不言而喻,它可以让用户通过编写一个简单模板文件,快速地创建和管理基于Docker容器地应用集群. Compose项目是Docker官方的开源项目,负责实现对Docker容器的快速编排.从功能上看,跟OpenStack中的Heat十分相似.Compose定位是"定义和运行多个Docker容

Docker三剑客之Swarm介绍

DockOne技术分享(二十): 我用swarm在多台物理机调度管理容器,用ovs实现跨主机的容器互联问题 [编者的话]Swarm项目是Docker公司发布三剑客中的一员,用来提供容器集群服务,目的是更好的帮助用户管理多个Docker Engine,方便用户使用,像使用Docker Engine一样使用容器集群服务.这次分享内容从Swarm项目现状.Swarm社区现状和Swarm未来的一些规划三方面介绍Swarm,目的是能让大家对Swarm有个完整的认识,并且希望更多的人采用到Swarm项目中来

容器技术|Docker三剑客之docker-compose

三剑客简介 docker-machine docker技术是基于Linux内核的cgroup技术实现的,那么问题来了,在非Linux平台上是否就不能使用docker技术了呢?答案是可以的,不过显然需要借助虚拟机去模拟出Linux环境来. docker-machine就是docker公司官方提出的,用于在各种平台上快速创建具有docker服务的虚拟机的技术,甚至可以通过指定driver来定制虚拟机的实现原理(一般是virtualbox). docker-compose docker镜像在创建之后,