僅僅開放遠程訪問Docker API,這個還不夠的,由於會有安全問題。關於這點,Docker有相關的安全機制,參考官方文檔Protect the Docker daemon socket,大體就是:生成證書,用來達到驗證客戶端身份的目的。docker
下面是操做步驟:json
mkdir -pv /etc/docker/certs cd /etc/docker/certs
須要連續輸入兩次相同的密碼安全
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=123.123.123.123" -sha256 -new -key server-key.pem -out server.csr
0.0.0.0表示全部ip均可以鏈接。(這裏須要注意,雖然0.0.0.0能夠匹配任意,可是仍須要配置你的外網ip和127.0.0.1,不然客戶端會鏈接不上)bash
echo subjectAltName = IP:0.0.0.0,IP:123.123.123.123,IP:127.0.0.1 >> extfile.cnf
或者也能夠設置成域名服務器
echo subjectAltName = DNS:www.example.com,IP:123.123.123.123,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out server-cert.pem -extfile extfile.cnf
openssl genrsa -out key.pem 4096
openssl req -subj "/CN=123.123.123.123" -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile-client.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out cert.pem -extfile extfile-client.cnf
rm -v client.csr server.csr extfile.cnf extfile-client.cnf
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
拷貝安裝包單元文件到/etc,這樣就不會由於docker升級而被覆蓋curl
cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
在ExecStart=/usr/bin/dockerd-current \
下面增長socket
--tlsverify \ --tlscacert=/etc/docker/certs/ca.pem \ --tlscert=/etc/docker/certs/server-cert.pem \ --tlskey=/etc/docker/certs/server-key.pem \ -H tcp://0.0.0.0:2376 \ -H unix:///var/run/docker.sock \
systemctl daemon-reload systemctl restart docker
mkdir -pv ~/.docker/certs/ cd ~/.docker/certs/
ca.pem
cert.pem
key.pem
這3個文件拷貝到當前目錄scp ca.pem ./ scp cert.pem ./ scp key.pem ./
docker --tlsverify \ --tlscacert=/home/alex/.docker/certs/ca.pem \ --tlscert=/home/alex/.docker/certs/cert.pem \ --tlskey=/home/alex/.docker/certs/key.pem \ -H=123.123.123.123:2376 version
curl https://123.123.123.123:2376/images/json \ --cert ~/.docker/certs/cert.pem \ --key ~/.docker/certs/key.pem \ --cacert ~/.docker/certs/ca.pem
# 配置~/.zshrc(或者~/.bashrc,根據你的客戶端環境而定),在末尾添加如下幾行 export DOCKER_HOST=tcp://123.123.123.123:2376 DOCKER_TLS_VERIFY=1 export DOCKER_CERT_PATH=~/.docker/certs/ # 而後讓加載到當前會話 source .zshrc # 測試 docker ps
務必很是當心保管這些key,它們就跟服務器root密碼同樣重要(衆所周知docker是能夠進行真實主機提權的)