docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > 部署安装docker及项目搭建所需要的环境

部署安装docker及项目搭建所需要的基础环境实践(mysql、redis、nginx、nacos)

作者:方渐鸿

本文介绍通过docker-run.sh和docker-compose.yml实现一键部署Docker及Web服务,解决环境不一致问题,包含MySQL、Nacos、Nginx等配置,并提供GitHub代码链接便于直接使用

前言

该文章主要用于实现快速部署docker以及相关web服务所需要的基础环境容器。

编写该文章主要是因为公司的项目前面都是使用jar包进行部署,目前进行升级改造为docker部署。因为jar部署的项目,很容易出现部署人员离职后,如果部署文件写的不够详细,会造成找 项目部署地址都非常麻烦,并且环境不一致等问题,所以改造为docker部署。

但docker部署每一个服务器都要去重新敲一遍命令部署docker,然后又都还需要去一个个部署项目所需要的相关数据库以及其他的一些中间件就会很累,所以就想到了通过编写.sh文件以及docker compose,实现一键部署。

!!!觉得内容太多了麻烦,可以直接移动到最后面拉取我上传git上的代码下面直接部署

一、介绍

该项目主要包括了docekr-run.sh、docker-compose.yml两个部署文件,以及config文件夹下的mysql、conf、nacos、nginx的用于容器映射的配置文件。

二、修改docker配置

1、修改docker-run.sh脚本

CentOS部署文件

创建一个docker-run.sh文件。然后把下面的脚本复制进去,

#!/bin/bash

# 如果命令以非零状态退出,则立即退出脚本。
set -e
# 在替换时,将未设置的变量视为错误。
set -u
# 管道命令的返回值将是最后一个以非零状态退出的命令的退出状态,
# 或者如果所有命令都成功退出则返回零。
set -o pipefail

# ========== Docker 安装配置 ==========

# 1. 更新软件包索引并安装必要的依赖
echo "--> 正在更新软件包索引并安装必要的依赖..."
sudo dnf makecache
sudo dnf install -y dnf-utils openssl # 确保 openssl 已安装

# 2. 卸载旧版本的 Docker(如果存在)
echo "--> 正在尝试移除可能存在的旧 Docker 软件包..."
sudo dnf remove -y docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine \
                  docker-ce \
                  docker-ce-cli \
                  containerd.io \
                  runc || true

# 3. 设置 Docker 软件仓库
echo "--> 正在添加官方 Docker 软件仓库..."
sudo yum config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo || echo "Sed command skipped or failed, continuing..."

# 4. 安装 Docker 引擎
echo "--> 正在安装 Docker 引擎..."
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 5. 确保 Docker 服务启动并设置开机自启(稍后会重启)
echo "--> 正在启动并设置开机自启 Docker 服务 (初始启动)..."
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker --no-pager

# 6. 确保 /home/docker 和数据目录存在
DOCKER_DATA="/home/docker/docker-data"

echo "--> 确保 Docker 数据目录 '$DOCKER_DATA' 存在..."
sudo mkdir -p $DOCKER_DATA

# ========== 询问用户是否启用 TLS ==========
ENABLE_TLS=""
while [[ "$ENABLE_TLS" != "yes" && "$ENABLE_TLS" != "no" ]]; do
    read -p "是否启用 TLS 以允许安全的远程 Docker 连接? (yes/no): " user_input
    ENABLE_TLS=$(echo "$user_input" | tr '[:upper:]' '[:lower:]') # 转为小写
    if [[ "$ENABLE_TLS" != "yes" && "$ENABLE_TLS" != "no" && "$ENABLE_TLS" != "y" && "$ENABLE_TLS" != "n" ]]; then
        echo "无效输入,请输入 'yes' 或 'no'."
        ENABLE_TLS="" # 重置以便循环继续
    elif [[ "$ENABLE_TLS" == "y" ]]; then
         ENABLE_TLS="yes"
    elif [[ "$ENABLE_TLS" == "n" ]]; then
         ENABLE_TLS="no"
    fi
done

# ========== 根据用户选择执行操作 ==========
if [[ "$ENABLE_TLS" == "yes" ]]; then
    # --- 执行 TLS 证书生成 ---
    echo "===== 用户选择启用 TLS,开始生成 Docker TLS 证书 ====="

    # --- TLS 相关配置信息 ---
    SERVER_IP="10.211.55.6"   # !!! 重要: 使用Docker客户端连接到服务器的实际IP地址
    PASSWORD="123456"        # !!! 重要: 请修改为强密码  !!
    COUNTRY="CN"
    STATE="xx省"
    CITY="xx市"
    ORGANIZATION="xxxx有限公司"
    ORGANIZATIONAL_UNIT="Dev"
    EMAIL="123456@qq.com"
    CERT_DIR="/home/docker/tls" # 定义证书存放目录
    # --- 配置结束 ---
    echo "--> 确保 '/home/docker/tls' 目录存在..."
    sudo mkdir -p $CERT_DIR

    echo "--> 切换到证书目录: $CERT_DIR"
    cd "$CERT_DIR"

    echo "--> 生成 CA 私钥 (ca-key.pem)..."
    openssl genrsa -aes256 -passout pass:$PASSWORD -out ca-key.pem 4096

    echo "--> 生成 CA 证书 (ca.pem)..."
    openssl req -new -x509 -passin "pass:$PASSWORD" -days 3650 -key ca-key.pem -sha256 -out ca.pem \
      -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$SERVER_IP/emailAddress=$EMAIL"

    echo "--> 生成服务器私钥 (server-key.pem)..."
    openssl genrsa -out server-key.pem 4096

    echo "--> 生成服务器证书签名请求 (server.csr)..."
    openssl req -subj "/CN=$SERVER_IP" -new -key server-key.pem -out server.csr

    echo "--> 使用 CA 签发服务器证书 (server-cert.pem)..."
    echo "subjectAltName = IP:$SERVER_IP" > server-ext.cnf
    openssl x509 -req -days 3650 -in server.csr -CA ca.pem -CAkey ca-key.pem \
      -passin "pass:$PASSWORD" -CAcreateserial -out server-cert.pem -extfile server-ext.cnf

    echo "--> 生成客户端私钥 (key.pem)..."
    openssl genrsa -out key.pem 4096

    echo "--> 生成客户端证书签名请求 (client.csr)..."
    openssl req -subj '/CN=client' -new -key key.pem -out client.csr

    echo "--> 创建客户端证书扩展文件 (extfile.cnf)..."
    echo "extendedKeyUsage=clientAuth" > extfile.cnf

    echo "--> 使用 CA 签发客户端证书 (cert.pem)..."
    openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca-key.pem \
      -passin "pass:$PASSWORD" -CAcreateserial -out cert.pem -extfile extfile.cnf

    echo "--> 调整证书和密钥文件权限..."
    # 使用 sudo 确保权限设置成功,即使脚本以非 root 用户执行(但需要 sudo 权限)
    sudo chmod 0774 ca-key.pem key.pem server-key.pem
    sudo chmod 0774 ca.pem server-cert.pem cert.pem

    echo "--> 清理临时文件..."
    rm -f client.csr server.csr server-ext.cnf extfile.cnf ca.srl

    echo "===== TLS 证书生成完成 ====="


else

    # --- 用户选择不启用 TLS ---
    echo "===== 用户选择不启用 TLS ====="
    echo "--> 仅配置镜像加速和数据目录..."

fi

    # --- 配置 daemon.json  ---
    echo "--> 正在写入 '/etc/docker/daemon.json' 配置文件..."
    sudo bash -c 'cat <<EOF > /etc/docker/daemon.json
{
  "registry-mirrors": ["https://zhengfp.cn"],
  "data-root": "$DOCKER_DATA"
}

EOF'


# ========== 应用配置并完成后续步骤 ==========
echo "--> '/etc/docker/daemon.json' 配置写入完成。内容如下:"
sudo cat /etc/docker/daemon.json

# 7. 重启 Docker 服务以应用配置
echo "--> 正在重启 Docker 服务以应用 daemon.json 配置..."
sudo systemctl restart docker

# 8. 验证 Docker 服务状态
echo "--> 正在检查 Docker 服务状态,确认配置已生效..."
sudo systemctl status docker --no-pager

# 9. 将当前用户添加到 docker 组(可选)
echo "--> 正在将当前用户 ($USER) 添加到 'docker' 用户组..."
sudo usermod -aG docker $USER
echo "# 重要提示:                                                         #"
echo "# 用户组更改需要 退出登录 并 重新登录 才能生效。                    #"
echo "# 或者,运行 'newgrp docker' 启动具有新组成员身份的新 Shell。         #"


# 10. 最终验证说明 (根据 TLS 选择显示不同信息)
echo "===== Docker 安装和配置脚本执行完毕 ====="
echo "镜像加速器: https://zhengfp.cn"
echo "数据目录: $DOCKER_DATA"

if [[ "$ENABLE_TLS" == "yes" ]]; then
    echo "######################################################################"
    echo "                                                          "
    echo "# 重要提示:需要到/usr/lib/systemd/system/docker.service目录去配置Docker 的TLS用于远程服务器连接,执行下面命令"
    echo "# >>> 打开docker.service文件                                   "
    echo "   vim /usr/lib/systemd/system/docker.service             "
    echo ""
    echo "# >>> 将下面内容加入到 [Service] 节点的ExecStart后面      "
    echo " -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --tlsverify --tlscacert=$CERT_DIR/ca.pem --tlscert=$CERT_DIR/server-cert.pem --tlskey=$CERT_DIR/server-key.pem"
    echo ""
    echo " 更新配置:systemctl daemon-reload"
    echo " 重启docker:systemctl restart docker"
    echo " 查看是否启动成功:systemctl status docker"
    echo ""
    echo "######################################################################"
    echo ""
    echo "要从远程客户端连接,你需要以下文件 (位于 $CERT_DIR 目录):"
    echo "  - CA 证书: ca.pem"
    echo "  - 客户端证书: cert.pem"
    echo "  - 客户端私钥: key.pem"
    echo ""
    echo "远程连接命令示例 (需将证书文件复制到客户端):"
    echo "  docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$SERVER_IP:2376 version"
    echo ""
    echo "!!!重要防火墙提示!!!"
    echo "请确保防火墙允许 TCP 端口 2376 的入站连接或。"
    echo "例如,使用 firewalld:"
    echo "  sudo firewall-cmd --permanent --add-port=2376/tcp"
    echo "  sudo firewall-cmd --reload"
else
    echo "Docker 未启用 TLS 远程连接,仅监听在本地 Unix 套接字 unix:///var/run/docker.sock。"
    echo "  docker ps"
fi
echo ""
echo "使用 'docker info | grep -E 'TLS|Hosts|Docker Root Dir|Registry Mirrors|Server Version\"' 查看详细配置。"

ubuntu执行脚本

修改的内容和上面一致

#!/bin/bash

# 如果命令以非零状态退出,则立即退出脚本。
set -e
# 在替换时,将未设置的变量视为错误。
set -u
# 管道命令的返回值将是最后一个以非零状态退出的命令的退出状态,
# 或者如果所有命令都成功退出则返回零。
set -o pipefail

# ========== Docker 安装配置 (Ubuntu 版本) ==========

# 1. 更新软件包索引并安装必要的依赖
echo "--> [Ubuntu] 正在更新软件包索引并安装必要的依赖..."
sudo apt-get update
sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release \
    openssl # 确保 openssl 已安装 (通常已存在,安全起见添加)

# 2. 卸载 Docker(如果存在)
echo "--> [Ubuntu] 正在尝试移除可能存在的旧 Docker 软件包..."
sudo apt-get remove -y docker docker-engine docker.io containerd runc || true # 使用 Ubuntu 常见的旧包名
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y

# 3. 设置 Docker 软件仓库 (使用官方推荐方法 + Aliyun 镜像)
echo "--> [Ubuntu] 正在添加 Docker 官方 GPG 密钥 (使用 Aliyun 镜像)..."
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo "--> [Ubuntu] 正在设置 Docker 软件仓库 (使用 Aliyun 镜像)..."
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 4. 安装 Docker 引擎
echo "--> [Ubuntu] 正在更新软件包索引并安装 Docker 引擎..."
sudo apt-get update # 再次更新以识别新添加的仓库
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin 

# 5. 确保 Docker 服务启动并设置开机自启(稍后会重启)
echo "--> 正在启动并设置开机自启 Docker 服务 (初始启动)..."
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker --no-pager

# 6. 确保 /home/docker 和数据目录存在
DOCKER_DATA="/home/docker/docker-data"

echo "--> 确保 Docker 数据目录 '$DOCKER_DATA' 存在..."
sudo mkdir -p $DOCKER_DATA

# ========== 询问用户是否启用 TLS ==========
ENABLE_TLS=""
while [[ "$ENABLE_TLS" != "yes" && "$ENABLE_TLS" != "no" ]]; do
    read -p "是否启用 TLS 以允许安全的远程 Docker 连接? (yes/no): " user_input
    ENABLE_TLS=$(echo "$user_input" | tr '[:upper:]' '[:lower:]') # 转为小写
    if [[ "$ENABLE_TLS" != "yes" && "$ENABLE_TLS" != "no" && "$ENABLE_TLS" != "y" && "$ENABLE_TLS" != "n" ]]; then
        echo "无效输入,请输入 'yes' 或 'no'."
        ENABLE_TLS="" # 重置以便循环继续
    elif [[ "$ENABLE_TLS" == "y" ]]; then
         ENABLE_TLS="yes"
    elif [[ "$ENABLE_TLS" == "n" ]]; then
         ENABLE_TLS="no"
    fi
done

# ========== 根据用户选择执行操作 ==========
if [[ "$ENABLE_TLS" == "yes" ]]; then
    # --- 执行 TLS 证书生成 (这部分与操作系统无关) ---
    echo "===== 用户选择启用 TLS,开始生成 Docker TLS 证书 ====="

    # --- TLS 相关配置信息 ---
    SERVER_IP="10.211.55.6"   # !!! 重要: 使用Docker客户端连接到服务器的实际IP地址
    PASSWORD="123456"        # !!! 重要: 请修改为强密码  !!
    COUNTRY="CN"
    STATE="xx省"
    CITY="xx市"
    ORGANIZATION="xxxx有限公司"
    ORGANIZATIONAL_UNIT="Dev"
    EMAIL="123456@qq.com"
    CERT_DIR="/home/docker/tls" # 定义证书存放目录
    # --- 配置结束 ---
    echo "--> 确保 '$CERT_DIR' 目录存在..."
    sudo mkdir -p $CERT_DIR

    echo "--> 切换到证书目录: $CERT_DIR"
    cd "$CERT_DIR"

    echo "--> 生成 CA 私钥 (ca-key.pem)..."
    openssl genrsa -aes256 -passout pass:$PASSWORD -out ca-key.pem 4096

    echo "--> 生成 CA 证书 (ca.pem)..."
    openssl req -new -x509 -passin "pass:$PASSWORD" -days 3650 -key ca-key.pem -sha256 -out ca.pem \
      -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$SERVER_IP/emailAddress=$EMAIL"

    echo "--> 生成服务器私钥 (server-key.pem)..."
    openssl genrsa -out server-key.pem 4096

    echo "--> 生成服务器证书签名请求 (server.csr)..."
    openssl req -subj "/CN=$SERVER_IP" -new -key server-key.pem -out server.csr

    echo "--> 使用 CA 签发服务器证书 (server-cert.pem)..."
    echo "subjectAltName = IP:$SERVER_IP" > server-ext.cnf
    openssl x509 -req -days 3650 -in server.csr -CA ca.pem -CAkey ca-key.pem \
      -passin "pass:$PASSWORD" -CAcreateserial -out server-cert.pem -extfile server-ext.cnf

    echo "--> 生成客户端私钥 (key.pem)..."
    openssl genrsa -out key.pem 4096

    echo "--> 生成客户端证书签名请求 (client.csr)..."
    openssl req -subj '/CN=client' -new -key key.pem -out client.csr

    echo "--> 创建客户端证书扩展文件 (extfile.cnf)..."
    echo "extendedKeyUsage=clientAuth" > extfile.cnf

    echo "--> 使用 CA 签发客户端证书 (cert.pem)..."
    openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca-key.pem \
      -passin "pass:$PASSWORD" -CAcreateserial -out cert.pem -extfile extfile.cnf

    echo "--> 调整证书和密钥文件权限..."
    # 使用 sudo 确保权限设置成功
    sudo chmod 0774 ca-key.pem key.pem server-key.pem
    sudo chmod 0774 ca.pem server-cert.pem cert.pem

    echo "--> 清理临时文件..."
    rm -f client.csr server.csr server-ext.cnf extfile.cnf ca.srl

    echo "===== TLS 证书生成完成 ====="

else
    # --- 用户选择不启用 TLS ---
    echo "===== 用户选择不启用 TLS ====="
    echo "--> 仅配置镜像加速和数据目录..."
fi

# --- 配置 daemon.json (这部分与操作系统无关) ---
echo "--> 正在写入 '/etc/docker/daemon.json' 配置文件..."
# 使用 sudo bash -c '...' 来确保整个重定向操作具有 root 权限
sudo bash -c 'cat <<EOF > /etc/docker/daemon.json
{
  "registry-mirrors": ["https://zhengfp.cn"],
  "data-root": "$DOCKER_DATA"'$( # 在这里插入条件判断
    if [[ "$ENABLE_TLS" == "yes" ]]; then
        # 如果启用了 TLS,则不添加 hosts 行,将在 systemd service 文件中配置
        echo "" # 输出空行,保持 JSON 结构,但不添加 hosts
    else
        # 如果未启用 TLS,可以保留默认的 unix socket 或添加 tcp (如果需要非 TLS 远程,但不推荐)
        # 这里我们保持默认,只监听 unix socket,不写 hosts 行
        echo "" # 输出空行
        # 或者,如果想明确只监听本地 TCP (不安全,不推荐):
        # echo ',\n  "hosts": ["tcp://127.0.0.1:2375", "unix:///var/run/docker.sock"]'
    fi
  )'
}
EOF'

# ========== 应用配置并完成后续步骤 ==========
echo "--> '/etc/docker/daemon.json' 配置写入完成。内容如下:"
# 确保文件存在再 cat
if [[ -f /etc/docker/daemon.json ]]; then
    sudo cat /etc/docker/daemon.json
else
    echo "--> Warning: /etc/docker/daemon.json 未生成或为空。"
fi

# 7. 重启 Docker 服务以应用配置
echo "--> 正在重启 Docker 服务以应用 daemon.json 配置..."
sudo systemctl restart docker

# 8. 验证 Docker 服务状态
echo "--> 正在检查 Docker 服务状态,确认配置已生效..."
sudo systemctl status docker --no-pager

# 9. 将当前用户添加到 docker 组(与操作系统无关)
echo "--> 正在将当前用户 ($USER) 添加到 'docker' 用户组..."
# 检查 docker 组是否存在,如果不存在则创建 (虽然 Docker 安装时通常会创建)
if ! getent group docker > /dev/null; then
  echo "--> 'docker' 组不存在,正在创建..."
  sudo groupadd docker
fi
sudo usermod -aG docker $USER
echo "# 重要提示:                                                         #"
echo "# 用户组更改需要 退出登录 并 重新登录 才能生效。                    #"
echo "# 或者,运行 'newgrp docker' 启动具有新组成员身份的新 Shell。         #"

# 10. 最终验证说明 (根据 TLS 选择显示不同信息)
echo "===== Docker 安装和配置脚本执行完毕 ====="
echo "镜像加速器: https://zhengfp.cn (或 daemon.json 中配置的其他镜像)"
echo "数据目录: $DOCKER_DATA"

if [[ "$ENABLE_TLS" == "yes" ]]; then
    echo "######################################################################"
    echo "                                                          "
    echo "# 重要提示:需要到/usr/lib/systemd/system/docker.service目录去配置Docker 的TLS用于远程服务器连接,执行下面命令"
    echo "# >>> 打开docker.service文件                                   "
    echo "   vim /usr/lib/systemd/system/docker.service             "
    echo ""
    echo "# >>> 将下面内容加入到 [Service] 节点的ExecStart后面      "
    echo " -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --tlsverify --tlscacert=$CERT_DIR/ca.pem --tlscert=$CERT_DIR/server-cert.pem --tlskey=$CERT_DIR/server-key.pem"
    echo ""
    echo " 更新配置:systemctl daemon-reload"
    echo " 重启docker:systemctl restart docker"
    echo " 查看是否启动成功:systemctl status docker"
    echo ""
    echo "######################################################################"
    echo ""
    echo "要从远程客户端连接,你需要以下文件 (位于 $CERT_DIR 目录):"
    echo "  - CA 证书: ca.pem"
    echo "  - 客户端证书: cert.pem"
    echo "  - 客户端私钥: key.pem"
    echo ""
    echo "远程连接命令示例 (需将证书文件复制到客户端):"
    echo "docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$SERVER_IP:2376 version"
    echo ""
    echo "!!!重要防火墙提示 (Ubuntu 使用 ufw)!!!"
    echo "请确保防火墙允许 TCP 端口 2376 的入站连接。"
    echo "例如,使用 ufw:"
    echo "  sudo ufw allow 2376/tcp"
    echo "  sudo ufw reload  # 或者 sudo ufw enable 如果防火墙未启用"
else
    echo "Docker 未启用 TLS 远程连接,仅监听在本地 Unix 套接字 unix:///var/run/docker.sock。"
    echo "可以通过本地命令访问,例如:"
    echo "  docker ps"
fi
echo ""
echo "使用 'docker info | grep -E 'TLS|Hosts|Docker Root Dir|Registry Mirrors|Server Version\"' 查看详细配置。"

2、修改docker-compose.yml文件

添加docker-compose.yml 

创建一个docker-compose.yml文件把下面内容复制进去

version: '3.8'

services:
# redis服务
  redis:
    image: redis:6.2.7
    container_name: redis-server
    ports:
      - "26379:6379" # 将主机的 26379 端口映射到容器的 6379 端口 (Redis 默认端口)
    volumes:
      - ./config/redis/conf/:/usr/local/etc/redis/
      - ./config/redis/data/:/data/
    #添加配置,指定配置文件位置,为映射到容器的配置文件位置
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    deploy:
      resources:
        limits:
          memory: 512m

# mysql服务
  mysql:
    image: mysql:8.0.33 # 或选择你需要的 MySQL 版本,例如 mysql:latest
    container_name: mysql-db
    ports:
      - "3406:3306"   # 将主机的 3306 端口映射到容器的 3306 端口 (MySQL 默认端口)
    environment:
      MYSQL_ROOT_PASSWORD: 123456 # 设置 MySQL root 用户的密码,请替换为你的密码
      # MYSQL_DATABASE: nacos_config # 初始化数据库(后续的初始化sql会在这个库执行)
      # MYSQL_USER: nacos # 初始化用户(不能是root 会报错, 后续需要给新用户赋予权限)
      # MYSQL_PASSWORD: nacos # 用户密码
      TZ: Asia/Shanghai 
    volumes:
      - ./config/mysql/data/:/var/lib/mysql/ # 数据持久化,将 MySQL 数据目录挂载到 Docker volume
      - ./config/mysql/initdb/:/docker-entrypoint-initdb.d/     #初始化磁盘
      - ./config/mysql/conf/:/etc/mysql/conf.d/ 
    deploy:
      resources:
        limits:
          memory: 1g

# nacos服务
  nacos:
    image: nacos/nacos-server:2.0.2 #  或 nacos/nacos-opensource:latest (根据你的需求选择)
    container_name: nacos-server
    ports:
      - "8948:8848"   # Nacos 服务器端口
      - "9948:9848"   # Nacos 集群通信端口 (gRPC 默认端口)
      - "9949:9849"   # Nacos 集群通信端口 (gRPC 客户端请求端口)
    environment:
      MODE: standalone # 设置 Nacos 运行模式为单机模式 (standalone)
      # 如果需要持久化,可以添加以下配置并挂载数据卷 (例如使用 MySQL 持久化)
      NACOS_DATASOURCE_PLATFORM: mysql
      DB_NUM: 1
      DB_HOST_0: mysql # 这里使用 docker-compose 内的 mysql 服务名
      DB_PORT_0: 3406
      DB_NAME_0: nacos_config # 你需要先在 MySQL 中创建 nacos_db 数据库
      DB_USER_0: root
      DB_PASSWORD_0: 123456
    depends_on:
      - mysql # 如果 Nacos 使用 MySQL 持久化,则依赖 mysql
    volumes:
      #   - ./config/nacos/conf/:/home/nacos/conf/ # (可选) 数据持久化,
      - ./config/nacos/logs/:/home/nacos/logs/
    deploy:
      resources:
        limits:
          memory: 1g

  nginx:
    image: nginx:1.20.2
    restart: always
    container_name: nginx-webserver
    ports:
      - "90:80"     # 将主机的 80 端口映射到容器的 80 端口 (HTTP 默认端口)
      - "1443:443"   # 将主机的 443 端口映射到容器的 443 端口 (HTTPS 默认端口)
      - "8090:8090"
    volumes:
      - ./config/nginx/conf/nginx.conf:/etc/nginx/nginx.conf # (可选) 将本地 nginx 配置挂载到容器
      - ./config/nginx/html/:/usr/share/nginx/html/ # (可选) 将本地 html 目录挂载到容器
      - ./config/nginx/log/:/var/log/nginx/      # (可选) 将 nginx 日志挂载到本地
    privileged: true
    depends_on:
      - redis
      - mysql
      - nacos
    deploy:
      resources:
        limits:
          memory: 256m

注意点:

mysql初始化数据库

把需要初始化的数据库文件放入到initdb文件夹下,尽量不要放入大批量的INSERT语句的sql文件,可以等创建好后在执行

nginx.conf

nginx.conf配置文件做监听端口需要使用容器的端口,项目地址也是,项目文件地址因为做了文件映射,所以只需要写到html下面就行

3、添加config配置文件

我的配置文件结构

3.1、mysql

添加my-custom.cnf

conf目录下添加一个my-custom.cnf文件

内容主要添加了一个大小写不敏感和字符集

[mysqld]
# 设置表名和数据库名不区分大小写
# 1: 表名存储在磁盘上是小写的,名称比较时不区分大小写。
lower_case_table_names=1

# (可选) 推荐同时显式设置默认字符集和排序规则
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

添加mysql初始化sql文件

initdb目录下添加一个mysql-schema.sql文件,需要初始化的文件,该目录的sql文件在创建数据库时会执行一次,后面就不会在执行了。

格式如下,先设置字符集,在创建数据库,如果需要创建用户则在创建用户,给予权限。我这个的表是nacos创建的初始化sql。因为太多了就不全写了

	SET NAMES utf8;
	CREATE DATABASE IF NOT EXISTS `nacos_config` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
	use `nacos_config`;
	
	-- -- 创建用户 'nacos',密码 'nacos'
	-- CREATE USER IF NOT EXISTS 'nacos'@'%' IDENTIFIED BY 'nacos';
	
	-- -- 授予 'nacos' 对 nacos_config 的所有权限
	-- GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'%';
	
	/******************************************/
	/*   数据库全名 = nacos_config   */
	/*   表名称 = config_info   */
	/******************************************/
	CREATE TABLE `config_info` (
	  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
	  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
	  `group_id` varchar(128) DEFAULT NULL,
	  `content` longtext NOT NULL COMMENT 'content',
	  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
	  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
	  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
	  `src_user` text COMMENT 'source user',
	  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
	  `app_name` varchar(128) DEFAULT NULL,
	  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
	  `c_desc` varchar(256) DEFAULT NULL,
	  `c_use` varchar(64) DEFAULT NULL,
	  `effect` varchar(64) DEFAULT NULL,
	  `type` varchar(64) DEFAULT NULL,
	  `c_schema` text,
	  `encrypted_data_key` text NOT NULL COMMENT '秘钥',
	  PRIMARY KEY (`id`),
	  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
	

3.2、nginx

nginx.conf配置文件

在conf文件夹下添加nginx.conf配置文件

需要注意监听端口和地址都是写的容器的

# nginx.conf 示例文件
worker_processes  10;
events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server{
        #监听的端口号为容器的端口
        listen 80;
        #要监听的服务器地址,域名也可行,根据实际情况修改
        server_name localhost;
        client_max_body_size 20m;


        #前端,根据实际情况修改
        location / {
            # 项目地址,这里指的是nginx容器的地址
            root   /usr/share/nginx/html;
            try_files $uri $uri/ /index.html?s=$uri&$args;
            index index.html index.htm index.php;
        }
    }


}

添加前端项目文件

在html下面添加前端内容,因为这个目录映射的容器内的/usr/share/nginx/html

<html>
<head>
<meta charset="utf-8">
<title>hello nginx</title>
</head>
<body>
    <h1>Hello Niginx</h1>
    <p>小例子</p>
</body>
</html>

3.3、redis

添加redis.conf

在conf下添加redis.conf文件,可以根据自己情况添加配置

# 绑定地址 (默认监听所有网卡)
bind 0.0.0.0

# 端口 (默认端口)
port 6379

# 守护进程 (建议在生产环境设置为 yes,但 Docker 环境通常由容器管理,可以保持 no)
daemonize no

# 密码认证 (设置密码为 123456 - 请在生产环境中使用强密码!)
requirepass 123456

三、部署docker

最好先切换为root用户在去执行

把文件打包进去服务器然后解压,进入docker-deploy目录,也就是.sh执行文件的目录

1、执行部署命令

安装成功后如下

2、配置idea远程tcp连接(如果不需要可以忽略)

把提示的内容执行vim /usr/lib/systemd/system/docker.service 复制到下面的ExecStart位置后面

下载证书到本地:key.pem、cert.pem、ca.pem ,提示里面可以看位于什么目录下

通过idea配置

idea配置远程连接(如果不需要远程监控省略)

打开idea进入配置:Settings>Build>Docker目录下,

1. 配置远程服务器的IP,端口(2376加密端口),

2. 配置存放下载下来的加密文件的路径

出现Connection successful就成功了

3、通过docker-compose部署redis、mysql、nginx、nacos

进入anywhereDeploy目录

执行cd anywhereDeploy命令

创建容器

执行docker compose up -d后台执行创建,或者不加-d在命令行输出创建。

然后到idea去查看容器状态

可以通过idea查看到都启动成功了 啊

验证

连接数据库

nacos也可以正常连接

nginx也是可以正常连接

docker compose常用命令

#启动创建文件容器
docker compose up -d
# 删除容器和镜像
docker compose down
#覆盖更新
docker compose up -d --force-recreate
# 查看日志
docker compose logs
#删除容器
docker compose down --remove-orphans
#删除单个镜像
docker rmi nacos/nacos-server:2.0.2

四、直接部署

如果觉得前面的内容太多了,麻烦,可以直接拉取我github仓库的代码l拉取下来直接丢到服务器直接执行docker-run.sh创建docker,再执行docker compose up -d创建容器

仓库地址:https://github.com/AACS111/zfp-docker-deploy

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文