Compose 項目是 Docker 官方的開源項目,負責實現對 Docker 容器集羣的快速編排。使用前面介紹的Dockerfile咱們很容易定義一個單獨的應用容器。然而在平常開發工做中,常常會碰到須要多個容器相互配合來完成某項任務的狀況。例如要實現一個 Web 項目,除了 Web 服務容器自己,每每還須要再加上後端的數據庫服務容器;再好比在分佈式應用通常包含若干個服務,每一個服務通常都會部署多個實例。若是每一個服務都要手動啓停,那麼效率之低、維護量之大可想而知。這時候就須要一個工具可以管理一組相關聯的的應用容器,這就是Docker Compose。 Compose有2個重要的概念java
curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
複製代碼
這個方法如今基本行不通,下載太慢了,不推薦使用。node
從https://github.com/docker/compose/releases/download/1.25.0/docker-compose-Linux-x86_64
下載對應的安裝包,好比我下載了Linux-x86_64的。python
將下載好的安裝包剪切到/usr/local/bin/docker-compose
目錄下 mv /app/download/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
mysql
添加執行權限 sudo chmod +x /usr/local/bin/docker-compose
git
#安裝依賴
yum -y install epel-release
#安裝PIP
yum -y install python-pip
#升級PIP
pip install --upgrade pip
複製代碼
[root@tymonitor bin]# pip --version
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
複製代碼
安裝docker compose
pip install -U docker-compose==1.25.0
github
驗證docker compose版本web
[root@tymonitor bin]# docker-compose --version
docker-compose version 1.25.0, build b42d419
複製代碼
curl -L https://raw.githubusercontent.com/docker/compose/1.25.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
redis
rm /usr/local/bin/docker-compose
sql
pip uninstall docker-compose
docker
config
驗證 Compose 文件格式是否正確,若正確則顯示配置,若格式錯誤顯示錯誤緣由。 如:docker-compose -f skywalking.yml config
此命令不會執行真正的操做,而是顯示 docker-compose 程序解析到的配置文件內容:
images
列出 Compose 文件中包含的鏡像。如docker-compose -f skywalking.yml images
ps
列出項目中目前的全部容器。如docker-compose -f skywalking.yml ps
build
構建(從新構建)項目中的服務容器。如:docker-compose -f skywalking.yml build
,通常搭配自定義鏡像,好比編寫的Dockfile,功能相似於docker build .
up
該命令十分強大(重點掌握),它將嘗試自動完成包括構建鏡像,(從新)建立服務,啓動服務,並關聯服務相關容器的一系列操做。如docker-compose -f skywalking.yml up
。默認狀況,docker-compose up
啓動的容器都在前臺,控制檯將會同時打印全部容器的輸出信息,能夠很方便進行調試。
docker-compose up -d
將會在後臺啓動並運行全部的容器。通常推薦生產環境下使用該選項。 默認狀況,若是服務容器已經存在,docker-compose up
將會嘗試中止容器,而後從新建立(保持使用 volumes-from 掛載的卷),以保證新啓動的服務匹配 docker-compose.yml
文件的最新內容。若是用戶不但願容器被中止並從新建立,可使用 docker-compose up --no-recreate
。這樣將只會啓動處於中止狀態的容器,而忽略已經運行的服務。若是用戶只想從新部署某個服務,可使用 docker-compose up --no-deps -d <SERVICE_NAME>
來從新建立服務並後臺中止舊服務,啓動新服務,並不會影響到其所依賴的服務。此命令有以下選項:-d
在後臺運行服務容器。--no-color
不使用顏色來區分不一樣的服務的控制檯輸出。--no-deps
不啓動服務所連接的容器。--force-recreate
強制從新建立容器,不能與 --no-recreate 同時使用。--no-recreate
若是容器已經存在了,則不從新建立,不能與 --force-recreate 同時使用。--no-build
不自動構建缺失的服務鏡像。-t, --timeout TIMEOUT
中止容器時候的超時(默認爲 10 秒)。 down
此命令中止用up
命令所啓動的容器並移除網絡,如docker-compose -f skywalking.yml down
stop
格式爲 docker-compose stop [options] [SERVICE...]
中止已經處於運行狀態的容器,但不刪除它。經過 docker-compose start
能夠再次啓動這些容器,若是不指定service則默認中止全部的容器。如docker-compose -f skywalking.yml stop elasticsearch
選項: -t, --timeout TIMEOUT
中止容器時候的超時(默認爲 10 秒)。
start
啓動已經存在的服務容器。用法跟上面的stop
恰好相反,如docker-compose -f skywalking.yml start elasticsearch
restart
重啓項目中的服務。用法跟上面的stop
,start
同樣
logs
格式爲docker-compose logs [options] [SERVICE...]
查看服務容器的輸出。默認狀況下,docker-compose 將對不一樣的服務輸出使用不一樣的顏色來區分。能夠經過 --no-color 來關閉顏色。該命令在調試問題的時候十分有用。如docker-compose -f skywalking.yml logs
查看總體的日誌,docker-compose -f skywalking.yml logs elasticsearch
查看單獨容器的日誌
模板文件是使用 Compose 的核心,涉及到的指令關鍵字也比較多。本文主要列出幾個常見&重要的指令,其餘指令你們能夠自行百度。 默認的模板文件名稱爲 docker-compose.yml,格式爲 YAML 格式。
version: '3'
services:
elasticsearch:
image: elasticsearch:6.8.5
container_name: elasticsearch
restart: always
volumes:
- /app/skywalking/elasticsearch/data:/usr/share/elasticsearch/data:rw
- /app/skywalking/elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /app/skywalking/elasticsearch/conf/jvm.options:/usr/share/elasticsearch/config/jvm.options
- /app/skywalking/elasticsearch/logs:/usr/share/elasticsearch/logs:rw
environment:
- TZ=Asia/Shanghai
- xpack.monitoring.enabled=false
- xpack.watcher.enabled=false
ports:
- "9200:9200"
- "9300:9300"
複製代碼
注意每一個服務都必須經過 image 指令指定鏡像或 build 指令(須要 Dockerfile)等來自動構建生成鏡像。若是使用 build 指令,在 Dockerfile 中設置的選項(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會自動被獲取,無需在 docker-compose.yml 中重複設置。
images
image: apache/skywalking-oap-server:6.5.0
image: apache/skywalking-ui:6.5.0
複製代碼
ports
ports:
- "3000"
- "8080:8080"
- "127.0.0.1:8001:8001"
複製代碼
volumes
volumes:
- /app/skywalking/elasticsearch/data:/usr/share/elasticsearch/data:rw
- conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
複製代碼
version: "3"
services:
my_src:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
複製代碼
ulimits
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
複製代碼
depends_on
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: mysql
複製代碼
environment
environment:
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
environment:
- SW_STORAGE= elasticsearch
- SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200
複製代碼
restart
always
或者 unless-stopped
。restart: always
首先我須要推薦兩件事:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com",
"https://reg-mirror.qiniu.co"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
複製代碼
本次實戰咱們以docker-compose部署skywalking爲例。編寫skywalking.yml,內容以下。
version: '3.3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.8.5
container_name: elasticsearch
restart: always
ports:
- 9200:9200
- 9300:9300
environment:
discovery.type: single-node
ulimits:
memlock:
soft: -1
hard: -1
oap:
image: skywalking/oap
container_name: oap
depends_on:
- elasticsearch
links:
- elasticsearch
restart: always
ports:
- 11800:11800
- 12800:12800
environment:
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
ui:
image: skywalking/ui
container_name: ui
depends_on:
- oap
links:
- oap
restart: always
ports:
- 8080:8080
environment:
SW_OAP_ADDRESS: oap:12800
複製代碼
部署完成後將其上傳至服務器,執行docker-compose -f /app/skywalking.yml up -d
便可。
我的公衆號:JAVA日知錄 , 我的網站