佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > docker-compose教程之安裝使用和快速入門

docker-compose教程之安裝使用和快速入門

熱門標(biāo)簽:智能手機(jī) 百度競價(jià)點(diǎn)擊價(jià)格的計(jì)算公式 網(wǎng)站建設(shè) 硅谷的囚徒呼叫中心 美圖手機(jī) 阿里云 檢查注冊表項(xiàng) 使用U盤裝系統(tǒng)

教程基于ubuntu下最新的compose版本3
參考: https://docs.docker.com/compose/overview/

1.Compose介紹

Docker Compose是一個(gè)用來定義和運(yùn)行復(fù)雜應(yīng)用的Docker工具。一個(gè)使用Docker容器的應(yīng)用,通常由多個(gè)容器組成。使用Docker Compose不再需要使用shell腳本來啟動(dòng)容器。

Compose 通過一個(gè)配置文件來管理多個(gè)Docker容器,在配置文件中,所有的容器通過services來定義,然后使用docker-compose腳本來啟動(dòng),停止和重啟應(yīng)用,和應(yīng)用中的服務(wù)以及所有依賴服務(wù)的容器,非常適合組合使用多個(gè)容器進(jìn)行開發(fā)的場景。

2.Compose和Docker兼容性

compose文件格式版本 docker版本
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+
1.0 1.9.1.+

Docker版本變化說明:

Docker從1.13.x版本開始,版本分為企業(yè)版EE和社區(qū)版CE,版本號也改為按照時(shí)間線來發(fā)布,比如17.03就是2017年3月。

Docker的linux發(fā)行版的軟件倉庫從以前的https://apt.dockerproject.org和https://yum.dockerproject.org變更為目前的https://download.docker.com, 軟件包名字改為docker-ce和docker-ee。

3.安裝docker

Docker的社區(qū)版(Docker Community Edition)叫做docker-ce。老版本的Docker包叫做docker或者docker-engine,如果安裝了老版本的docker得先卸載然后再安裝新版本的docker。docker的發(fā)展非常迅速,apt源的更新往往比較滯后。所以docker官網(wǎng)推薦的安裝方式都是下載docker安裝腳本安裝。
卸載老舊的版本(若未安裝過可省略此步):

$ sudo apt-get remove docker docker-engine docker.io

安裝最新的docker:

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

shell會提示你輸入sudo的密碼,然后開始執(zhí)行最新的docker過程
或者

$ curl -sSL https://get.docker.com/ | sh 

確認(rèn)Docker成功最新的docker:

$ sudo docker run hello-world

4.安裝docker-compose

兩種最新的docker安裝方式

1.從github上下載docker-compose二進(jìn)制文件安裝

下載最新版的docker-compose文件 

sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

若是github訪問太慢,可以用daocloud下載

sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

添加可執(zhí)行權(quán)限 

sudo chmod +x /usr/local/bin/docker-compose

測試安裝結(jié)果

$ docker-compose --version
docker-compose version 1.16.1, build 1719ceb

2.pip安裝

sudo pip install docker-compose

5.docker-compose文件結(jié)構(gòu)和示例

docker-compose文件結(jié)構(gòu)

docker-compose.yml:

version: "3"
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:

docker-compose使用示例

通過docker-compose構(gòu)建一個(gè)在docker中運(yùn)行的基于python flask框架的web應(yīng)用。

注意:確保你已經(jīng)安裝了Docker Engine和Docker Compose。 您不需要安裝Python或Redis,因?yàn)檫@兩個(gè)都是由Docker鏡像提供的。

Step 1: 定義python應(yīng)用

1 .創(chuàng)建工程目錄

$ mkdir compose_test
$ cd compose_test
$ mkdir src   # 源碼文件夾
$ mkdir docker # docker配置文件夾

目錄結(jié)構(gòu)如下:

└── compose_test
  ├── docker
  │  └── docker-compose.yml
  ├── Dockerfile
  └── src
    ├── app.py
    └── requirements.txt

2 .在compose_test/src/目錄下創(chuàng)建python flask應(yīng)用 compose_test/src/app.py文件。

from flask import Flask
from redis import Redis
 
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
 
@app.route('/')
def hello():
  count = redis.incr('hits')
  return 'Hello World! I have been seen {} times.\n'.format(count)
 
if __name__ == "__main__":
  app.run(host="0.0.0.0", debug=True)

3 .創(chuàng)建python 需求文件 compose_test/src/requirements.txt

flask
redis

Step 2: 創(chuàng)建容器的Dockerfile文件

一個(gè)容器一個(gè)Dockerfile文件,在compose_test/目錄中創(chuàng)建Dockerfile文件:

FROM python:3.7
 
COPY src/ /opt/src
WORKDIR /opt/src
 
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

Dockerfile文件告訴docker了如下信息:

從Python 3.6鏡像開始構(gòu)建一個(gè)容器鏡像。

復(fù)制src(即compose_test/src)目錄到容器的/opt/src目錄。

將容器的工作目錄設(shè)置為/opt/src(通過docker exec -it your_docker_container_id_or_name bash 進(jìn)入容器后的默認(rèn)目錄)。
安裝Python依賴關(guān)系。
將容器的默認(rèn)命令設(shè)置為python app.py。

Step 3: 定義docker-compose腳本

在compose_test/docker/目錄下創(chuàng)建docker-compose.yml文件,并在里面定義服務(wù),內(nèi)容如下:

version: '3'
services:
 web:
  build: ../
  ports:
   - "5000:5000"
 redis:
  image: "redis:3.0.7"

這個(gè)compose文件定義了兩個(gè)服務(wù),即定義了web和redis兩個(gè)容器。
web容器:
* 使用當(dāng)前docker-compose.yml文件所在目錄的上級目錄(compose_test/Dockerfile)中的Dockerfile構(gòu)建映像。
* 將容器上的暴露端口5000映射到主機(jī)上的端口5000。 我們使用Flask Web服務(wù)器的默認(rèn)端口5000。
redis容器:
* redis服務(wù)使用從Docker Hub提取的官方redis鏡像3.0.7版本。

Step 4: 使用Compose構(gòu)建并運(yùn)行您的應(yīng)用程序

在compose_test/docker/目錄下執(zhí)行docker-compose.yml文件:

$ docker-compose up
# 若是要后臺運(yùn)行: $ docker-compose up -d
# 若不使用默認(rèn)的docker-compose.yml 文件名:
$ docker-compose -f server.yml up -d 

然后在瀏覽器中輸入http://0.0.0.0:5000/查看運(yùn)行的應(yīng)用程序。

Step 5: 編輯compose文件以添加文件綁定掛載

上面的代碼是在構(gòu)建時(shí)靜態(tài)復(fù)制到容器中的,即通過Dockerfile文件中的COPY src /opt/src命令實(shí)現(xiàn)物理主機(jī)中的源碼復(fù)制到容器中,這樣在后續(xù)物理主機(jī)src目錄中代碼的更改不會反應(yīng)到容器中。
可以通過volumes 關(guān)鍵字實(shí)現(xiàn)物理主機(jī)目錄掛載到容器中的功能(同時(shí)刪除Dockerfile中的COPY指令,不需要?jiǎng)?chuàng)建鏡像時(shí)將代碼打包進(jìn)鏡像,而是通過volums動(dòng)態(tài)掛載,容器和物理host共享數(shù)據(jù)卷):

version: '3'
services:
 web:
  build: ../
  ports:
   - "5000:5000"
  volumes:
   - ../src:/opt/src
 redis:
  image: "redis:3.0.7"

通過volumes(卷)將主機(jī)上的項(xiàng)目目錄(compose_test/src)掛載到容器中的/opt/src目錄下,允許您即時(shí)修改代碼,而無需重新構(gòu)建映像。

Step 6: 重新構(gòu)建和運(yùn)行應(yīng)用程序

使用更新的compose文件構(gòu)建應(yīng)用程序,然后運(yùn)行它。

$ docker-compose up -d

6.compose常用服務(wù)配置參考

Compose文件是一個(gè)定義服務(wù),網(wǎng)絡(luò)和卷的YAML文件。 Compose文件的默認(rèn)文件名為docker-compose.yml。

**提示:您可以對此文件使用.yml或.yaml擴(kuò)展名。 他們都工作。

與docker運(yùn)行一樣,默認(rèn)情況下,Dockerfile中指定的選項(xiàng)(例如,CMD,EXPOSE,VOLUME,ENV)都被遵守,你不需要在docker-compose.yml中再次指定它們。

同時(shí)你可以使用類似Bash的$ {VARIABLE} 語法在配置值中使用環(huán)境變量,有關(guān)詳細(xì)信息,請參閱變量替換。

本節(jié)包含版本3中服務(wù)定義支持的所有配置選項(xiàng)。

build

build 可以指定包含構(gòu)建上下文的路徑:

version: '2'
services:
 webapp:
  build: ./dir

或者,作為一個(gè)對象,該對象具有上下文路徑和指定的Dockerfile文件以及args參數(shù)值:

version: '2'
services:
 webapp:
  build:
   context: ./dir
   dockerfile: Dockerfile-alternate
   args:
    buildno: 1

webapp服務(wù)將會通過./dir目錄下的Dockerfile-alternate文件構(gòu)建容器鏡像。
如果你同時(shí)指定image和build,則compose會通過build指定的目錄構(gòu)建容器鏡像,而構(gòu)建的鏡像名為image中指定的鏡像名和標(biāo)簽。

build: ./dir
image: webapp:tag

這將由./dir構(gòu)建的名為webapp和標(biāo)記為tag的鏡像。

context

包含Dockerfile文件的目錄路徑,或者是git倉庫的URL。
當(dāng)提供的值是相對路徑時(shí),它被解釋為相對于當(dāng)前compose文件的位置。 該目錄也是發(fā)送到Docker守護(hù)程序構(gòu)建鏡像的上下文。

dockerfile

備用Docker文件。Compose將使用備用文件來構(gòu)建。 還必須指定構(gòu)建路徑。

args

添加構(gòu)建鏡像的參數(shù),環(huán)境變量只能在構(gòu)建過程中訪問。
首先,在Dockerfile中指定要使用的參數(shù):

ARG buildno
ARG password
 
RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"

然后在args鍵下指定參數(shù)。 你可以傳遞映射或列表:

build:
 context: .
 args:
  buildno: 1
  password: secret
 
build:
 context: .
 args:
  - buildno=1
  - password=secret

** 注意:YAML布爾值(true,false,yes,no,on,off)必須用引號括起來,以便解析器將它們解釋為字符串。

image

指定啟動(dòng)容器的鏡像,可以是鏡像倉庫/標(biāo)簽或者鏡像id(或者id的前一部分)

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

如果鏡像不存在,Compose將嘗試從官方鏡像倉庫將其pull下來,如果你還指定了build,在這種情況下,它將使用指定的build選項(xiàng)構(gòu)建它,并使用image指定的名字和標(biāo)記對其進(jìn)行標(biāo)記。

container_name

指定一個(gè)自定義容器名稱,而不是生成的默認(rèn)名稱。

container_name: my-web-container

由于Docker容器名稱必須是唯一的,因此如果指定了自定義名稱,則無法將服務(wù)擴(kuò)展到多個(gè)容器。

volumes

卷掛載路徑設(shè)置??梢栽O(shè)置宿主機(jī)路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro),掛載數(shù)據(jù)卷的默認(rèn)權(quán)限是讀寫(rw),可以通過ro指定為只讀。
你可以在主機(jī)上掛載相對路徑,該路徑將相對于當(dāng)前正在使用的Compose配置文件的目錄進(jìn)行擴(kuò)展。 相對路徑應(yīng)始終以 . 或者 .. 開始。

volumes:
 # 只需指定一個(gè)路徑,讓引擎創(chuàng)建一個(gè)卷
 - /var/lib/mysql
 # 指定絕對路徑映射
 - /opt/data:/var/lib/mysql
 
 # 相對于當(dāng)前compose文件的相對路徑
 - ./cache:/tmp/cache
 
 # 用戶家目錄相對路徑
 - ~/configs:/etc/configs/:ro
 
 # 命名卷
 - datavolume:/var/lib/mysql

但是,如果要跨多個(gè)服務(wù)并重用掛載卷,請?jiān)陧敿塿olumes關(guān)鍵字中命名掛在卷,但是并不強(qiáng)制,如下的示例亦有重用掛載卷的功能,但是不提倡。

version: "3"
 
services:
 web1:
  build: ./web/
  volumes:
   - ../code:/opt/web/code
 web2:
  build: ./web/
  volumes:
   - ../code:/opt/web/code

** 注意:通過頂級volumes定義一個(gè)掛載卷,并從每個(gè)服務(wù)的卷列表中引用它, 這會替換早期版本的Compose文件格式中volumes_from。

version: "3"
 
services:
 db:
  image: db
  volumes:
   - data-volume:/var/lib/db
 backup:
  image: backup-service
  volumes:
   - data-volume:/var/lib/backup/data
 
volumes:
 data-volume:

command

覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令。

command: bundle exec thin -p 3000

該命令也可以是一個(gè)類似于dockerfile的列表:

command: ["bundle", "exec", "thin", "-p", "3000"]

links

鏈接到另一個(gè)服務(wù)中的容器。 請指定服務(wù)名稱和鏈接別名(SERVICE:ALIAS),或者僅指定服務(wù)名稱。

web:
 links:
  - db
  - db:database
  - redis

在當(dāng)前的web服務(wù)的容器中可以通過鏈接的db服務(wù)的別名database訪問db容器中的數(shù)據(jù)庫應(yīng)用,如果沒有指定別名,則可直接使用服務(wù)名訪問。

鏈接不需要啟用服務(wù)進(jìn)行通信 - 默認(rèn)情況下,任何服務(wù)都可以以該服務(wù)的名稱到達(dá)任何其他服務(wù)。 (實(shí)際是通過設(shè)置/etc/hosts的域名解析,從而實(shí)現(xiàn)容器間的通信。故可以像在應(yīng)用中使用localhost一樣使用服務(wù)的別名鏈接其他容器的服務(wù),前提是多個(gè)服務(wù)容器在一個(gè)網(wǎng)絡(luò)中可路由聯(lián)通)

links也可以起到和depends_on相似的功能,即定義服務(wù)之間的依賴關(guān)系,從而確定服務(wù)啟動(dòng)的順序。

external_links

鏈接到docker-compose.yml 外部的容器,甚至并非 Compose 管理的容器。參數(shù)格式跟 links 類似。

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

expose

暴露端口,但不映射到宿主機(jī),只被連接的服務(wù)訪問。
僅可以指定內(nèi)部端口為參數(shù)

expose:
 - "3000"
 - "8000"

ports

暴露端口信息。
常用的簡單格式:使用宿主:容器 (HOST:CONTAINER)格式或者僅僅指定容器的端口(宿主將會隨機(jī)選擇端口)都可以。

** 注意:當(dāng)使用 HOST:CONTAINER 格式來映射端口時(shí),如果你使用的容器端口小于 60 你可能會得到錯(cuò)誤得結(jié)果,因?yàn)?YAML 將會解析 xx:yy 這種數(shù)字格式為 60 進(jìn)制。所以建議采用字符串格式。

簡單的短格式:

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"

在v3.2中ports的長格式的語法允許配置不能用短格式表示的附加字段。
長格式:

ports:
 - target: 80
  published: 8080
  protocol: tcp
  mode: host

target:容器內(nèi)的端口
published:物理主機(jī)的端口
protocol:端口協(xié)議(tcp或udp)
mode:host 和ingress 兩總模式,host用于在每個(gè)節(jié)點(diǎn)上發(fā)布主機(jī)端口,ingress 用于被負(fù)載平衡的swarm模式端口。

restart

no是默認(rèn)的重啟策略,在任何情況下都不會重啟容器。 指定為always時(shí),容器總是重新啟動(dòng)。 如果退出代碼指示出現(xiàn)故障錯(cuò)誤,則on-failure將重新啟動(dòng)容器。

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

environment

添加環(huán)境變量。 你可以使用數(shù)組或字典兩種形式。 任何布爾值; true,false,yes,no需要用引號括起來,以確保它們不被YML解析器轉(zhuǎn)換為True或False。
只給定名稱的變量會自動(dòng)獲取它在 Compose 主機(jī)上的值,可以用來防止泄露不必要的數(shù)據(jù)。

environment:
 RACK_ENV: development
 SHOW: 'true'
 SESSION_SECRET:
 
environment:
 - RACK_ENV=development
 - SHOW=true
 - SESSION_SECRET

** 注意:如果你的服務(wù)指定了build選項(xiàng),那么在構(gòu)建過程中通過environment定義的環(huán)境變量將不會起作用。 將使用build的args子選項(xiàng)來定義構(gòu)建時(shí)的環(huán)境變量。

pid
將PID模式設(shè)置為主機(jī)PID模式。 這就打開了容器與主機(jī)操作系統(tǒng)之間的共享PID地址空間。 使用此標(biāo)志啟動(dòng)的容器將能夠訪問和操作裸機(jī)的命名空間中的其他容器,反之亦然。即打開該選項(xiàng)的容器可以相互通過進(jìn)程 ID 來訪問和操作。

pid: "host"

dns
配置 DNS 服務(wù)器??梢允且粋€(gè)值,也可以是一個(gè)列表。

dns: 8.8.8.8
dns:
 - 8.8.8.8
 - 9.9.9.9

到此這篇關(guān)于docker-compose教程之安裝使用和快速入門 的文章就介紹到這了,更多相關(guān)docker-compose安裝使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

標(biāo)簽:湖北 賀州 通遼 湘潭 煙臺 黃山 懷化 山南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《docker-compose教程之安裝使用和快速入門》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    垣曲县| 开阳县| 平泉县| 泗阳县| 民和| 南江县| 绥宁县| 墨竹工卡县| 县级市| 双辽市| 闽清县| 禄丰县| 伊春市| 梅河口市| 三门峡市| 收藏| 仪陇县| 巴彦淖尔市| 晋州市| 黎城县| 威海市| 武功县| 哈尔滨市| 厦门市| 高碑店市| 阳江市| 神池县| 龙海市| 天镇县| 汤阴县| 池州市| 贵州省| 饶平县| 洪雅县| 禄劝| 杂多县| 凤凰县| 泰和县| 岳西县| 灵璧县| 陵川县|