docker-compose簡介

| 介紹

Docker開源項目,負責實現(xiàn)對Docker容器集群的快速編排孕荠。

通過一個單獨的docker-compose.yml模板文件沪哺,來定義一組相關聯(lián)的應用容器為一個項目牙瓢。

概念

  1. 服務
  2. 項目

Compose默認管理對象是項目,通過子命令對項目中的一組容器進行生命周期的管理。

Compose項目由Python實現(xiàn)勺疼,實現(xiàn)上調用了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]

為連接到服務的外部客戶端指定服務發(fā)現(xiàn)的方式。有兩種方式:

  1. vip:由 Docker 為服務賦一個虛擬 IP耕肩。Docker 會自動為客戶端和服務工作節(jié)點選擇合適的路由因妇。這是默認的方式。
  2. dnsrr:使用 DNS 服務發(fā)現(xiàn)猿诸。Docker 會為服務創(chuàng)建一個 DNS 項婚被,以便使用服務名進行 DNS 查詢時能連接到合適的 IP。該選項在你想使用自己的負載均衡器等情況下時是有用的梳虽。

[labels]

為服務(而非容器)設置標簽址芯。

[mode]

可為 global(每個 swarm 節(jié)點只有一個容器)或者 replicated(可有多個容器,默認)窜觉。

[placement]

指定布置約束谷炸。

[replicas]

當 mode 為 replicated 時,指定要運行的容器的數(shù)量禀挫。

[resources]

配置內存旬陡、CPU 等資源限制。

[restart_policy]

配置如何重啟退出的容器

  1. condition:值為 none语婴、on-failure 或者 any 之一描孟,默認為 any。
  2. delay:在下次嘗試重啟之前需要等待的時間砰左,默認為 0匿醒。
  3. max_attempts:最多嘗試重啟的次數(shù),默認從不放棄缠导。
  4. window:判定一次重啟失敗前要等待的時間廉羔,默認立即判定。

[update_config]

配置如何更新服務

  1. parallelism:每次要更新的容器數(shù)量僻造。
  2. delay:更新下一組容器前要等待的時間憋他。
  3. failure_action:更新失敗時要采取的動作。為 continue髓削、rollback 或 pause 之一举瑰,默認為 pause。
  4. monitor:判定一次更新失敗前要持續(xù)的時間蔬螟,默認為 0s此迅。
  5. max_failure_ratio:能容忍的最大更新失敗率。
version: "3.7"
services:
  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:    # 配置如何更新服務
        parallelism: 2  # 每次要更新的容器數(shù)量
        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后一定要執(zhí)行docker-compose build重新創(chuàng)建鏡像

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為容器的網(wǎng)絡模式

MYSQL_ROOT_PASSWORD為數(shù)據(jù)庫的密碼耸序,也就是root用戶的密碼忍些。

MYSQL_USER和MYSQL_PASS另外一個用戶名和密碼。

image為你拉取鏡像的地址和版本坎怪,當然也可以換成自己的鏡像倉庫罢坝,這里使用官方的。

volumes里面的參數(shù)為映射本地和docker容器里面的文件夾和目錄搅窿。

./db 用來存放了數(shù)據(jù)庫表文件

./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");
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市男应,隨后出現(xiàn)的幾起案子闹司,更是在濱河造成了極大的恐慌,老刑警劉巖沐飘,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件游桩,死亡現(xiàn)場離奇詭異,居然都是意外死亡耐朴,警方通過查閱死者的電腦和手機借卧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筛峭,“玉大人铐刘,你說我怎么就攤上這事∮跋” “怎么了滨达?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長俯艰。 經(jīng)常有香客問我,道長锌订,這世上最難降的妖魔是什么竹握? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮辆飘,結果婚禮上啦辐,老公的妹妹穿的比我還像新娘。我一直安慰自己蜈项,他們只是感情好芹关,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著紧卒,像睡著了一般侥衬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天轴总,我揣著相機與錄音直颅,去河邊找鬼。 笑死怀樟,一個胖子當著我的面吹牛功偿,可吹牛的內容都是我干的。 我是一名探鬼主播往堡,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼械荷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虑灰?” 一聲冷哼從身側響起吨瞎,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘩缆,沒想到半個月后关拒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡庸娱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年着绊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熟尉。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡归露,死狀恐怖,靈堂內的尸體忽然破棺而出斤儿,到底是詐尸還是另有隱情剧包,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布往果,位于F島的核電站疆液,受9級特大地震影響,放射性物質發(fā)生泄漏陕贮。R本人自食惡果不足惜堕油,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肮之。 院中可真熱鬧掉缺,春花似錦、人聲如沸戈擒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筐高。三九已至搜囱,卻和暖如春丑瞧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犬辰。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工嗦篱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人幌缝。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓灸促,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涵卵。 傳聞我的和親對象是個殘疾皇子浴栽,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容