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.conf
data:数据文件
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: true
3.文件说明
除了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