目录
1、多容器运行环境配置(docker-compose.yml)
2、创建项目Dockerfile文件(启动遇到找不到类问题,原因是模块包版本错误)
1、多容器运行环境配置(docker-compose.yml)
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- test-net
redis:
image: redis
container_name: redis
ports:
- "6379:6379"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
volumes:
- "./myredis/redis:/usr/local/etc/redis"
- "./myredis/redis/data:/usr/local/etc/redis/data"
- "./myredis/data:/data"
networks:
- test-net
acme-sh:
image: neilpang/acme.sh
container_name: acme.sh
command: daemon
environment:
- Ali_Key=LTAI5xxxxq5fMExxxxpc2
- Ali_Secret=Q3xxxxx7Bd1XzxxxxXPpitQa
volumes:
- "./nginx/certs:/acme.sh"
- "/var/run/docker.sock:/var/run/docker.sock"
network_mode: host
nginx:
image: nginx
container_name: nginx
ports:
- "80:80"
- "8090:8090"
- "8091:8091"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
- "./nginx/certs:/etc/nginx/certs"
- "./nginx/logs:/var/log/nginx"
networks:
- test-net
depends_on:
- acme-sh
lifecolor:
build:
context: .
dockerfile: Dockerfile
container_name: lifecolor
ports:
- "8080:8080"
networks:
- test-net
depends_on:
- mysql
- redis
networks:
test-net:
name: test-net
2、创建项目Dockerfile文件(启动遇到找不到类问题,原因是模块包版本错误)
FROM openjdk:17
WORKDIR /
COPY ./lifecolor-web.jar lifecolor-web.jar
CMD ["java", "-jar", "lifecolor-web.jar"]
3、创建挂载目录
mkdir -p /data/nginx
cd /data/nginx
touch nginx.conf # 该文件必须先创建
4、配置nginx.conf
- 未安装acme适用: 无ssl证书模版
worker_processes 1;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/json;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
listen [::]:80;
server_name www.ahuaya.com;
# 前端静态资源
location / {
root /usr/share/nginx/html/lifecolor;
try_files $uri $uri/ /index.html;# 不加刷新会404
index index.html index.htm;
}
# 转发后端
location ^~/prod-api/ {
proxy_pass http://lifecolor:8080/;
}
}
}
- 安装acme适用: 有ssl证书模版
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
listen [::]:80;
server_name www.xxx.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443 ssl;
server_name xxx.com;
# 注意证书文件名字和位置,是从/etc/nginx/下开始算起的
ssl_certificate /etc/nginx/certs/${server_name}/fullchain.cer;
ssl_certificate_key /etc/nginx/certs/${server_name}/${server_name}.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
root /usr/share/nginx/html/lifecolor;
try_files $uri $uri/ /index.html;# 不加刷新会404
index index.html index.htm;
}
location ^~/prod-api/ {
proxy_pass http://lifecolor:8080/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
5、通过docker-compose.yml脚本启动
# 将docker-compose.yml文件上传到data目录后打开命令窗口
cd /data
docker compose -f ./docker-compose.yml up -d # 后台运行多个容器
6、acme操作
## 注册证书服务商账号
docker exec acme.sh --register-account -m flxxxx5@163.com
## 申请www.ahuaya.com证书
docker exec acme.sh acme.sh --issue --dns dns_ali -d xxxx.com -d *.xxxx.com --force --dnssleep
# 重启nginx
docker compose -f ./env-compose.yml restart nginx
# 执行命令
crontab -e
# 每天凌晨12点执行任务续签
0 0 * * * docker exec acme.sh --cron
7、相关操作命令
docker ps # 列出运行中容器
docker ps -a # 查看所有容器
docker inspect nginx # 查看容器详细信息
docker exec -it nginx bash # 进入容器
exit # 退出容器
docker rm -fv mysql redis # 删除容器及创建的匿名数据卷
docker images # 列出镜像
docker rmi -f mysql redis nginx # 删除镜像
docker compose down # 停止并删除多个容器
docker compose exec mysql bash # 进入容器
8、验证结果
# 访问地址成功则表示启动成功
http://www.xxxx.com
http://8.xx.x.24:80
9、注意事项
-
挂载的nginx.conf必须先创建文件,否则docker compose启动报错
-
服务器要开放80端口,否则访问报错
-
域名要配置解析到服务器,否则访问报错
-
acme的environment配置不能加引号,加了生成ssl证书报错
-
centOs内核版本过低可能会导致nginx容器映射问题,具体表现为在容器内正常,容器外不能访问
# 容器内获取nginx页面正常
docker exec -it nginx bash
curl http://localhost:80
exit;
# 容器外获取报错
curl http://localhost:80
# 解决方案:升级内核
https://www.cnblogs.com/xzkzzz/p/9627658.html
shutdown -r -t 3 # 3秒后重启