Docker | 第七章:Docker Compose服務編排介紹及使用
前言
前面章節,我們學習了如何構建自己的鏡像文件,如何保存自己的鏡像文件。大多都是一個鏡像啟動。當一個系統需要多個子系統進行配合時,若每個子系統也就是鏡像需要一個個手動啟動和停止的話,那估計實施人員也會崩潰的,而且效率也很低,維護的量也就很大了。所以,本章節就來了解下,如何利用官方提供的
Compose
編排工具按一定的業務規則來合理的進行容器啟停工作。
- Compose介紹
- Compose安裝
- 二進制文件直接安裝
- 使用pip(Python包管理工具)安裝
- 命令補齊
- Compose常用命令
- build
- kill
- logs
- port
- ps
- pull
- rm
- run
- start
- stop
- up
- pause
- docker-compose.yml模版文件常用命令
- image
- build
- command
- links
- dns
- environment
- env_file
- expose
- volumes
- volumes_from
- Compose編排實踐
- 參考資料
- 總結
- 最後
- 老生常談
Compose介紹
Compose是一個用於定義和運行多個
Docker
容器的編排工具。可以一條命令啟動多個容器。主要是解決了容器與容器之間如何管理編排的問題。
按官網的說明,使用Compose
基本上也就分成三步:
- 利用
Dockerfile
定義運行環境 - 使用
docker-compose.yml
定義組成應用的各服務 - 運行
docker-compose up
啟動應用
題外話:我所理解的就是,其實就是個批量工具,如批處理命令一樣。
Compose實現原理圖:
Compose 中有兩個重要的概念:
- 服務 (service) :一個應用的容器,實際上可以包括若幹運行相同鏡像的容器實例。
- 項目 (project) :由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。
一個項目可以由多個服務(容器)關聯而成,Compose
面向項目進行管理,通過子命令對項目中的一組容器進行便捷地生命周期管理。
Compose
項目由 Python
編寫,實現上調用了 Docker
Docker API
,就可以在其上利用 Compose
來進行編排管理。
題外話:關於Docker API
會在下一章節進行詳細說明。
Compose安裝
本身
Compose
是一個獨立的產品,所以需要獨立安裝的。
按官網的說明,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(Python包管理工具)安裝
這種安裝方式就是不會受限於網絡,但安裝比較麻煩。
#安裝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 說明了相應配置,這裏就不進行闡述了。
Compose常用命令
在控制窗口,直接輸入
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
這裏簡單說明下一些常用的:
build
構建或者重新構建服務。
kill
通過發送SIGKILL信號來強制停止服務容器。支持通過參數來指定發送的信號,如:docker-compose kill -s SIGINT
logs
查看服務的日誌輸出。
port
打印綁定的公共端口
ps
列出所有的容器或者指定的容器
pull
拉取鏡像
rm
輸出容器
run
在一個服務上執行一個命令。如docker-compose run ubuntu ping docker.com
將會啟動一個 ubuntu 服務,執行 ping docker.com
命令。默認情況下,所有關聯的服務將會自動被啟動,除非這些服務已經在運行中。
該命令類似啟動容器後運行指定的命令,相關卷、鏈接等等都將會按照期望創建。
兩個不同點:
- 給定命令將會覆蓋原有的自動運行命令;
- 不會自動創建端口,以避免沖突。
如果不希望自動啟動關聯的容器,可以使用 --no-deps
選項,例如
$ docker-compose run --no-deps web python manage.py shell
將不會啟動 web 容器所關聯的其它容器。
start
啟動一個已經存在的服務容器。
stop
停止一個已經運行的容器,但不刪除它。
up
構建,(重新)創建,啟動,鏈接一個服務相關的容器。鏈接的服務都將會啟動,除非他們已經運行。
默認情況, docker-compose up
將會整合所有容器的輸出,並且退出時,所有容器將會停止。如果使用 docker-compose up -d
,將會在後臺啟動並運行所有的容器。
默認情況,如果該服務的容器已經存在, docker-compose up
將會停止並嘗試重新創建他們(保持使用 volumes-from
掛載的卷),以保證 docker-compose.yml
的修改生效。如果你不想容器被停止並重新創建,可以使用 docker-compose up --no-recreate
。如果需要的話,這樣將會啟動已經停止的容器。
pause
暫停容器服務
其他的命令,可直接通過幫助查詢下。
docker-compose.yml模版文件常用命令
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.+ |
image
指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose
將會嘗試拉去這個鏡像。
例如:
image: frolvlad/alpine-glibc
build
指定 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
覆蓋容器啟動後默認執行的命令。
command: bundle exec thin -p 3000
links
鏈接到其它服務中的容器。使用服務名稱(同時作為別名)或服務名稱:服務別名 (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 服務器。可以是一個值,也可以是一個列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
environment
設置環境變量。你可以使用數組或字典兩種格式。
只給定名稱的變量會自動獲取它在 Compose 主機上的值,可以用來防止泄露不必要的數據。
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
env_file
從文件中獲取環境變量,可以為單獨的文件路徑或列表。
如果通過 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
暴露端口,但不映射到宿主機,只被連接的服務訪問。
僅可以指定內部端口為參數
expose:
- "3000"
- "8000"
volumes
卷掛載路徑設置。可以設置宿主機路徑 (HOST:CONTAINER
) 或加上訪問模式 (HOST:CONTAINER:ro
)。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
volumes_from
從另一個服務或容器掛載它的所有卷。
volumes_from:
- service_name
- container_name
其他相關命名了或者了解命令的其他配置項,可到官網查看,包括一些選項等,真的蠻多的。。
官網:https://docs.docker.com/compose/compose-file
Compose編排實踐
講了命令後,大家估計和我一樣一頭霧水,接下來,就以一個實際的啟動例子,進行講解下。這裏啟動兩個先前章節編寫過的
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
示例,大家對於復雜的可以自己試著編寫下,對於一個後端的我來說,這塊用到的機會還是很少了,畢竟都是自己一個微服務,自己啟停了。⊙﹏⊙‖∣
參考資料
官方的文檔還是很齊全的,建議大家還是直接去官網查看相關資料。
- https://docs.docker.com/compose/install
- https://docs.docker.com/compose/reference/
- https://docs.docker.com/compose/compose-file
- https://www.hi-linux.com/posts/12554.html
總結
本章節主要介紹了關於
Compose
編排工具的使用。使用了編排工具後,提供了應用系統部署各個管理應用的便捷性。學習後,大家就可以根據自己的業務需求,業務系統進行合理的編排工作了。一般上還是利用在微服務的編排上,一般上一個應用系統可能存在這幾十個微服務的,所以說合理的利用編排工具可以提高部署效率,同時也能減少出錯遺漏的機率。
最後
鑒於作者也是個初學者,水平有限,若文中有錯誤或者遺漏之處,還望指出,共同進步!
老生常談
- 個人QQ:
499452441
- 微信公眾號:
lqdevOps
個人博客:http://blog.lqdev.cn
原文地址:http://blog.lqdev.cn/2018/08/12/docker/docker-seven/
Docker | 第七章:Docker Compose服務編排介紹及使用