前面章節,咱們學習瞭如何構建本身的鏡像文件,如何保存本身的鏡像文件。大多都是一個鏡像啓動。當一個系統須要多個子系統進行配合時,若每一個子系統也就是鏡像須要一個個手動啓動和中止的話,那估計實施人員也會崩潰的,並且效率也很低,維護的量也就很大了。因此,本章節就來了解下,如何利用官方提供的
Compose
編排工具按必定的業務規則來合理的進行容器啓停工做。html
Compose是一個用於定義和運行多個
Docker
容器的編排工具。能夠一條命令啓動多個容器。主要是解決了容器與容器之間如何管理編排的問題。java
按官網的說明,使用Compose
基本上也就分紅三步:python
Dockerfile
定義運行環境docker-compose.yml
定義組成應用的各服務docker-compose up
啓動應用題外話:我所理解的就是,其實就是個批量工具,如批處理命令同樣。mysql
Compose實現原理圖:linux
Compose 中有兩個重要的概念:git
一個項目能夠由多個服務(容器)關聯而成,Compose
面向項目進行管理,經過子命令對項目中的一組容器進行便捷地生命週期管理。github
Compose
項目由 Python
編寫,實現上調用了 Docker
服務提供的 API 來對容器進行管理。所以,只要所操做的平臺支持 Docker API
,就能夠在其上利用 Compose
來進行編排管理。web
題外話:關於Docker API
會在下一章節進行詳細說明。redis
自己
Compose
是一個獨立的產品,因此須要獨立安裝的。spring
按官網的說明,Compose
能夠在Mac
、Windows
、Linux
等操做系統,本章節主要講解下關於Linux
的安裝,其餘操做系統能夠查看官網的安裝指南:https://docs.docker.com/compose/install/#install-compose
此安裝方式簡單,但可能會有網絡鏈接問題。或者直接去
gitHub
上的資源列表下載到本地也能夠的。筆者下載過程(11M左右)仍是很順利的,╰( ̄▽ ̄)╮
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
可看見控制檯輸出:
docker-compose version 1.22.0, build f46880fe
說明已經安裝成功了。固然你們能夠選擇不一樣的安裝版本了,直接去github
上下載便可。
這種安裝方式就是不會受限於網絡,但安裝比較麻煩。
#安裝pip yum -y install epel-release yum -y install python-pip #確認版本 pip --version #更新pip pip install --upgrade pip #安裝docker-compose pip install docker-compose #查看版本 docker-compose version
命令補齊功能能夠提升輸入效率,因此須要安裝命令補齊功能的,能夠照着官網:https://docs.docker.com/compose/completion/#install-command-completion 說明了相應配置,這裏就不進行闡述了。
在控制窗口,直接輸入
docker-compose
能夠看見,其命令的組成及命令的集合了。
Define and run multi-container applications with Docker. Usage: docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...] docker-compose -h|--help Options: -f, --file FILE Specify an alternate compose file (default: docker-compose.yml) -p, --project-name NAME Specify an alternate project name (default: directory name) --verbose Show more output --log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL) --no-ansi Do not print ANSI control characters -v, --version Print version and exit -H, --host HOST Daemon socket to connect to --tls Use TLS; implied by --tlsverify --tlscacert CA_PATH Trust certs signed only by this CA --tlscert CLIENT_CERT_PATH Path to TLS certificate file --tlskey TLS_KEY_PATH Path to TLS key file --tlsverify Use TLS and verify the remote --skip-hostname-check Don't check the daemon's hostname against the name specified in the client certificate --project-directory PATH Specify an alternate working directory (default: the path of the Compose file) --compatibility If set, Compose will attempt to convert deploy keys in v3 files to their non-Swarm equivalent Commands: build Build or rebuild services bundle Generate a Docker bundle from the Compose file config Validate and view the Compose file create Create services down Stop and remove containers, networks, images, and volumes events Receive real time events from containers exec Execute a command in a running container help Get help on a command images List images kill Kill containers logs View output from containers pause Pause services port Print the public port for a port binding ps List containers pull Pull service images push Push service images restart Restart services rm Remove stopped containers run Run a one-off command scale Set number of containers for a service start Start services stop Stop services top Display the running processes unpause Unpause services up Create and start containers version Show the Docker-Compose version information
這裏簡單說明下一些經常使用的:
構建或者從新構建服務。
經過發送SIGKILL信號來強制中止服務容器。支持經過參數來指定發送的信號,如:docker-compose kill -s SIGINT
查看服務的日誌輸出。
打印綁定的公共端口
列出全部的容器或者指定的容器
拉取鏡像
輸出容器
在一個服務上執行一個命令。如docker-compose run ubuntu ping docker.com
將會啓動一個 ubuntu 服務,執行 ping docker.com
命令。默認狀況下,全部關聯的服務將會自動被啓動,除非這些服務已經在運行中。 該命令相似啓動容器後運行指定的命令,相關卷、連接等等都將會按照指望建立。 兩個不一樣點:
若是不但願自動啓動關聯的容器,可使用 --no-deps
選項,例如
$ docker-compose run --no-deps web python manage.py shell
將不會啓動 web 容器所關聯的其它容器。
啓動一個已經存在的服務容器。
中止一個已經運行的容器,但不刪除它。
構建,(從新)建立,啓動,連接一個服務相關的容器。連接的服務都將會啓動,除非他們已經運行。 默認狀況, docker-compose up
將會整合全部容器的輸出,而且退出時,全部容器將會中止。若是使用 docker-compose up -d
,將會在後臺啓動並運行全部的容器。 默認狀況,若是該服務的容器已經存在, docker-compose up
將會中止並嘗試從新建立他們(保持使用 volumes-from
掛載的卷),以保證 docker-compose.yml
的修改生效。若是你不想容器被中止並從新建立,可使用 docker-compose up --no-recreate
。若是須要的話,這樣將會啓動已經中止的容器。
暫停容器服務
其餘的命令,可直接經過幫助查詢下。
compose的默認模版文件爲:docker-compose.yml
。和Dockerfile
同樣,它也是有本身的語法命令的。其中定義的每一個服務都必須經過image指令指定鏡像或build指令(須要 Dockerfile)來自動構建。其它大部分指令都跟docker run中的相似。
若是使用build指令,在Dockerfile中設置的選項(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會自動被獲取,無需在docker-compose.yml中再次設置。
模版文件有多種寫法,例如Version 1 file format
、Version 2 file format
、Version 2.1 file format
、Version 3 file format
等。其中,Version 1 file format
將逐步被被棄用;Version 2.x
及Version 3.x
基本兼容,是將來的趨勢。
具體說明可查看:https://docs.docker.com/compose/compose-file/
各版本對應的支持的模版文件以下:
Compose file format | Docker Engine release |
---|---|
3.7 | 18.06.0+ |
3.6 | 18.02.0+ |
3.5 | 17.12.0+ |
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.4 | 17.12.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.+ |
指定爲鏡像名稱或鏡像 ID。若是鏡像在本地不存在,Compose
將會嘗試拉去這個鏡像。
例如:
image: frolvlad/alpine-glibc
指定 Dockerfile
所在文件夾的路徑。 Compose
將會利用它自動構建這個鏡像,而後使用這個鏡像。
build: /opt/docker
其中build還有一些小選項。
build: context: ./webapp dockerfile: Dockerfile-alternate args: - buildno=1 - user=someuser
context
上下文是docker build
中很重要的一個概念。構建鏡像必須指定context
。context
是 docker build
命令的工做目錄。默認狀況下,若是不額外指定 Dockerfile
的話,會將 Context
下的名爲 Dockerfile
的文件做爲 Dockerfile
。
dockerfile
選項是值得備選的dockerfile
。args
是一些提供的參數。
覆蓋容器啓動後默認執行的命令。
command: bundle exec thin -p 3000
連接到其它服務中的容器。使用服務名稱(同時做爲別名)或服務名稱:服務別名 (SERVICE:ALIAS)
格式均可以。
links: - db - db:database - redis
使用的別名將會自動在服務容器中的 /etc/hosts
裏建立。例如:
172.17.2.186 db 172.17.2.186 database 172.17.2.187 redis
相應的環境變量也將被建立。
配置 DNS 服務器。能夠是一個值,也能夠是一個列表。
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
設置環境變量。你可使用數組或字典兩種格式。
只給定名稱的變量會自動獲取它在 Compose 主機上的值,能夠用來防止泄露沒必要要的數據。
environment: RACK_ENV: development SESSION_SECRET: environment: - RACK_ENV=development - SESSION_SECRET
從文件中獲取環境變量,能夠爲單獨的文件路徑或列表。
若是經過 docker-compose -f FILE
指定了模板文件,則 env_file
中路徑會基於模板文件路徑。
若是有變量名稱與 environment
指令衝突,則之後者爲準。
env_file: .env env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
環境變量文件中每一行必須符合格式,支持 #
開頭的註釋行。
# common.env: Set Rails/Rack environment RACK_ENV=development
暴露端口,但不映射到宿主機,只被鏈接的服務訪問。
僅能夠指定內部端口爲參數
expose: - "3000" - "8000"
卷掛載路徑設置。能夠設置宿主機路徑 (HOST:CONTAINER
) 或加上訪問模式 (HOST:CONTAINER:ro
)。
volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro
從另外一個服務或容器掛載它的全部卷。
volumes_from: - service_name - container_name
其餘相關命名了或者瞭解命令的其餘配置項,可到官網查看,包括一些選項等,真的蠻多的。。
官網:https://docs.docker.com/compose/compose-file
講了命令後,你們估計和我同樣一頭霧水,接下來,就以一個實際的啓動例子,進行講解下。這裏啓動兩個先前章節編寫過的
SpringBoot
項目,進行api調用進行舉例說明。
0.編寫docker-compose.yml
文件:
# 表示該文件使用Version 3 文件格式 version: '3.3' services: springboot-demo-1: # 依賴的鏡像,直接使用先前章節自定義的鏡像文件 image: lqdev.cn/springboot:0.1 # 暴露端口信息 ports: - "1222:8080" springboot-demo-2: # 依賴的鏡像,直接使用先前章節自定義的鏡像文件 image: lqdev.cn/springboot:0.1 # 暴露端口信息 ports: - "1333:8080"
1.在docker-compose.yml
文件所在目錄執行
# -d 說明是後臺運行 docker-compose up -d
此時能夠看見,啓動成功了:
[root@izbp16chpwsnff41nrjtfhz java]# docker-compose up -d Creating java_springboot-demo-1_1 ... done Creating java_springboot-demo-2_1 ... done
利用ps
命令查看,說明已經啓動成功了。
[root@izbp16chpwsnff41nrjtfhz java]# docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------ java_springboot-demo-1_1 java -Djava.security.egd=f ... Up 0.0.0.0:1222->8080/tcp java_springboot-demo-2_1 java -Djava.security.egd=f ... Up 0.0.0.0:1333->8080/tcp
或者查看下日誌輸出,能夠看見SpringBoot
已經啓動成功:
訪問下服務,能夠看見能正常輸出了:
示例就簡單的利用images
和ports
進行簡單的運行了一個Comoose
示例,你們對於複雜的能夠本身試着編寫下,對於一個後端的我來講,這塊用到的機會仍是不多了,畢竟都是本身一個微服務,本身啓停了。⊙﹏⊙‖∣
官方的文檔仍是很齊全的,建議你們仍是直接去官網查看相關資料。
本章節主要介紹了關於
Compose
編排工具的使用。使用了編排工具後,提供了應用系統部署各個管理應用的便捷性。學習後,你們就能夠根據本身的業務需求,業務系統進行合理的編排工做了。通常上仍是利用在微服務的編排上,通常上一個應用系統可能存在這幾十個微服務的,因此說合理的利用編排工具能夠提升部署效率,同時也能減小出錯遺漏的機率。
鑑於做者也是個初學者,水平有限,若文中有錯誤或者遺漏之處,還望指出,共同進步!
499452441
lqdevOps
我的博客:http://blog.lqdev.cn