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: 
posted @   梵高de画笔  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示