docker-compose离线部署Java项目实践
作者:灵感君
这篇文章主要介绍了docker-compose离线部署Java项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
前言
本文docker不做过多基础讲解,需要熟悉docker基本命令掌握基础知识,提供docke-composer一键部署的思路
简介
docker:是一个供开发和运维人员开发、测试、部署和运行应用程序的容器平台(docker是一个容器平台)docker-compose:是一个用于创建和管理多容器应用程序的工具
docker-compose的优势
- 统一管理和部署:可以将多个容器组织成一个整体,方便管理和部署。
- 快速配置和部署:可以通过Docker镜像快速构建和部署容器。
- 扩展能力:可以方便地扩展和缩放容器,以满足不同负载的需求。
- 版本控制:可以将Docker Compose配置文件纳入版本控制系统,方便管理程序的配置和版本。
docker-compose常用命令
Compose常用命令 docker-compose -h # 查看帮助 docker-compose up # 启动所有docker-compose服务 docker-compose up -d # 启动所有docker-compose服务并后台运行 docker-compose down # 停止并删除容器、网络、卷、镜像。 docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash docker-compose ps # 展示当前docker-compose编排过的运行的所有容器 docker-compose top # 展示当前docker-compose编排过的容器进程 docker-compose logs yml里面的服务id # 查看容器输出日志 docker-compose config # 检查配置 docker-compose config -q # 检查配置,有问题才有输出 docker-compose restart # 重启服务 docker-compose start # 启动服务 docker-compose stop # 停止服务
1.创建脚本目录结构

bin:用于存放编译后的可执行文件(例如可执行程序、库文件或脚本)conf:存放配置文件,宿主机映射配置文件,例nginx目录下存放nginx.confdata:数据文件docker:目录下存放Dockerfile和docker-compose.yml脚本文件,image目录下存放镜像tar包,ubantu目录下存放docker-compose安装包,我这里是ubantu系统,所以docker的版本下载的ubantu的,如果是其他系统就下载其他系统的版本init:初始化sql文件,也可以根据实际使用存放其他初始化文件log:日志目录target:jar和html文件存放目录
.保存镜像文件生成tar包
通过docker images命令查看网上拉取下来的镜像,然后通过docker save -o mysql.tar mysql保存下来,默认保存在当前路径下:


2.编写docker-compose文件
在docker目录下创建docker-compose.yml文件,配置容器参数和宿主机映射目录
version: "3"
services:
manage-server:
# 镜像名
image: manage:2023
# 容器名
container_name: manage
# 重启策略
# always:任何原因重启
# no:不重启
# on-failure:容器因错误代码停止时才重启
# unless-stopped:对 .yml 文件或任何项目目录文件进行任何更改后重启
restart: always
build:
context: ../docker
dockerfile: Dockerfile-manage
# 容器访问端口
expose:
- 9007
volumes:
- ../log/manage:/home/logs
- ../target:/manage/target
- ../bin/manage-start.sh:/manage/sh/manage-start.sh
- ../conf/manage/application.yml:/manage/conf/application.yml
- ../file/file:/manage/file
networks:
- server_net
nginx:
image: nginx:1.22.1
container_name: nginx
restart: always
# 指定容器中的主机名
hostname: nginx
# 针对宿主机设置环境变量
# 时区上海
environment:
TZ: Asia/Shanghai
logging:
driver: "json-file"
options:
max-size: "500m"
ports:
- 80:80
- 443:443
volumes:
- ../data/nginx:/data
- ../target/html:/html
- ../conf/nginx/nginx.conf:/etc/nginx/nginx.conf
- ../conf/nginx/conf.d:/etc/nginx/conf.d
- ../log/nginx:/var/log/nginx
networks:
- server_net
mysql:
image: mysql:latest
container_name: mysql8
restart: always
# 指定容器中的主机名
hostname: mysql8
# 针对宿主机设置环境变量
# docker安全验证
security_opt:
- seccomp:unconfined
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_USER: 'test'
MYSQL_PASS: '123456'
# 指定初始化sql文件的数据库
MYSQL_DATABASE: yw_manage
logging:
driver: "json-file"
options:
max-size: "500m"
ports:
- 9008:3306
- 33069:33060
#使用 command 可以覆盖容器启动后默认执行的命令
command: [
#设置数据库表的数据集
'--character-set-server=utf8mb4',
#设置数据库表的数据集
'--collation-server=utf8mb4_unicode_ci',
#设置mysql数据库的 时区问题!!!! 而不是设置容器的时区问题!!!!
'--default-time-zone=+8:00'
]
volumes:
- ../log/mysql:/var/log/mysql
- ../data/mysql:/var/lib/mysql
- ../conf/mysql:/etc/mysql/conf.d
- ../init/sql:/docker-entrypoint-initdb.
networks:
- server_net
entrypoint:
- docker-entrypoint.sh
redis:
# 镜像名
image: redis:6.2.11
# 容器名
container_name: redis
restart: always
# 指定容器中的主机名
hostname: redis
logging:
driver: "json-file"
options:
max-size: "500m"
ports:
- 9010:6379
command: redis-server /usr/local/etc/redis/redis.conf
volumes:
- ../data/redis:/data
- ../conf/redis/redis.conf:/usr/local/etc/redis/redis.conf
- ../log/redis:/usr/local/redis/log
networks:
- server_net
#配置External网络
networks:
server_net:
external: true3.文件说明
除了manage.tar属于自己项目镜像,其他.tar文件都可拉取官方镜像
附上nginx -> manage-nginx.conf文件, networks加入同一个网段的作用就是可通过容器名代替IP的配置方式,如果不配置ports,只配置expose那么就只能通过容器访问,这样就可以做到无法通过ip端口直接访问到容器,必须走nginx才行安全性更高
server {
listen 80;
server_name manage;
location /manage {
proxy_pass http://manage:9007/manage;
proxy_set_header Host $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;
}
}
4.编写一键安装脚本
配置install-ubantu.sh一键部署脚本
- 恢复镜像文件(tar文件)
- 对文件授权并且执行docker-compose命令构建容器
#!/bin/bash #切换到docker 目录 curPath=$(readlink -f "$(dirname "$0")") echo "当前路径:$curPath" #安装docker dpkg -i $curPath/docker/ubantu/containerd.io_1.4.6-1_amd64.deb dpkg -i $curPath/docker/ubantu/docker-ce-cli_20.10.6_3-0_ubuntu-xenial_amd64.deb dpkg -i $curPath/docker/ubantu/docker-ce_20.10.6_3-0_ubuntu-xenial_amd64.deb #启动docker镜像 sudo systemctl start docker #重命名 sudo cp $curPath/docker/ubantu/docker-compose-Linux-x86_64 $curPath/docker/ubantu/docker-compose #移动位置 sudo cp $curPath/docker/ubantu/docker-compose /usr/local/bin/ sudo chmod +x /usr/local/bin/docker-compose #添加可执行权限 #创建docker网络 sudo docker network create simplev_net #安装jdk镜像 sudo docker load -i $curPath/docker/image/jdk.tar echo "加载jdk镜像" # 安装mysql sudo docker load -i $curPath/docker/image/mysql.tar echo "加载mysql镜像" #安装nginx镜像 sudo docker load -i $curPath/docker/image/nginx.tar echo " 加载nginx 镜像" #安装redis镜像 sudo docker load -i $curPath/docker/image/redis.tar echo " 加载redis镜像" #授权 sudo chmod +x $curPath/bin/*.sh #启动mysql 和业务应用 sudo docker-compose -f $curPath/docker/docker-compose.yml up -d --build #把普通用户加到docker组 sudo gpasswd -a $USER docker #docker自启动 sudo systemctl enable docker
docker load命令加载镜像,docker-compose命令构建镜像和容器
5.启动脚本
sh install-ubantu.sh
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
