直接上例子及介绍:
docker-compose中文参考手册
https://docker_practice.gitee.io/zh-cn/
官方文档地址:https://www.docker.com/get-started
version: "3.2"
services:
#服务名称
tomcat01:
#指定容器名称,相当于run的--name
container_name: tomcat01
#服务对应的镜像,用这个镜像启动容器,镜像在本地不存在,会自动拉去该镜像,相当于run image
image: tomcat:8.0-jre8
# 用来完成host与容器的端口映射关系,是数据的形式,可以有多个,官方建议用引号包起来,当端口号小于60,系统会按照进制读取,会报错,相当于run -p
ports:
#宿主机:容器,可以有多个
- "8083:8080"
#- "5672:5890"
volumes:
#完成宿主机与容器中目录数据卷的共享,相当于run -v,有下面两种方式
#- /root/apps:/usr/local/tomcat/webapps #1、适用自定义路径映射 宿主机路径:容器中的路径,在宿主机的/root/apps下就可以看到容器/usr/local/tomcat/webapps中的文件
- tomcatwebapps01:/usr/local/tomcat/webapps #2、自动映射,但是tomcatwebapps必须声明一下
#相当于run --network
networks:
#创建一个hello的桥,hello为项目的名称
- hello
tomcat02:
container_name: tomcat02
image:
ports:
- "8083:8080"
volumes:
- tomcatwebapps:/usr/local/tomcat/webapps
networks:
#代表当前服务使用哪个网桥,这样tomcat01和tomcat02就可以通信,可以在tomcat01里访问tomcat02的接口
- hello
mysql:
container_name: mysql
image: mysql:5.7.32
ports:
- "3307:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconf:/etc/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
networks:
- hello
redis:
container_name: redis
image: redis:5.0.10
ports:
- "6379:6379"
volumes:
- redisdata:/data
networks:
- hello
command: "redis-server --appendonly yes"
# run镜像之后用来覆盖容器内默认命令,用--appendonly yes覆盖redis-server,--appendonly yes意思是开启持久化
volumes:
#声明上面tomcat01服务所使用的自动创建的卷名 tomcatwebapps:
tomcatwebapps01:
# 声明指令的卷名,compose自动创建卷名,但是会在之前加上项目名(这是默认的方式),使用命令查看 docker volume ls(会列表所有的卷,用命令docker volume prune可以删除卷)
# docker inspect hello_tomcatwebapps,查看里面的内容,Mountpoint对应的路径就是文件所在的位置
external:
# 如果要使用自定义的卷名,加这个关键字,设置为true,前提是,必须要提前创建好该卷名,否则启动时会报错,创建命令 docker volume create tomcatwebapps
true
tomcatwebapps02:
mysqldata:
mysqlconf:
redisdata:
networks:
# 定义服务用到的桥,常用的有 bridge,net,默认的事bridge,查看网络使用的是docker network ls
hello:
external:
# 默认在网桥的名称前面加了项目的名称,这样就可以使用自定义的网桥名称,网桥叫hello
# 前提是hello这个网桥必须提前建好(建网桥 docker network create -d bridge hello,-d是隐藏,查看网桥docker network ls, docker inspect 容器ID看细节)
true
这样就可以在tomcat01里面用名称访问tomcat02里面的信息
docker exec -it tomcat01 bash
curl http://tomcat02:8080
env_file:
# 和environment搭配使用,从文件中获取环境变量,可以为单独的文件路径或者列表,如果通过docker-compose -f FILE方式来指定Compose模板文件,则env_file中变量的路径会基于模板文件路径,如果有变量名称与environment指令冲突,则以后者为准
# 这种方式可以隐藏一些敏感信息,提高安全性
# 用来将environment环境中配置放入指定文件中,这个指定文件必须是以.env结尾,里面的文件路径可以是相对路径也可以是绝对路径
version: "3.2"
services:
mysql:
container_name: mysql
image: mysql:5.7.32
ports:
- "3307:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconf:/etc/mysql
# environment:
# - MYSQL_ROOT_PASSWORD=root
env_file:
# 下面的写法是在docker-compose.yml所在的路径建一个mysql.env的文件,里面写了:MYSQL_ROOT_PASSWORD=root
- ./mysql.env
#- mysql.env 这种写法也可以
networks:
- hello
depends-on
解决容器的依赖。启动先后的问题,真正体现了docker-compose编排容器的作用
version: "3.2"
services:
tomcat01:
container_name: tomcat01
image: tomcat:8.0-jre8
ports:
- "8083:8080"
volumes:
- tomcatwebapps01:/usr/local/tomcat/webapps # 自动映射,但是tomcatwebapps必须声明一下
networks:
- hello
depends-on:
# 代表这个容器必须依赖哪些容器启动之后才能启动
- tomcat02 # 服务名,不是容器名!!!
- redis # 服务名,不是容器名!!!
- mysql # 服务名,不是容器名!!! 三遍
# 并不是等这三个容器完全启动之后在启动tomcat01,而是等他们启动到一定程度之后就会启动
tomcat02:
container_name: tomcat02
image:
ports:
- "8083:8080"
volumes:
- tomcatwebapps:/usr/local/tomcat/webapps
networks:
- hello
mysql:
container_name: mysql
image: mysql:5.7.32
ports:
- "3307:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconf:/etc/mysql
# environment:
# - MYSQL_ROOT_PASSWORD=root
env_file:
# 下面的写法是在docker-compose.yml所在的路径建一个mysql.env的文件,里面写了:MYSQL_ROOT_PASSWORD=root
- ./mysql.env
networks:
- hello
redis:
container_name: redis
image: redis:5.0.10
ports:
- "6379:6379"
volumes:
- redisdata:/data
networks:
- hello
command: "redis-server --appendonly yes"
volumes:
tomcatwebapps01:
external:
true
tomcatwebapps01:
mysqldata:
mysqlconf:
redisdata:
healthcheck
心跳检查,检查docker是否存活
version: "3.2"
services:
mysql:
container_name: mysql
image: mysql:5.7.32
ports:
- "3307:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconf:/etc/mysql
env_file:
# 下面的写法是在docker-compose.yml所在的路径建一个mysql.env的文件,里面写了:MYSQL_ROOT_PASSWORD=root
- ./mysql.env
networks:
- hello
healthcheck:
test: ["CMD","curl","-f","http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
sysctls
修改容器中系统内核参数,并不是必须,有些服务启动会受容器内操作系统参数限制,可能会无法启动,必须修改系统参数才能启动,需要的时候加上就可以,有两种方式
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
ulimits
指定容器的ulimits限制值,例如,指定最大进程数为65535,指定文件句柄数为20000(软限制,应用可以随时修改,不能超过硬限制)和40000(系统硬限制,只能root用户提高),在使用过程中可根据当前容器运行服务要求进行修改
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
docker-compose中build指令详情
build和image指定有异曲同工之处
作用:用来将指定dockerFile打包成对应的镜像,然后在运行该镜像
version: "3.8"
services:
demo:
build: # 用来指定Dockerfiles所在目录,先根据build中Dockerfile自动构建镜像,然后自动运行容器
context: demo # 此时demo目录和Dockerfile是在同一个目录,可以用这种写法,可以用./demo或者绝对路径/root/demo-project/demo
dockerfile: Dockerfile
container_name: demo
ports:
- "8001:8001"
networks:
- hello
depends-on:
- tomcat01
tomcat01:
container_name: tomcat02
image:
ports:
- "8083:8080"
volumes:
- tomcatwebapps:/usr/local/tomcat/webapps
networks:
- hello
docker-compose 模板指令 和 指令
模板指令:用来书写在 docker-compose.yml文件中指令称之为模板指令,用来为服务进行服务的
指令:用来对整个docker-compose.yml对应的这个项目操作,书写在docker-compose命令之后的命令
常用指令
命令选项
docker-compose -f
如果文件名就叫docker-compose。yml,直接用命令docker-compose up就可以启动,但是如果是自定义的名称,就要加这个参数:docker-compose -f demo-compose.yml
docker-compose -p
指定项目名称
--verbose 输出更多调试信息
-v 展示日志
up
后年可以加选项,服务,写了服务ID,启动该服务,不跟启动所有服务
docker-compose up 前台运行,用control+c后所有服务就会停止
docker-compose up -d 服务在后台运行
默认情况,如果服务容器已经存在,docker-compose up将会尝试停止容器,然后重新创建(保持使用volumes-from挂载卷),以保证新启动的服务匹配docker-compose.yml文件的最新内容
down
此命令将会停止up命令所启动的容器,并移除网络,不会移除数据卷,只会移除自动创建的网桥,外面定义的不会移除
docker-compose down
exec
使用docker-compose进入容器
docker-compose exec 服务ID(docker-compose.yml中声明的服务ID) bash
docker exec -it 容器ID bash
ps
列出项目中目前的所有容器,docker ps是列出该docker下的所有容器
docker-compose ps
restart
重启服务
docker-compose restart 服务ID,有服务ID,重启该服务,没有ID,重启所有服务
可以指定重启前停止容器的超时(默认10秒),如果超过这个时间服务就不会启动
rm
用来删除项目中的某个服务
-f 强制删除
docker-compose rm -f 服务ID,不加服务ID删除所有
-v 删除服务挂载的数据卷,谨慎使用
start
启动服务
docker-compose start 服务ID,不加服务ID启动所有
stop
关闭服务,不会移除网络
docker-compose stop 服务ID,不加服务ID暂停所有
top
查看容器内运行的进程
docker-compose top
docker-compose top 服务ID 具体查看某个容器
unpause
恢复处于暂停状态中的服务
docker-compose unpause 服务ID,不加服务ID恢复所有
pause
暂停服务
docker-compose pause 服务ID,不加服务ID暂停所有
logs
调试查看日志
docker-compose logs 服务ID,不加服务ID看所有
docker可是化工具
对docker里面的所运行的所有容器使用的资源监控
安装说明:https://www.portainer.io/installation/
docker pull portainer/portainer
docker volume create portainer_data
docker run -d
-p 8000:8000
-p 9000:9000
--name=portainer
--restart=always
-v /var/run/docker.sock:/var/run/docker.sock
-v portainer_data:/data
portainer/portainer
之所以能监控到容器,是因为他会和docker的引擎会关联,centos中,docker的引擎默认在/var/run/docker.sock,他会读取这个文件,他们之间会有通信
会把docker里面的数据持久话到portainer中,用于展示
与引擎通信用的是端口8000,与外部通信用的是9000
portainer:
image: portainer/portainer
container_name: portainer
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
networks:
- hello
ports:
- "8000:8000"
- "9000:9000"
volumes:
portainer_data: