部署安裝docker及項目搭建所需要的基礎(chǔ)環(huán)境實踐(mysql、redis、nginx、nacos)
前言
該文章主要用于實現(xiàn)快速部署docker以及相關(guān)web服務(wù)所需要的基礎(chǔ)環(huán)境容器。
編寫該文章主要是因為公司的項目前面都是使用jar包進行部署,目前進行升級改造為docker部署。因為jar部署的項目,很容易出現(xiàn)部署人員離職后,如果部署文件寫的不夠詳細,會造成找 項目部署地址都非常麻煩,并且環(huán)境不一致等問題,所以改造為docker部署。
但docker部署每一個服務(wù)器都要去重新敲一遍命令部署docker,然后又都還需要去一個個部署項目所需要的相關(guān)數(shù)據(jù)庫以及其他的一些中間件就會很累,所以就想到了通過編寫.sh文件以及docker compose,實現(xiàn)一鍵部署。
?。?!覺得內(nèi)容太多了麻煩,可以直接移動到最后面拉取我上傳git上的代碼下面直接部署
一、介紹
該項目主要包括了docekr-run.sh、docker-compose.yml兩個部署文件,以及config文件夾下的mysql、conf、nacos、nginx的用于容器映射的配置文件。

二、修改docker配置
1、修改docker-run.sh腳本
CentOS部署文件
創(chuàng)建一個docker-run.sh文件。然后把下面的腳本復(fù)制進去,
- 修改DOCKER_DATA=""改為自己要存儲docker容器的目錄。
- 修改SERVER_IP= ip改為自己服務(wù)器的ip地址
- 修改自己公司的信息
- 修改CERT_DIR="/home/docker/tls"為自己要存放tls證書的目錄地址(如果要進行遠程TCP連接)
#!/bin/bash
# 如果命令以非零狀態(tài)退出,則立即退出腳本。
set -e
# 在替換時,將未設(shè)置的變量視為錯誤。
set -u
# 管道命令的返回值將是最后一個以非零狀態(tài)退出的命令的退出狀態(tài),
# 或者如果所有命令都成功退出則返回零。
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. 設(shè)置 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 服務(wù)啟動并設(shè)置開機自啟(稍后會重啟)
echo "--> 正在啟動并設(shè)置開機自啟 Docker 服務(wù) (初始啟動)..."
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker --no-pager
# 6. 確保 /home/docker 和數(shù)據(jù)目錄存在
DOCKER_DATA="/home/docker/docker-data"
echo "--> 確保 Docker 數(shù)據(jù)目錄 '$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:]') # 轉(zhuǎn)為小寫
if [[ "$ENABLE_TLS" != "yes" && "$ENABLE_TLS" != "no" && "$ENABLE_TLS" != "y" && "$ENABLE_TLS" != "n" ]]; then
echo "無效輸入,請輸入 'yes' 或 'no'."
ENABLE_TLS="" # 重置以便循環(huán)繼續(xù)
elif [[ "$ENABLE_TLS" == "y" ]]; then
ENABLE_TLS="yes"
elif [[ "$ENABLE_TLS" == "n" ]]; then
ENABLE_TLS="no"
fi
done
# ========== 根據(jù)用戶選擇執(zhí)行操作 ==========
if [[ "$ENABLE_TLS" == "yes" ]]; then
# --- 執(zhí)行 TLS 證書生成 ---
echo "===== 用戶選擇啟用 TLS,開始生成 Docker TLS 證書 ====="
# --- TLS 相關(guān)配置信息 ---
SERVER_IP="10.211.55.6" # ?。?! 重要: 使用Docker客戶端連接到服務(wù)器的實際IP地址
PASSWORD="123456" # ?。?! 重要: 請修改為強密碼 !!
COUNTRY="CN"
STATE="xx省"
CITY="xx市"
ORGANIZATION="xxxx有限公司"
ORGANIZATIONAL_UNIT="Dev"
EMAIL="123456@qq.com"
CERT_DIR="/home/docker/tls" # 定義證書存放目錄
# --- 配置結(jié)束 ---
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 "--> 生成服務(wù)器私鑰 (server-key.pem)..."
openssl genrsa -out server-key.pem 4096
echo "--> 生成服務(wù)器證書簽名請求 (server.csr)..."
openssl req -subj "/CN=$SERVER_IP" -new -key server-key.pem -out server.csr
echo "--> 使用 CA 簽發(fā)服務(wù)器證書 (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 "--> 創(chuàng)建客戶端證書擴展文件 (extfile.cnf)..."
echo "extendedKeyUsage=clientAuth" > extfile.cnf
echo "--> 使用 CA 簽發(fā)客戶端證書 (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 "--> 調(diào)整證書和密鑰文件權(quán)限..."
# 使用 sudo 確保權(quán)限設(shè)置成功,即使腳本以非 root 用戶執(zhí)行(但需要 sudo 權(quán)限)
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 "--> 僅配置鏡像加速和數(shù)據(jù)目錄..."
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'
# ========== 應(yīng)用配置并完成后續(xù)步驟 ==========
echo "--> '/etc/docker/daemon.json' 配置寫入完成。內(nèi)容如下:"
sudo cat /etc/docker/daemon.json
# 7. 重啟 Docker 服務(wù)以應(yīng)用配置
echo "--> 正在重啟 Docker 服務(wù)以應(yīng)用 daemon.json 配置..."
sudo systemctl restart docker
# 8. 驗證 Docker 服務(wù)狀態(tài)
echo "--> 正在檢查 Docker 服務(wù)狀態(tài),確認配置已生效..."
sudo systemctl status docker --no-pager
# 9. 將當(dāng)前用戶添加到 docker 組(可選)
echo "--> 正在將當(dāng)前用戶 ($USER) 添加到 'docker' 用戶組..."
sudo usermod -aG docker $USER
echo "# 重要提示: #"
echo "# 用戶組更改需要 退出登錄 并 重新登錄 才能生效。 #"
echo "# 或者,運行 'newgrp docker' 啟動具有新組成員身份的新 Shell。 #"
# 10. 最終驗證說明 (根據(jù) TLS 選擇顯示不同信息)
echo "===== Docker 安裝和配置腳本執(zhí)行完畢 ====="
echo "鏡像加速器: https://zhengfp.cn"
echo "數(shù)據(jù)目錄: $DOCKER_DATA"
if [[ "$ENABLE_TLS" == "yes" ]]; then
echo "######################################################################"
echo " "
echo "# 重要提示:需要到/usr/lib/systemd/system/docker.service目錄去配置Docker 的TLS用于遠程服務(wù)器連接,執(zhí)行下面命令"
echo "# >>> 打開docker.service文件 "
echo " vim /usr/lib/systemd/system/docker.service "
echo ""
echo "# >>> 將下面內(nèi)容加入到 [Service] 節(jié)點的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 "遠程連接命令示例 (需將證書文件復(fù)制到客戶端):"
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 遠程連接,僅監(jiān)聽在本地 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執(zhí)行腳本
修改的內(nèi)容和上面一致
#!/bin/bash
# 如果命令以非零狀態(tài)退出,則立即退出腳本。
set -e
# 在替換時,將未設(shè)置的變量視為錯誤。
set -u
# 管道命令的返回值將是最后一個以非零狀態(tài)退出的命令的退出狀態(tài),
# 或者如果所有命令都成功退出則返回零。
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. 設(shè)置 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] 正在設(shè)置 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 服務(wù)啟動并設(shè)置開機自啟(稍后會重啟)
echo "--> 正在啟動并設(shè)置開機自啟 Docker 服務(wù) (初始啟動)..."
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker --no-pager
# 6. 確保 /home/docker 和數(shù)據(jù)目錄存在
DOCKER_DATA="/home/docker/docker-data"
echo "--> 確保 Docker 數(shù)據(jù)目錄 '$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:]') # 轉(zhuǎn)為小寫
if [[ "$ENABLE_TLS" != "yes" && "$ENABLE_TLS" != "no" && "$ENABLE_TLS" != "y" && "$ENABLE_TLS" != "n" ]]; then
echo "無效輸入,請輸入 'yes' 或 'no'."
ENABLE_TLS="" # 重置以便循環(huán)繼續(xù)
elif [[ "$ENABLE_TLS" == "y" ]]; then
ENABLE_TLS="yes"
elif [[ "$ENABLE_TLS" == "n" ]]; then
ENABLE_TLS="no"
fi
done
# ========== 根據(jù)用戶選擇執(zhí)行操作 ==========
if [[ "$ENABLE_TLS" == "yes" ]]; then
# --- 執(zhí)行 TLS 證書生成 (這部分與操作系統(tǒng)無關(guān)) ---
echo "===== 用戶選擇啟用 TLS,開始生成 Docker TLS 證書 ====="
# --- TLS 相關(guān)配置信息 ---
SERVER_IP="10.211.55.6" # ?。?! 重要: 使用Docker客戶端連接到服務(wù)器的實際IP地址
PASSWORD="123456" # !?。?重要: 請修改為強密碼 !!
COUNTRY="CN"
STATE="xx省"
CITY="xx市"
ORGANIZATION="xxxx有限公司"
ORGANIZATIONAL_UNIT="Dev"
EMAIL="123456@qq.com"
CERT_DIR="/home/docker/tls" # 定義證書存放目錄
# --- 配置結(jié)束 ---
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 "--> 生成服務(wù)器私鑰 (server-key.pem)..."
openssl genrsa -out server-key.pem 4096
echo "--> 生成服務(wù)器證書簽名請求 (server.csr)..."
openssl req -subj "/CN=$SERVER_IP" -new -key server-key.pem -out server.csr
echo "--> 使用 CA 簽發(fā)服務(wù)器證書 (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 "--> 創(chuàng)建客戶端證書擴展文件 (extfile.cnf)..."
echo "extendedKeyUsage=clientAuth" > extfile.cnf
echo "--> 使用 CA 簽發(fā)客戶端證書 (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 "--> 調(diào)整證書和密鑰文件權(quán)限..."
# 使用 sudo 確保權(quán)限設(shè)置成功
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 "--> 僅配置鏡像加速和數(shù)據(jù)目錄..."
fi
# --- 配置 daemon.json (這部分與操作系統(tǒng)無關(guān)) ---
echo "--> 正在寫入 '/etc/docker/daemon.json' 配置文件..."
# 使用 sudo bash -c '...' 來確保整個重定向操作具有 root 權(quán)限
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 結(jié)構(gòu),但不添加 hosts
else
# 如果未啟用 TLS,可以保留默認的 unix socket 或添加 tcp (如果需要非 TLS 遠程,但不推薦)
# 這里我們保持默認,只監(jiān)聽 unix socket,不寫 hosts 行
echo "" # 輸出空行
# 或者,如果想明確只監(jiān)聽本地 TCP (不安全,不推薦):
# echo ',\n "hosts": ["tcp://127.0.0.1:2375", "unix:///var/run/docker.sock"]'
fi
)'
}
EOF'
# ========== 應(yīng)用配置并完成后續(xù)步驟 ==========
echo "--> '/etc/docker/daemon.json' 配置寫入完成。內(nèi)容如下:"
# 確保文件存在再 cat
if [[ -f /etc/docker/daemon.json ]]; then
sudo cat /etc/docker/daemon.json
else
echo "--> Warning: /etc/docker/daemon.json 未生成或為空。"
fi
# 7. 重啟 Docker 服務(wù)以應(yīng)用配置
echo "--> 正在重啟 Docker 服務(wù)以應(yīng)用 daemon.json 配置..."
sudo systemctl restart docker
# 8. 驗證 Docker 服務(wù)狀態(tài)
echo "--> 正在檢查 Docker 服務(wù)狀態(tài),確認配置已生效..."
sudo systemctl status docker --no-pager
# 9. 將當(dāng)前用戶添加到 docker 組(與操作系統(tǒng)無關(guān))
echo "--> 正在將當(dāng)前用戶 ($USER) 添加到 'docker' 用戶組..."
# 檢查 docker 組是否存在,如果不存在則創(chuàng)建 (雖然 Docker 安裝時通常會創(chuàng)建)
if ! getent group docker > /dev/null; then
echo "--> 'docker' 組不存在,正在創(chuàng)建..."
sudo groupadd docker
fi
sudo usermod -aG docker $USER
echo "# 重要提示: #"
echo "# 用戶組更改需要 退出登錄 并 重新登錄 才能生效。 #"
echo "# 或者,運行 'newgrp docker' 啟動具有新組成員身份的新 Shell。 #"
# 10. 最終驗證說明 (根據(jù) TLS 選擇顯示不同信息)
echo "===== Docker 安裝和配置腳本執(zhí)行完畢 ====="
echo "鏡像加速器: https://zhengfp.cn (或 daemon.json 中配置的其他鏡像)"
echo "數(shù)據(jù)目錄: $DOCKER_DATA"
if [[ "$ENABLE_TLS" == "yes" ]]; then
echo "######################################################################"
echo " "
echo "# 重要提示:需要到/usr/lib/systemd/system/docker.service目錄去配置Docker 的TLS用于遠程服務(wù)器連接,執(zhí)行下面命令"
echo "# >>> 打開docker.service文件 "
echo " vim /usr/lib/systemd/system/docker.service "
echo ""
echo "# >>> 將下面內(nèi)容加入到 [Service] 節(jié)點的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 "遠程連接命令示例 (需將證書文件復(fù)制到客戶端):"
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 遠程連接,僅監(jiān)聽在本地 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
創(chuàng)建一個docker-compose.yml文件把下面內(nèi)容復(fù)制進去
ports:為ip映射,把主機的ip改為自己主機的ipvolumes:容器映射,把前面的路徑改為自己需要映射的路徑(按照我的創(chuàng)建,不用改也可以)
version: '3.8'
services:
# redis服務(wù)
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服務(wù)
mysql:
image: mysql:8.0.33 # 或選擇你需要的 MySQL 版本,例如 mysql:latest
container_name: mysql-db
ports:
- "3406:3306" # 將主機的 3306 端口映射到容器的 3306 端口 (MySQL 默認端口)
environment:
MYSQL_ROOT_PASSWORD: 123456 # 設(shè)置 MySQL root 用戶的密碼,請?zhí)鎿Q為你的密碼
# MYSQL_DATABASE: nacos_config # 初始化數(shù)據(jù)庫(后續(xù)的初始化sql會在這個庫執(zhí)行)
# MYSQL_USER: nacos # 初始化用戶(不能是root 會報錯, 后續(xù)需要給新用戶賦予權(quán)限)
# MYSQL_PASSWORD: nacos # 用戶密碼
TZ: Asia/Shanghai
volumes:
- ./config/mysql/data/:/var/lib/mysql/ # 數(shù)據(jù)持久化,將 MySQL 數(shù)據(jù)目錄掛載到 Docker volume
- ./config/mysql/initdb/:/docker-entrypoint-initdb.d/ #初始化磁盤
- ./config/mysql/conf/:/etc/mysql/conf.d/
deploy:
resources:
limits:
memory: 1g
# nacos服務(wù)
nacos:
image: nacos/nacos-server:2.0.2 # 或 nacos/nacos-opensource:latest (根據(jù)你的需求選擇)
container_name: nacos-server
ports:
- "8948:8848" # Nacos 服務(wù)器端口
- "9948:9848" # Nacos 集群通信端口 (gRPC 默認端口)
- "9949:9849" # Nacos 集群通信端口 (gRPC 客戶端請求端口)
environment:
MODE: standalone # 設(shè)置 Nacos 運行模式為單機模式 (standalone)
# 如果需要持久化,可以添加以下配置并掛載數(shù)據(jù)卷 (例如使用 MySQL 持久化)
NACOS_DATASOURCE_PLATFORM: mysql
DB_NUM: 1
DB_HOST_0: mysql # 這里使用 docker-compose 內(nèi)的 mysql 服務(wù)名
DB_PORT_0: 3406
DB_NAME_0: nacos_config # 你需要先在 MySQL 中創(chuàng)建 nacos_db 數(shù)據(jù)庫
DB_USER_0: root
DB_PASSWORD_0: 123456
depends_on:
- mysql # 如果 Nacos 使用 MySQL 持久化,則依賴 mysql
volumes:
# - ./config/nacos/conf/:/home/nacos/conf/ # (可選) 數(shù)據(jù)持久化,
- ./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初始化數(shù)據(jù)庫

把需要初始化的數(shù)據(jù)庫文件放入到initdb文件夾下,盡量不要放入大批量的INSERT語句的sql文件,可以等創(chuàng)建好后在執(zhí)行
nginx.conf

nginx.conf配置文件做監(jiān)聽端口需要使用容器的端口,項目地址也是,項目文件地址因為做了文件映射,所以只需要寫到html下面就行

3、添加config配置文件
我的配置文件結(jié)構(gòu)

3.1、mysql
添加my-custom.cnf
在conf目錄下添加一個my-custom.cnf文件
內(nèi)容主要添加了一個大小寫不敏感和字符集
[mysqld] # 設(shè)置表名和數(shù)據(jù)庫名不區(qū)分大小寫 # 1: 表名存儲在磁盤上是小寫的,名稱比較時不區(qū)分大小寫。 lower_case_table_names=1 # (可選) 推薦同時顯式設(shè)置默認字符集和排序規(guī)則 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
添加mysql初始化sql文件
在initdb目錄下添加一個mysql-schema.sql文件,需要初始化的文件,該目錄的sql文件在創(chuàng)建數(shù)據(jù)庫時會執(zhí)行一次,后面就不會在執(zhí)行了。
格式如下,先設(shè)置字符集,在創(chuàng)建數(shù)據(jù)庫,如果需要創(chuàng)建用戶則在創(chuàng)建用戶,給予權(quán)限。我這個的表是nacos創(chuàng)建的初始化sql。因為太多了就不全寫了
SET NAMES utf8; CREATE DATABASE IF NOT EXISTS `nacos_config` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; use `nacos_config`; -- -- 創(chuàng)建用戶 'nacos',密碼 'nacos' -- CREATE USER IF NOT EXISTS 'nacos'@'%' IDENTIFIED BY 'nacos'; -- -- 授予 'nacos' 對 nacos_config 的所有權(quán)限 -- GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'%'; /******************************************/ /* 數(shù)據(jù)庫全名 = 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 '創(chuàng)建時間', `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配置文件
需要注意監(jiān)聽端口和地址都是寫的容器的
# nginx.conf 示例文件
worker_processes 10;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server{
#監(jiān)聽的端口號為容器的端口
listen 80;
#要監(jiān)聽的服務(wù)器地址,域名也可行,根據(jù)實際情況修改
server_name localhost;
client_max_body_size 20m;
#前端,根據(jù)實際情況修改
location / {
# 項目地址,這里指的是nginx容器的地址
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html?s=$uri&$args;
index index.html index.htm index.php;
}
}
}
添加前端項目文件
在html下面添加前端內(nèi)容,因為這個目錄映射的容器內(nèi)的/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文件,可以根據(jù)自己情況添加配置
# 綁定地址 (默認監(jiān)聽所有網(wǎng)卡) bind 0.0.0.0 # 端口 (默認端口) port 6379 # 守護進程 (建議在生產(chǎn)環(huán)境設(shè)置為 yes,但 Docker 環(huán)境通常由容器管理,可以保持 no) daemonize no # 密碼認證 (設(shè)置密碼為 123456 - 請在生產(chǎn)環(huán)境中使用強密碼!) requirepass 123456
三、部署docker
最好先切換為root用戶在去執(zhí)行
把文件打包進去服務(wù)器然后解壓,進入docker-deploy目錄,也就是.sh執(zhí)行文件的目錄
1、執(zhí)行部署命令
- centos執(zhí)行
sh docker-run.sh命令 - ubuntu執(zhí)行
bash ubuntu-docker-run.sh命令

安裝成功后如下

2、配置idea遠程tcp連接(如果不需要可以忽略)
把提示的內(nèi)容執(zhí)行vim /usr/lib/systemd/system/docker.service 復(fù)制到下面的ExecStart位置后面

下載證書到本地:key.pem、cert.pem、ca.pem ,提示里面可以看位于什么目錄下

通過idea配置
idea配置遠程連接(如果不需要遠程監(jiān)控省略)
打開idea進入配置:Settings>Build>Docker目錄下,
1. 配置遠程服務(wù)器的IP,端口(2376加密端口),
2. 配置存放下載下來的加密文件的路徑
出現(xiàn)Connection successful就成功了

3、通過docker-compose部署redis、mysql、nginx、nacos
進入anywhereDeploy目錄
執(zhí)行cd anywhereDeploy命令
創(chuàng)建容器
執(zhí)行docker compose up -d后臺執(zhí)行創(chuàng)建,或者不加-d在命令行輸出創(chuàng)建。
然后到idea去查看容器狀態(tài)
可以通過idea查看到都啟動成功了 啊

驗證
連接數(shù)據(jù)庫

nacos也可以正常連接

nginx也是可以正常連接

docker compose常用命令
#啟動創(chuàng)建文件容器 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
四、直接部署
如果覺得前面的內(nèi)容太多了,麻煩,可以直接拉取我github倉庫的代碼l拉取下來直接丟到服務(wù)器直接執(zhí)行docker-run.sh創(chuàng)建docker,再執(zhí)行docker compose up -d創(chuàng)建容器
倉庫地址:https://github.com/AACS111/zfp-docker-deploy
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux搭建Docker環(huán)境的詳細過程(最新推薦)
Docker從17.03版本之后分為CE(Community Edition: 社區(qū)版)和EE(Enterprise Edition: 企業(yè)版),相對于社區(qū)版本,企業(yè)版本強調(diào)安全性,但需付費使用,這里我們使用社區(qū)版本即可,這篇文章給大家介紹Linux搭建Docker環(huán)境的詳細過程,感興趣的朋友一起看看吧2025-04-04
dockerfile結(jié)合go應(yīng)用程序的簡單應(yīng)用代碼示例
Dockerfile文件是一個包含了指令和參數(shù)的文本文件,用于自動化構(gòu)建Docker鏡像,這篇文章主要給大家介紹了關(guān)于dockerfile結(jié)合go應(yīng)用程序的簡單應(yīng)用,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-03-03
docker設(shè)置代理通過代理服務(wù)器拉取鏡像方式
這篇文章主要介紹了docker設(shè)置代理通過代理服務(wù)器拉取鏡像方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
Docker部署ELK7.3.0日志收集服務(wù)最佳實踐
這篇文章主要介紹了Docker部署ELK7.3.0日志收集服務(wù)最佳實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
詳解利用Dockerfile構(gòu)建mysql鏡像并實現(xiàn)數(shù)據(jù)的初始化及權(quán)限設(shè)置
本篇文章主要介紹了詳解利用Dockerfile構(gòu)建mysql鏡像并實現(xiàn)數(shù)據(jù)的初始化及權(quán)限設(shè)置 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06

