侧边栏壁纸
博主头像
一揽芳华 博主等级

行动起来,活在当下

  • 累计撰写 265 篇文章
  • 累计创建 24 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

docker-compose

芳华是个男孩!
2024-10-11 / 0 评论 / 0 点赞 / 25 阅读 / 0 字
广告 广告

1.基础理论

当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容易出错,此时推荐使用docker 单机编排工具 docker-compose。

docker-compose 是 docker 容器的一种单机编排服务,docker-compose 是一个管理多个容器的工具,比如:可以解决容器之间的依赖关系,就像启动一个nginx 前端服务的时候会调用后端的tomcat,那就得先启动tomcat,但是启动tomcat 容器还需要依赖数据库,那就还得先启动数据库,docker-compose 可以用来解决这样的嵌套依赖关系,并且可以替代docker命令对容器进行创建、启动和停止等手工的操作。

因此,如果说docker命令就像linux的命令,docker compse就像shell脚本,可以自动的执行容器批量操作,从而实现自动化的容器管理,或者说docker命令相当于ansible命令,那么docker compose文件,就相当于ansible-playbook的yaml文件。

docker-compose 项目是Docker 官方的开源项目,负责实现对Docker 容器集群的快速编排,docker-compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。

Docker Compose 使用 YAML 文件来定义多服务的应用。YAML 是 JSON 的一个子集,因此也可以使用JSON。Docker Compose 默认使用文件名compose.yml,同时也支持docker-compose.yml。当然,也可以使用 -f 参数指定具体文件。

1.1.选项参数说明

#选项说明:

-f,–file FILE #指定Compose 模板文件,默认为docker-compose.yml。

-p,–project-name NAME #指定项目名称,默认将使用当前所在目录名称作为项目名。

--verbose #显示更多输出信息

--log-level LEVEL #定义日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)

--no-ansi #不显示ANSI 控制字符

-v, --version #显示版本

#以下为命令选项,需要在docker-compose.yml|yaml 文件所在在目录里执行

build #构建镜像

bundle #从当前docker compose 文件生成一个以<当前目录>为名称的json格式的Docker

Bundle 备份文件 config -q #查看当前配置,没有错误不输出任何信息

create #创建服务,较少使用

down #停止和删除所有容器、网络、镜像和卷

#events #从容器接收实时事件,可以指定json 日志格式,较少使用

exec #进入指定容器进行操作

help #显示帮助细信息

images #显示镜像信息,较少使用

kill #强制终止运行中的容器

logs #查看容器的日志

pause #暂停服务

port #查看端口

ps #列出容器,较少使用

pull #重新拉取镜像,镜像发生变化后,需要重新拉取镜像,较少使用

push #上传镜像

restart #重启服务,较少使用

rm #删除已经停止的服务

run #一次性运行容器

scale #设置指定服务运行的容器个数

start #启动服务 ,较少使用

stop #停止服务,较少使用

top #显示容器运行状态

unpause #取消暂定

up #创建并启动容器 ,较少使用

1.2.常用命令

docker-compose up:启动所有服务。
docker-compose up :启动指定的服务。
docker-compose down:停止并删除所有服务。
docker-compose down :停止并删除指定的服务。
docker-compose ps:列出所有正在运行的服务。
docker-compose logs:查看所有服务的日志。

1.3.docker-compose模本文件解析

字段

描述

build

使用Dockerfile构建镜像。指定Dockerfile 文件名,要指定Dockerfile文件需要在bui ld标签的子级标签中使用dockerfile标签指定

dockerfile

构建镜像上下文路径(指定Dockerfile文件)

context

可以是dockerfile 的路径,或者是指向git 仓库的url地址

image

指定镜像

command

执行命令,覆盖容器启动后默认执行的命令(类似于 docker run)

container_name

指定容器名称,由于容器名称是唯一的, 如果指定自定义名称,则无法scale指定容器数量(同一个镜像指定多个容器数量)

deploy

指定部署和运行服务相关的配置,只能在Swarm模式使用

environment

添加环境变量

networks

加入网络,引用顶级networks下条目

networks_mode

设置容器的网络模式,如 host,bridge

ports

暴露容器端口,与-p相同,但端口不能低于60

volumes

挂载一个宿主机目录或命令卷到容器中,命令卷要在顶级volumes定义卷名称

volumes_from

从另一个服务或容器挂载卷,可选参数:ro 和:rw。仅版本'2' 支持

hostname

容器主机名

sysctls

在容器内设置内核参数

links

连接到另外一个容器,- 服务名称[:服务别名] (类似于容器互联)

privileged

用来给容器root权限,注意是不安全的,只有两个值:true或false

restart

设置重启策略,never,always, no-failure, unless-stopped

never,默认策略,在容器退出时不重启容器。

on-failure,在容器非正常退出时(退出状态非0),才会重启容器。

on-failure:3,在容器非正常退出时重启容器,最多重启3次。

always,在容器退出时总是重启容器。

unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。

depends_on

在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。

1.3.1.version

version 字段指定了 Docker Compose 编排文件的版本,例如:

version: '3'

1.3.2 services

services 字段指定了在 Docker Compose 编排中要运行的服务。每个服务都有一个名称,并指定要使用的镜像和容器的配置选项。例如:

services:
  mysql: #服务名
    image: mysql:5.5 #mysql镜像

1.3.3 build 和 image

build 字段允许在 Docker Compose 编排中指定 Dockerfile 的位置,从而可以使用 Docker Compose 构建镜像。image 字段指定要使用的 Docker 镜像。例如:

services:
  mysql: #服务名
    image: mysql:5.5 #mysql镜像
  user: #服务名
    build: ./user #这里为用户微服务文件夹,里面存放的是该服务代码jar包和Dockerfile文件

1.3.4 volumes 和 environment

volumes 字段指定了要使用的数据卷。environment 字段指定了要设置的环境变量。例如:

services:
  mysql: #服务名
    image: mysql:5.5 #mysql镜像
    environment:
      MYSQL_ROOT_PASSWORD: 000000 #设置数据库密码
    volumes:
    - "$PWD/mysql/data:/var/lib/mysql" #数据卷挂载

1.3.5 ports 和 expose

ports字段指定了要宿主机映射到容器的端口(宿主机端口:容器端口)。expose 字段是用于在 Docker 容器内部暴露端口的选项,可以让其他容器连接到这些端口,但不会将它们映射到 Docker 主机上。exposeports 不同的是,expose 字段仅仅是将容器内部的端口暴露给其他容器使用,而不是直接映射到宿主机上的端口

例如:

 services:
    gateway: #服务名
       build: ./gateway #这里为网关文件夹,里面存放的是该服务代码jar包和Dockerfile文件
       ports:
          -"7000:7000"
    nginx:
        image: nginx
        expose:
          -"8080"

1.3.6.ulimits

指定容器的 ulimits 限制值。例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。

ulimits:
   nproc:65535
   nofile:
     soft:20000
     hard:40000

1.3.7.depends_on

解决容器的依赖、启动先后的问题。以下例子中会先启动 redis mysql 再启动 web

version:'3'
services:
  web:
    build:.
    depends_on:
      -db
      -redis
  redis:
    image:redis
  db:
    image:mysql

1.3.8.environment

设置环境变量。你可以使用数组或字典两种格式。

environment:
      SW_STORAGE:elasticsearch
      SW_STORAGE_ES_CLUSTER_NODES:elasticsearch:9200
      
environment:
      -SW_STORAGE=elasticsearch
      -SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200

1.3.9.restart

指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped

restart: always

1.3.10.networks

networks应用的网络,在它下面可以定义应用的名字、使用的网络类型等。

networks:
      halo_network:

1.3.11.healthcheck

healthcheck配置运行的检查以确定此服务的容器是否“健康”。

healthcheck:
   test: ["CMD", "curl", "-f", "http://localhost"]
   interval: 1m30s
   timeout: 10s
   retries: 3
   start_period: 40s

1.3.12.command

command重写默认的命令,即指定启动容器的命令。

command:
      - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
      - --spring.r2dbc.username=halo
      # PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
      - --spring.r2dbc.password=openpostgresql
      - --spring.sql.init.platform=postgresql
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=http://localhost:8090/
      # 初始化的超级管理员用户名
      - --halo.security.initializer.superadminusername=admin
      # 初始化的超级管理员密码
      - --halo.security.initializer.superadminpassword=P@88w0rd

2.docker-compose安装

docker-compose安装很简单,下载对应文件,添加执行权限即完成安装,不需要依赖docker引擎

2.1.下载最新Docker-compose文件

 curl -SL https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

2.2.添加可执行权限,即完成安装

[root@localhost ~]# chmod +x /usr/local/bin/docker-compose

2.3.查看版本信息

[root@localhost ~]# docker-compose -v
Docker Compose version v2.20.3

3.使用docker-compose批量部署nginx服务

部署3个nginx服务,并实现端口映射,容器卷挂载服务等

3.1.提前拉去好实验镜像(本次是自己制作的镜像,版本1.25.1),并准备好对应的nginx配置文件

3.2.编写docker-compose.yaml文件

version: "3"
networks:
  mynet110:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16

services:
  nginx01:
    image: cs/nginx:latest
    container_name: nginx01
    restart: always
    networks:
      mynet110:
        ipv4_address: 172.18.0.2
    volumes:
      - /usr/local/nginx01/html:/usr/local/nginx/html
      - /usr/local/nginx01/conf.d:/usr/local/nginx/conf.d
      - /usr/local/nginx01/logs:/usr/local/nginx/logs
      - /usr/local/nginx01/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf
    ports:
      - "80:80"

  nginx02:
    image: cs/nginx:latest
    container_name: nginx02
    restart: always
    networks:
      mynet110:
        ipv4_address: 172.18.0.3
    volumes:
      - /usr/local/nginx02/html:/usr/local/nginx/html
      - /usr/local/nginx02/conf.d:/usr/local/nginx/conf.d
      - /usr/local/nginx02/logs:/usr/local/nginx/logs
      - /usr/local/nginx02/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf
    ports:
      - "81:80"

  nginx03:
    image: cs/nginx:latest
    container_name: nginx03
    restart: always
    networks:
      mynet110:
        ipv4_address: 172.18.0.4
    volumes:
      - /usr/local/nginx03/html:/usr/local/nginx/html
      - /usr/local/nginx03/conf.d:/usr/local/nginx/conf.d
      - /usr/local/nginx03/logs:/usr/local/nginx/logs
      - /usr/local/nginx03/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf
    ports:
      - "82:80"

3.3.检查语法错误

[root@localhost nginx]# docker-compose config -q

3.4.启动服务并查看容器

[root@localhost nginx]# docker-compose up -d
[+] Running 3/3
 ✔ Container nginx03  Started                                                           0.6s
 ✔ Container nginx01  Started                                                           0.6s
 ✔ Container nginx02  Started                                                           0.6s
[root@localhost nginx]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED              STATUS              PORTS                                       NAMES
f26352c93337   cs/nginx:latest   "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp           nginx01
02d1d0cd7827   cs/nginx:latest   "nginx -g 'daemon of…"   About a minute ago   Up About a minute   80/tcp, 0.0.0.0:81->81/tcp, :::81->81/tcp   nginx02
8ec762adabe0   cs/nginx:latest   "nginx -g 'daemon of…"   About a minute ago   Up About a minute   80/tcp, 0.0.0.0:82->82/tcp, :::82->82/tcp   nginx03

3.5.放入首页测试文件,并测试

[root@localhost nginx]# touch this is nginx01 web site > /usr/local/nginx01/html/index.html
[root@localhost nginx]# touch this is nginx02 web site > /usr/local/nginx02/html/index.html
[root@localhost nginx]# touch this is nginx03 web site > /usr/local/nginx03/html/index.html

4.使用docker-compose批量部署mysql服务

#使用docker-compose部署mysql项目,mysql版本为5.7

4.1.编写docker-compose.yaml文件

version: "3"
networks:
  mynet110:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16

services:
  mysql01:
    image: mysql:5.7
    container_name: mysql01
    restart: always
    networks:
      mynet110:
        ipv4_address: 172.18.0.2
    volumes:
      - /home/mysql01/conf:/etc/mysql/conf.d
      - /home/mysql01/data:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=0000
    command:
      --max_connections=1000
      # 最大连接数
      --character-set-server=utf8mb4
      # 字符编码
      --collation-server=utf8mb4_general_ci
      # 在比较和排序的时候更快
      --default-authentication-plugin=mysql_native_password
      # 身份验证插件

  mysql02:
    image: mysql:5.7
    container_name: mysql02
    restart: always
    networks:
      mynet110:
        ipv4_address: 172.18.0.3
    volumes:
      - /home/mysql02/conf:/etc/mysql/conf.d
      - /home/mysql02/data:/var/lib/mysql
    ports:
      - "3307:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=0000
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password

  mysql03:
    image: mysql:5.7
    container_name: mysql03
    restart: always
    networks:
      mynet110:
        ipv4_address: 172.18.0.4
    volumes:
      - /home/mysql03/conf:/etc/mysql/conf.d
      - /home/mysql03/data:/var/lib/mysql
    ports:
      - "3308:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=0000
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password

4.2.语法没有错误后启动容器服务

[root@localhost mysql]# docker-compose config -q
[root@localhost mysql]# docker-compose up -d
[+] Running 4/4
 ✔ Network mysql_mynet110  Created                 0.2s
 ✔ Container mysql03       Started                 0.0s
 ✔ Container mysql01       Started                 0.0s
 ✔ Container mysql02       Started                 0.0s

4.3.查看运行的容器

[root@localhost mysql]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED              STATUS              PORTS                                                  NAMES
ee1c2ae06a3c   mysql:5.7   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql01
834040baeb6e   mysql:5.7   "docker-entrypoint.s…"   About a minute ago   Up About a minute   33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp   mysql03
ea87d1ff63fd   mysql:5.7   "docker-entrypoint.s…"   About a minute ago   Up About a minute   33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp   mysql02

4.5.测试访问

5.使用docker-compose部署lnmp环境

基于官方镜像配置lnmp环境

nginx 1.25.1、mysql 5.7、php 7.6

5.1.编写docker-compose文件

version: "3"
networks:
  mynet110:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16

services:
  php:
    image: php:latest
    container_name: php
    restart: always
    volumes:
      - /www/wwwroot/cs.com:/var/www
    networks:
      mynet110:
        ipv4_address: 172.18.0.2
    ports:
      - "9000:9000"

  nginx:
    image: cs/nginx:latest
    container_name: nginx
    restart: always
    networks:
      mynet110:
        ipv4_address: 172.18.0.3
    volumes:
      - /www/wwwroot/cs.com:/usr/local/nginx/html
      - /www/nginx/conf.d:/usr/local/nginx/conf.d
      - /www/nginx/logs:/usr/local/nginx/logs
      - /www/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf
    ports:
      - "80:80"

  mysql:
    image: mysql:5.7
    container_name: mysql
    restart: always
    networks:
      mynet110:
        ipv4_address: 172.18.0.4
    volumes:
      - /www/mysql/conf:/etc/mysql/conf.d
      - /www/mysql/data:/var/lib/mysql
    ports:
      - "3307:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=0000
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password

5.2.语法没有错误后启动容器服务

[root@localhost lnmp]# docker-compose up -d
[+] Running 10/10
 ✔ fpm 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled        48.6s
   ✔ a2abf6c4d29d Pull complete                             9.9s
   ✔ c5608244554d Pull complete                             0.4s
   ✔ 2d07066487a0 Pull complete                             1.0s
   ✔ 40f5e6ee20ce Pull complete                             8.7s
   ✔ 718b027f9905 Pull complete                             9.1s
   ✔ 3bf01f3e893c Pull complete                             19.3s
   ✔ af85a153f85f Pull complete                             10.5s
   ✔ e052a88c20f6 Pull complete                             11.3s
[+] Running 4/4
 ✔ Network lnmp_mynet110  Created                           0.2s
 ✔ Container mysql        Started                           0.5s
 ✔ Container fpm          Started                           0.5s
 ✔ Container nginx        Started                           0.5s
[root@localhost lnmp]#

5.3.查看容器运行情况

6.使用docker-compose部署redis服务

7.使用docker-compose构建halo项目

3.1.任意位置创建halo目录

[root@localhost ~]# mkdir ~/halo && cd ~/halo

3.2.创建 docker-compose.yaml文件

#采用halo+mysql方式
[root@localhost halo]# vim docker-compose.yaml
version: "3"

services:
  halo:
    image: halohub/halo:2.8
    container_name: halo
    restart: on-failure:3
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      halo_network:
    volumes:
      - ./:/root/.halo2
    ports:
      - "8090:8090"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s
    command:
      - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
      - --spring.r2dbc.username=root
      # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
      - --spring.r2dbc.password=0000
      - --spring.sql.init.platform=mysql
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=http://localhost:8090/
      # 初始化的超级管理员用户名
      - --halo.security.initializer.superadminusername=admin
      # 初始化的超级管理员密码
      - --halo.security.initializer.superadminpassword=660910../

  halodb:
    image: mysql:8.0.31
    container_name: halodb
    restart: on-failure:3
    networks:
      halo_network:
    command:
      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
      - --explicit_defaults_for_timestamp=true
    volumes:
      - ./mysql:/var/lib/mysql
      - ./mysqlBackup:/data/mysqlBackup
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
      interval: 3s
      retries: 5
      start_period: 30s
    environment:
      # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
      - MYSQL_ROOT_PASSWORD=0000
      - MYSQL_DATABASE=halo

networks:
  halo_network:

3.3.启动halo服务

[root@localhost halo]# docker-compose up -d
[+] Running 23/23
 ✔ halo 10 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled           348.8s
   ✔ 9d19ee268e0d Pull complete                                    15.0s
   ✔ f2b566cb887b Pull complete                                    11.4s
   ✔ 2eb275343c46 Pull complete                                    325.8s
   ✔ d6398d1ffae6 Pull complete                                    12.7s
   ✔ c6cc8e703200 Pull complete                                    14.1s
   ✔ ae6a9433814d Pull complete                                    40.5s
   ✔ 2c46e2604ceb Pull complete                                    17.0s
   ✔ 4f4fb700ef54 Pull complete                                    18.4s
   ✔ 8d293f9b2fa4 Pull complete                                    21.6s
   ✔ 0e19c09dfee6 Pull complete                                    23.0s
 ✔ halodb 11 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled        192.6s
   ✔ 0ed027b72ddc Pull complete                                    141.3s
   ✔ 0296159747f1 Pull complete                                    25.0s
   ✔ 3d2f9b664bd3 Pull complete                                    27.0s
   ✔ df6519f81c26 Pull complete                                    29.6s
   ✔ 36bb5e56d458 Pull complete                                    31.1s
   ✔ 054e8fde88d0 Pull complete                                    34.1s
   ✔ f2b494c50c7f Pull complete                                    46.1s
   ✔ 132bc0d471b8 Pull complete                                    47.4s
   ✔ 135ec7033a05 Pull complete                                    61.3s
   ✔ 5961f0272472 Pull complete                                    62.9s
   ✔ 75b5f7a3d3a4 Pull complete                                    64.2s
[+] Running 3/3
 ✔ Network halo_halo_network  Created                              0.2s
 ✔ Container halodb           Healthy                              0.2s
 ✔ Container halo             Started                              0.0s

3.4.测试访问

3.5.安装nginx并配置nginx反向代理

#提前拷贝一份nginx.conf核心配置文件至相关目录下

[root@localhost halo]# docker run --name nginx  -it -d -p 80:80 \
> -v /usr/local/nginx/html:/usr/local/nginx/html   \
> -v /usr/local/nginx/conf.d:/usr/local/nginx/conf.d  \
> -v /usr/local/nginx/logs:/usr/local/nginx/logs  \
> -v /usr/local/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf \
> --network halo_halo_network bcf638382021

[root@localhost halo]# vim /usr/local/nginx/conf/nginx.conf
proxy_pass   http://halo:8090;

测试

0
广告 广告

评论区