部署安裝docker及項(xiàng)目搭建所需要的基礎(chǔ)環(huán)境實(shí)踐(mysql、redis、nginx、nacos)
前言
該文章主要用于實(shí)現(xiàn)快速部署docker以及相關(guān)web服務(wù)所需要的基礎(chǔ)環(huán)境容器。
編寫該文章主要是因?yàn)楣镜捻?xiàng)目前面都是使用jar包進(jìn)行部署,目前進(jìn)行升級(jí)改造為docker部署。因?yàn)閖ar部署的項(xiàng)目,很容易出現(xiàn)部署人員離職后,如果部署文件寫的不夠詳細(xì),會(huì)造成找 項(xiàng)目部署地址都非常麻煩,并且環(huán)境不一致等問(wèn)題,所以改造為docker部署。
但docker部署每一個(gè)服務(wù)器都要去重新敲一遍命令部署docker,然后又都還需要去一個(gè)個(gè)部署項(xiàng)目所需要的相關(guān)數(shù)據(jù)庫(kù)以及其他的一些中間件就會(huì)很累,所以就想到了通過(guò)編寫.sh
文件以及docker compose
,實(shí)現(xiàn)一鍵部署。
?。?!覺得內(nèi)容太多了麻煩,可以直接移動(dòng)到最后面拉取我上傳git上的代碼下面直接部署
一、介紹
該項(xiàng)目主要包括了docekr-run.sh、docker-compose.yml兩個(gè)部署文件,以及config文件夾下的mysql、conf、nacos、nginx的用于容器映射的配置文件。
二、修改docker配置
1、修改docker-run.sh腳本
CentOS部署文件
創(chuàng)建一個(gè)docker-run.sh
文件。然后把下面的腳本復(fù)制進(jìn)去,
- 修改DOCKER_DATA=""改為自己要存儲(chǔ)docker容器的目錄。
- 修改SERVER_IP= ip改為自己服務(wù)器的ip地址
- 修改自己公司的信息
- 修改CERT_DIR="/home/docker/tls"為自己要存放tls證書的目錄地址(如果要進(jìn)行遠(yuǎn)程TCP連接)
#!/bin/bash # 如果命令以非零狀態(tài)退出,則立即退出腳本。 set -e # 在替換時(shí),將未設(shè)置的變量視為錯(cuò)誤。 set -u # 管道命令的返回值將是最后一個(gè)以非零狀態(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 軟件倉(cāng)庫(kù) echo "--> 正在添加官方 Docker 軟件倉(cāng)庫(kù)..." 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ù)啟動(dòng)并設(shè)置開機(jī)自啟(稍后會(huì)重啟) echo "--> 正在啟動(dòng)并設(shè)置開機(jī)自啟 Docker 服務(wù) (初始啟動(dòng))..." 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 # ========== 詢問(wèn)用戶是否啟用 TLS ========== ENABLE_TLS="" while [[ "$ENABLE_TLS" != "yes" && "$ENABLE_TLS" != "no" ]]; do read -p "是否啟用 TLS 以允許安全的遠(yuǎn)程 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 "無(wú)效輸入,請(qǐng)輸入 '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ù)器的實(shí)際IP地址 PASSWORD="123456" # ?。?! 重要: 請(qǐng)修改為強(qiáng)密碼 !! 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ù)器證書簽名請(qǐng)求 (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 "--> 生成客戶端證書簽名請(qǐng)求 (client.csr)..." openssl req -subj '/CN=client' -new -key key.pem -out client.csr echo "--> 創(chuàng)建客戶端證書擴(kuò)展文件 (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 "--> 清理臨時(shí)文件..." 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. 驗(yàn)證 Docker 服務(wù)狀態(tài) echo "--> 正在檢查 Docker 服務(wù)狀態(tài),確認(rèn)配置已生效..." sudo systemctl status docker --no-pager # 9. 將當(dāng)前用戶添加到 docker 組(可選) echo "--> 正在將當(dāng)前用戶 ($USER) 添加到 'docker' 用戶組..." sudo usermod -aG docker $USER echo "# 重要提示: #" echo "# 用戶組更改需要 退出登錄 并 重新登錄 才能生效。 #" echo "# 或者,運(yùn)行 'newgrp docker' 啟動(dòng)具有新組成員身份的新 Shell。 #" # 10. 最終驗(yàn)證說(shuō)明 (根據(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用于遠(yuǎn)程服務(wù)器連接,執(zhí)行下面命令" echo "# >>> 打開docker.service文件 " echo " vim /usr/lib/systemd/system/docker.service " echo "" echo "# >>> 將下面內(nèi)容加入到 [Service] 節(jié)點(diǎn)的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 " 查看是否啟動(dòng)成功:systemctl status docker" echo "" echo "######################################################################" echo "" echo "要從遠(yuǎn)程客戶端連接,你需要以下文件 (位于 $CERT_DIR 目錄):" echo " - CA 證書: ca.pem" echo " - 客戶端證書: cert.pem" echo " - 客戶端私鑰: key.pem" echo "" echo "遠(yuǎn)程連接命令示例 (需將證書文件復(fù)制到客戶端):" echo " docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$SERVER_IP:2376 version" echo "" echo "?。?!重要防火墻提示!??!" echo "請(qǐng)確保防火墻允許 TCP 端口 2376 的入站連接或。" echo "例如,使用 firewalld:" echo " sudo firewall-cmd --permanent --add-port=2376/tcp" echo " sudo firewall-cmd --reload" else echo "Docker 未啟用 TLS 遠(yuǎn)程連接,僅監(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\"' 查看詳細(xì)配置。"
ubuntu執(zhí)行腳本
修改的內(nèi)容和上面一致
#!/bin/bash # 如果命令以非零狀態(tài)退出,則立即退出腳本。 set -e # 在替換時(shí),將未設(shè)置的變量視為錯(cuò)誤。 set -u # 管道命令的返回值將是最后一個(gè)以非零狀態(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 軟件倉(cāng)庫(kù) (使用官方推薦方法 + 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 軟件倉(cāng)庫(kù) (使用 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 # 再次更新以識(shí)別新添加的倉(cāng)庫(kù) sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 5. 確保 Docker 服務(wù)啟動(dòng)并設(shè)置開機(jī)自啟(稍后會(huì)重啟) echo "--> 正在啟動(dòng)并設(shè)置開機(jī)自啟 Docker 服務(wù) (初始啟動(dòng))..." 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 # ========== 詢問(wèn)用戶是否啟用 TLS ========== ENABLE_TLS="" while [[ "$ENABLE_TLS" != "yes" && "$ENABLE_TLS" != "no" ]]; do read -p "是否啟用 TLS 以允許安全的遠(yuǎn)程 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 "無(wú)效輸入,請(qǐng)輸入 '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)無(wú)關(guān)) --- echo "===== 用戶選擇啟用 TLS,開始生成 Docker TLS 證書 =====" # --- TLS 相關(guān)配置信息 --- SERVER_IP="10.211.55.6" # !??! 重要: 使用Docker客戶端連接到服務(wù)器的實(shí)際IP地址 PASSWORD="123456" # ?。?! 重要: 請(qǐng)修改為強(qiáng)密碼 !! 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ù)器證書簽名請(qǐng)求 (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 "--> 生成客戶端證書簽名請(qǐng)求 (client.csr)..." openssl req -subj '/CN=client' -new -key key.pem -out client.csr echo "--> 創(chuàng)建客戶端證書擴(kuò)展文件 (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 "--> 清理臨時(shí)文件..." 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)無(wú)關(guān)) --- echo "--> 正在寫入 '/etc/docker/daemon.json' 配置文件..." # 使用 sudo bash -c '...' 來(lái)確保整個(gè)重定向操作具有 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,可以保留默認(rèn)的 unix socket 或添加 tcp (如果需要非 TLS 遠(yuǎn)程,但不推薦) # 這里我們保持默認(rèn),只監(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 未生成或?yàn)榭铡? fi # 7. 重啟 Docker 服務(wù)以應(yīng)用配置 echo "--> 正在重啟 Docker 服務(wù)以應(yīng)用 daemon.json 配置..." sudo systemctl restart docker # 8. 驗(yàn)證 Docker 服務(wù)狀態(tài) echo "--> 正在檢查 Docker 服務(wù)狀態(tài),確認(rèn)配置已生效..." sudo systemctl status docker --no-pager # 9. 將當(dāng)前用戶添加到 docker 組(與操作系統(tǒng)無(wú)關(guān)) echo "--> 正在將當(dāng)前用戶 ($USER) 添加到 'docker' 用戶組..." # 檢查 docker 組是否存在,如果不存在則創(chuàng)建 (雖然 Docker 安裝時(shí)通常會(huì)創(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 "# 或者,運(yùn)行 'newgrp docker' 啟動(dòng)具有新組成員身份的新 Shell。 #" # 10. 最終驗(yàn)證說(shuō)明 (根據(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用于遠(yuǎn)程服務(wù)器連接,執(zhí)行下面命令" echo "# >>> 打開docker.service文件 " echo " vim /usr/lib/systemd/system/docker.service " echo "" echo "# >>> 將下面內(nèi)容加入到 [Service] 節(jié)點(diǎn)的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 " 查看是否啟動(dòng)成功:systemctl status docker" echo "" echo "######################################################################" echo "" echo "要從遠(yuǎn)程客戶端連接,你需要以下文件 (位于 $CERT_DIR 目錄):" echo " - CA 證書: ca.pem" echo " - 客戶端證書: cert.pem" echo " - 客戶端私鑰: key.pem" echo "" echo "遠(yuǎn)程連接命令示例 (需將證書文件復(fù)制到客戶端):" echo "docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$SERVER_IP:2376 version" echo "" echo "?。?!重要防火墻提示 (Ubuntu 使用 ufw)?。?!" echo "請(qǐng)確保防火墻允許 TCP 端口 2376 的入站連接。" echo "例如,使用 ufw:" echo " sudo ufw allow 2376/tcp" echo " sudo ufw reload # 或者 sudo ufw enable 如果防火墻未啟用" else echo "Docker 未啟用 TLS 遠(yuǎn)程連接,僅監(jiān)聽在本地 Unix 套接字 unix:///var/run/docker.sock。" echo "可以通過(guò)本地命令訪問(wèn),例如:" echo " docker ps" fi echo "" echo "使用 'docker info | grep -E 'TLS|Hosts|Docker Root Dir|Registry Mirrors|Server Version\"' 查看詳細(xì)配置。"
2、修改docker-compose.yml文件
添加docker-compose.yml
創(chuàng)建一個(gè)docker-compose.yml
文件把下面內(nèi)容復(fù)制進(jìn)去
ports
:為ip映射,把主機(jī)的ip改為自己主機(jī)的ipvolumes
:容器映射,把前面的路徑改為自己需要映射的路徑(按照我的創(chuàng)建,不用改也可以)
version: '3.8' services: # redis服務(wù) redis: image: redis:6.2.7 container_name: redis-server ports: - "26379:6379" # 將主機(jī)的 26379 端口映射到容器的 6379 端口 (Redis 默認(rèn)端口) 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" # 將主機(jī)的 3306 端口映射到容器的 3306 端口 (MySQL 默認(rèn)端口) environment: MYSQL_ROOT_PASSWORD: 123456 # 設(shè)置 MySQL root 用戶的密碼,請(qǐng)?zhí)鎿Q為你的密碼 # MYSQL_DATABASE: nacos_config # 初始化數(shù)據(jù)庫(kù)(后續(xù)的初始化sql會(huì)在這個(gè)庫(kù)執(zhí)行) # MYSQL_USER: nacos # 初始化用戶(不能是root 會(huì)報(bào)錯(cuò), 后續(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 默認(rèn)端口) - "9949:9849" # Nacos 集群通信端口 (gRPC 客戶端請(qǐng)求端口) environment: MODE: standalone # 設(shè)置 Nacos 運(yùn)行模式為單機(jī)模式 (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ù)庫(kù) 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" # 將主機(jī)的 80 端口映射到容器的 80 端口 (HTTP 默認(rèn)端口) - "1443:443" # 將主機(jī)的 443 端口映射到容器的 443 端口 (HTTPS 默認(rèn)端口) - "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
注意點(diǎn):
mysql
初始化數(shù)據(jù)庫(kù)
把需要初始化的數(shù)據(jù)庫(kù)文件放入到initdb
文件夾下,盡量不要放入大批量的INSERT
語(yǔ)句的sql文件,可以等創(chuàng)建好后在執(zhí)行
nginx.conf
nginx.conf配置文件做監(jiān)聽端口需要使用容器的端口,項(xiàng)目地址也是,項(xiàng)目文件地址因?yàn)樽隽宋募成?,所以只需要寫到html下面就行
3、添加config配置文件
我的配置文件結(jié)構(gòu)
3.1、mysql
添加my-custom.cnf
在conf
目錄下添加一個(gè)my-custom.cnf
文件
內(nèi)容主要添加了一個(gè)大小寫不敏感和字符集
[mysqld] # 設(shè)置表名和數(shù)據(jù)庫(kù)名不區(qū)分大小寫 # 1: 表名存儲(chǔ)在磁盤上是小寫的,名稱比較時(shí)不區(qū)分大小寫。 lower_case_table_names=1 # (可選) 推薦同時(shí)顯式設(shè)置默認(rèn)字符集和排序規(guī)則 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
添加mysql初始化sql文件
在initdb
目錄下添加一個(gè)mysql-schema.sql
文件,需要初始化的文件,該目錄的sql文件在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)會(huì)執(zhí)行一次,后面就不會(huì)在執(zhí)行了。
格式如下,先設(shè)置字符集,在創(chuàng)建數(shù)據(jù)庫(kù),如果需要?jiǎng)?chuàng)建用戶則在創(chuàng)建用戶,給予權(quán)限。我這個(gè)的表是nacos創(chuàng)建的初始化sql。因?yàn)樘嗔司筒蝗珜懥?/p>
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' 對(duì) nacos_config 的所有權(quán)限 -- GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'%'; /******************************************/ /* 數(shù)據(jù)庫(kù)全名 = 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)建時(shí)間', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時(shí)間', `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)聽的端口號(hào)為容器的端口 listen 80; #要監(jiān)聽的服務(wù)器地址,域名也可行,根據(jù)實(shí)際情況修改 server_name localhost; client_max_body_size 20m; #前端,根據(jù)實(shí)際情況修改 location / { # 項(xiàng)目地址,這里指的是nginx容器的地址 root /usr/share/nginx/html; try_files $uri $uri/ /index.html?s=$uri&$args; index index.html index.htm index.php; } } }
添加前端項(xiàng)目文件
在html下面添加前端內(nèi)容,因?yàn)檫@個(gè)目錄映射的容器內(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ù)自己情況添加配置
# 綁定地址 (默認(rèn)監(jiān)聽所有網(wǎng)卡) bind 0.0.0.0 # 端口 (默認(rèn)端口) port 6379 # 守護(hù)進(jìn)程 (建議在生產(chǎn)環(huán)境設(shè)置為 yes,但 Docker 環(huán)境通常由容器管理,可以保持 no) daemonize no # 密碼認(rèn)證 (設(shè)置密碼為 123456 - 請(qǐng)?jiān)谏a(chǎn)環(huán)境中使用強(qiáng)密碼!) requirepass 123456
三、部署docker
最好先切換為root用戶在去執(zhí)行
把文件打包進(jìn)去服務(wù)器然后解壓,進(jìn)入docker-deploy
目錄,也就是.sh執(zhí)行文件的目錄
1、執(zhí)行部署命令
- centos執(zhí)行
sh docker-run.sh
命令 - ubuntu執(zhí)行
bash ubuntu-docker-run.sh
命令
安裝成功后如下
2、配置idea遠(yuǎn)程tcp連接(如果不需要可以忽略)
把提示的內(nèi)容執(zhí)行vim /usr/lib/systemd/system/docker.service
復(fù)制到下面的ExecStart
位置后面
下載證書到本地:key.pem、cert.pem、ca.pem
,提示里面可以看位于什么目錄下
通過(guò)idea配置
idea配置遠(yuǎn)程連接(如果不需要遠(yuǎn)程監(jiān)控省略)
打開idea進(jìn)入配置:Settings>Build>Docker
目錄下,
1. 配置遠(yuǎn)程服務(wù)器的IP,端口(2376加密端口),
2. 配置存放下載下來(lái)的加密文件的路徑
出現(xiàn)Connection successful
就成功了
3、通過(guò)docker-compose部署redis、mysql、nginx、nacos
進(jìn)入anywhereDeploy目錄
執(zhí)行cd anywhereDeploy
命令
創(chuàng)建容器
執(zhí)行docker compose up -d
后臺(tái)執(zhí)行創(chuàng)建,或者不加-d在命令行輸出創(chuàng)建。
然后到idea去查看容器狀態(tài)
可以通過(guò)idea查看到都啟動(dòng)成功了 啊
驗(yàn)證
連接數(shù)據(jù)庫(kù)
nacos也可以正常連接
nginx也是可以正常連接
docker compose常用命令
#啟動(dòng)創(chuàng)建文件容器 docker compose up -d # 刪除容器和鏡像 docker compose down #覆蓋更新 docker compose up -d --force-recreate # 查看日志 docker compose logs #刪除容器 docker compose down --remove-orphans #刪除單個(gè)鏡像 docker rmi nacos/nacos-server:2.0.2
四、直接部署
如果覺得前面的內(nèi)容太多了,麻煩,可以直接拉取我github倉(cāng)庫(kù)的代碼l拉取下來(lái)直接丟到服務(wù)器直接執(zhí)行docker-run.sh
創(chuàng)建docker,再執(zhí)行docker compose up -d
創(chuàng)建容器
倉(cāng)庫(kù)地址:https://github.com/AACS111/zfp-docker-deploy
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker 上傳鏡像到hub倉(cāng)庫(kù)的操作步驟
這篇文章主要介紹了docker 上傳鏡像到hub倉(cāng)庫(kù)的操作步驟,首先Docker Hub需要登錄到 Docker Hub,具體操作方法跟隨小編一起看看吧2024-07-07Linux搭建Docker環(huán)境的詳細(xì)過(guò)程(最新推薦)
Docker從17.03版本之后分為CE(Community Edition: 社區(qū)版)和EE(Enterprise Edition: 企業(yè)版),相對(duì)于社區(qū)版本,企業(yè)版本強(qiáng)調(diào)安全性,但需付費(fèi)使用,這里我們使用社區(qū)版本即可,這篇文章給大家介紹Linux搭建Docker環(huán)境的詳細(xì)過(guò)程,感興趣的朋友一起看看吧2025-04-04對(duì)已有的docker容器增加新的端口映射問(wèn)題(兩種方式)
這篇文章主要介紹了對(duì)已有的docker容器增加新的端口映射,在運(yùn)行容器時(shí)指定映射端口運(yùn)行后,如果想要添加新的端口映射,使用兩種方式都可以,需要的朋友可以參考下2022-01-01dockerfile結(jié)合go應(yīng)用程序的簡(jiǎn)單應(yīng)用代碼示例
Dockerfile文件是一個(gè)包含了指令和參數(shù)的文本文件,用于自動(dòng)化構(gòu)建Docker鏡像,這篇文章主要給大家介紹了關(guān)于dockerfile結(jié)合go應(yīng)用程序的簡(jiǎn)單應(yīng)用,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03docker設(shè)置代理通過(guò)代理服務(wù)器拉取鏡像方式
這篇文章主要介紹了docker設(shè)置代理通過(guò)代理服務(wù)器拉取鏡像方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04Docker部署ELK7.3.0日志收集服務(wù)最佳實(shí)踐
這篇文章主要介紹了Docker部署ELK7.3.0日志收集服務(wù)最佳實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10詳解利用Dockerfile構(gòu)建mysql鏡像并實(shí)現(xiàn)數(shù)據(jù)的初始化及權(quán)限設(shè)置
本篇文章主要介紹了詳解利用Dockerfile構(gòu)建mysql鏡像并實(shí)現(xiàn)數(shù)據(jù)的初始化及權(quán)限設(shè)置 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06