SpringBoot项目docker部署过程说明——互联网环境
环境准备
以虚拟机为例,需要在互联网下安装docker环境。准备镜像有nginx、redis、mysql、后端jar包
1.nginx镜像(前端程序挂载到宿主机)
2.redis镜像
3. mysql镜像
4.后端包镜像
mysql
使用官方镜像
直接运行mysql,sql文件后期mysql安装完成后导出,不打包镜像。
- 下载mysql镜像
# docker pull mysql 默认下载最新版本
docker pull mysql:{版本号}
# 查看当前镜像是否安装成功
docker images
- 创建mysql配置文件my.cnf
[client]
# 端口号
port=3306
[mysql]
no-beep
default-character-set=utf8mb4
[mysqld]
# 端口号
port=3306
# 数据目录
datadir=/var/lib/mysql
# 新模式或表时将使用的默认字符集
character-set-server=utf8mb4
# 默认存储引擎
default-storage-engine=INNODB
# 将 SQL 模式设置为严格
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
# 最大连接数
max_connections=1024
# 表缓存
table_open_cache=2000
# 表内存
tmp_table_size=16M
# 线程缓存
thread_cache_size=10
# 设置大小写不敏感
lower_case_table_names=1
# myisam设置
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=8M
key_buffer_size=8M
read_buffer_size=0
read_rnd_buffer_size=0
# innodb设置
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=8M
innodb_log_file_size=48M
innodb_thread_concurrency=33
innodb_autoextend_increment=64
innodb_buffer_pool_instances=8
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_open_files=300
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_checksum_algorithm=0
# 其他设置
back_log=80
flush_time=0
join_buffer_size=256K
max_allowed_packet=4M
max_connect_errors=100
open_files_limit=4161
sort_buffer_size=256K
table_definition_cache=1400
binlog_row_event_max_size=8K
sync_master_info=10000
sync_relay_log=10000
sync_relay_log_info=10000
- 运行mysql
配置mysql宿主机映射端口、配置文件,密码等信息。
docker run --net jnet --name mysql -d -p 13306:3306 --restart unless-stopped -v /usr/local/docker/mysql/log:/var/log/mysql -v /usr/local/docker/mysql/data:/var/lib/mysql -v /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=wwj123 mysql:5.7
reids
Redis无特殊配置,直接使用官方镜像即可。
# 查找镜像
docker search redis
# 下载镜像, 默认最新版本
docker pull redis:[tag]
# 运行镜像 前为宿主机端口
docker run --name redis01 -d -p 16379:6379 redis:latest
# 使用redis-cli测试
docker exec -it redis01 /bin/bash
redis配置文件、日志文件等需要映射到宿主机的可运行
docker run -p 16379:6379 --net jnet --name redis -v /usr/local/docker/redis/conf/redis.config:/etc/redis/redis.conf -v /usr/local/docker/redis/data:/data -v /usr/local/docker/redis/logs:/logs -d redis redis-server /etc/redis/redis.conf
前端部署
nginx 不包含前端代码
验证启动nginx
# nginx镜像中不包含vue前端项目,nginx的配置文件挂载到宿主机指定位置
# 验证 nginx配置文件
# docker exec nginx容器名称 nginx -t
docker exec nginx1 nginx -t
# 热启动 修改完配置文件后的nginx
# docker exec nginx容器名称 nginx -s reload
docker exec nginx1 nginx -s reload
nginx配置文件、日志文件、项目文件等需要映射到宿主机的可运行
docker run -d --name nginx -p 9000:80 -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/docker/nginx/conf.d:/etc/nginx/conf.d -v /usr/local/docker/nginx/logs:/var/log/nginx -v /usr/local/docker/nginx/html:/usr/share/nginx/html nginx
配置后端地址转发
在Docker容器中,由于IP地址不是固定的,通常不能直接在Nginx配置文件中写死后端服务的IP地址。但是,可以使用DNS解析或者Docker内置的服务发现机制来解决这个问题。
以下是一个使用Docker内置的DNS服务发现的例子:
- 确保你的容器都连接到同一个Docker网络。
- 使用容器名称而不是IP地址配置后端服务。
- 在Nginx配置文件中使用容器名称而不是IP地址。
例如,假设你有一个后端服务的容器名称为backend-service,你可以这样配置Nginx:
upstream jserver {
# jserver01 对应docker容器名称
server jserver01:8080;
}
server {
listen 80;
location / {
proxy_pass http://jserver;
}
}
当Nginx容器启动时,它会通过Docker内置的DNS服务器解析backend-service,并且Nginx会使用解析到的正确的IP地址转发请求。
记得,每次容器启动时,确保它们都在相同的Docker网络中,这样它们才能互相解析对方的容器名称。
docker网络
自定义docker网络
自定义docker容器之间的网络地址,保证docker容器之间的通信。
# docker有默认网络但是默认不能直接通过容器名访问, 必须使用--link指定, 可以自定义一个网络来实现
# 查看现有网络
docker network ls
# 新增网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 jnet
查看docker容器的ip地址
使用 docker inspect 命令
# docker inspect 命令可以提供容器的详细信息,包括 IP 地址。以下是具体步骤:
# 获取容器的 ID 或名称。可以通过 docker ps 命令查看正在运行的容器列表。
docker ps
# 使用 docker inspect 命令获取容器的详细信息,并通过 grep 或 jq 工具过滤出 IP 地址。
docker inspect <container_id_or_name> | grep '"IPAddress"' | head -n 1 | awk '{print $2}' | tr -d '",'
# 或者使用 jq 工具(如果已安装):
docker inspect <container_id_or_name> | jq -r '.[0].NetworkSettings.IPAddress'
防火墙端口
防火墙端口开放
在CentOS 7上,可以使用firewalld来开放端口。以下是如何操作的步骤:
- 确保firewalld正在运行:
# 启动防火墙服务
systemctl start firewalld
# 停止防火墙服务
systemctl stop firewalld
# 重启防火墙服务
systemctl restart firewalld
# 查看防火墙服务状态
systemctl status firewalld
# 防火墙服务 设置开机自启
systemctl enable firewalld
# 防火墙服务 取消开机自启
systemctl disable firewalld
- 查看当前的防火墙规则:
firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client http ssh
ports: 13306/tcp 8080/tcp 80/tcp 13307/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 开放指定的端口(例如,开放TCP端口8080):
firewall-cmd --zone=public --add-port=8080/tcp --permanent
防火墙管理区域
阻塞区域(block):任何传入的网络数据包都将被阻止。
工作区域(work):相信网络上的其他计算机,不会损害你的计算机。
家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。
公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。
隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
信任区域(trusted):所有的网络连接都可以接受。
丢弃区域(drop):任何传入的网络连接都被拒绝。
内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
注:FirewallD的默认区域是public。
firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib /firewalld/zones/”目录下。
- 重新加载防火墙以应用更改:
# 重启防火墙
firewall-cmd --reload
确保您已将上述命令中的端口号(这里是8080)和协议(这里是tcp)替换为您需要开放的实际端口号和协议。如果您需要为UDP端口开放规则,请将tcp替换为udp。
- 是否容器端口未与宿主机端口映射
映射方式:通过 -p 宿主机端口:容器端口
例如: # docker run -d -p 8080:80 nginx
防火墙端口开放访问不通问题排查
- 检查端口是否已开放
# 查看当前端口开放
firewall-cmd --list-all
- 关闭防火墙
# 停止防火墙
systemctl stop firewalld
# 停止并禁用开机启动
systemctl disable firewalld
- 检查转发是否开启
cat /proc/sys/net/ipv4/ip_forward
0
返回0, 说明没有开启
开启IP转发
# 打开/etc/sysctl.conf文件
# 配置 net.ipv4.ip_forward=1,保存并退出
vim /etc/sysctl.conf
# 重启服务,让配置生效
systemctl restart network
- 检查端口开放区域是否正确
后端jar包部署
后端程序打包成镜像
编写Dockerfile文件
# 使用官方Java运行环境作为基础镜像
FROM anapsix/alpine-java:8_server-jre_unlimited
# 作者
MAINTAINER wwj
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 将工作目录设置为jar
WORKDIR /jar
# 为暴露容器运行时的监听端口给外部
EXPOSE 8080
# 复制命令,将文件复制到镜像中。
ADD ./houseNumberSys-3.4.3.jar ./
# 复制配置文件到镜像中
ADD ./application-test.yml ./
# 设置容器启动时运行的命令
CMD sleep 60;java -Djava.security.egd=file:/dev/./urandom -Dspring.config.additional-location=./application-test.yml -jar houseNumberSys-3.4.3.jar
上传服务器指定位置,在该目录下打包jar后端镜像。
# 后端打包,在Dockerfile文件同级目录下执行,-t 容器名称:版本号
docker build -f Dockerfile -t jserver:1.0 .
运行后端镜像
镜像打包完成后,运行镜像,连接需要的容器,如mysql,redis等。
# 后端运行
# --net docker 自定义网络, --link 需要连接的容器名称, -p 与宿主机映射的端口,宿主机端口:容器端口
docker run --net jnet --name=jserver -d -p 8080:8080 --link redis --link mysql jserver:1.0
# 查看实时日志
docker logs -f jserver01
docker-compose 应用
一个项目涉及到redis,mysql、nginx、jar程序包多个镜像,一一启动太麻烦,docker-compose可以批量启动。
安装docker-compose
docker-compose是docker官方开源的项目, 需要额外安装。
# docker-compose是docker官方开源的项目, 需要额外安装
# 本例使用的虚拟机 centos7
# compose 安装说明
# https://docs.docker.com/compose/install/
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
sudo chmod +x /usr/local/bin/docker-compose
启动docker-compose
编写docker-compose.yml文件,例如:
# docker-compose版本, 2 指令最多, 1将被弃用
version: '2'
# 服务
services:
# 服务名
mysql:
# 镜像, 可以是线上的 也可以是本地的
image: mysql:5.7
# 变量
environment:
MYSQL_ROOT_PASSWORD: wwj123
restart: always
# 容器名称
container_name: mysql01
# 启动命令, 使用command可以覆盖容器启动后默认执行的命令
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
# 映射端口
ports:
- 13306:3306
# 映射docker中的日志、配置文件等挂载到宿主机上,宿主机原路径:docker容器路径
volumes:
- /usr/local/docker/mysql/log:/var/log/mysql
- /usr/local/docker/mysql/data:/var/lib/mysql
- /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf
# redis
# jeecg-boot-redis:
redis:
# 如果本地没有, 则会去仓库下载
image: redis:latest
# 端口映射
ports:
- 16379:6379
restart: always
# 容器名称
container_name: redis01
volumes:
- /usr/local/docker/redis/conf/redis.config:/etc/redis/redis.conf
- /usr/local/docker/redis/data:/data
- /usr/local/docker/redis/logs:/logs
# 后台服务
jserver:
# 镜像
# image: 81.70.17.111:5000/jeecg-boot-system:1.0
image: jserver:1.0
restart: always
container_name: jserver01
# 文件路径挂载 宿主机:容器
volumes:
- /data/config:/jeecg-boot/config
ports:
- 8080:8080
links:
# 此处关联的是本文件中服务的名字
- mysql
- redis
# 增加关联配置, server依赖 redis和mysql
depends_on:
- mysql
- redis
# web
front:
# image: 81.70.17.111:5000/nginxhtml
image: front:1.0
restart: always
container_name: jfront01
ports:
- 80:80
# 增加容器访问link
links:
# 此处关联的是本文件中服务的名字
- jserver
# 增加关联配置, 前端依赖后端server
depends_on:
- jserver
# nginx
nginx:
# image: 81.70.17.111:5000/nginxhtml
image: nginx:latest
restart: always
container_name: nginx01
ports:
- 9000:80
volumes:
- /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /usr/local/docker/nginx/conf.d:/etc/nginx/conf.d
- /usr/local/docker/nginx/logs:/var/log/nginx
- /usr/local/docker/nginx/html:/usr/share/nginx/html
# 增加容器访问link
links:
# 此处关联的是本文件中服务的名字
- jserver
# 增加关联配置, 前端依赖后端server
depends_on:
- jserver
编写完成上传到指定目录下,清除所有容器,在docker-compose.yml同级目录下运行,即可一键启动。
# 清除之前的容器
docker ps -aq|xargs docker stop|xargs docker rm
# 执行 docker-compose, 在docker-compose.yml同目录下执行
docker-compose up -d