看到一篇很不錯的docker-compose使用總結,轉載一下,
原文地址:https://www.li-rui.top/2018/11/04/docker/docker-compose%E4%BD%BF%E7%94%A8/
docker compose使用
理解
compose就是把多個容器匯聚到一塊兒形成一個容器組來提供服務,體現了微服務的思想。
如何使用
1.常用命令
#指定yml文件和項目名稱
docker-compose -f docker-compose.yml -p dongodng up -d
#進行所需的服務鏡像構建
docker-compose build
#打印出詳細的config文件
docker-compose config
#創建容器但是不運行
docker-compose create
#停掉服務,刪除容器,不刪除鏡像
docker-compose down
#接受服務之間的互動事件,如進行健康檢查等
docker-compose events
#對某個容器執行命令
docker-compose exec 容器名稱 命令
#對某個服務查看日誌
docker-compose logs -ft mysql
#查看服務狀態
docker-compose ps
#重啓服務
docker-compose restart/start/stop [服務名稱]
#運行某個服務
docker-compose run [服務名稱]
#查看服務中使用的鏡像
docker-compose images [服務名稱]
#強制停止容器,刪除
docker-compose kill
#刪除停止的容器
docker-compose rm
定義出容器鏡像的Dockerfile
#想要重啓單個服務容器
#先進行停掉服務
docker-compose stop test1
#然後刪除容器
docker-compose rm
#再次啓動該服務
docker-compose up -d test1
2.定義出容器鏡像的Dockerfile
定義出Dockerfile以後就可以方便的創建鏡像
3.啓動compose
#-d爲保持後臺啓動
docker-compose up -d
安裝compose
curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose.yml配置
1.基本概念
一個docker-compose.yml需要定義出services, networks 和volumes。這三者和容器操作的對應關係如下:
compose中 | docker中 |
---|---|
services | docker container create |
networks | docker network create |
volumes | docker volume create |
compose中還可以使用環境變量
compose現在存在三個版本的文件格式,在配置文件的第一行就要指定所用的版本
version: '3'
services:
webapp:
build: ./dir
2.services主要配置
使用Dockerfile來構建鏡像
version: '3'
services:
webapp:
#使用buid字段來通過Dockerfile構建鏡像
build:
context: ./dir
dockerfile: Dockerfile-alternate
container_name: my-web-container
#容器內目錄映射
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
#指定自定義dns
dns: 8.8.8.8
#覆蓋入口
entrypoint: /code/entrypoint.sh
container_name
配置容器名稱
container_name: my-web-container
depends_on容器依賴
配置容器名稱
container_name: my-web-container
depends_on容器依賴
web服務啓動之前會啓動db和redis,只是會等待啓動,而不是等db和redis服務可以正常提供後再啓動web比如命令
docker-compose up web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
環境變量
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
#引入環境變量文件
env_file: .env
#直接給出環境變量
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
#暴露出端口,僅僅供容器之間訪問,link的容器訪問,沒有和宿主機綁定
expose:
- "3000"
- "8000"
健康檢查
compose中的健康檢查主要和Dockerfile中的一樣,只是這個在容器外邊執行
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
指定服務所用的image
可以指定的格式
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
日誌記錄
services:
some-service:
image: some-service
logging:
#記錄驅動json-file syslog none
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
network
網絡模式
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
要加入的網絡
services:
some-service:
networks:
- some-network
- other-network
爲容器配置靜態IP,在compose中service name 和 container_name 默認會做服務發現,也就是說可以在容器container1裏面ping通container2和service2,hostname之間不會通。
version: "2.4"
services:
service1:
image: docker.li-rui.top/library/centos:7.5.1804
container_name: container1
domainname: domainname1
hostname: hostname1
mac_address: 02:42:ac:11:65:41
networks:
app_net:
ipv4_address: 172.16.1.2
service2:
image: docker.li-rui.top/library/centos:7.5.1804
container_name: container2
domainname: domainname2
hostname: hostname2
mac_address: 02:42:ac:11:65:42
networks:
app_net:
ipv4_address: 172.16.1.3
networks:
app_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.16.0.0/16
ip_range: 172.16.1.0/24
gateway: 172.16.1.1
端口映射
#短語法
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
#長語法
ports:
#targer爲容器內的端口
- target: 80
published: 8080
protocol: tcp
mode: host
容器內的內核參數調整
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
#文件句柄數設置
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
容器的數據持久化
version: "3.2"
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
#長語法
#target爲容器內的路徑
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
#短語法
- /opt/data:/var/lib/mysql
- mydata:/var/lib/mysql
networks:
webnet:
volumes:
mydata:
重啓策略restart
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
volumes主要配置
這個是和services平級的字段,其所定義的volume可以被多個服務進行復用
docker中的數據庫存儲
compose中volumes使用的是Volume方式
下面例子可以讓數據庫的數據庫文件進行週期性備份
version: "3"
services:
db:
image: db
#使用的是Volume方式
volumes:
- data-volume:/var/lib/db
backup:
image: backup-service
volumes:
- data-volume:/var/lib/backup/data
volumes:
#使用的是Bind mounts方式
data-volume:
driver
external
表示持久化存儲卷不受compose控制,compose啓動前就應該創建好
version: '2'
services:
db:
image: postgres
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
external: true
3.networks主要配置
網絡查看
docker network ls
docker network inspect bridg
compose會在up的時候建立一個默認網絡
driver
可選有:bridge(默認) overlay host 或者 none
internal和external
如果要創建外部隔離的覆蓋網絡,您可以將此internal選項設置爲true
networks:
harbor:
#docker會創建網絡
external: false
首先建立docker網絡
host_net=eth3
bri_name=pcp
bri_ip=172.16.1.119
docker_net=app_net
ip link add name $bri_name type bridge
ip link set $bri_name up
ip link set dev $host_net master $bri_name
ip addr add $bri_ip/16 dev $bri_name
docker network create --subnet=172.16.0.0/16 --gateway=$bri_ip -o com.docker.network.bridge.name=$bri_name $docker_net
docker compose使用創建的網絡
networks:
outside:
external: true
變量使用
可以使用${POSTGRES_VERSION}
變量,如果POSTGRES_VERSION
定義的話。
docker stack
介紹
docker stack可以直接使用docker-compose.yml文件而不用安裝docker-compose
使用區別
docker-compose -f docker-compose up
docker stack deploy -c docker-compose.yml somestackname
常用命令
Usage: docker stack [OPTIONS] COMMAND
Manage Docker stacks
Options:
--orchestrator string Orchestrator to use (swarm|kubernetes|all)
Commands:
deploy Deploy a new stack or update an existing stack
ls List stacks
ps List the tasks in the stack
rm Remove one or more stacks
services List the services in the stack