docker+docker-compose+运维账户+部署账户-版本
这次部署测试,自己找的是一台腾讯云服务器,几十块一年,信息如下:

.1.部署准备-
删除所有容器-

删除所有docker镜像-

卸载原有docker版本-
sudo systemctl stop docker
sudo systemctl stop docker.socket
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

.2.安装依赖组件,配置 docker 官方 yum 源
# 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置docker官方yum源(稳定版)
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
查看docker版本和docker compose 版本

.4.创建个人登陆账号-
登陆root账户,创建运维用户和部署账户。
# 创建部署账户(用于运行应用)
sudo useradd -u 10086 -m -s /bin/bash deploy
设部署账户空密码:root 下执行 passwd -d deploy
先备份-
# 创建运维账户(用于系统管理)
sudo useradd -u 10087 -m -s /bin/bash dengyilang
注意:可以指定UID和GID,避免UID太小,在容器内创建新用户,运行时出现UID不匹配的情况。
sudo passwd dengyilang
密码:xxxxxx

.5.添加必要权限
# 格式:用户名 主机=(可切换的用户) 可执行的命令列表
# 为部署账户添加sudo权限(仅限必要操作)
echo "deploy ALL=(ALL) NOPASSWD: /usr/bin/docker compose *, /usr/bin/systemctl restart docker" | sudo tee /etc/sudoers.d/deploy
echo "dengyilang ALL=(ALL) NOPASSWD: /usr/bin/systemctl *, /usr/bin/docker *, /usr/bin/yum *, /usr/bin/df, /usr/bin/ps" | sudo tee /etc/sudoers.d/dengyilang
查看编辑结果-
cat /etc/sudoers.d/deploy
cat /etc/sudoers.d/dengyilang

设置dengyilang用户可以切换到deploy用户。
dengyilang ALL=(deploy)ALL

.5.将运维账号建议添加到 docker 组
# 将运维账户添加到部署组(便于访问日志)
sudo usermod -aG deploy dengyilang
验证组是否添加成功
groups deploy
groups dengyilang

# 添加 deploy 用户到 docker 组
sudo usermod -aG docker deploy
设计原因:
部署账户:专门用于运行应用,UID/GID=10086(避免与系统用户冲突)
运维账户:用于系统管理,UID/GID=10087(与部署账户不同,避免权限过度集中)
sudo权限:严格限制,仅允许执行必要的命令
组权限:将运维账户加入部署组,便于查看日志但不拥有应用运行权限
.6.使用root用户创建项目目录
# 创建应用基础目录
sudo mkdir -p /opt/u01/exam/{nginx,java,mysql,redis}
sudo chown -R deploy:deploy /opt/u01/exam
sudo chmod -R 755 /opt/u01/exam
# 为Nginx设置专用目录(使用合理命名)
先创建nginx这个组
sudo groupadd -g 101 nginx
sudo mkdir -p /opt/u01/exam/nginx/{html,logs,sslkey,conf.d}
sudo chown -R deploy:nginx /opt/u01/exam/nginx
sudo chmod -R 775 /opt/u01/exam/nginx/logs

# 为Java应用设置专用目录
sudo mkdir -p /opt/u01/exam/java/{logs,data,conf}
sudo chown -R deploy:deploy /opt/u01/exam/java
sudo chmod -R 755 /opt/u01/exam/java/logs
# 为MySQL设置专用目录
# 先创建mysql这个组
sudo groupadd -g 9998 mysql
sudo mkdir -p /opt/u01/exam/mysql/{data,logs,conf,init-scripts}
sudo chown -R deploy:mysql /opt/u01/exam/mysql
sudo chmod -R 755 /opt/u01/exam/mysql/logs

# 为Redis设置专用目录
sudo groupadd -g 9999 redis
sudo mkdir -p /opt/u01/exam/redis/{data,logs}
sudo chown -R deploy:redis /opt/u01/exam/redis
sudo chmod -R 755 /opt/u01/exam/redis/logs

.7.使用运维账户远程登陆,上传文件-
遇到问题一:使用dengyilang登陆后,不能上传文件-

解决办法,需要先给deploy账户设置空密码,
root 下执行 passwd -d deploy
并且设置需要使用dengyilang用户切换到deploy账户即可。
dengyilang ALL=(deploy)ALL

说明:先使用运维账户将所有部署文件上传到/tmp目录中,
然后在切换到depoly用户,将部署文件复制到指定目录。
启动容器报错-
docker compose up -d --build

将部署账户添加到docker组即可。
# 添加 deploy 用户到 docker 组
sudo usermod -aG docker deploy
# 重新登录或重启 shell 生效
su - deploy

一次启动成功-

访问成功-

其他问题,访问网站时,菜单出现乱码。
排查后发现返回的菜单数据是乱码,初步判断是数据库执行时,插入数据时出现乱码。

由于执行脚本是在docker容器启动mysql的时候执行的,自己猜测大概率是在插入数据的时候出现异常。
去查询数据库时,发现保存的中文数据出现问题-

解决办法-在数据库执行脚本前面添加如下代码即可-

再次访问,问题解决-

感谢千问AI 全程的辅助与支持!IT相关的技术问题,还是千问更专业!点三个赞
浙公网安备 33010602011771号