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、指定 或者相对 docker-compose.yml 文件的路径)。 2、 |
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 2、host 3、none 4、container # 查看自定义网段信息 |
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(软限制, 应⽤可以随时修改,不能超过硬限制) 和 |
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性