看到一篇很不错的docker-compose使用总结,转载一下,
原文地址:https://www.li-rui.top/2018/11/04/docker/docker-compose%E4%BD%BF%E7%94%A8/
compose就是把多个容器汇聚到一块儿形成一个容器组来提供服务,体现了微服务的思想。
#指定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
定义出Dockerfile以后就可以方便的创建镜像
#-d为保持后台启动
docker-compose up -d
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需要定义出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
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: my-web-container
配置容器名称
container_name: my-web-container
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: 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_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: "no"
restart: always
restart: on-failure
restart: unless-stopped
这个是和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:
表示持久化存储卷不受compose控制,compose启动前就应该创建好
version: '2'
services:
db:
image: postgres
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
external: true
docker network ls
docker network inspect bridg
compose会在up的时候建立一个默认网络
可选有:bridge(默认) overlay host 或者 none
如果要创建外部隔离的覆盖网络,您可以将此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-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