1 安裝:
官方:
curl -L https://github.com/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
或者使用包管理工具:
apt-get install docker-compose
2 使用場景
docker-compose用來單機上編排容器(定義和運行多個容器,使容器能互通)
Eg:前端和后端部署在一台機器上,現在直接通過編寫docker-compose文件對多個服務(可定義依賴,按順序啟動服務)同時進行啟動/停止/更新
注:
docker-compose將所管理的容器分為3層結構:project service container
docker-compose.yml組成一個project,project里包括多個service,每個service定義了容器運行的鏡像(或構建鏡像),網絡端口,文件掛載,參數,依賴等,每個service可包括同一個鏡像的多個容器實例。
即 project 包含 service ,service 包含 container
3 編寫docker-compose.yml
官網地址:https://docs.docker.com/compose/compose-file/
version: '3'
services:
back:
image: backService:1.0
container_name: back
environment:
- name=tom
- DB_PATH=jdbc:sqlite:/data/ns.db
restart: always
privileged: true
ports:
- "9000:9000"
networks:
- "net"
volumes:
- "/root/k3s.kube.config:/k3s.kube.config"
- "/root/data:/data"
- "/etc/network/interfaces:/etc/network/interfaces"
front:
image: front:1.0
container_name: front
restart: always
ports:
- "10087:80"
networks:
- "net"
volumes:
- "/root/nginx.conf:/etc/nginx/nginx.conf"
networks:
net:
driver: bridge
version:指定 docker-compose.yml 文件的寫法格式
services:多個容器集合environment:環境變量配置,可以用數組或字典兩種方式
environment:
RACK_ENV: "development"
SHOW: "ture"
-------------------------
environment:
- RACK_ENV="development"
- SHOW="ture"
image:指定服務所使用的鏡像
version: '2'
services:
redis:
image: redis:alpine
expose:定義容器用到的端口(一般用來標識鏡像使用的端口,方便用ports映射)
expose:
- "3000"
- "8000"
ports:定義宿主機端口和容器端口的映射,可使用宿主機IP+宿主機端口進行訪問 宿主機端口:容器端口
ports: # 暴露端口信息 - "宿主機端口:容器暴露端口"
- "5000"
- "8081:8080"
注:僅指定容器端口時,宿主機將會隨機選擇端口
volumes:卷掛載路徑,定義宿主機的目錄/文件和容器的目錄/文件的映射 宿主機路徑:容器路徑
volumes:
- "/var/lib/mysql"
- "hostPath:containerPath"
- "root/configs:/etc/configs"
depend_on: 規定service加載順序,例如數據庫服務需要在后台服務前運行
extra_hosts:類似於docker里的--add-host參數 配置DNS域名解析(域名和IP的映射)
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
相當於在容器種的/etc/hosts文件里增加
8.8.8.8 googledns
52.1.157.61 dockerhub
restart: always :配置重啟,docker每次啟動時會啟動該服務
restart: always
privileged: true :開啟特權模式
privileged: true
user: root :指定容器運行的用戶名
user: root
links:將指定容器連接到當前連接,可以設置別名,已廢棄,推薦使用networks
networks:
可參考:https://www.cnblogs.com/jsonhc/p/7823286.html
version: '3'
services:
front:
image: front
container_name: front
depends_on:
- php
ports:
- "80:80"
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html"
back:
image: back
container_name:back
expose:
- "9000"
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html"
networks:
net1:
driver: bridge
front里可以直接用back替換IP訪問back
logging:日志服務
driver:默認json-file,可選syslog
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
network_mode:設置網絡模式
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
bridge:默認,需要單獨配置ports映射主機port和服務的port,並且開啟了容器間通信
host:和宿主機共享網絡,比如service是8081端口,無需配置ports,直接可以用主機IP:8081訪問
cap_add cap_drop:賦予/刪除 容器某些能力
可運行 man 7 capabilities 查看所有能力
build:配置構建時,Compose 會利用它自動構建鏡像,該值可以是一個路徑,也可以是一個對象,用於指定 Dockerfile 路徑
注:如果指定build同時也指定image,那么會從build里構建,鏡像的名字和tag將取image指定的
build: .
image: webapp:tag
command:覆蓋容器啟動后默認執行的命令
command: bundle exec thin -p 3000
----------------------------------
command: [bundle,exec,thin,-p,3000]
4 docker-compose命令:
官網地址:https://docs.docker.com/compose/reference/overview/
注意:
以下都需要在docker-compose.yml所在目錄下執行,且名字就是默認的docker-compose.yml,否則需要加上 -f yml地址
Eg: docker-compose -f /usr/docker/docker-compose1.yml ps
* 表示常用
* docker-compose pull:拉取服務里定義的鏡像
* docker-compose ps :列出project所有運行容器(容器名 = 目錄名_service_index index表示容器序數,從1開始)
Eg:
docker-compose build:構建/重新構建所有鏡像
當某個service的Dockerfile改變時,即鏡像發生改變需要重新生成時,如果僅僅是docker-compose.yml改變,只需要up重新啟動project即可
docker-compose start [serviceName]:啟動已存在但停止的所有service
(可選)serviceName:表示啟動某一個service
* docker-compose up -d(相當於 build + start ) :構建(容器)並啟動(容器)整個project的所有service
-d:后台進程
--scale:指定服務運行的容器個數(如果服務有對外的端口就不能指定多個容器,因為端口已經被占用) Eg:docker-compose up -d --scale web=1 --scale redis=2
docker-compose stop [serviceName]:停止運行的service
(可選)serviceName:表示停止某一個service
docker-compose rm -f [serviceName]:刪除已停止的所有service
(可選)serviceName:表示刪除已停止某一個service(可以用docker-compose up重新構建service)
-f :刪除不在詢問
* docker-compose down -v(相當於 stop + rm ):停止並移除整個project的所有services
-v :刪除掛載卷和volunme的鏈接
* docker-compose logs [serviceName]:查看服務內所有容器日志輸出,
加上serviceName表示輸出某一個service的日志
-f:實時輸出日志
docker-compose run service command:在某個服務上運行命令
Eg:docker-compose run web ping www.baidu.com
* docker-compose exec [serviceName] sh:進入到某個容器
--index:2 :當服務內有多個容器時,需要指定第幾個,默認是第一個 Eg:docker-compose exec --index=2 web sh
docker-compose restart [serviceName]: 重啟服務
docker-compose config:驗證和查看compose文件
docker-compose images:列出所用的鏡像
docker-cpmpose scale:設置服務個數 Eg:docker-compose scale web=2 worker=3
docker-compose pause [serviceName]:暫停服務
docker-compose unpause [serviceName]:恢復服務
常見流程:
啟動:創建docker-compose.yaml -> docker-compose pull -> docker-compose up -d
更新:docker-compose down -v -> docker-compose pull -> docker-compose up -d
from:https://blog.csdn.net/qq_35720307/article/details/87256684