SpringBoot项目docker部署过程说明——内网环境
环境准备
以虚拟机为例,需要安装docker环境。内网部署与互联网部署基本一致,需要在联网的服务器上下载好对应的镜像,传输到内网服务器上,再进行安装部署。
安装yum
CentOS 7 默认安装了 YUM 包管理器。
确认 YUM 是否安装以及其版本,可以使用以下命令:
yum --version
安装docker
下载docker
下载地址
https://download.docker.com/linux/static/stable/x86_64/
本次安装版本为docker-26.1.4.tgz
上传安装包
将docker离线安装包上传到虚拟机中,通过cmd命令窗口上传,或者通过xftp上传。
# 命令行上传安装包到服务器的/usr/local/docker
scp F:/wwj/Downloads/docker-26.1.4.tgz root@192.168.198.102:/usr/local/docker
# 需要输入服务器root账号密码
在虚拟机上显示对应上传的安装包。
# 进入对应的文件位置
cd /usr/local/docker
# 显示当前文件夹下的文件
ll
解压安装包
# 通过tar 命令解压安装包
tar -zxvf docker-26.1.4.tgz
# 将解压后的文件移到 /usr/bin/ 目录下
cp docker/* /usr/bin
注册docker为系统服务
打开 /ect/systemd/system/docker.service 文件
vi /etc/systemd/system/docker.service
并插入如下配置信息
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
给docker.service配置文件添加执行权限,并重新加载配置文件。
# 添加权限
chmod +x /etc/systemd/system/docker.service
# 重新加载
systemctl daemon-reload
操作docker
启动docker服务
systemctl start docker
设置docker开机自启
# 设置开机自启动
systemctl enable docker
# 关闭开机自启动
systemctl disable docker
# 查看docker是否为开机自启
systemctl is-enabled docker
查看docker状态
systemctl status docker
停止docker服务
systemctl stop docker
reids
redis在有网络的服务器上下载镜像
# 查找镜像
docker search redis
# 下载镜像, 默认最新版本
docker pull redis:[tag]
将redis镜像保存为本地文件
将redis的镜像文件保存在当前目录下,命名为redis_images.tar的文件。
# 保存镜像文件
docker save -o redis_image.tar redis:latest
# 下载镜像, 默认最新版本
docker pull redis:[tag]
利用scp将镜像文件传输到第二台服务器
# 传输文件到/usr/local/docker/redis目录下
scp redis_images.tar root@192.168.198.102:/usr/local/docker/redis/
在第二台服务器上导入镜像
# 登录第二台服务器,进入存放.tar文件的目录
cd /usr/local/docker/redis
# 导入redis镜像
docker load -i redis_image.tar
验证镜像是否导入成功
# 查看镜像
docker images
运行容器
redis配置文件、日志文件等需要映射到宿主机的可运行,当前配置映射宿主机端口为16379,redis配置文件/usr/local/docker/redis/conf/redis.config,
# 运行redis容器
docker run -p 16379:6379 --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
# 查看redis容器是否运行
docker ps -a
mysql
mysql安装部署与redis相同,只有镜像和运行命令配置文件不同。
获取镜像
# docker pull mysql 默认下载最新版本
docker pull mysql:{版本号}
# 保存镜像文件
docker save -o mysql_image.tar mysql:5.7
# 传输文件到/usr/local/docker/mysql目录下
scp mysql_images.tar root@192.168.198.102:/usr/local/docker/mysql/
# 登录第二台服务器,进入存放.tar文件的目录
cd /usr/local/docker/mysql
# 导入mysql镜像
docker load -i mysql_image.tar
# 查看镜像
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 --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
后端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 --name=jserver -d -p 8080:8080 --link redis --link mysql jserver:1.0
# 查看实时日志
docker logs -f jserver01
前端部署
nginx 不包含前端代码
nginx镜像和redis一致
获取镜像
# docker pull nginx 默认下载最新版本
docker pull nginx:{版本号}
# 保存镜像文件
docker save -o nginx_image.tar nginx:latest
# 传输文件到/usr/local/docker/nginx目录下
scp nginx_images.tar root@192.168.198.102:/usr/local/docker/nginx/
# 登录第二台服务器,进入存放.tar文件的目录
cd /usr/local/docker/nginx
# 导入mysql镜像
docker load -i nginx_image.tar
# 查看镜像
docker images
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
导入项目文件
打包后项目文件dist上传到服务器/usr/local/docker/nginx/html/,配置nginx的配置文件,如:
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
需要重载nginx配置:
# 重载配置
# docker exec <容器名称> nginx -s reload
docker exec nginx nginx -s reload
配置后端地址转发
在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网络中,这样它们才能互相解析对方的容器名称。
由于nginx配置文件是映射文件,修改完/usr/local/docker/nginx/conf.d/default.conf,需要重载nginx配置。
docker-compose 应用
一个项目涉及到redis,mysql、nginx、jar程序包多个镜像,一一启动太麻烦,docker-compose可以批量启动。
离线安装docker-compose
docker-compose是docker官方开源的项目, 需要额外安装。通过其他服务器下载docker-compose
# 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/docker/docker-compose
# 添加权限
sudo chmod +x /usr/local/bin/docker-compose
# 用scp 传输docker-compose 到另一台服务器
scp /usr/local/docker/docker-compose root@192.168.198.102:/usr/local/docker/
启动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