一、Docker 服务端配置

1. 配置 Docker 远程连接端口

首先,新建或修改 /etc/systemd/system/docker.service.d/override.conf 文件,确保其内容如下:

1
2
3
4
## Add this to the file for the docker daemon to use different ExecStart parameters (more things can be added here)
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

接着,在 /etc/docker/daemon.json 文件中(如果没有则新建),添加以下内容。请使用您自己的镜像地址,不必强制使用示例中的地址:

1
2
3
4
5
6
7
{
"registry-mirrors": ["https://2v6jvius.mirror.aliyuncs.com"],
"hosts": [
"unix:///var/run/docker.sock",
"tcp://0.0.0.0:2375"
]
}

然后重启服务:

1
2
systemctl daemon-reload
systemctl restart docker

通过以下命令检查端口是否成功开放:

1
netstat -anp | grep 2375

如果看到类似以下的输出,说明端口开放成功:

image-20250117141832092

接下来,输入以下命令以确认 Docker 端口暴露成功:

1
docker -H 192.168.56.10 ps

若能显示 Docker 的基本信息,说明端口暴露成功。

2. Docker 安全连接

Docker 开放端口后,只要知道 IP 和端口号就可以随意管理镜像和容器,这样的安全性很差。在生成环境中,建议使用证书来安全地连接和管理 Docker。

注意: 一定需要切换到 root 用户执行以下步骤。

创建脚本

新建脚本 dockerAuth.sh,将以下内容复制到脚本中。记得修改 IP 地址和密码(随便填写一个,不要使用中文),以及目录 dir/root/docker

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
#!/bin/sh
ip=服务器ip
password=证书密码
dir=/root/docker

if [ ! -d "$dir" ]; then
echo ""
echo "$dir 不存在,将创建"
echo ""
mkdir -p $dir
else
echo ""
echo "$dir 已存在,将删除并重新创建"
echo ""
rm -rf $dir
mkdir -p $dir
fi

cd $dir
# 创建根证书RSA私钥
openssl genrsa -aes256 -passout pass:$password -out ca-key.pem 4096
# 创建CA证书
openssl req -new -x509 -days 365 -key ca-key.pem -passin pass:$password -sha256 -out ca.pem -subj "/C=NL/ST=./L=./O=./CN=$ip"
# 创建服务端私钥
openssl genrsa -out server-key.pem 4096
# 创建服务端签名请求证书文件
openssl req -subj "/CN=$ip" -sha256 -new -key server-key.pem -out server.csr

echo subjectAltName = IP:$ip,IP:0.0.0.0 >> extfile.cnf

echo extendedKeyUsage = serverAuth >> extfile.cnf
# 创建签名生效的服务端证书文件
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.cnf
# 创建客户端私钥
openssl genrsa -out key.pem 4096
# 创建客户端签名请求证书文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr

echo extendedKeyUsage = clientAuth >> extfile.cnf

echo extendedKeyUsage = clientAuth > extfile-client.cnf
# 创建签名生效的客户端证书文件
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
# 删除多余文件
rm -f -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

赋予脚本执行权限

1
chmod 777 dockerAuth.sh

执行脚本

1
sh dockerAuth.sh

image-20250117142636482

配置 Docker

修改 /etc/docker/daemon.json 文件,将以下配置添加到文件中:

1
2
3
4
5
6
7
{
"tls": true,
"tlsverify": true,
"tlscacert": "/root/docker/ca.pem",
"tlscert": "/root/docker/server-cert.pem",
"tlskey": "/root/docker/server-key.pem"
}

重启 Docker

1
2
systemctl daemon-reload
systemctl restart docker

将证书文件复制到 Windows

/root/docker 目录下的证书文件夹复制到 Windows 机器上。

image-20250117145809696

测试效果

1
https://192.168.56.10:2375/info
1
https://192.168.56.10:2375/info --cert /root/docker/cert.pem --key /root/docker/key.pem --cacert /root/docker/ca.pem

二、客户端连接 Docker

加密:

image-20250117155508881

无加密:改为tcp://192.168.56.10:2375即可

连接成功:

image-20250117160000329

三、操作镜像和容器

1. Docker Image 方式

在 IDEA 的设置中(File -> Settings -> Docker),新建连接:

image-20250117160106840

镜像拉取

注意,写 Docker 镜像地址时,需要在镜像名称后面指定版本号。如果不指定,IDEA 会默认使用 latest

image-20250117160215127

image-20250117160227252

image-20250117160241628

目前大部分镜像加速已经不可用。需要去找合适的加速地址。docker在国内已经被墙了。

容器创建与运行

image-20250117160445073

新的 IDEA 版本可能需要额外的参数配置:

image-20250117160521122

创建成功后,可以在服务器上查看新创建的容器:

image-20250117160540768

进行容器的重启、停止和删除等操作:

image-20250117160856846

2. Dockerfile 方式

有关 Dockerfile 的介绍,请参考这篇文章:Dockerfile 介绍

创建一个测试项目:

image-20250117160957462

创建 Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
# 该镜像需要依赖的基础镜像
FROM dp-imoyt.onrender.com/docker.io/openjdk:8
# 将当前目录下的jar包复制到docker容器的/目录下
ADD target/mall-tiny-1.0.0-SNAPSHOT.jar /mall-tiny-1.0.0-SNAPSHOT.jar
# 设置时区
RUN echo "Asia/Shanghai" > /etc/timezone
# 声明服务运行在8080端口
EXPOSE 8080
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java", "-jar","/mall-tiny-1.0.0-SNAPSHOT.jar"]
# 指定维护者的名字
MAINTAINER imoyt

image-20250117161038327

image-20250117161124692

1
clean package -U -DskipTests

在”Run Maven Goal”中输入 clean package -U -DskipTests,表示每次构建镜像之前都会清理并重新编译构建

成功构建并部署镜像后,可以在 Docker 上运行容器:

image-20250117161245193

在浏览器访问地址 http://192.168.56.10:8001/hello

3. Docker-Compose 方式

关于 Docker-Compose 的介绍,请参考这篇文章:Docker-Compose 介绍。主要功能是:通过 docker-compose.yml 文件编排运行容器