Docker Compose
笔记来源与编程不良人的docker-compose教学 : https://www.bilibili.com/video/BV1wQ4y1Y7SE?p=30&vd_source=91fb39ddf3fc1f01afd5208696618e41
怕自己忘记, 记录此笔记.....
安装Docker-Compose
- github下载地址: https://github.com/docker/compose/releases/tag/1.25.5
- 下载 docker-compose-Linux-x86_64 放打/usr/local/bin
- 改名为 docker-compose
- 赋予权限 chmod +x docker-compose
- 查看是否安装成功 docker-compose version
docker-compose模板
网上下的, 具体位置忘记了
多个服务
# Compose 版本 Version 2支持更多的指令。Version 1将来会被弃用。
version: "3"
# 定义服务
services:
# 为project定义服务
redis:
# 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
image: redis:4.0
# 配置端口 - "宿主机端口:容器暴露端口"
ports:
- "6379:6379"
# 配置容器连接的网络,引用顶级 networks 下的条目(就是最下面配置的networks(一级目录))
networks:
network_name:
# 为单redis创建别名, REDIS_URL标记为redis服务的地址. (不配置aliases也可以, 这样就通过定义的服务名: redis链接)
aliases:
- REDIS_URL
# 挂载
volumes:
- "/docker/redis/conf/redis.conf:/etc/redis/redis.conf"
- "/docker/redis/data:/data"
# 容器总是重新启动
restart: always
# 相当于执行一些命令
command:
redis-server /etc/redis/redis.conf --appendonly yes
# 指定一个自定义容器名称,而不是生成的默认名称。
container_name: redis
# 使用该参数,container内的root拥有真正的root权限。
privileged: true
db:
image: mysql:5.7
ports:
- "3306:3306"
# 添加环境变量
environment:
MYSQL_ROOT_PASSWORD: "123456"
volumes:
- "/docker/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf"
- "/docker/mysql/logs:/var/log/mysql"
- "/docker/mysql/data:/var/lib/mysql"
- "/docker/mysql/sql/init.sql:/docker-entrypoint-initdb.d/init.sql"
- "/etc/localtime:/etc/localtime"
networks:
network_name:
aliases:
- MYSQL_URL
restart: always
command: --init-file /docker-entrypoint-initdb.d/init.sql
container_name: mysql
privileged: true
project-name:
# 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
image: project-name:1.0.0
# 构建镜像
build:
# 指定项目的地址
context: /root/docker_mysql_redis
# 指定Dockerfile
dockerfile: Dockerfile
ports:
- "8080:8080"
# 从文件添加环境变量
env_file:
- /root/environment.env
networks:
network_name:
aliases:
- PROJECT_URL
privileged: true
restart: always
container_name: test-name
# ........可以继续添加
networks:
# bridge:默认,需要单独配置ports映射主机port和服务的port,并且开启了容器间通信
network_name:
driver: bridge
单个服务
version: "3"
services:
nacos:
image: nacos/nacos-server:1.2.1
ports:
- "8848:8848"
# 加入已存在的网络 docker_network_mysql(docker-mysql.yaml), 并创建一个新的网络 network_nacos
networks:
network_nacos:
aliases:
- NACOS_URL
# 通过docker network ls 进行获取
docker_network_mysql:
restart: always
environment:
MODE: standalone
container_name: nacos
privileged: true
networks:
docker_network_mysql:
external: true
network_nacos:
driver: bridge
实战
- 编写docker-compose.yaml, 第一行的version根据docker版本填写对应版本
# 代表使用docker-compose项目的版本号
version: "3.8"
services:
# 服务名 自定义的
tomcat:
# 镜像名
images: tomcat:8.0
ports:
# 端口映射, 多个写多行
- 8080:8080
- 启动docker-compose服务
# 需要在docker-compose .yaml目录下执行启动命令
docker-compose up
- 再启动一个tomcat
# 代表使用docker-compose项目的版本号
version: "3.8"
services:
# 服务名 自定义的
tomcat:
# 镜像名
images: tomcat:8.0
ports:
# 端口映射, 多个写多行
- 8080:8080
tomcat02:
image: tomcat:8.0
ports:
- 8081:8080
- 添加一个redis服务
# 代表使用docker-compose项目的版本号
version: "3.8"
services:
# 服务名 自定义的
tomcat:
# 镜像名
images: tomcat:8.0
ports:
# 端口映射, 多个写多行
- 8080:8080
tomcat02:
image: tomcat:8.0
ports:
- 8081:8080
redis:
image: redis:5.0.12
ports:
- 6379:6379
# volumes:
# 在配置文件挂载目录, 添加上redis.conf配置文件, 不然挂在出来会是个文件夹
# - "/home/docker-compose/redis/conf/redis.conf:/etc/redis/redis.conf"
# - "/home/docker-compose/redis/data:/data"
- 再添加一个mysql
version: "3.8"
services:
# 服务名 自定义的
tomcat:
# 镜像名
images: tomcat:8.0
ports:
# 端口映射, 多个写多行
- 8080:8080
tomcat02:
image: tomcat:8.0
ports:
- 8081:8080
redis:
image: redis:5.0.12
ports:
- 6379:6379
mysql:
image: mysql:8.0
ports:
- 3306:3306
enviroment:
- "MYSQL_ROOT_PASSEORD=admin@123"
- 给mysql添加挂载目录
version: "3.8"
services:
# 服务名 自定义的
tomcat:
# 镜像名
images: tomcat:8.0
ports:
# 端口映射, 多个写多行
- 8080:8080
tomcat02:
image: tomcat:8.0
ports:
- 8081:8080
redis:
image: redis:5.0.12
ports:
- 6379:6379
mysql:
image: mysql:8.0
ports:
- 3306:3306
enviroment:
- "MYSQL_ROOT_PASSEORD=admin@123"
volumes:
- /home/docker-compose/mysql:/var/lib/mysql
- 自定义容器名
version: "3.8"
# 管理一组服务
services:
# 服务名 自定义的
tomcat:
# 给当前取名字
container_name: tomcat01
# 镜像名
images: tomcat:8.0
ports:
# 端口映射, 多个写多行
- 8080:8080
tomcat02:
image: tomcat:8.0
ports:
- 8081:8080
redis:
container_name: redis01
image: redis:5.0.12
ports:
- 6379:6379
mysql:
container_name: mysql01
image: mysql:8.0
ports:
- 3306:3306
enviroment:
- "MYSQL_ROOT_PASSEORD=admin@123"
volumes:
- /home/docker-compose/mysql:/var/lib/mysql
Docker-Compose模板命令
build
构建 , 通过docker-compose在启动容器之前根据Dockerfile构建镜像, 然后根据构建的镜像启动容器
version: "3.8"
services:
apps:
build:
context: ./
dockerfile: DockerFile
ports:
- "9870:8080"
command
覆盖启动后默认执行的指令, 相当于在把app.jar改为test.jar
Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=9080"]
EXPOSE 9080
ENTRYPOINT ["java", "-jar"]
CMD ["/app.jar"]
docker-compose.yaml
version: "3.8"
services:
apps:
build:
context: ./
dockerfile: DockerFile
ports:
- "9870:8080"
command: test.jar
container_name
用来指定docker-compose启动容器名称, 不推荐使用, docker不允许同样名字容器存在
version: "3.8"
services:
tomcat:
image: tomcat:8.0
container_name: tomcat01
ports: "8080:8080"
depends_on
解决容器依赖,启动先后的问题
version: "3.8"
services:
tomcat:
image: tomcat:8.0
ports: "8080:8080"
apps:
build:
context: ./
dockerfile: DockerFile
ports:
- "9870:8080"
depends_on:
# 再tomcat启动之后再启动当前容器, 多个多行
- tomcat
# - mysql
# - redis
env_file
设置环境变量
version: "3.8"
services:
tomcat:
image: tomcat:8.0
ports: "8080:8080"
apps:
build:
context: ./
dockerfile: DockerFile
ports:
- "9870:8080"
depends_on:
# 再tomcat启动之后再启动当前容器, 多个多行
- tomcat
mysql:
image: mysql:8.0
ports: "3306:3306"
# 设置环境变量
enviroment:
MYSQL_ROOT_PASSWORD:admin@123
在服务器中添加.env文件, 隐藏不想展示的环境变量, .env文件在服务器上是隐藏文件. ls -a才看得到
.env
MYSQL_ROOT_PASSWORD:admin@123
docker-compose.yaml
version: "3.8"
services:
tomcat:
image: tomcat:8.0
ports: "8080:8080"
apps:
build:
context: ./
dockerfile: DockerFile
ports:
- "9870:8080"
depends_on:
# 再tomcat启动之后再启动当前容器, 多个多行
- tomcat
mysql:
image: mysql:8.0
ports: "3306:3306"
# 设置环境变量
env_file: ./.env.file
expose
用来指定构建镜像过程中容器暴露的端口, 一般是自己构建的镜像中需要该指令, 一般在Dockerfile中使用
version: "3.8"
services:
tomcat:
expose: 8080
image: tomcat:8.0
ports: "8080:8080"
apps:
build:
context: ./
dockerfile: DockerFile
ports:
- "9870:8080"
depends_on:
# 再tomcat启动之后再启动当前容器, 多个多行
- tomcat
mysql:
image: mysql:8.0
ports: "3306:3306"
# 设置环境变量
env_file: ./.env.file
image
指定启动容器使用的镜像
network
用来指定容器启动用的网桥 相当于docker -network
docker-compose.yaml
version: "3.8"
services:
tomcat:
expose: 8080
image: tomcat:8.0
ports: "8080:8080"
networks:
- app
apps:
build:
context: ./
dockerfile: DockerFile
ports:
- "9870:8080"
depends_on:
# 再tomcat启动之后再启动当前容器, 多个多行
- tomcat
networks:
- app
mysql:
image: mysql:8.0
ports: "3306:3306"
# 设置环境变量
env_file: ./.env.file
networks:
- app
# 上面这种直接使用网桥的方式, docker不会自动创建网桥, 需要声明一下
networks:
app:
volumes
数据卷挂载
docker-compose.yaml
version: "3.8"
services:
tomcat:
expose: 8080
image: tomcat:8.0
ports: "8080:8080"
networks:
- app
apps:
build:
context: ./
dockerfile: DockerFile
ports:
- "9870:8080"
depends_on:
# 再tomcat启动之后再启动当前容器, 多个多行
- tomcat
networks:
- app
mysql:
image: mysql:8.0
ports: "3306:3306"
# 设置环境变量
env_file: ./.env.file
volumes:
# 需要添加声明
- mysqlData:/var/lib/mysql
networks:
- app
# 上面这种直接使用网桥的方式, docker不会自动创建网桥, 需要声明一下
networks:
app:
volumes:
mysqlData:
ports
宿主机和容器端口映射, 相当于docker run -p
restart
用来指定docker容器总是运行 相当于docekr run --restart=always
version: "3.8"
services:
tomcat:
expose: 8080
image: tomcat:8.0
ports: "8080:8080"
networks:
- app
apps:
build:
context: ./
dockerfile: DockerFile
ports:
- "9870:8080"
depends_on:
# 再tomcat启动之后再启动当前容器, 多个多行
- tomcat
networks:
- app
mysql:
image: mysql:8.0
ports: "3306:3306"
# 设置环境变量
env_file: ./.env.file
volumes:
# 需要添加声明
- mysqlData:/var/lib/mysql
networks:
- app
restart: always
# 上面这种直接使用网桥的方式, docker不会自动创建网桥, 需要声明一下
networks:
app:
volumes:
mysqlData:
docker-compose常用命令
服务id 就是docker-compose.yaml中的服务名
up / up -d 启动
# 启动整个项目
docker-compose up
# 启动某个服务, 服务id指的是定义在yaml中services下的服务名
docker-compose up [服务id] docker-compose up mysql
# 后台启动
docker-compose up -d
stop 停止
docker-compose stop [options] [SERVICES...]
停止运行状态的容器
start 开启
docker-compose start [SERVICES...]
开启停止状态的容器
dowm 停止
类似 up , 不跟服务名 停止全部, 并且会移除网络
docker-compose down [服务id]
restart 重启
# 重启整个项目
docker-compose restart
# 重启指定服务
docker-compose restart [服务id]
# 指定时间重启, 20秒后重启
docker-compose restart -t 20
rm 删除
# 删除所有停止状态的服务容器, 推荐先执行docker-compose stop命令停止容器
docker-compose rm [options] [SERVICE...]
-f --force强制直接删除, 包括非停止状态的
-v 删除容器挂载的数据卷
-f 指定docker-compose文件名
# 默认是docker-compose, 可以不写
docker-compose -f docker-compose.yml
exec 进入指定容器
docker-compose exec 服务id bash
ps 列出所有运行的服务
docker-compose ps
pause / unpause 暂停 恢复
# 暂停所有服务
docker-compose pause
# 暂停指定服务
docker-compose pause [SERVICE]
# 恢复同理
logs 日志
docker-compose logs -f [服务id]