官方脚本

1
curl -fsSL https://get.docker.com | bash -s docker

官方脚本+阿里云镜像

1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 

官方脚本镜像

适合连接不上get.docker.com时使用

1
curl -fsSL https://bash.foreverlink.love/dockerinstall.sh | bash -s docker --mirror Aliyun 

清华源全镜像

1
export DOWNLOAD_URL="https://mirrors.tuna.tsinghua.edu.cn/docker-ce" && curl -fsSL https://raw.githubusercontent.com/docker/docker-install/master/install.sh | sh

增加权限

1
2
3
4
su root
sudo groupadd docker #添加用户组
sudo gpasswd -a username docker #将当前用户添加至用户组
newgrp docker #更新用户组

换源

Docker 镜像加速站集合 - License server

1
2
3
4
5
6
7
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://a.ussh.net"]
}
EOF

sudo systemctl daemon-reload && sudo systemctl restart docker

portainer安装

Home | Portainer Documentation

1
2
3
4
5
# 如果计划使用https
docker volume create portainer_data && docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

# 直接Http
docker volume create portainer_data && docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

访问ip:9000页面后 设置账号 admin/adminadminadmin

如果页面提示以下信息,则按提示信息重启portainer容器即可:

1
2
3
# Your Portainer instance timed out for security purposes. To re-enable your Portainer instance, you will need to restart Portainer.

docker restart portainer

docker远程连接

开启docker远程连接

  1. 检查 Docker 的 systemd 配置文件(/lib/systemd/system/docker.service),确保 ExecStart 中没有 -H 参数。如果有,将其移除。

    1
    2
    3
    4
    sudo vim /lib/systemd/system/docker.service
    # ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    # 改为如下
    ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
  2. 编辑 /etc/docker/daemon.json

    1
    2
    3
    {
    "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
    }
  3. 重新加载 systemd 配置并重启 Docker:

    1
    sudo systemctl daemon-reload; sudo systemctl restart docker

IDEA连接

  1. Index of win/static/stable/x86_64/中选择最新的 docker,解压到任意目录
  2. 进入 File > Settings > Build, Execution, Deployment > Docker。选择docker.exe解压的位置,点击确定
  3. 点击 + 添加新连接,选择 TCP socket
  4. 输入服务器地址和端口(如 tcp://your-server-ip:2375)。
  5. 测试连接,成功后保存。

使用 TLS 加密连接

通过使用 TLS(传输层安全协议)加密连接,可以防止数据在传输过程中被窃取或篡改,同时也能对客户端和服务器进行身份验证。

  1. 创建证书目录

    1
    2
    mkdir -p ~/docker-certs
    cd ~/docker-certs
  2. 一台机器上生成CA 私钥和CA 证书

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 生成 CA 私钥:ca-key.pem
    openssl genrsa -aes256 -out ca-key.pem 4096
    # 设置一个密码来保护私钥: 123456
    # 生成 CA 证书:
    openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
    # 输入之前设置的密码。123456
    # 填写 CA 的相关信息(如国家、组织等)。
    Country Name (2 letter code) [AU]:CN
    State or Province Name (full name) [Some-State]:SHANGHAI
    Locality Name (eg, city) []:SHANGHAI
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Personal
    Organizational Unit Name (eg, section) []:Personal Use
    Common Name (e.g. server FQDN or YOUR name) []:
    Email Address []:

  3. 共享 CA

    注意:ca-key.pem 是 CA 的私钥,必须严格保护,不能泄露。

    1
    2
    3
    4
    5
    # 将生成的 ca.pem 和 ca-key.pem 文件安全地分发给其他 4 台机器。
    scp ~/docker-certs/* sun@192.168.61.111:~/docker-certs
    scp ~/docker-certs/* sun@192.168.61.112:~/docker-certs
    scp ~/docker-certs/* sun@192.168.61.113:~/docker-certs
    scp ~/docker-certs/* sun@192.168.61.114:~/docker-certs
  4. 生成服务器证书

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    # 生成服务器私钥:
    openssl genrsa -out server-key.pem 4096
    # 生成证书签名请求(CSR):将 <服务器IP或域名> 替换为服务器的实际 IP 或域名。
    # openssl req -subj "/CN=<服务器IP或域名>" -sha256 -new -key server-key.pem -out server.csr
    # 创建扩展配置文件(extfile.cnf):将 <服务器域名> 和 <服务器IP> 替换为实际值。
    # echo subjectAltName = DNS:<服务器域名>,IP:<服务器IP>,IP:127.0.0.1 > extfile.cnf
    # echo extendedKeyUsage = serverAuth >> extfile.cnf
    openssl req -subj "/CN=192.168.61.110" -sha256 -new -key server-key.pem -out server.csr
    echo subjectAltName = IP:192.168.61.110,IP:127.0.0.1 > extfile.cnf
    echo extendedKeyUsage = serverAuth >> extfile.cnf

    openssl req -subj "/CN=192.168.61.111" -sha256 -new -key server-key.pem -out server.csr
    echo subjectAltName = DNS:node01,IP:192.168.61.111,IP:127.0.0.1 > extfile.cnf
    echo extendedKeyUsage = serverAuth >> extfile.cnf

    openssl req -subj "/CN=192.168.61.112" -sha256 -new -key server-key.pem -out server.csr
    echo subjectAltName = DNS:node02,IP:192.168.61.112,IP:127.0.0.1 > extfile.cnf
    echo extendedKeyUsage = serverAuth >> extfile.cnf

    openssl req -subj "/CN=192.168.61.113" -sha256 -new -key server-key.pem -out server.csr
    echo subjectAltName = DNS:node03,IP:192.168.61.113,IP:127.0.0.1 > extfile.cnf
    echo extendedKeyUsage = serverAuth >> extfile.cnf

    openssl req -subj "/CN=192.168.61.114" -sha256 -new -key server-key.pem -out server.csr
    echo subjectAltName = DNS:node04,IP:192.168.61.114,IP:127.0.0.1 > extfile.cnf
    echo extendedKeyUsage = serverAuth >> extfile.cnf



    # 在每台机器上使用共享的 CA 签名服务器证书:
    openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
    -CAcreateserial -out server-cert.pem -extfile extfile.cnf
    # 输入ca密码

    # 删除不必要的文件:
    rm -v server.csr extfile.cnf
  5. 生成客户端证书

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 生成客户端私钥:
    openssl genrsa -out key.pem 4096

    # 生成证书签名请求(CSR):
    openssl req -subj "/CN=client" -new -key key.pem -out client.csr
    # 创建扩展配置文件(extfile-client.cnf):
    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

  6. 设置文件权限

    1
    2
    chmod -v 0400 ca-key.pem key.pem server-key.pem
    chmod -v 0444 ca.pem server-cert.pem cert.pem

配置 Docker 使用 TLS

  1. 将生成的证书文件复制到 Docker 的配置目录:

    1
    2
    sudo cp ~/docker-certs/{ca.pem,server-cert.pem,server-key.pem} /etc/docker/
    sudo chown -R root:root /etc/docker
  2. 编辑 Docker 的配置文件 /etc/docker/daemon.json,添加以下内容:

    1
    2
    3
    4
    5
    6
    7
    {
    "tls": true,
    "tlscacert": "/etc/docker/ca.pem",
    "tlscert": "/etc/docker/server-cert.pem",
    "tlskey": "/etc/docker/server-key.pem",
    "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"]
    }
  3. 重启 Docker 服务以应用配置:

    1
    sudo systemctl daemon-reload; sudo systemctl restart docker
  4. 客户端配置,将以下文件从服务器复制到客户端机器:

    • ca.pem

    • cert.pem

    • key.pem

生成证书和密钥脚本

hostname -I 命令返回的是服务器上所有网络接口的 IP 地址,多个网卡必须改为服务器真实域名或IP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
vim generate_docker_tls.sh

#!/bin/bash

# 相关配置信息
SERVER=$(hostname -I | awk '{print $1}') #"your_server_domain_or_ip" # 重要!必须改为服务器真实域名或IP
PASSWORD="XyZ@123abc!#$"
COUNTRY="CN"
STATE="SHANGHAI"
CITY="SHANGHAI"
ORGANIZATION="Personal"
ORGANIZATIONAL_UNIT="Personal Use"
EMAIL="yourname@example.com"

### 开始生成文件 ###
echo "开始生成文件"

# 创建目标目录并进入(自动处理目录不存在的情况)
mkdir -p /etc/docker && cd /etc/docker || exit 1

# 生成 CA 私钥(使用 aes256 加密)
openssl genrsa -aes256 -passout pass:"$PASSWORD" -out ca-key.pem 4096

# 生成 CA 证书
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/emailAddress=$EMAIL"

# 生成服务器私钥
openssl genrsa -out server-key.pem 4096

# 生成服务器证书请求
openssl req -subj "/CN=$SERVER" -sha256 -new -key server-key.pem -out server.csr

# 创建服务器证书扩展配置文件
echo "subjectAltName = IP:$SERVER,IP:0.0.0.0" > server-extfile.cnf
echo "extendedKeyUsage = serverAuth" >> server-extfile.cnf

# 生成服务器证书
openssl x509 -req -days 3650 -sha256 -in server.csr \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-passin "pass:$PASSWORD" \
-out server-cert.pem -extfile server-extfile.cnf

# 生成客户端私钥
openssl genrsa -out key.pem 4096

# 生成客户端证书请求
openssl req -subj '/CN=client' -new -key key.pem -out client.csr

# 创建客户端证书扩展配置文件
echo "extendedKeyUsage = clientAuth" > client-extfile.cnf

# 生成客户端证书
openssl x509 -req -days 3650 -sha256 -in client.csr \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-passin "pass:$PASSWORD" \
-out cert.pem -extfile client-extfile.cnf

# 设置权限
chmod 0400 ca-key.pem key.pem server-key.pem
chmod 0444 ca.pem server-cert.pem cert.pem

# 清理临时文件
rm -f client.csr server.csr server-extfile.cnf client-extfile.cnf

echo "生成文件完成"
### 生成结束 ###
  1. 赋予执行权限:在终端中执行以下命令,为脚本添加执行权限:

    1
    2
    chmod +x generate_docker_tls.sh
    sudo ./generate_docker_tls.sh
  2. 查看证书

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ll /etc/docker

    -r-------- 1 root root 3.4K 2月 6日 03:15 ca-key.pem
    -r--r--r-- 1 root root 2.2K 2月 6日 03:15 ca.pem
    -rw-r--r-- 1 root root 41 2月 6日 03:16 ca.srl
    -r--r--r-- 1 root root 2.0K 2月 6日 03:16 cert.pem
    -rw-r--r-- 1 root root 51 2月 4日 23:47 daemon.json
    -r-------- 1 root root 3.2K 2月 6日 03:16 key.pem
    -r--r--r-- 1 root root 2.1K 2月 6日 03:15 server-cert.pe

    这些文件是 Docker TLS 认证机制正常工作所必需的:

    • **ca-key.pem**:CA(证书颁发机构)的私钥文件,用于签署服务器和客户端证书。它使用 AES256 加密,权限设置为只有所有者可读写(-r--------),以保证安全性。
    • **ca.pem**:CA 的证书文件,客户端和服务器使用它来验证对方证书的有效性。
    • **server-cert.pem**:服务器的证书文件,用于向客户端证明服务器的身份。
    • **server-key.pem**:服务器的私钥文件,与 server-cert.pem 配对使用,用于加密和解密通信数据。
    • **cert.pem**:客户端的证书文件,用于向服务器证明客户端的身份。
    • **key.pem**:客户端的私钥文件,与 cert.pem 配对使用,用于加密和解密通信数据。