本次上线内容包含前端vue 和 后端 springboot 项目,通过docker打包环境,并且因为服务器内部无法联网,所以所有docker操作如打包,下载等,都使用下载离线包来完成,包括mysql 和 redis 配置 其中包含了对于docker 网络访问内容的补充,作为一次记录
docker部署上线
一、部署环境
mysql 和 redis
准备docker-compose 环境
因为本次部署环境中没有docker-compose文件,需要去阿里镜像下载可执行文件:
阿里镜像: 阿里镜像https://mirrors.aliyun.com
把docker-compose 放到 /usr/local/bin 下,
并修改名称为docker-compose, 给予可执行权限,
chmod 775 /usr/local/bin/docker-compose
成功后通过查看安装环境信息
docker-compose --version
编写docker-compose.yml 文件
version: '3.3'
services:
mysql:
container_name: mysql
restart: always
image: mysql:5.7
ports:
- "3306:3306"
volumes:
# 挂挂载配置文件
- ./mysql/conf:/etc/mysql/conf.d
# 挂载日志
- ./mysql/logs:/logs
# 挂载数据
- ./mysql/data:/var/lib/mysql
command:
--innodb-buffer-pool-size=80M
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
'--default-time-zone=+8:00'
--lower-case-table-names=1
--explicit_defaults_for_timestamp=true
--max_allowed_packet=128M
environment:
# root 密码
MYSQL_ROOT_PASSWORD: admin123
redis:
image: redis:5.0.10
container_name: redis
restart: always
ports:
- 6379:6379
volumes:
#指定挂载目录
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf:rw
- ./redis/data:/data:rw
command: /bin/bash -c "redis-server /usr/local/etc/redis/redis.conf "
配置redis.conf
protected-mode no
port 6379
timeout 0
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /data
appendonly yes
appendfsync everysec
requirepass admin123
执行 docker-compose up -d
将文件中配置的信息生成镜像,并生成环境容器;
进入mysql 内部并初始化数据库信息
1、复制文件到mysql容器内部,在容器里面最外层地址
docker cp ./init.sql mysql:/
2、进入mysql 容器内部
docker exec -it mysql /bin/bash
3、进入mysql数据库
mysql -u root -p admin123
4、创建mysql 数据库
create database test;
5、执行初始化sql文件
use test;
source /var/lib/mysql/init.sql
二、部署后端项目
编写dockerflie
back为后端项目名称,下同
# 设置本镜像需要使用的基础镜像
FROM kdvolder/jdk8
# 把jar包添加到镜像中
ADD back.jar /back.jar
# 镜像暴露的端口
EXPOSE 8050
RUN bash -c 'touch /back.jar'
# 容器启动命令
ENTRYPOINT ["java","-jar","/back.jar"]
导出镜像
docker build -t back-pro:1.0.0 .
docker save back-pro:1.0.0 > back-pro.tar
把tar文件放到服务器指定文件夹后,执行指令生成 back-pro:1.0.1的镜像
docker load -i back-pro.tar;
指定镜像名称,启动容器
docker run -d --restart=always --name back -p 8050:8080 back-pro:1.0.1
查看容器启动日志
docker logs -f --tail=1000 back
linux中模拟访问测试接口,get方法,无参数
curl http://127.0.0.1:8050/back/test
三、部署前端项目
编写dockerflie
front-web为前端项目名称,下同
FROM nginx
VOLUME /OSdata/docker/nginx
ENV LANG en_US.UTF-8
RUN echo "server { \
listen 8051; \
location ^~ /back { \
proxy_pass http://127.0.0.1:8050/back/; \
proxy_set_header Host jeecg-boot-system; \
proxy_set_header X-Real-IP \$remote_addr; \
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; \
} \
#解决Router(mode: 'history')模式下,刷新路由地址不能找到页面的问题 \
location / { \
root /var/www/html/; \
index index.html index.htm; \
if (!-e \$request_filename) { \
rewrite ^(.*)\$ /index.html?s=\$1 last; \
break; \
} \
} \
access_log /var/log/nginx/access.log ; \
} " > /etc/nginx/conf.d/default.conf \
&& mkdir -p /var/www \
&& mkdir -p /var/www/html
ADD dist/ /var/www/html/
EXPOSE 8051
导出镜像
docker build -t front-web-pro:1.0.0 .
docker save front-web-pro:1.0.0 > front-web-pro.tar
把tar文件放到服务器指定文件夹后,执行指令生成 front-web-pro:1.0.1的镜像
docker load -i front-web-pro.tar;
指定镜像名称,启动容器
docker run -d --restart=always --name front-web -p 8051:8051 front-web-pro
linux中模拟访问测试接口,get方法,无参数
curl http://127.0.0.1:8051
四、遇到问题
1、镜像包tar保存后,docker load 出来的镜像没有仓库名称和标签,使用docker tag打日志
docker tag 镜像id front-web:1.0.0
2、服务器中某些端口可能被防火墙屏蔽,使用命令查看可用端口
netstat -tuln
3、docker中的数据库访问方式,需要通过docker分配的ip来设置
ip addr
一开始通过127.0.0.1访问数据库失败,通过上面指令知道docker的ip为:172.17.0.2,修改项目中访问数据库的ip为:172.17.0.2:3306/test,此处问题参考以下文章: 宿主机项目连接docker容器内的mysql
五、后续优化点
1、通过修改后端 dockerfile 的jar 文件配置方式,挂载一个地址可以实现更新jar项目,无需每次频繁打包镜像
2、把docker 的ip加入nginx 管理,实现统一的访问路径