Docker Compose概述
Compose是一個通過yaml
文件來定義、運行、管理Docker容器的工具,負責實現對Docker容器集羣的快速編排。
安裝Compose
在Linux環境安裝Compose:
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.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.26.0, build d4451659
docker-py version: 4.2.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
如果想要卸載Composer,直接將對應文件刪除即可:
sudo rm /usr/local/bin/docker-compose
Compose的使用
Compose 裏涉及到兩個重要概念:service
、project
。
service:一個應用容器,實際上可以運行多個相同鏡像的實例;
project:由一組相互關聯的應用容器組成的一個完整業務單元。
由此可知,一個項目由多個服務(應用容器)組成,Compose面向項目進行管理。
Compose 模板文件
Compose 模板文件是使用Compose
的核心,默認名稱爲docker-compose.yml
,文件格式爲yaml
。一個簡單的模板文件如下所示:
version: "3"
services:
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"
version
:指定模板文件的版本號,當前最新版本爲3.8
,詳情可看官網。
services
:定義應用服務,webapp
是自定義的服務名稱,image
指定鏡像名稱,ports
對容器端口進行映射,volumes
指定數據卷掛載。
雖然模板文件裏參數特別多,但是很多都跟Docker裏的參數含義一致,所以理解起來也比較容易,下面以官方的例子來進行講解。
# 指定模板文件版本號
version: "3.8"
services:
# 自定義的服務名
redis:
# 指定服務鏡像
image: redis:alpine
# 端口映射,這裏只指定了容器端口,沒有和宿主機端口進行映射
ports:
- "6379"
# 指定服務網絡
networks:
- frontend
# 指定服務部署相關配置,僅用於 Swarm 集羣部署的時候,如果僅運行 docker-compose up 或 docker-compose run 將被忽略。
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
# 表示該服務依賴於redis服務
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"
# 在容器響應中斷信號之前,允許等待的時間,即等待1m30s後再把容器停掉
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:
Compose 實戰
下面我們來搭建一個ElasticSearch+Kibana+Logstash
的服務項目來介紹Compose的使用。
創建一個compose-test
目錄並進入該目錄:
mkdir compose-test
cd compose-test/
創建Compose 模板文件:
touch docker-compose.yml
編輯該文件:
vi docker-compose.yml
輸入以下內容:
version: '3'
services:
es01:
image: elasticsearch:7.7.1
container_name: es01
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms128m -Xmx512m"
volumes:
- es-data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
networks:
- elastic
kib01:
image: kibana:7.7.1
container_name: kib01
ports:
- 5601:5601
environment:
ELASTICSEARCH_URL: http://es01:9200
ELASTICSEARCH_HOSTS: http://es01:9200
networks:
- elastic
depends_on:
- es01
logstash01:
image: logstash:7.7.1
container_name: logstash01
networks:
- elastic
volumes:
- logstash01-config:/usr/share/logstash/config
environment:
- "xpack.management.enabled=false"
- "monitoring.enabled=false"
depends_on:
- es01
volumes:
es-data01:
driver: local
logstash01-config:
driver: local
networks:
elastic:
driver: bridge
執行docker-compose -p elk up -d
命令,會看到控制檯輸出以下內容:
Creating es01 ... done
Creating logstash01 ... done
Creating kib01 ... done
執行curl localhost:9200
,控制檯輸出以下內容則說明elasticsearch
已啓動成功:
{
"name" : "2b9932a79edd",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "TR59-aFHRDWXuz1VCrcr4Q",
"version" : {
"number" : "7.7.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ad56dce891c901a492bb1ee393f12dfff473a423",
"build_date" : "2020-05-28T16:30:01.040088Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
在瀏覽器輸入ip:5601
,可以看到Kibana也能正常訪問。
常用命令說明
docker-compose
命令的基本使用格式:
docker-compose [-f<arg>...] [options] [COMMAND] [ARGS...]
命令選項
-
-f,--file FILE
指定使用的模板文件,默認爲docker-compose.yml
,可以多次指定 -
p,--project-name NAME
指定項目名稱,默認使用所在目錄名稱作爲項目名稱
up
啓動容器項目,該命令參數比較多,下面說下常用的:
-d
在後臺運行服務。--force-recreate
強制構建容器。--no-crcreate
如果容器已經存在,則不重新創建,不能與--force-recreate
同時使用。no-build
不自動構建缺失的服務鏡像。
示例:
docker-compose -p elk up -d
down
停止up
命令所啓動的容器,並移除對應網絡。
示例:
docker-compose down
提示:
Removing network compose-test_elastic
WARNING: Network compose-test_elastic not found.
看來停止也要指定項目名,命令改成如下:
docker-compose -p elk down
控制檯輸出以下內容:
Stopping es01 ... done
Stopping kib01 ... done
Stopping logstash01 ... done
Removing es01 ... done
Removing kib01 ... done
Removing logstash01 ... done
Removing network elk_elastic
即down
命令會先把對應容器服務停掉,隨後刪除,最後再把對應網絡移除。
ps
列出項目中所有容器。
示例:
docker-compose -p elk ps
輸出:
Name Command State Ports
----------------------------------------------------------------------------------------------------
es01 /tini -- /usr/local/bin/do ... Up 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp
kib01 /usr/local/bin/dumb-init - ... Up 0.0.0.0:5601->5601/tcp
logstash01 /usr/local/bin/docker-entr ... Up 5044/tcp, 9600/tcp
images
列出Compose文件包含的鏡像。
示例:
docker-compose -p elk images
輸出:
Container Repository Tag Image Id Size
------------------------------------------------------------
es01 elasticsearch 7.7.1 830a894845e3 804.3 MB
kib01 kibana 7.7.1 6de54f813b39 1.201 GB
logstash01 logstash 7.7.1 7f059e3dee67 787.9 MB
logs
格式爲:docker-compose logs [options] [SERVICE...]
查看項目容器服務的日誌,默認情況下不同容器日誌顏色不一樣。
示例:
docker-compose -p elk logs --tail 2
輸出:
es01 | "at io.netty.util.internal......",
es01 | "at java.lang......"] }
kib01 | {"type":"log"......}
kib01 | {"type":"log"......}
logstash01 | [2020-06-09T09:02:41,917]......
logstash01 | [2020-06-09T09:02:42,445]......
如果只想看指定服務的日誌,命令如下:
docker-compose -p elk logs --tail 2 kib01
top
查看項目中容器運行的進程。
示例:
# 查看全部容器的進程
docker-compose -p elk top
# 查看指定容器的進程
docker-compose -p elk top kib01
port
查看指定容器對外映射的端口。
示例:
docker-compose -p elk port es01 9200
輸出:
0.0.0.0:9200
rm
移除項目容器,如果指定-v
參數,還會同時把對應數據卷刪除,注意,項目中使用的網絡不會移除。
格式爲:
Usage: rm [options] [SERVICE...]
Options:
-f, --force Don't ask to confirm removal
-s, --stop Stop the containers, if required, before removing
-v Remove any anonymous volumes attached to containers
示例:
docker-compose -p elk rm -s -v logstash01
輸出:
Stopping logstash01 ... done
Going to remove logstash01
Are you sure? [yN] Y
Removing logstash01 ... done
其它命令可參看官網。
ptions] [SERVICE…]
Options:
-f, --force Don’t ask to confirm removal
-s, --stop Stop the containers, if required, before removing
-v Remove any anonymous volumes attached to containers
示例:
```shell
docker-compose -p elk rm -s -v logstash01
輸出:
Stopping logstash01 ... done
Going to remove logstash01
Are you sure? [yN] Y
Removing logstash01 ... done
其它命令可參看官網。