Docker安全開(kāi)放遠(yuǎn)程訪問(wèn)連接權(quán)限方式
1、Docker完全開(kāi)放遠(yuǎn)程訪問(wèn)
Docker服務(wù)完全開(kāi)放對(duì)外訪問(wèn)權(quán)限操作如下:
# 開(kāi)啟端口命令 (--permanent永久生效,沒(méi)有此參數(shù)重啟后失效) firewall-cmd --zone=public --add-port=2375/tcp --permanent # 重新載入 firewall-cmd --reload # 使用 vim 編輯docker服務(wù)配置文件 vim /lib/systemd/system/docker.service # 找到如下配置行 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock # 將其注釋掉或者直接刪除,替換成下面的配置行.然后保存退出 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock # 重新加載docker配置并重啟服務(wù) systemctl daemon-reload && systemctl restart docker # 然后直接在命令行客戶端輸入如下命令,IP地址改為自己的 curl http://192.168.56.20:2375/version # 或者在瀏覽器直接訪問(wèn),IP地址改為自己的 http://192.168.56.20:2375/version
出現(xiàn)如下信息則代表修改Docker服務(wù)設(shè)置遠(yuǎn)程訪問(wèn)成功。

特別注意的點(diǎn):
完全開(kāi)放Docker對(duì)外訪問(wèn)權(quán)限有可能會(huì)遭到別人攻擊,這是很不安全的,只要?jiǎng)e人知道你的服務(wù)器地址就能夠隨意連接你的Docker服務(wù),而不需要任何認(rèn)證,因此,完全開(kāi)放只推薦自己在內(nèi)網(wǎng)使用,不推薦在云服務(wù)器上直接完全開(kāi)放。
2、Docker開(kāi)放遠(yuǎn)程訪問(wèn)并開(kāi)啟認(rèn)證和通信加密
為了解決上面Docker完全開(kāi)放遠(yuǎn)程訪問(wèn)所帶來(lái)的安全隱患,我們需要對(duì)Docker服務(wù)進(jìn)行通信認(rèn)證和加密,操作如下:
首先創(chuàng)建一個(gè)文件目錄,用于存放證書(shū)和私鑰
mkdir -p /data/certificate/linux-ca && cd /data/certificate/linux-ca
然后在 linux-ca 文件夾下進(jìn)行以下操作:
生成自簽名的根證書(shū)和私鑰
- a. 執(zhí)行以下命令生成根證書(shū)私鑰文件(例如
ca-key.pem):
openssl genrsa -aes256 -passout pass:123456 -out ca-key.pem 4096
- b. 執(zhí)行以下命令生成根證書(shū)文件(例如
ca.pem)并使用私鑰進(jìn)行簽名。在生成證書(shū)時(shí),你需要為其分配一個(gè)有效期,通常為幾年。
# 直接指定證書(shū)的主題信息 openssl req -x509 -new -key ca-key.pem -sha256 -days 365 -passin pass:123456 -out ca.pem
生成自簽名的服務(wù)端證書(shū)和私鑰
- a. 執(zhí)行以下命令生成私鑰文件(例如
server-key.pem):
openssl genrsa -out server-key.pem 4096
- b. 執(zhí)行以下命令生成證書(shū)簽名請(qǐng)求文件(例如
server.csr)。
在生成 CSR 文件時(shí),你需要提供一些信息,如組織名稱、組織單位、所在國(guó)家等。
# 直接指定證書(shū)的主題信息 openssl req -new -key server-key.pem -out server.csr
- c. 執(zhí)行以下命令生成自簽名的服務(wù)器證書(shū)(例如
server-cert.pem),并使用 CSR 文件和私鑰進(jìn)行簽名。
echo extendedKeyUsage = serverAuth >> extfile-server.cnf openssl x509 -req -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -days 365 -sha256 -passin pass:123456 -out server-cert.pem -extfile extfile-server.cnf
生成自簽名的客戶端證書(shū)和私鑰
- a. 執(zhí)行以下命令生成客戶端私鑰文件(例如
key.pem):
openssl genrsa -out key.pem 4096
- b. 執(zhí)行以下命令生成客戶端證書(shū)簽名請(qǐng)求文件(例如
client.csr)。在生成 CSR 文件時(shí),你需要提供一些信息,如組織名稱、組織單位、所在國(guó)家等。
openssl req -new -key key.pem -out client.csr
- c. 執(zhí)行以下命令生成自簽名的客戶端證書(shū)(例如
cert.pem),并使用 CSR 文件和私鑰進(jìn)行簽名。在生成證書(shū)時(shí),你需要為其分配一個(gè)有效期,通常為幾年。
echo extendedKeyUsage = clientAuth > extfile-client.cnf openssl x509 -req -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -days 365 -sha256 -passin pass:123456 -out cert.pem -extfile extfile-client.cnf
刪除多余的四個(gè)請(qǐng)求文件:
rm -f server.csr client.csr extfile-server.cnf extfile-client.cnf
完成了上述步驟后,你將獲得以下文件:
- 根證書(shū)文件:
ca.pem - 根證書(shū)私鑰文件:
ca-key.pem - 服務(wù)器端證書(shū)文件:
server-cert.pem - 服務(wù)器端私鑰文件:
server-key.pem - 客戶端證書(shū)文件:
cert.pem - 客戶端私鑰文件:
key.pem
特別要注意的是以下四點(diǎn):
- 根證書(shū)名稱必須為 ca.pem
- 客戶端證書(shū)必須為 cert.pem
- 客戶端私鑰必須為 key.pem
- 在輸入 commonName 信息時(shí)必須添加服務(wù)器的IP地址,否則Docker可能啟動(dòng)失敗
服務(wù)端和客戶端創(chuàng)建私鑰是不能額外添加加密密碼,不然會(huì)導(dǎo)致服務(wù)端、客戶端無(wú)法解析。
然后是配置Docker守護(hù)進(jìn)程配置文件 daemon.json 具體操作如下:
# 先查看 /etc/docker/daemon.json 是否存在,如果不存在則創(chuàng)建,存在則直接修改
cat /etc/docker/daemon.json
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"tls": true,
"tlsverify": true,
"tlscacert": "/data/certificate/linux-ca/ca.pem",
"tlscert": "/data/certificate/linux-ca/server-cert.pem",
"tlskey": "/data/certificate/linux-ca/server-key.pem",
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://ung2thfc.mirror.aliyuncs.com",
"https://mirror.ccs.tencentyun.com",
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.baidubce.com"
]
}
EOF
systemctl daemon-reload && systemctl restart docker在以上操作中,我們需要填寫(xiě)正確的證書(shū)和私鑰存放地址,如果你是按照我上面的步驟來(lái),那沒(méi)有問(wèn)題,你什么都不用改。
如果你的證書(shū)和私鑰的存放地址是自己定義的地址,那么,你需要將 daemon.json 中的地址也相應(yīng)的修改一下。
完成以上內(nèi)容后,此時(shí)我們?cè)跒g覽器使用 https://192.168.56.10:2375/version 就無(wú)法獲取信息了,提示需要身份認(rèn)證

3、快速完成Docker服務(wù)開(kāi)啟認(rèn)證和通信加密
為了解決第二步流程比較繁瑣的問(wèn)題,我編寫(xiě)了兩個(gè)自動(dòng)化配置Shell腳本并且我將其上傳到了公網(wǎng),它們能夠幫助我們非??焖俚耐瓿傻诙降乃辛鞒?,
你們可以直接選擇使用我創(chuàng)建好的腳本,操作如下:
# 證書(shū)腳本 curl -O https://backup-1305596318.cos.ap-guangzhou.myqcloud.com/shell/cert.sh chmod +x cert.sh source cert.sh # Docker守護(hù)進(jìn)程腳本 curl -O https://backup-1305596318.cos.ap-guangzhou.myqcloud.com/shell/daemon.sh chmod +x daemon.sh source daemon.sh
如果自己創(chuàng)建然后使用,可以參考下面的步驟,具體操作如下:
首先是創(chuàng)建證書(shū)和私鑰的Shell腳本
我們只需要?jiǎng)?chuàng)建一個(gè) cert.sh 腳本文件,名稱可以任取,然后填入如下內(nèi)容:
#!/bin/bash # 從控制臺(tái)讀取必要輸入信息 read -p "please input the cert store path: " certDir echo your cert store path is: "$certDir" read -p "please input the ca-key's password: " password echo your password is: "$password" read -p "please input the IP of your server: " ip echo your server IP is: "$ip" # 檢查輸入的證書(shū)路徑是否已經(jīng)存在 # 如果不存在,則創(chuàng)建;如果存在則刪除后創(chuàng)建 if [ ! -d "$certDir" ]; then echo "" echo "$certDir , not exist, it will be create" echo "" mkdir -p $certDir else echo "" echo "$certDir , already exist , it will be delete then create" echo "" rm -rf $certDir mkdir -p $certDir fi cd $certDir # 定義服務(wù)端證書(shū)擴(kuò)展配置 server_conf="[req] prompt = no distinguished_name = req_distinguished_name req_extensions = v3_req [req_distinguished_name] countryName = CN stateOrProvinceName = JX localityName = SR organizationName = PY organizationalUnitName = XS commonName = $ip emailAddress = 2320391937@qq.com [v3_req] extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] IP.1 = 0.0.0.0" # 將服務(wù)端證書(shū)的擴(kuò)展配置寫(xiě)入extfile-server.cnf文件 echo "$server_conf" > extfile-server.cnf # 定義客戶端證書(shū)擴(kuò)展配置 client_conf="[req] prompt = no distinguished_name = req_distinguished_name req_extensions = v3_req [req_distinguished_name] countryName = CN stateOrProvinceName = JX localityName = SR organizationName = PY organizationalUnitName = XS commonName = $ip emailAddress = 2320391937@qq.com [v3_req] extendedKeyUsage = clientAuth" # 將客戶端證書(shū)的擴(kuò)展配置寫(xiě)入extfile-client.cnf文件 echo "$client_conf" > extfile-client.cnf # 創(chuàng)建根證書(shū)RSA私鑰 openssl genrsa -aes256 -passout pass:$password -out ca-key.pem 4096 # 創(chuàng)建CA證書(shū) openssl req -new -x509 -days 365 -key ca-key.pem -passin pass:$password -sha256 -out ca.pem -subj "/C=CN/CN=$ip" # 創(chuàng)建服務(wù)端私鑰 openssl genrsa -out server-key.pem 4096 # 創(chuàng)建服務(wù)端簽名請(qǐng)求證書(shū)文件 openssl req -subj "/CN=$ip" -sha256 -new -key server-key.pem -out server.csr # 創(chuàng)建簽名生效的服務(wù)端證書(shū)文件 openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$password" -CAcreateserial -out server-cert.pem -extfile extfile-server.cnf # 創(chuàng)建客戶端私鑰 openssl genrsa -out key.pem 4096 # 創(chuàng)建客戶端簽名請(qǐng)求證書(shū)文件 openssl req -subj "/CN=$ip" -new -key key.pem -out client.csr # 創(chuàng)建簽名生效的客戶端證書(shū)文件 openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$password" -CAcreateserial -out cert.pem -extfile extfile-client.cnf # 刪除多余文件 # 使用了 -v 參數(shù),rm 命令將會(huì)顯示每個(gè)被刪除的文件或目錄的名稱,以便您能夠看到操作的進(jìn)展和結(jié)果。 rm -f -v client.csr server.csr extfile-server.cnf extfile-client.cnf # 為所有用戶設(shè)置對(duì)這些文件的讀取權(quán)限 chmod -v 444 ca-key.pem key.pem server-key.pem chmod -v 444 ca.pem server-cert.pem cert.pem
該腳本只需要我們?cè)诳刂婆_(tái)輸入證書(shū)和私鑰的存放地址、根私鑰密碼以及服務(wù)器IP地址三個(gè)參數(shù)即可,其他的什么都不用做。
如果你按照上面的步驟創(chuàng)建好了 cert.sh 腳本文件并填入了腳本內(nèi)容,那么接下來(lái)我們就可以通過(guò)如下命令來(lái)執(zhí)行腳本了
source /xxx/cert.sh
使用 source 命令后接腳本的絕對(duì)地址或者相對(duì)地址即可執(zhí)行腳本。
創(chuàng)建Docker守護(hù)進(jìn)程配置腳本
我們創(chuàng)建一個(gè) daemon.sh 腳本文件,名稱可以任取,然后填入如下內(nèi)容:
#!/bin/bash
# 讀取控制臺(tái)輸入,需要輸入一個(gè)目錄
read -p "please input the cert store path: " certDir
echo your cert store path is: "$certDir"
# 檢查輸入的證書(shū)路徑是否已經(jīng)存在
# 如果不存在,則直接退出
if [ ! -d "$certDir" ]; then
echo ""
echo "$certDir , not exist, please input a correct cert path"
exit
fi
json_content='{
"tls": true,
"tlsverify": true,
"tlscacert": "$certDir/ca.pem",
"tlscert": "$certDir/server-cert.pem",
"tlskey": "$certDir/server-key.pem",
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://ung2thfc.mirror.aliyuncs.com",
"https://mirror.ccs.tencentyun.com",
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.baidubce.com"
]
}'
# 替換變量
json_content=$(echo "$json_content" | sed "s|\$certDir|$certDir|g")
daemonDir='/etc/docker'
# 如果docker配置目錄不存在則創(chuàng)建;存在則刪除后創(chuàng)建
if [ ! -d "$daemonDir" ]; then
echo ""
echo "$daemonDir not exist, it will be create"
mkdir -p "$daemonDir" && cd "$daemonDir"
# 將替換后的內(nèi)容保存到新的 JSON 文件
echo "$json_content" > "$daemonDir/daemon.json"
else
echo ""
echo "$daemonDir already exist, it will be delete then create"
rm -rf "$daemonDir"
mkdir -p "$daemonDir" && cd "$daemonDir"
# 將替換后的內(nèi)容保存到新的 JSON 文件
echo "$json_content" > "$daemonDir/daemon.json"
fi
systemctl daemon-reload && systemctl restart docker然后我們可以通過(guò) source 命令后接腳本的絕對(duì)地址或者相對(duì)地址即可執(zhí)行腳本。
source /xxx/daemon.sh
這個(gè)腳本主要是對(duì)Docker服務(wù)進(jìn)行通信加密、服務(wù)認(rèn)證、鏡像加速配置這三個(gè)設(shè)置,使用方式和上一個(gè)腳本一樣。
在執(zhí)行腳本的過(guò)程中,會(huì)提示我們輸入之前創(chuàng)建的證書(shū)和私鑰的存放地址,我們必須填寫(xiě)正確的地址,否則會(huì)導(dǎo)致Docker服務(wù)無(wú)法讀取證書(shū)和私鑰。
4、IDEA連接Docker服務(wù)
下載證書(shū)文件夾到Windows本地,
只需要這三個(gè)文件即可:ca.pem、cert.pem、key.pem 將他們下載到本地并裝入一個(gè)文件夾中

在具體的 IDEA 配置中,可以按照以下步驟進(jìn)行設(shè)置:
- 打開(kāi) IDEA,進(jìn)入 Settings 。
- 導(dǎo)航到 Docker 部分(一般是 Build, Execution, Deployment 下的 Docker)。
- 找到 Connect to Docker daemon with 配置下面的 TCP socket 配置選項(xiàng)
- 在 Engine API URL 中填入Docker服務(wù)連接地址,例如:https://192.168.56.10:2375
- 在 Certificates folder 中選擇裝有三個(gè)證書(shū)文件的文件夾,用以客戶端向服務(wù)端的身份認(rèn)證
- 保存設(shè)置并嘗試連接到 Docker 服務(wù)。

需要注意的是,具體的設(shè)置步驟可能因 IDEA 版本而異,請(qǐng)根據(jù)你使用的版本進(jìn)行適當(dāng)調(diào)整。
5、Maven連接Docker服務(wù)
有時(shí)候我們需要讓自己的項(xiàng)目配置Docker服務(wù)的連接配置,以方便快速進(jìn)行項(xiàng)目打包并部署在Docker中,因此,我們需要如下配置:
<!-- 項(xiàng)目maven插件統(tǒng)一管理 -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
<!-- docker插件,用于制作鏡像 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker-maven.version}</version>
<!-- docker配置 -->
<configuration>
<!-- docker遠(yuǎn)程地址 -->
<dockerHost>${docker.host}</dockerHost>
<!-- docker打包鏡像名稱 -->
<imageName>${docker.image.prefix}/${project.artifactId}:${project.version}</imageName>
<!-- DockerFile的存放位置 -->
<dockerDirectory>${project.basedir}</dockerDirectory>
<!-- 由于docker服務(wù)使用加密通信,開(kāi)啟了認(rèn)證,因此需要提供通信證書(shū) -->
<dockerCertPath>C:\Users\23203\Desktop\linux-ca</dockerCertPath>
<!-- 配置制作鏡像時(shí)需要依賴的資源,此處依賴項(xiàng)目jar包 -->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</pluginManagement>因?yàn)榕渲眠^(guò)長(zhǎng),我只選取關(guān)鍵的部分展示。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker部署MySQL并實(shí)現(xiàn)客戶端連接
這篇文章介紹了Docker部署MySQL并實(shí)現(xiàn)客戶端連接的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01
docker自建GitLab倉(cāng)庫(kù)的實(shí)現(xiàn)
Harbor是一個(gè)用于存儲(chǔ)和分發(fā)Docker鏡像的企業(yè)級(jí)Registry服務(wù)器,本文主要介紹了docker自建GitLab倉(cāng)庫(kù)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
基于Docker搭建Graylog分布式日志采集系統(tǒng)的詳細(xì)過(guò)程
Graylog是一個(gè)開(kāi)源的日志管理工具,支持日志收集、解析、存儲(chǔ)、搜索和可視化,它可以從各種數(shù)據(jù)源收集日志,并通過(guò)內(nèi)置的解析器將日志格式化,本文介紹基于Docker搭建Graylog分布式日志采集系統(tǒng),感興趣的朋友一起看看吧2025-02-02
Docker部署nGrinder性能測(cè)試平臺(tái)過(guò)程解析
這篇文章主要介紹了Docker部署nGrinder性能測(cè)試平臺(tái)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Linux環(huán)境下安裝docker環(huán)境(親測(cè)無(wú)坑)
大家好,本篇文章主要講的是Linux環(huán)境下安裝docker環(huán)境(親測(cè)無(wú)坑),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2021-12-12

