docker-compose简介

| 介绍

Docker开源项目,负责实现对Docker容器集群的快速编排。

通过一个单独的docker-compose.yml模板文件,来定义一组相关联的应用容器为一个项目。

概念

  1. 服务
  2. 项目

Compose默认管理对象是项目,通过子命令对项目中的一组容器进行生命周期的管理。

Compose项目由Python实现,实现上调用了Docker服务提供的API来对容器进行管理。

version

A3: version指的是docker-compose的version, 详见https://docs.docker.com/compose/compose-file/#reference-and-guidelines

| 配置解析

资源:https://aisxyz.iteye.com/blog/2393862

deploy

指定与服务部署相关的配置,仅在使用docker stack deploy部署到swarm时才会生效,会被docker-compose up及docker-compose run忽略。支持以下子项:

[endpoint_mode]

为连接到服务的外部客户端指定服务发现的方式。有两种方式:

  1. vip:由 Docker 为服务赋一个虚拟 IP。Docker 会自动为客户端和服务工作节点选择合适的路由。这是默认的方式。
  2. dnsrr:使用 DNS 服务发现。Docker 会为服务创建一个 DNS 项,以便使用服务名进行 DNS 查询时能连接到合适的 IP。该选项在你想使用自己的负载均衡器等情况下时是有用的。

[labels]

为服务(而非容器)设置标签。

[mode]

可为 global(每个 swarm 节点只有一个容器)或者 replicated(可有多个容器,默认)。

[placement]

指定布置约束。

[replicas]

当 mode 为 replicated 时,指定要运行的容器的数量。

[resources]

配置内存、CPU 等资源限制。

[restart_policy]

配置如何重启退出的容器

  1. condition:值为 none、on-failure 或者 any 之一,默认为 any。
  2. delay:在下次尝试重启之前需要等待的时间,默认为 0。
  3. max_attempts:最多尝试重启的次数,默认从不放弃。
  4. window:判定一次重启失败前要等待的时间,默认立即判定。

[update_config]

配置如何更新服务

  1. parallelism:每次要更新的容器数量。
  2. delay:更新下一组容器前要等待的时间。
  3. failure_action:更新失败时要采取的动作。为 continue、rollback 或 pause 之一,默认为 pause。
  4. monitor:判定一次更新失败前要持续的时间,默认为 0s。
  5. max_failure_ratio:能容忍的最大更新失败率。
version: "3.7"
services:
  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:    # 配置如何更新服务
        parallelism: 2  # 每次要更新的容器数量
        delay: 10s  # 更新下一组容器前要等待的时间
      restart_policy:
        condition: on-failure

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - "5000:80"
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure

  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - "5001:80"
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

networks:
  frontend:
  backend:

volumes:
  db-data:

| 安装

curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version

| 基本命令

  • build
  • kill
  • logs
  • pause
  • ps
  • restart
  • rm
  • run
  • scale
docker-compose scale web=2 db=2

更新Dockerfile后一定要执行docker-compose build重新创建镜像

docker-compose文件介绍

version: "2"
  services:
    webapp:
      image: examples/web   # 每个服务都必须通过Image指令或build指令(需要Dockerfile)来自动构建生成镜像
      port:
        - "80:80"
      volumes:
        - "/data"

| 示例

部署spring-boot应用

spring-boot app打包

mvn clean package -Dmaven.test.skip=true

Dockerfile

FROM openjdk:8-jdk
COPY ./id_gen_svc-0.0.1-SNAPSHOT.jar /usr/local
ENTRYPOINT ["java", "-jar", "/usr/local/id_gen_svc-0.0.1-SNAPSHOT.jar"]

docker-compose.yml

version: '2'
services:
  sb1:
    restart: always
    build:
      context: .
    ports:
      - 8001:8080
  sb2:
    restart: always
    build:
      context: .
    ports:
      - 8002:8080
  sb3:
    restart: always
    build:
      context: .
    ports:
      - 8003:8080

使用docker-compose stack部署

version: "3"
services:
  webapp:
    image: nginx:alpine
    deploy:
      replicas: 4
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
          condition: on-failure
    ports:
      - 80:80

mysql+.netcore工程部署

配置结构

1564468723045.png

docker-compose.yml

version: '2'
services:
    patient-svc:
        build: ./patient-svc
        ports:
            - "8001:80"

    report-svc:
        build: ./report-svc
        ports:
            - "8002:80"

    ucloud-svc:
        environment:
            MYSQL_ROOT_PASSWORD: "111111"
            MYSQL_USER: 'test'
            MYSQL_PASS: '111111'
        image: "mysql:5.7"
        restart: always
        volumes:
            - "./ucloud-db/db:/var/lib/mysql"
            - "./ucloud-db/conf/my.cnf:/etc/my.cnf"
            - "./ucloud-db/init:/docker-entrypoint-initdb.d/"
        ports:
            - "3306:3306"

patient-svc Dockerfile

FROM microsoft/dotnet:2.1-aspnetcore-runtime
COPY ./publish /app
WORKDIR /app
EXPOSE 80
ENTRYPOINT ["dotnet","PatientSvc.dll"]

report-svc Dockerfile

FROM microsoft/dotnet:2.1-aspnetcore-runtime
COPY ./publish /app
WORKDIR /app
EXPOSE 80
ENTRYPOINT ["dotnet","ReportSvc.dll"]

docker-compose部署mysql

docker-compose.yml

version: '2'
services:
    mysql:
        network_mode: "bridge"
        environment:
            MYSQL_ROOT_PASSWORD: "111111"
            MYSQL_USER: 'test'
            MYSQL_PASS: '111111'
        image: "mysql:latest"
        restart: always
        volumes:
            - "./db:/var/lib/mysql"
            - "./conf/my.cnf:/etc/my.cnf"
            - "./init:/docker-entrypoint-initdb.d/"
        ports:
            - "33060:3306"

其中,

network_mode为容器的网络模式

MYSQL_ROOT_PASSWORD为数据库的密码,也就是root用户的密码。

MYSQL_USER和MYSQL_PASS另外一个用户名和密码。

image为你拉取镜像的地址和版本,当然也可以换成自己的镜像仓库,这里使用官方的。

volumes里面的参数为映射本地和docker容器里面的文件夹和目录。

./db 用来存放了数据库表文件

./conf/my.cnf存放自定义的配置文件

./init存放初始化的脚本。ports 为映射主机和容器的端口

文件结构

.
├── conf
│ └── my.cnf
├── db
├── docker-compose.yml
└── init
│ └──init.sql

my.cnf

[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

init.sql

use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '111111';
create database test;
use test;
create table user
(
    id int auto_increment primary key,
    username varchar(64) unique not null,
    email varchar(120) unique not null,
    password_hash varchar(128) not null,
    avatar varchar(128) not null
);
insert into user values(1, "zhangsan","[email protected]","passwd","avaterpath");
insert into user values(2, "lisi","[email protected]","passwd","avaterpath");

你可能感兴趣的:(docker-compose简介)