Docker基操_2.Compose
build run用于手动操作单容器;而多容器的服务存在相互依赖关系,使用Compose定义、运行多个容器,可实现快速编排;compose、machine、swarm三大编排工具
Compose是docker官方的开源项目,需要安装,所有的环境都可以使用;Compose主要有3个步骤:dockerfile、services、启动项目
Compose两个重要概念:服务(services),一个项目中的一个容器、应用;项目(project),由一组关联的应用容器组成的一个完整业务单元,在compose.yml文件中定义
dockerfile定义各个服务应用并构建出对应的镜像文件;compose.yml定义一个完整业务单元,安排整体应用中的各个服务;docker-compose up命令来启动并运行整个应用程序,完成一键部署上线
常用命令
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose config # 检查配置
docker-compose config -q # 检查配置,有问题才输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
docker-compose exec yml里面的服务id # 进入容器示例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose logs yml里面的服务id # 查看容器输出日志
CREATE TABLE `t_user` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户名',
`password` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '密码',
`sex` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男',
`deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1114 DEFAULT CHARSET=utf8 COMMENT='用户表'
安装Compose
1、linux需单独安装
2、在线安装
docker文档Compose下载说明页 | 国内镜像下载说明页
[root@wg ~]# curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.2/\
> docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
--- 如果下载不动,尝试着降低版本 ---
[root@wg ~]# chmod +x /usr/local/bin/docker-compose // 赋予权限
[root@wg ~]# docker-compose version // 查看版本
3、离线安装
- 1.下载docker-compose脚本
- 2.放入/usr/local/bin
- 3.chmod +x /usr/local/bin/docker-compose
配置示例
1.创建app.py文件
[root@wg ~]# mkdir -p /opt/compose/composetest
[root@wg ~]# vi /opt/compose/composetest/app.py
| import time // 终于进入我的领域了
| import redis
| from flask import Flask
|
| app = Flask(__name__)
| cache = redis.Redis(host='redis', port=6379)
| def get_hit_count():
| retries = 5
| while True:
| try:
| return cache.incr('hits')
| except redis.exceptions.ConnectionError as exc:
| if retries == 0:
| raise exc
| retries -= 1
| time.sleep(0.5)
| @app.route('/')
| def hello():
| count = get_hit_count()
| return 'Hello World! I have been seen {} times.\n'.format(count)
2.导入Py依赖包
[root@wg ~]# vi /opt/compose/composetest/requirements.txt
| flask
| redis
3.Dockerfile
[root@wg ~]# vi /opt/compose/composetest/Dockerfile // 自动识别首字母大写
| # syntax=docker/dockerfile:1
| FROM python:3.7-alpine
| WORKDIR /code
| ENV FLASK_APP=app.py
| ENV FLASK_RUN_HOST=0.0.0.0
| RUN apk add --no-cache gcc musl-dev linux-headers
| COPY requirements.txt requirements.txt
| RUN pip install -r requirements.txt
| EXPOSE 5000
| COPY . .
| CMD ["flask", "run"]
4.定义服务
[root@wg ~]# vi /opt/compose/composetest/docker-compose.yml
| version: "3.9" // 代表compose的版本号
| services:
| web: // 指定是用哪个镜像
| build: .
| ports:
| - "5000:5000"
| redis:
| image: "redis:alpine"
5.构建和运行
[root@wg composetest]# docker-compose up
6.错误排查
※ WARNING: This is a development server. Do not use it in a production deployment.
# 打脸来的太快,没学过框架,完全不了解flask,暂时没解决办法;docker官网的方法,修改yml文件
[root@wg composetest]# vi /opt/compose/composetest/docker-compose.yml
| services:
| web:
| build: .
| ports:
| - "5000:5000"
| volumes:
| - .:/code
| environment:
| FLASK_ENV: development
| redis:
| image: "redis:alpine"
7、步骤
- 1.创建一个专属目录
- 2.定义一个项目,既编写一个yml文件
- 3.docker-compose up启动一个项目
yaml规则
- yaml分三层
| version: "" # 版本
| services: "" # 服务;一个项目中某一个容器称为一个服务。
| 其他配置:
- 实例演示
| version: "3.8" # 指的是compose的版本
| services:
| tomcat01:
| images: "tomcat:8.0" # 代表使用哪个镜像 类似于docker run 指定的镜像名
| ports: # 代表宿主机和容器中端口映射 类似于docker run -p 参数
| - "8080:8080"
|
| tomcat2:
| image: "tomcat:latest"
| ports:
| - "8081:8080"
|
| mysql1:
| image: "mysql:5.7.35"
| ports:
| - "3306:3306"
| environment: # 代表给当前容器启动指定环境,类似于docker run -e MYSQL_ROOT_PASSWORD=root
| - "MYSQL_ROOT_PASSWORD=root"
| volumes: # 代表给当前容器和宿主机指定数据卷 类似docker run -v
| - /root/mysqldata:/var/lib/mysql 6
|
| volumes:
| mysqldata #声明数据卷别名
# 0.编写compose版本要和docker版本对应,可以去官网查
# 1.yml有严格书写格式
# 2.键值对中间有空格
# 3.以前的实例中 键值对的值不用加引号,我这次加了
# 4.所谓严格书写格式是缩进,不能同tab,只能用空格
# 5.每个分层下要空两格,我这里测试空1格可以
补充
[root@wg ~]# docker service ls
※ Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
- 默认的服务名: 文件名_服务名_num
- docker-compose up -d // 后台运行
- ctrl+c // 退出,不删除网络
- docker-compose down // 退出并删除网络
Compose指令
- build指令
| build和image不能同时使用
| build是使用之前,根据dockerfile构建镜像
| 使用build需要指定上下文目录,一般是 .
| build里可以传参数
- env_file和environment作用相同,指定环境
| environment用来给容器迪庆指令环境变量 相当于docker run -e 选项
| env_file 可以写成 - ./.env 把mysql密码保存在env文件中
| 一般把env_file设置成隐藏文件
- networks
| 使用网桥要先声明 docker中不用声明
| networks:
| dangdang:
- ports
| 宿主机和容器端口映射
- volumes也需要声明
- restart用来制定容器总是运行
| 等同于--restart=always
version: "3.8"
services:
tomcat:
image: tomct:8.0
ports:
- "8080:8080"
apps: # 用apps,就可以注释掉上边tomcat部分了
build: # build和image不能同时使用
# 在启动之前构建镜像,然后根据构建启动容器
# 这里可以写为 build: ./ 在当前构建了;而不是用context: ./
context: ./ # 用来指定Dockerfile上下文目录
dockerfile: Dockerfile # 用来指定dockerfile的文件名
args: # 用来传参
buildno: 1
ports:
- "8081:8081"
command: ["test.jar"] # 覆盖容器启动之后默认指令
# 类似于dockerfile的cmd指令 或者说 docker run image test.jar
container_name # 用来制定docker-compose启动容器名称,不推荐使用
depends_on: # 写依赖的服务
- tomcat
- mysql
- redis # 注意:服务不会等待被依赖的服务 完全启动之后才启动
mysql:
image: mysql:5.7.35
ports:
- "3306:3306"
# environment # 用来给容器启动指定环境变量 相当于docker run -e 选项
# MYSQL_ROOT_PASSWORD: root
env_file: # 和environment作用相同,这里可以不写死
- ./.env # MYSQL_ROOT_PASSWORD=ROOT 推荐设置成隐藏文件
# .开头的文件是隐藏文件,env文件
# 格式和environment下边的内容格式相同
networks: # 网桥,网桥和卷一样,需要单独声明
- dangdang
restart: always
volumes: # 如果写绝对路径,需要先创建
- esdata:/usr/share/elasticsearch
networks:
dangdang:
volumes:
esdata:
Compose命令
- docker-compose 命令 可以是项目中某个服务 没有说明就是默认整个项目操作
- 标准语法:docker-compose -f docker-compose.yml 命令 [选项] [服务id]
| docker-compose up // 对整个项目操作
| docker-compose up 服务id // 对项目中的服务操作
- up命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,关联服务相关容器的一系列操作
| docker-compose up -d # 自动删除原有容器,后台启动
- docker-compose down # 会移除网络,不会移除卷
- 进入容器,只能针对某一个容器
| docker-compose exec tomcat bash
| docker exec -it 容器id bash
docker-compose ps // 列出项目所有服务
docker-compose restart // 重启整个项目 -t 指定时间内停止,直接重启
docker-compose rm // 删除停止的服务
docker-compose top // 查看所有项目进程
docker-compose pause|unpause // 暂停和恢复项目
docker-compose logs
示例讲解
version: "3" # yml文件分三层编写,version;services;其他配置;version是compose的版本
services: # 服务,其实这一部分就是docker run里边的东西
microService: # 服务名称,再下一级是各种配置
image: zz_docker:1.6 # 用哪个镜像
container_name: ms01 # 容器的名称
ports:
- "6001:6001" # 配置的端口
volumes:
- /app/server:/data # 配置的卷,应该可以配置多个
networks:
- atguigu_net
depends_on: # 依赖于redis和mysql先启动
- redis
- mysql
redis:
...
comand: redis-server /etc/redis/redis.conf # 启动命令
mysql:
command: --default-authentication-plugin=mysql_native_password # 解决外部无法访问问题
networks: # 这里就是创建网络,就是yaml文件第三层
atguigu_net:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)