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","test12345@qq.com","passwd","avaterpath");
insert into user values(2, "lisi","12345test@qq.com","passwd","avaterpath");
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,242评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,953评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 171,299评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,709评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,723评论 6 399
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,236评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,629评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,594评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,135评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,156评论 3 345
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,285评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,914评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,600评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,073评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,203评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,798评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,339评论 2 365

推荐阅读更多精彩内容