Docker Compose
文章目录
版本
- docker 18.03
- compose 1.21.2
wget https://github.com/docker/compose/releases/download/1.21.2/docker-compose-linux-x86_64
命令
docker-compose up [-d]
docker-compose down
docker-compose start/restart/stop [service_name]
-
创建目录:**
mkdir -p /opt/compose
-
在该目录下创建应用的目录,如 web
- 创建
Dockerfile
- 编辑指令(FROM、RUN)
- 创建
-
新建
docker-compose.yml
version: "0.1" services: ngx: build: ./web/ ports: - "8888:80" redis: image: "hub.c.163.com/library/redis:latest"
-
运行构建
docker-compose up -d
-f 指定文件名,默认docker-compose.yml
-d 后台运行
yml参数详解
build
指定包含构建上下文的路径
build: ./dir
或者作为一个对象:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
name: value
- context,包含Dockerfile文件的目录路径
- dockerfile,备用Docker文件
- args,添加构建镜像的参数,环境变量只能在构建过程中访问
#首先,在Dockerfile中指定要使用的参数:
ARG number
RUN echo "number: $number"
# 然后在args键下指定参数值
build:
context: .
args:
number: "1234"
image
指定启动容器的镜像,可以是镜像仓库/标签或者镜像id
image: "hub.c.163.com/library/redis:latest"
image: "id"
同时指定image和build,则compose会通过build指定的目录构建容器镜像,而构建的镜像名为image中指定的镜像名和标签。
command
覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
command: ["bundle", "exec", "thin", "-p", "3000"]
volumes
挂载宿主机目录
volumes
- ./data :/data
- data_volume:/var/lib/mysql
volumes:
- appdata:/usr/share/kibana/config
volumes:
appdata:
driver: local
links
链接到另一个服务中的容器
任何服务都可以以该服务的名称到达任何其他服务,实际上是通过设置/etc/hosts的域名解析,前提是多个服务容器在一个网络中可路由连通
links:
- db:alias
external_links
链接外部容器(非compose管理)
external_links:
- mysql_server:mysql
extra_hosts
添加hosts
extra_hosts:
- "tracker:192.168.1.100"
expose
暴露端口,但不映射到宿主机,只被连接的服务访问
expose:
- "3000"
- "8000"
ports
暴露端口,宿主端口:容器端口,建议字符串格式
ports:
- "3000"
- "3000-3005"
- "8000:8000"
environment
添加环境变量
environment:
- SERVERID=SRV01
environment:
TZ: Asia/Shanghai
springboot
可通过${SERVERID:ifnull}读取变量值
注意:YAML布尔值(true,false,yes,no,on,off)必须用引号括起来,以便解析器将它们解释为字符串。
networks
services:
app:
networks:
- api-net
networks:
api-net: # 网络名称
driver: custom-driver-1
默认网络
networks:
default:
driver: custom-driver-1
使用已存在网络
networks:
default:
external:
name: existing-network
兼容性
修改yml文件后,需要先down
再up
,否则不生效
测试
如果yml没有以下代码
version: "?"
services:
则external_links
&links
会起作用,并且在hosts文件中会解析
如果存在,则external_links
不起作用,links
亦无作用
如配置新或已存在网络nw_default
:
networks:
default: # 默认
external:
name: nw_default
结果:hosts中未解析,但仍可ping通services中任何服务
示例:
web:
image: hub.c.163.com/library/java:8u111-jre
container_name: web_api
external_links:
- mysql:mysql
links:
- redis
volumes:
- /home/projs/logs:/data/wwwlogs
- /home/projs/api:/data/wwwroot/api
ports:
- "8081:8081"
command: java -server -jar /data/wwwroot/api/jframe-web-api-1.0.jar --spring.profiles.active=pro
version: "3"
services:
mysqld:
image: hub.c.163.com/library/mysql
container_name: mysqld
volumes:
- /home/data/mysql:/var/lib/mysql
- /home/data/conf:/etc/mysql
environment:
MYSQL_ROOT_PASSWORD: zhenyi123
web:
image: hub.c.163.com/library/java:8u111-jre
container_name: web_api
volumes:
- /home/projs/logs:/data/wwwlogs
- /home/projs/api:/data/wwwroot/api
ports:
- "8081:8081"
command: java -server -jar /data/wwwroot/api/jframe-web-api-1.0.jar --spring.profiles.active=pro
networks:
default: # 默认
external:
name: docker-br1
案例
基于v3
version: "3"
services:
redis:
image: hub.c.163.com/library/redis
container_name: redis
environment:
TZ: Asia/Shanghai
volumes:
- /home/data/redis:/data
mysql:
image: hub.c.163.com/library/mysql
container_name: mysql
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: jimai123
ports:
- "3306:3306"
volumes:
- /home/data/mysql:/var/lib/mysql
- /home/data/config:/etc/mysql/conf.d
app:
image: hub.c.163.com/library/java:8u111-jre
container_name: web_app
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
resources:
limits:
cpus: '0.5'
memory: 1024M
environment:
TZ: Asia/Shanghai
links:
- redis
- mysql
external_links:
- fdfs_tracker:fdfs
volumes:
- /home/data/logs:/data/wwwlogs
- /home/docker/app:/data/wwwroot/app
ports:
- "8082:8082"
command: java -server -jar /data/wwwroot/app/jframe-web-app.jar --spring.profiles.active=pro
networks:
default:
external:
name: docker-br0
Python
version: "3"
services:
postdb:
image: postgres:10
environment:
POSTGRES_DB: repay
POSTGRES_USER: repay
POSTGRES_PASSWORD: repay
TZ: Asia/Shanghai
ports:
- "5432:5432"
volumes:
- ./pgdata:/var/lib/postgresql/data
api:
build: .
environment:
TZ: Asia/Shanghai
working_dir: /api
volumes:
- ./api:/api
- ./logs:/logs
links:
- postdb
command: python app.py
nginx:
image: nginx
links:
- api
environment:
TZ: Asia/Shanghai
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx:/etc/nginx/conf.d
- ./www:/www