注意docker-compose版本不同,指令执行结果会不同,具体的以官网文档为主
注意docker-compose版本不同,指令执行结果会不同,具体的以官网文档为主
注意docker-compose版本不同,指令执行结果会不同,具体的以官网文档为主
docker-compose模板指令和指令不太一样,模板指令是用再docker-compose.yml文件中的,指令是运行docker-compose的一些指令
指令中文API文档,看这里
模板命令中文API文档,看这里
ports映射的端口,
用引号引起来,避免出现进制转换出问题
version: "3.0"
services:
tomcat:
# image: 镜像ID也可以
image: tomcat:jre8
ports:
- "8080:8080"
宿主机与容器中目录数据卷共享
// 可以使用几种方式挂载数据卷
volumes:
- 宿主机绝对路径:容器内部的文件路径
- # 相对路径挂容器内部路径,注意这种要在外部声明一下volumes
- testFile:/user/local/tomcat/webapps
version: "3.0"
services:
tomcat:
image: tomcat:jre8
ports:
- "8080:8080"
volumes:
# 要在外部声明一下
- test:/usr/local/tomcat/webapps
# 声明上面服务所使用的自动创建的卷名
volumes:
# 声明指定的卷名
test
使用指令执行docker-compose之后,docker volume ls查看创建的数据卷,会发现和你yml中的不一致,默认的规则是项目名+你的数据卷名字,例如你写的项目名是A,那么会是A_test这种
// 查看数据卷
docker inspect A_test
使用自定义卷名
version: "3.0"
services:
tomcat:
image: tomcat:jre8
ports:
- "8080:8080"
volumes:
# 要在外部声明一下
- test:/usr/local/tomcat/webapps
# 声明上面服务所使用的自动创建的卷名
volumes:
# 声明指定的卷名
test:
# 使用自定义卷名,注意使用自定义卷的话,需要你自己先创建一个test数据卷
# docker volume create test
external:
true # true代表使用自定义卷名
network网桥
version: "3.0"
services:
tomcat:
image: tomcat:jre8
ports:
- "8080:8080"
volumes:
- test:/usr/local/tomcat/webapps
# 指定一个网桥
networks:
- test_network
tomcat02:
image: tomcat:jre8
ports:
- "8081:8080"
volumes:
- test02:/usr/local/tomcat/webapps
networks:
- test_network
volumes:
test:
external:
true
test02:
external:
true
# 定义服务用到桥
networks:
# 定义上面的服务用到的网桥名称,默认是bridge,创建的网桥会默认带上项目名字,例如项目名字是A,那么是A_test_network
test_network
container_name指定容器名字,默认是:项目名称_服务名称_序号
version: "3.0"
services:
tomcat:
# 相当于run的 --name
container_name: test01
# 相当于run的 image
image: tomcat:jre8
# 相当于run -p
ports:
- "8080:8080"
# 相当于run -v
volumes:
- test:/usr/local/tomcat/webapps
# 相当于run -network
networks:
- test_network
tomcat02:
container_name: test02
image: tomcat:jre8
ports:
- "8081:8080"
volumes:
- test02:/usr/local/tomcat/webapps
networks:
- test_network
volumes:
test:
external:
true
test02:
external:
true
networks:
test_network
external:
# 使用外部网桥,网桥必须存在
# docker network create -d bridge test_network
true
配置mysql,redis
version: "3.0"
services:
tomcat:
# 相当于run的 --name
container_name: test01
# 相当于run的 image
image: tomcat:jre8
# 相当于run -p
ports:
- "8080:8080"
# 相当于run -v
volumes:
- test:/usr/local/tomcat/webapps
# 相当于run -network
networks:
- test_network
tomcat02:
container_name: test02
image: tomcat:jre8
ports:
- "8081:8080"
volumes:
- test02:/usr/local/tomcat/webapps
networks:
- test_network
mysql:
image: mysql:5.7.32
container_name: mysql
ports:
- "3307:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconfig:/etc/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
networks:
- test_network
volumes:
test:
external:
true
test02:
external:
true
mysqldata:
mysqlconf:
networks:
test_network
external:
# 使用外部网桥,网桥必须存在
# docker network create -d bridge test_network
true
version: "3.0"
services:
tomcat:
# 相当于run的 --name
container_name: test01
# 相当于run的 image
image: tomcat:jre8
# 相当于run -p
ports:
- "8080:8080"
# 相当于run -v
volumes:
- test:/usr/local/tomcat/webapps
# 相当于run -network
networks:
- test_network
tomcat02:
container_name: test02
image: tomcat:jre8
ports:
- "8081:8080"
volumes:
- test02:/usr/local/tomcat/webapps
networks:
- test_network
mysql:
image: mysql:5.7.32
container_name: mysql
ports:
- "3307:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconfig:/etc/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
networks:
- test_network
redis:
image: redis:5.0.10
container_name: redis
ports:
- "6379:6379"
volumes:
- redisdata:/data
# command 覆盖容器内部命令
command: "redis-server --appendonly yes"
networks:
- test_network
volumes:
test:
external:
true
test02:
external:
true
mysqldata:
mysqlconf:
redisdata:
networks:
test_network
external:
# 使用外部网桥,网桥必须存在
# docker network create -d bridge test_network
true
env_file用来将配置的环境变量放到配置文件中,也可以解决和environment的环境变量冲突
# 新建一个env的文件
touch xxx.env
vi xxx.env
MYSQL_ROOT_PASSWORD=root
version: "3.0"
services:
tomcat:
# 相当于run的 --name
container_name: test01
# 相当于run的 image
image: tomcat:jre8
# 相当于run -p
ports:
- "8080:8080"
# 相当于run -v
volumes:
- test:/usr/local/tomcat/webapps
# 相当于run -network
networks:
- test_network
tomcat02:
container_name: test02
image: tomcat:jre8
ports:
- "8081:8080"
volumes:
- test02:/usr/local/tomcat/webapps
networks:
- test_network
mysql:
image: mysql:5.7.32
container_name: mysql
ports:
- "3307:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconfig:/etc/mysql
env_file:
# 可以是相对路径,也可以是绝对路劲,相对路劲需要保持在一个目录下
- xxx.env
networks:
- test_network
redis:
image: redis:5.0.10
container_name: redis
ports:
- "6379:6379"
volumes:
- redisdata:/data
# command 覆盖容器内部命令
command: "redis-server --appendonly yes"
networks:
- test_network
volumes:
test:
external:
true
test02:
external:
true
mysqldata:
mysqlconf:
redisdata:
networks:
test_network
external:
# 使用外部网桥,网桥必须存在
# docker network create -d bridge test_network
true
depends_on 容器编排使用,例如tomcat的一个web服务依赖mysql,还依赖Redis,那么先启动mysql,redis,再启动tomcat服务
注:不会依赖mysql和redis完全启动完才会启动,而是mysql和redis启动到一定程度,web服务就会启动
version: "3.0"
services:
tomcat:
# 相当于run的 --name
container_name: test01
# 相当于run的 image
image: tomcat:jre8
# 相当于run -p
ports:
- "8080:8080"
# 相当于run -v
volumes:
- test:/usr/local/tomcat/webapps
# 相当于run -network
networks:
- test_network
# 代表这个容器必须依赖哪些容器启动之后才能启动
# 注意这里是服务名字
depends_no:
- mysql
- redis
tomcat02:
container_name: test02
image: tomcat:jre8
ports:
- "8081:8080"
volumes:
- test02:/usr/local/tomcat/webapps
networks:
- test_network
mysql:
image: mysql:5.7.32
container_name: mysql
ports:
- "3307:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconfig:/etc/mysql
env_file:
# 可以是相对路径,也可以是绝对路劲,相对路劲需要保持在一个目录下
- xxx.env
networks:
- test_network
redis:
image: redis:5.0.10
container_name: redis
ports:
- "6379:6379"
volumes:
- redisdata:/data
# command 覆盖容器内部命令
command: "redis-server --appendonly yes"
networks:
- test_network
volumes:
test:
external:
true
test02:
external:
true
mysqldata:
mysqlconf:
redisdata:
networks:
test_network
external:
# 使用外部网桥,网桥必须存在
# docker network create -d bridge test_network
true
healthcheck健康检查,其实就是发一个请求调用看是否正常
version: "3.0"
services:
tomcat:
# 相当于run的 --name
container_name: test01
# 相当于run的 image
image: tomcat:jre8
# 相当于run -p
ports:
- "8080:8080"
healthcheck:
test: ["CMD", "curl", "-f", "你机器的地址和接口路劲"]
interval: 1m30s
timeout: 10s
retries: 3
sysctls 配置容器内核参数,注意每个容器的内部参数不一样,你要看报错的提示然后进行自定义的修改
ulimits 指定容器的线程数,同上,要根据报错提示进行修改
version: "3.0"
services:
tomcat:
# 相当于run的 --name
container_name: test01
# 相当于run的 image
image: tomcat:jre8
# 相当于run -p
ports:
- "8080:8080"
healthcheck:
test: ["CMD", "curl", "-f", "你机器的地址和接口路劲"]
interval: 1m30s
timeout: 10s
retries: 3
# 修改容器中系统内部参数,服务启动可能容器内操作系统参数有误或限制,可以通过修改来进行访问启动
sysctls:
- net.core.somaxconn=1024
- net.ip4.tcp_syncookies=0
# 修改系统最大进程数
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
build指令,用来指定DockerFile所在目录,先根据build中dockerfile自动构建镜像,自动运行容器
version: "3.0"
services:
demo:
# 先将build命令中指定dockerfile打包成镜像,再运行该镜像
build:
# 指定上下文目录,dockerfile所在路径,相对路劲或者绝对路劲
context: demo
# 指定dockerfile的文件名字
dockerfile: Dockerfile
container_name: demo
ports:
- "8080:8080"
networks:
- test
depends_no:
- test01
tomcat:
# 相当于run的 --name
container_name: test01
# 相当于run的 image
image: tomcat:jre8
# 相当于run -p
ports:
- "8080:8080"