Docker-Compose部署服务

一、Docker Compose

1、前言

我们知道使⽤⼀个 Dockerfile 模板⽂件,可以让⽤户很⽅便的定义⼀个单独的应⽤容器。然⽽,在⽇常⼯作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。
例如要实现⼀个 Web 项⽬,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚⾄还包括负载均衡容器等,我们只能一个一个`写dockerfile文件,然后bulid构建,run手动操作单个容器`

Compose 恰好满⾜了这样的需求。它允许⽤户通过⼀个单独的 docker-compose.yml 模板⽂件(YAML 格式)
来定义⼀组相关联的应⽤容器为⼀个项⽬(project).
微服务。 100个微服务!依赖关系。
# Compose 项⽬是 Docker 官⽅的开源项⽬,负责实现对 Docker 容器集群的快速编排。

2、官方介绍

Docker Compose来轻松高效的管理容器,定义运行多个容器。

1、Compose 中有两个重要的概念

# 1、服务 ( service ):
⼀个应⽤的容器,实际上可以包括若⼲运⾏相同镜像的容器实例(web、redis、mysql ...)。
# 2、项⽬ ( project ):
由⼀组关联的应⽤容器组成的⼀个完整业务单元,在 docker-compose.yml ⽂件中定义(博客、web、mysql)。
# 启动docker-compose up 可以启动多个服务

2、三步骤

1、Dockerfile 保证我们的项目可以在任何地方运行。

2、定义组成您的应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。
# services 什么是服务
# docker-compose.ym 这个文件如何写

3、运行docker compose up和码头工人组成命令启动并运行你的整个应用程序。

  也可以docker-compose up使用 docker-compose 二进制文件运行。 # 启动项目

3、Compose是Docker官方的开源项目,需要安装!

dockerfile # 让程序在任何地方运行。 web服务、redis、mysql、nginx ... d  多个服务 启动

4、Compose:重要的概念

1、YAML file配置文件。
2、single command。 命令有哪里
3、Compose 适用于所有环境:生产、登台、开发、测试以及 CI 工作流。
4、Compose 的默认管理对象是项⽬,通过⼦命令对项⽬中的⼀组容器进⾏便捷地⽣命周期管理。
5、Compose 项⽬由 Python 编写,实现上调⽤了 Docker 服务提供的 API 来对容器进⾏管理。因此,只要所操作的平
台⽀持 Docker API,就可以在其上利⽤ Compose 来进⾏编排管理。

# Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。

二、docker compose 安装

# 官网安装: https://docs.docker.com/compose/install/

1、下载

方式一:
# 1、官网安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 方式二: #
2、国内 curl -L "https://get.daocloud.io/docker/compose/releases/download/1.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 3 ​curl -SL https://github.com/docker/compose/releases/download/v2.24.7/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
#4、查看
[root@docter bin]# ll total
12440 -rw-r--r-- 1 root root 12737304 Jul 14 20:19 docker-compose

2、bash命令补全

curl -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

3、卸载(没有安装不需要执行)

如果是⼆进制包⽅式安装的,删除⼆进制⽂件即可。

 sudo rm /usr/local/bin/docker-compose

4、授权

#授权
[root@docter bin]# sudo chmod +x /usr/local/bin/docker-compose
#软链接
[root@docter bin]#ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

5、检测版本

[root@docter bin]# docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

三、docker compose常用命令

1、运行
# 查看帮助
docker-compose -h 
# 启动所有服务
docker-compose up
# 以守护进程模式运行
docker-compose up -d
# -f 指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定
docker-compose -f docker-compose.yml up -d
# 构建或重建服务
docker compose build
# 列出创建的容器使用的图像
docker compose images
# 为服务创建容器
docker compose create
# 停止并删除容器、网络、卷、镜像。
docker-compose down
# 暂停服务
docker compose pause
#恢复处于暂停状态中的服务 docker compose unpause # 进入容器实例内部 docker
-compose exec docker-compose.yml文件中写的服务id /bin/bash docker compose exec yml里面的服务id # 检查配置 docker-compose config # 检查配置,有问题才有输出 docker-compose config -q 2、查看,日志,停止,重启,删除 # 展示当前docker-compose编排过的运行的所有容器 docker-compose ps # 查看正在运行的项目 docker-compose ls # 查看正在运行的项目,同时显示已停止的项目 docker-compose ls -a # 查看 Compose 日志(yml里面的服务id ) docker-compose logs web docker-compose logs redis # 启动服务 docker compose start # 停止服务 docker-compose stop # 重启 Compose 服务 docker-compose restart # 杀死 Compose 服务 docker-compose kill # 删除 Compose 服务 docker-compose rm
#查看事件
docker-compose events yml里面的服务id
#设置副本数 yml里面的服务id=5
docker-compose scale 服务id=5
#查看 各个服务容器内运行的进程
docker-compose top yml里面的服务id

四、compose编排模板

1、参数说明

build(指定镜像、并构建)

version: "3.0"
services:
  demo: #服务ID
    build: #启动服务时,先将build中指定的dockerfile打包成镜像,再运行该镜像
      context: ./dir #指定上下文目录dockerfile所在目录[相对、绝对路径都可以]
      dockerfile:  Dockerfile #文件名称
      args: #指定构建镜像时候的变量
        buildno: 1 
    container_name: jenkins-demo
    ports:
      - "8881:8881"

1、指定 Dockerfile 所在文件夹的路径(可以是绝对路径,

或者相对 docker-compose.yml 文件的路径)。

2、 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

 

command(覆盖容器启动后命令)

 
version: "3.0"
services:
  redis:
    container_name: redis
    image: redis:7.0.5
    ports:
      - "6379:6379"
    #run镜像之后,appendonly覆盖容器内的默认命令
    command: "redis-server --appendonly yes"

1、覆盖容器启动后的默认执行命令

 

 

container_name(指定容器名称)

 
version: "3.0"
services:
  redis:
    #container_name: redis
    container_name: docker-web-redis
 

1、指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。

2、指定容器名称后,该服务将无法进行扩展(scale),因为 Docker

不允许多个容器具有相同的名称。

 

depends_on(容器的依赖、启动先后的问题)

 
version: '3'
services:
  web:
    image:  ruoyi
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres
 

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

注意:web 服务不会等待 redis db 「完全启动」之后才启动。

2、默认情况下使用 docker-compose up web 这样的方式启动 web 服务时,

也会启动 redis和db 两个服务,因为在配置文件中定义了依赖关系。

 


 

env_file(文件中获取环境变量)

 
version: "3.0"
services:
  mysql:
    container_name: mysql8
    image: mysql:8.0.29
    ports:
      - "3306:3306"
    #- MYSQL_ROOT_PASSWORD=root #指定值
    env_file: #替换environment的配置[直接给该文件、不会泄露密码等信息]
      - mysql.env #此处为相对路径,也可以写绝对路径[里面的格式key=value,并且支持#的注释]
      - ./common.env
      - ./apps/web.env
      - /opt/secrets.env
 

1、从⽂件中获取环境变量,可以为单独的⽂件路径或列表。

2、如果通过 docker-compose -f FILE ⽅式来指定 Compose 模板⽂件,

  则 env_file 中变量的路径会基于模板⽂件路径。

3、如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。

 

environment(设置环境变量)

 
version: "3.0"
services:
  mysql:
    container_name: mysql8
    image: mysql:8.0.29
    ports:
      - "3306:3306"
    environment: #环境变量[此处写得太过敏感,给文件容易被别人知道]
      - MYSQL_ROOT_PASSWORD=root #指定值
      - MYSQL_ROOT_PASSWORD: password
      - TZ: Asia/Shanghai
 

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

2、只给定名称的变量会⾃动获取运⾏ Compose 主机上对应变量的值,

   可以⽤来防⽌泄露不必要的数据。

 

healthcheck(检查容器是否健康运行)

 
version: "3.0"
services:
  tomcat8082:
    container_name: tomcat02
    image: tomcat:8.0.15-jre7 #镜像版本
    ports:
      - "8082:8080"
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost" ]
      interval: 1m30s
      timeout: 10s
      retries: 3

 1、通过命令检查容器是否健康运⾏(健康检查)

 
 

image(指定镜像名称或镜像 ID)

version: "3.0"
services:
  tomcat8082:
    container_name: tomcat02
    image: ubuntu 
    #image: orchardup/postgresql
    #image: a4bc65fd
 

1、指定为镜像名称或镜像 ID。如果镜像在本地不存在,

      Compose 将会尝试拉取这个镜像。

 

network_mode(网络模式)
version: "3.0"
services:
  tomcat8082:
    container_name: tomcat02
    image: ubuntu 
    #image: orchardup/postgresql
    #image: a4bc65fd
    network_mode: "host"

 

docker-compose.yml 配置文件中的 network_mode 是用于设置网络模式的,与 docker run 中的 --network 选项参数一样的,可配置如下参数:

1、bridge
**默认 **的网络模式。如果没有指定网络驱动,默认会创建一个 bridge 类型的网络。
桥接模式一般是用在应用是独立的情况,容器之间不需要互相通信。
network_mode: "bridge"

2、host
host 网络模式,针对的也是应用是独立的情况,在 host 网络模式下,移除了宿主机与容器之间的网络隔离,容器直接使用宿主机的网络,这样就能在容器中访问宿主机网络
host 网络模式只对 Docker 17.06 以及更高版本的 swarm 服务可用
network_mode: "host"

3、none
none 表示对于这个 container ,禁用所有的网络。
network_mode: "none"

4、container
指定容器网络。
network_mode: "container:[container name/id]"
5、自定义网络
指向自己定义的网段
# 创建子网掩码为16位的网段
docker network create --subnet=172.18.0.0/16 mynet

# 查看自定义网段信息
docker network inspect mynet
network_mode: "mynet"

 

networks(配置容器连接的网络)

 

version: "3.0"
services:
  tomcat8082:
    container_name: tomcat02
    image: tomcat:8.0.15-jre7 #镜像版本
    ports:
      - "8082:8080"
    networks: #代表当前服务使用那个网络桥
      - hello
networks: #定义服务使用到的网桥
  hello: #定义上面的服务用到的网桥名称, 默认创建的就是bridge
    external:
      true #使用外部指定网桥,注意,网桥必须存在[docker network create -d bridge hello]
 

1、配置容器连接的网络。

2、当前服务使用的网络必须与定义服务的网络一致

 

ports(暴露端口信息)

 

version: "3.0"
services:
  tomcat8082:
    container_name: tomcat02
    image: tomcat:8.0.15-jre7 #镜像版本
    ports:
      - "8082:8080"

1、暴露端口信息。使用宿主端口:容器端口 (HOST:CONTAINER) 格式,

     或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。

2、注意:当使用 HOST:CONTAINER 格式来映射端口时,

           如果你使用的容器端口小于 60 并且没放到引号里,

           可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为

          60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。

 

sysctls(配置容器内核参数)

 

version: "3.0"
services:
  tomcat8080: #服务id
    container_name: tomcat01 #相当于run  --name
    image: tomcat:8.0.15-jre7 #镜像版本(没有的话会自动拉取) 相当于run image
    ports: #完成host与容器的端口映射 相当于run p
      - "8080:8080" #(防止出错,官方建议用""包起来)
    volumes: #完成宿主机与容器中目录数据卷的映射(可以挂在多个) 相当于run -v
  #- /usr/local/software/tomcat/webapps:/usr/local/tomcat/webapps #使用自定义路径映射
      - tomcatWebapps:/usr/local/tomcat/webapps
    networks: #代表当前服务使用那个网络桥 相当于run network
      - hello
    sysctls:
      net.core.somaxconn: 1024
      net.ipv4.tcp_syncookies: 0
    #sysctls:
      #- net.core.somaxconn=1024
      #- net.ipv4.tcp_syncookies=0

1、配置容器内核参数

 

 

ulimits(指定容器的 ulimits 限制值)

 
version: "3.0"
services:
  tomcat8080: #服务id
    container_name: tomcat01 #相当于run  --name
    image: tomcat:8.0.15-jre7 #镜像版本(没有的话会自动拉取) 相当于run image
    ports: #完成host与容器的端口映射 相当于run p
      - "8080:8080" #(防止出错,官方建议用""包起来)
    ulimits:
      nproc: 65535
      nofile:
        soft: 20000
        hard: 40000
 

1、指定容器的 ulimits 限制值。

2、指定最⼤进程数为 65535,指定⽂件句柄数为 20000(软限制,

     应⽤可以随时修改,不能超过硬限制) 和
     40000(系统硬限制,只能 root ⽤户提⾼)

 

volumes(数据卷所挂载路径设置)

 

version: "3.0"
services:
  tomcat8080: #服务id
    container_name: tomcat01 #相当于run  --name
    image: tomcat:8.0.15-jre7 #镜像版本(没有的话会自动拉取) 相当于run image
    ports: #完成host与容器的端口映射 相当于run p
      - "8080:8080" #(防止出错,官方建议用""包起来)
    volumes: #完成宿主机与容器中目录数据卷的映射(可以挂在多个) 相当于run -v
   #- /usr/local/software/tomcat/webapps:/usr/local/tomcat/webapps #使用自定义路径映射
      - tomcatWebapps:/usr/local/tomcat/webapps #使用声明数据卷的方式
#声明数据卷
volumes: #声明上面服务所使用的自动的卷名
  tomcatWebapps: #声明指定的卷名 compose会自动创建改卷明,但是会在之前加入项目名
    external: #使用自定义的卷名
      false #true确定使用自定义卷名 注意,一旦使用外部自定义卷名,启动服务之前必须手动创建
 

1、数据卷所挂载路径设置。可以设置为宿主机路径

   (HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),

   并且可以设置访问模式 (HOST:CONTAINER:ro)。

     

注:模板定义参考“https://tkstorm.com/docker-doc/compose/compose_file.html#build”

2、docker-compose.yml文件解释

version : '3'                                      #compose文件版本支持特定的Docker版本
services:                                          #本工程的服务配置列表
 
  docker-compose-demo:                             #服务名,自定义
    container_name: docker-compose-demo            #容器名
 
    build:                                         #基于Dockerfile文件构建镜像时使用的属性
      context: .                                   #代表当前目录,也可以指定绝对路径[/path/test/Dockerfile]或相对路径[../test/Dockerfile],尽量放在当前目录,便于管理
      dockerfile: Dockerfile-demo                  #指定Dockerfile文件名
    ports:                                         
      - "5555:6666"                                #指定宿主机端口映射到本容器的端口
    volumes:                                        
      - /tmp:/tmp                                  #目录挂载
    depends_on:                                    #本服务启动,依赖于mysql,也就是mysql优先于docker-compose-demo启动
      - mysql
    restart: always                                #是否随docker服务启动重启
    networks:                                      #加入指定网络
      - my-network                                 #自定义的网络名
    environment:                                   #设置容器的环境变量
      - TZ=Asia/Shanghai                           #这里设置容器的时区为亚洲上海,也就解决了容器通过compose编排启动的时区问题
 
  mysql:                                           #服务名,自定义
    container_name: docker-compose-mysql-demo      #容器名
    image: mysql:5.7                               #指定基于mysql:5.7镜像为基础镜像来构建镜像。ports:
      - "3306:3306"
    command: [                                           #使用command可以覆盖容器启动后默认执行的命令
            '--character-set-server=utf8mb4',            #设置数据库表的数据集
            '--collation-server=utf8mb4_unicode_ci',     #设置数据库表的数据集
            '--default-time-zone=+8:00'                  #设置mysql数据库的时区问题
    ]
    environment:           
      MYSQL_DATABASE: swapping                            #设置初始的数据库名
      MYSQL_ROOT_PASSWORD: 398023                         #设置root连接密码
      MYSQL_ROOT_HOST: '%'
    restart: always
    privileged: true                                        #启动拥有特权模式
    networks:
      - my-network
  networks:                        
    my-network: 

五、docker-compose编排微服务

1、编排微服务

编写docker-compose.yml文件

version: "3"    
services:
  microService:   #服务ID
    image: web:1.6
    container_name: docker-web-microService
    ports:
      - "6001:6001"
    volumes:
      - /app/microService:/data
restart:always networks:
- my_network depends_on: - redis - mysql redis: image: redis:6.0.8 ports: - "6379:6379" volumes: - /app/redis/redis.conf:/etc/redis/redis.conf - /app/redis/data:/data
restart:always networks:
- my_network command: redis-server /etc/redis/redis.conf mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: '123456' MYSQL_ALLOW_EMPTY_PASSWORD: 'no' MYSQL_DATABASE: 'db2021' MYSQL_USER: 'zzyy' MYSQL_PASSWORD: 'zzyy123' ports: - "3306:3306" volumes: - /app/mysql/db:/var/lib/mysql - /app/mysql/conf/my.cnf:/etc/my.cnf - /app/mysql/init:/docker-entrypoint-initdb.d
restart:always networks:
- my_network command: --default-authentication-plugin=mysql_native_password #解决外部无法访问 networks: my_network:

 启动服务:

docker-compose up -d # 启动所有docker-compose服务并后台运行

验证:

 

 

 

 

 

 2、compose部署lnmp

创建工作目录并移动相应安装包、配置文件:

----------------------nginx-----------------------------
1.mkdir -p /opt/compose-lnmp/nginx
2.cd  /opt/compose-lnmp/nginx
3.把nginx-1.12.0.tar.gz和wordpress-4.9.4-zh_CN.tar.gz和nginx的配置文件nginx.conf移进来(配置文件都已经修改好)
----------------------mysql-----------------------------
1.mkdir -p /opt/compose-lnmp/mysql
2.cd  /opt/compose-lnmp/mysql
3.把boost_1_59_0.tar.gz和mysql-5.7.17.tar.gz和mysql配置文件my.cnf移动到本目录(配置文件都已经修改好)
----------------------php--------------------------------
1.mkdir -p /opt/compose-lnmp/php
2.cd  /opt/compose-lnmp/php
3.把php-7.1.10.tar.bz2、php-fpm.conf、php.ini、www.conf移动到本目录(配置文件都已经修改好)

构建lnmp的compose文件:

cd /opt/compose-lnmp #compose的工作目录
vim docker-compose.yml   #构建compose的yml文件
version: '2'   #版本2能使用volumes_from
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    container_name: nginx
    ports:
      - 1111:80
      - 2222:443
    volumes:
      - ./nginx/html/:/usr/local/nginx/html
    networks:
      lnmp:
        ipv4_address: 172.18.0.10
  mysql:
    hostname: mysql
    build:
      context: ./mysql
      dockerfile: Dockerfile
    container_name: mysql
    networks:
      lnmp:
        ipv4_address: 172.18.0.20
    ports:
      - 3306:3306
  php:
    hostname: php
    build:
      context: ./php
      dockerfile: Dockerfile
    container_name: php
    networks:
      lnmp:
        ipv4_address: 172.18.0.30
    ports:
      - 9000:9000
    volumes_from:
      - nginx
      - mysql
networks:
  lnmp:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16

启动compose搭建的lnmp:

cd /opt/compose-lnmp/
docker-compose -f docker-compose.yml up -d
----------------------------------------------------------
-f, --file FILE :使用特定的 compose 模板文件,默认为 docker-compose.yml
-p, --project-name NAME :指定项目名称,默认使用目录名称
-d :在后台运行

3、部署nginx+mysql+redis+nacos+springboot项目W

1)在服务器创建如下,目录

首先新建myworks目录,作为项目所在目录以及项目名称,然后进入该目录,创建如下目录以及文件

docker-compose.yml、Dockerfile文件

java目录,目录下存放后台服务demo.jar包

mysql目录,目录下新建data目录,作为数据挂载目录

nginx目录,目录下新建conf目录,conf目录下新建nginx.conf配置文件;新建font目录,目录下存放dist前端打的包;新建log目录,映射挂载日志目录。

redis目录,目录下新建data目录和redis.conf配置文件。

nacos目录,目录下新建logs、conf目录,conf目录下新建application.properties配置文件.

2)修改docker-compose.yml的内容为

version: "3.8"

services:
   java:
    image: openjdk:8u342-oracle
build:
    context:.
    dockerfile: Dockerfile restart: always volumes:
- ./java:/home working_dir: /home/ ports: - "8080:8080" - "8090:8090" environment: TZ: Asia/Shanghai depends_on: - redis - mysql - nacos command: ['java', '-jar','/home/demo.jar'] redis: image: redis:latest restart: always ports: - "6379:6379" volumes: - ./redis/conf/redis.conf:/etc/redis/redis.conf - ./redis/data:/data command: redis-server /etc/redis/redis.conf mysql: image: mysql:latest restart: always ports: - "3306:3306" command: --lower_case_table_names=1 environment: MYSQL_DATABASE: fzys-show MYSQL_ROOT_PASSWORD: Fzys@123! MYSQL_ROOT_HOST: '%' TZ: Asia/Shanghai volumes: - ./mysql/data:/var/lib/mysql nginx: image: nginx:latest ports: - "80:80" volumes: - ./nginx/font/dist:/usr/share/nginx/dist - ./nginx/log:/var/log/nginx - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
privileged: true #启动拥有特权模式 nacos: hostname: nacos container_name: nacos image: nacos
/nacos-server:latest volumes: # 需要添加mysql8的插件 #- ./nacos/plugins/mysql/:/home/nacos/plugins/mysql/ # 把日志文件映射出来 - ./nacos/logs:/home/nacos/logs # 把配置文件映射出来 - ./nacos/conf/application.properties:/home/nacos/conf/application.properties environment: # 设置环境变量,相当于docker run命令中的-e - JVM_XMS=512m - JVM_XMX=512m - JVM_XMN=128m - REFER_HOST_MODE=hostname - MODE=standalone #单机版 ports: - "8848:8848" - "9848:9848" - "9849:9849" env_file: # 集群配置文件 - ./nacos/conf/nacos-hostname.env restart: always depends_on: - mysql

3)Dockerfile

FROM java:8
EXPOSE 81
ADD ./java/demo.jar /home/app.jar
RUN bash -c 'touch /demo.jar'
ENTRYPOINT ["java", "-jar", "/demo.jar"]

4)nginx.conf

worker_processes 1;
events {
  worker_connections 1024;
}
http {
  include mime.types;
  default_type application/octet-stream;
  sendfile on;
  keepalive_timeout 65;
  map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
  }

  

    upstream nacos {
         server nacos1:8848 weight=1 max_fails=2 fail_timeout=10s;
         #server nacos2:8848 weight=1 max_fails=2 fail_timeout=10s;
         #server nacos3:8848 weight=1 max_fails=2 fail_timeout=10s;
     }  server {    listen 390;    server_name localhost;

    client_max_body_size 300M;
   
    location / {
      root /usr/share/nginx/dist;  #前端包
      try_files $uri $uri/ /index.html last;
      index index.html index.htm;
    }
   
    location /prod-api/ {
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://你的服务器ip:8080/;
    }
    
 location /nacos {
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://nacos;
    }
    
    location /websocket/ {
            proxy_pass_header Server;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Scheme $scheme;
            proxy_pass       http://你的服务器ip:8080;
            proxy_http_version  1.1;
            proxy_set_header    Upgrade    "websocket";
            proxy_set_header    Connection "Upgrade";
            proxy_read_timeout 5s;
    }
error_page
500 502 503 504 /50x.html; location = /50x.html { root html; } } }

5)application.properties

vi /home/nacos/conf/application.properties
#复制得到的IP替换到下方的IP中
spring.datasource.platform=mysql
  
db.num=1
db.url.0=jdbc:mysql://172.17.0.3:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai
db.user=root
db.password=root

7、打包springboot项目并命名为配置中的服务名

配置中的mysql和redis配置都是用的服务名而不是ip地址

server:
  port: 81
 
 
spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB
  profiles:
    active: dev
  # mysql 配置
  datasource:
      url: jdbc:mysql://mysql:3306/blog4?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8
      username: 
      password: 
#      schema: classpath:springbootsecurityauth.sql
      sql-script-encoding: utf-8
      initialization-mode: always
      driver-class-name: com.mysql.cj.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource
      # 初始化大小,最小,最大
      initialSize: 1
      minIdle: 3
      maxActive: 20
     # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 30000
      validationQuery: select 'x'
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      # 打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 ,slf4j
      filters: stat,wall,slf4j
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
 
  redis:
    database: 6
    host: redis
    port: 6379
    timeout: 5000s  # 连接超时时长(毫秒)
    jedis:
      pool:
        max-active: 20 #连接池最大连接数(使用负值表示没有限制)
        max-idle: 8  #连接池中的最大空闲连接
        max-wait: -1s #连接池最大阻塞等待时间(使用负值表示没有限制)
        min-idle: 0  #连接池中的最小空闲连接
    password:  #rootroot

 3、compose部署mysql

1)拉取mysql镜像

docker pull mysql:8.0.18

2)创建挂载目录

mkdir -p /home/data/mysql8/log
mkdir -p /home/data/mysql/data
mkdir -p /home/data/mysql/conf.d

3)添加配置文件my.cnf

vi /home/data/mysql/conf.d/my.cnf
内容如下:
###### [client]配置模块 ######
[client]
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock

###### [mysql]配置模块 ######
[mysql]
# 设置MySQL客户端默认字符集
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock

###### [mysqld]配置模块 ######
[mysqld]
port=3306
user=mysql
# 设置sql模式 sql_mode模式引起的分组查询出现*this is incompatible with sql_mode=only_full_group_by,这里最好剔除ONLY_FULL_GROUP_BY
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id = 1

# MySQL8 的密码认证插件 如果不设置低版本navicat无法连接
default_authentication_plugin=mysql_native_password

# 禁用符号链接以防止各种安全风险
symbolic-links=0

# 允许最大连接数
max_connections=1000

# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4

# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

# 表名存储在磁盘是小写的,但是比较的时候是不区分大小写
lower_case_table_names=0
max_allowed_packet=16M 

# 设置时区
default-time_zone='+8:00'

4)编写docker-compose.yml文件

version: '3'
services:
  mysql: # 服务名称
    image: mysql:8.0.18 # 或其它mysql版本镜像
    container_name: mysql8 # 容器名称
    network_mode: host
    privileged: true
    environment:
#设置mysql root密码,可以直接设置明文密码 MYSQL_ROOT_PASSWORD: root,这里采用.env来传入密码
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} #
- MYSQL_ROOT_PASSWORD=123456 # root设置明文密码 # - TZ=Asia/Shanghai # 设置容器时区 我这里通过下面挂载方式同步的宿主机时区和时间了,这里忽略 - MYSQL_ROOT_HOST='%'
# 创建数据库
- MYSQL_DATABASE=wordpress
# 设置数据库用户名
- MYSQL_USER=demo
# 设置数数据库密码
- MYSQL_PASSWORD=demo

#目录挂载 volumes: - /home/data/mysql/log:/var/log/mysql # 映射日志目录,宿主机:容器 - /home/data/mysql/data:/var/lib/mysql # 映射数据目录,宿主机:容器 - /home/data/mysql/conf.d:/etc/mysql/conf.d # 映射配置目录,宿主机:容器 - /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro是read only的意思,就是只读。 ports: - 3306:3306 # 指定宿主机端口与容器端口映射关系,宿主机:容器 restart: always # 容器随docker启动自启 # 指定使用的容器网络和地址 networks: seclabs: ipv4_address: 10.1.0.2 # 限制容器内存大小 mem_limit: 1024m # 在宿主机上创建 # docker network create --driver=bridge --subnet=10.1.0.0/24 seclabs # 调用外部网络,注意不能调用默认生成的docker0网络 # 容器初始化时执行的指令 command: [ 'mysqld', '--innodb-buffer-pool-size=80M', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--default-time-zone=+8:00', '--lower-case-table-names=1', '--default-authentication-plugin=mysql_native_password', ] networks: seclabs: external: true

5).env 文件

$ cat .env 
MYSQL_ROOT_PASSWORD=123456

 

posted on 2023-04-03 16:46  uestc2007  阅读(160)  评论(0编辑  收藏  举报

导航