自学内容网 自学内容网

docker compose容器编排工具

docker compose概述

  • Docker Compose是一个用于定义和运行多容器应用程序的工具
  • 其是官方的一个开源项目,托管到github上:https://github.com/docker/compose

主要功能

定义服务

  • 使用YAML格式配置文件来定义一组相关的容器服务每个服务可以指定镜像、端口映射、环境变量、存储卷等参数
  • 例如,可以在配置文件中定义一个Web服务一个数据库服务,以及它们之间的连接关系

一键启动和停止

  • 通过一个简单的命令,可以启动停止整个应用程序所包含的所有容器。这大大简化多容器应用的部署和管理过程
  • 例如,使用docker-compose up命令可以启动配置文件中定义的所有服务,使用docker-compose down命令可以停止并删除这些服务

服务编排

  • 可以定义容器之间依赖关系,确保服务按照正确的顺序启动和停止。例如,可以指定数据库服务必须在Web服务之前启动
  • 支持网络配置,使不同服务容器可以相互通信。可以定义一个自定义的网络,将所有相关的容器连接到这个网络上

环境变量管理

  • 可以在配置文件中定义环境变量,并在容器启动时传递给容器。这使得在不同环境(如开发、测试和生产环境)中使用不同的配置变得更加容易
  • 例如,可以定义一个数据库连接字符串环境变量,在不同环境中可以设置不同的值

工作原理

1.读取配置文件

  • Docker Compose读取YAML配置文件解析其中定义的服务参数

2.创建容器

  • 根据配置文件中的定义Docker Compose调用Docker引擎创建相应的容器。它会下载所需的镜像(如果本地没有),并设置容器各种参数

3.管理容器生命周期

  • Docker Compose监控容器状态,并在需要启动、停止、重启容器
  • 它还可以处理容器故障恢复,例如自动重启失败的容器

docker compose中的管理层

  • 服务 (service) 一个应用容器实际上可以包括若干运行相同镜像容器实例
  • 项目 (project) 由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义
  • 容器container)是服务具体实例每个服务可以有一个或多个容器容器是基于服务定义镜像创建的运行实例

docker compose的常用命令参数

  • -d表示后台运行
  • docker compose默认的文件为docker-compose.yml,如果不是这个文件名,则需要使用-f指定对应的文件名
[root@docker-node1 ~]# cd huazi/
[root@docker-node1 huazi]# vim docker-compose.yml
services:
  web:   #服务名
    image: nginx:1.23  #服务名用的镜像
    ports:  #映射的端口
      - "80:80"

  testnode:  #服务名
    image: busybox:latest
    command: ["/bin/sh","-c","sleep 10000"]
#可以单独指定需要的运行的容器
[root@docker-node1 huazi]# docker compose up
testnode  web
#不指定表示全部运行
#-d表示在后台运行,不加-d进程不会结束
[root@docker-node1 huazi]# docker compose up -d
[+] Running 3/3
 ✔ Network huazi_default       Created                                            0.1s
 ✔ Container huazi-web-1       Started                                            0.5s
 ✔ Container huazi-testnode-1  Started                                            0.5s
#查看容器状态
[root@docker-node1 huazi]# docker compose ps
NAME               IMAGE            COMMAND                   SERVICE    CREATED          STATUS          PORTS
huazi-testnode-1   busybox:latest   "/bin/sh -c 'sleep 1…"   testnode   46 seconds ago   Up 45 seconds
huazi-web-1        nginx:1.23       "/docker-entrypoint.…"   web        46 seconds ago   Up 45 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp
#stop表示停止容器,并不会删除容器,可以使用start开启容器
[root@docker-node1 huazi]# docker compose stop
[+] Stopping 2/2
 ✔ Container huazi-testnode-1  Stopped                                           10.2s
 ✔ Container huazi-web-1       Stopped                                            0.3s
#start开启容器
[root@docker-node1 huazi]# docker compose start
[+] Running 2/2
 ✔ Container huazi-testnode-1  Started                                            0.3s
 ✔ Container huazi-web-1       Started                                            0.3s
#重启服务
[root@docker-node1 huazi]# docker compose restart
#down表示停止并删除容器
[root@docker-node1 huazi]# docker compose down
[+] Running 3/3
 ✔ Container huazi-testnode-1  Removed                                           10.2s
 ✔ Container huazi-web-1       Removed                                            0.2s
 ✔ Network huazi_default       Removed                                            0.1s
#logs查看服务的日志输出
[root@docker-node1 huazi]# docker compose logs
testnode  web
[root@docker-node1 huazi]# docker compose logs web

构建和重新构建服务

  • docker compose build
#先创建dockerfile
[root@docker-node1 ~]# cd docker/
[root@docker-node1 docker]# vim dockerfile
FROM busybox:latest
RUN ["/bin/sh","-c","touch /file1.txt"]
[root@docker-node1 ~]# cd huazi/
[root@docker-node1 huazi]# vim docker-compose.yml
services:
  test1:  #服务名
    image: test1   #构建的镜像名
    build:
      context: /root/docker   #构建上下文为/root/docker目录
      dockerfile: dockerfile   #Dockerfile的名称
    command: ["/bin/sh","-c","sleep 10000"]   #容器启动后执行的命令
    container_name: huazi1   #容器的名称为huazi1

  test2:  #服务名
    image: test2  #构建的镜像名
    build:
      context: /root/docker   #构建上下文为/root/docker目录
      dockerfile: dockerfile  #Dockerfile的名称
    command: ["/bin/sh","-c","sleep 10000"]   #容器启动后执行的命令
    container_name: huazi2  #容器的名称为huazi2
#up直接运行
[root@docker-node1 huazi]# docker compose -f docker-compose.yml up -d
#只创建镜像
[root@docker-node1 huazi]# docker compose -f docker-compose.yml build 
test1  test2

[root@docker-node1 huazi]# docker compose -f docker-compose.yml build
#进入容器
[root@docker-node1 huazi]# docker compose exec -it test1 /bin/sh
/ # ls
bin        etc        home       lib64      root       tmp        var
dev        file1.txt  lib        proc       sys        usr
#拉群镜像
[root@docker-node1 huazi]# docker compose pull
#语法检测,没有问题,会打印yaml文件内容
[root@docker-node1 huazi]# docker compose -f docker-compose.yml config

docker composeyaml文件

一、服务services

服务名称

  • 每个服务配置文件中都有一个唯一名称,用于在命令行其他部分引用该服务
services:
  service1:  #服务名为service1
    #服务1的配置
  service2:  #服务名为service2
    #服务2的配置

镜像image

  • 指定服务所使用的镜像名称标签。例如, image: nginx 表示使用nginx镜像最新版本
services:
  service1:
    image: nginx
  service2:
    image: mysql:5.7

端口映射ports

  • 容器内部端口映射到主机的端口,以便外部可以访问容器内服务
  • 例如:- "8080:80"表示将宿主机8080端口映射到容器内部80端口
services:
  web:  
    image: nginx
    container_name: web_nginx  #容器名
    restart: always  #容器的重启策略
    expose:
      - 1234  #容器暴露的端口
    ports:
      - "8080:80"  #端口映射,宿主机:容器

环境变量environment

  • 容器设置环境变量,可以在容器内部应用程序中使用。
  • 例如, key: value1设置环境变量key的值为value1
services:
  web:
    image: mysql:5.7
    environment:  #设置环境变量
      MYSQL_ROOT_PASSWORD: 123456

存储卷volumes

  • 主机上目录或文件挂载到容器中,以实现数据持久化共享
  • 例如/host/data:/container/data宿主机/host/data目录挂载到容器内/container/data路径
services:
  test:
    image: busybox
    command: ["/bin/sh","-c","sleep 1000"]
    restart: always
    container_name: busybox1
    volumes:
      - /etc/passwd:/tmp/passwd:ro

网络networks

  • 服务连接到特定网络,以便不同服务容器可以相互通信
services:
  test1:
    image: busybox
    container_name: huazi
    command: ["/bin/sh","-c","sleep 10000"]
[root@docker-node1 huazi]# docker compose up -d

在这里插入图片描述
在这里插入图片描述

  • network_modebridge,host,none
services:
  test1:
    image: busybox
    container_name: huazi
    command: ["/bin/sh","-c","sleep 10000"]
    network_mode: bridge  #使用默认的bridge模式
[root@docker-node1 huazi]# docker compose up -d

在这里插入图片描述
在这里插入图片描述

  • 使用networks创建网络
services:
  test1:
    image: busybox
    container_name: huazi
    command: ["/bin/sh","-c","sleep 10000"]
    networks:
      - bridge1
      - bridge2

networks:
  bridge1:
    driver: bridge
  bridge2:
    driver: bridge

在这里插入图片描述

[root@docker-node1 huazi]# docker compose up -d

在这里插入图片描述

[root@docker-node1 huazi]# docker compose exec -it test1 /bin/sh

在这里插入图片描述

命令command

  • 指定容器启动执行的命令
  • 例如, command: python app.py指定容器启动时运行python app.py命令
services:
  web:
    image: busybox
    container_name: busybox
    network_mode: bridge1
    command: ["/bin/sh","-c","sleep 1000"]

二、数据卷volumes

services:
  test1:
    image: busybox
    command: ["/bin/sh","-c","sleep 1000"]
    restart: always
    container_name: busybox
    volumes:
    - data:/test
    - /etc/passwd:/tmp/passwd:ro

volumes:
  data:
    name: huazi   #数据卷名称
[root@docker-node1 huazi]# docker compose up -d
[root@docker-node1 huazi]# docker volume ls
DRIVER    VOLUME NAME
local     huazi

三、网络networks

services:
  test1:
    image: busybox
    container_name: test1
    command: ["/bin/sh","-c","sleep 1000"]
    network_mode: default  #设置为default,意味着该服务将连接到Docker Compose自动创建的默认网络

  test2:
    image: busybox
    container_name: test2
    command: ["/bin/sh","-c","sleep 1000"]
    networks:
      - bridge1
      - bridge2

networks:
  default:
    external: true
    name: bridge

  bridge1:
    driver: bridge

  bridge2:
    ipam:
      driver: default
      config:
        - subnet: 172.26.0.0/24  #网络的子网端
          gateway: 172.26.0.254  #网关
[root@docker-node1 huazi]# docker compose up -d

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


原文地址:https://blog.csdn.net/huaz_md/article/details/144406211

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!