Skip to content

配置

安装

chmod +x install_docker.sh
./install_docker.sh

配置网络访问1

编辑 Docker 的服务配置文件(路径中的 lib 也可能是 etc):

sudo vim /lib/systemd/system/docker.service

可以看到,Docker 启动指令是这样的:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

这里的 -H fd:// 表示监听文件描述符 Socket,以实现 Docker 的服务激活功能。 我们需要添加 -H tcp://0.0.0.0:2375 来让 Docker 监听 2375 端口,但只添加这一个参数会使我们无法使用 docker 终端命令,所以再添加一个 -H unix:///var/run/docker.sock 来保持对终端指令的响应。 最终编辑为:

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock然后重启 Docker:sudo 
systemctl daemon-reload
sudo systemctl restart docker.service

配置网络访问2

通过文档可以得知,dockerd 的 -H 启动指令其实对应了 daemon.json 中的 hosts 配置项,所以我们可以通过 daemon.json 来配置,这样就不需要修改 dockerd 的服务配置了。编辑 daemon.json,如果没有则先创建:sudo vim /etc/docker/daemon.json添加以下键值对并保存:{ "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"] } 这样操作,达成的效果和第一种方法中的添加 -H 是一样。但是,存在 一个问题 一直没有解决,那就是因为 dockerd 的服务配置默认有一个 -H fd:// 配置, 在 daemon.json 中配置 hosts 会导致和启动指令冲突,而我们的目的是避免修改服务配置,所以,需要使用一种方式覆盖原始的服务配置。 解决方法:创建一个配置文件:/etc/systemd/system/docker.service.d/override.conf,这一步可能要切换成 root 用户来进行; 编辑填入以下内容:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock

然后重启 Docker 服务即可。 这种方式不用修改 dockerd 的原始服务配置。

限制容器内访问外网

version: '3'
services:
  app:
    image: www.51it.wang/lcry-photo:latest
    networks:
      - private
networks:
  private:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.enable_ip_masquerade: 'false' # 重要的就是这一行

# IP 伪装(IP Masquerading):
# 当容器通过 Docker 网络与外部网络通信时,Docker 会自动将容器的私有 IP 地址转换为主机的公共 IP 地址。这样,外部网络设备看到的流量似乎是来自主机的,而不是来自容器。
# 这种技术使得容器可以访问外部网络,同时隐藏容器的真实 IP 地址。

# com.docker.network.bridge.enable_ip_masquerade:
# 这个参数控制是否启用 IP 伪装。
# 如果设置为 true,Docker 会启用 IP 伪装,允许容器通过主机的 IP 地址与外部网络通信。
# 如果设置为 false,Docker 不会启用 IP 伪装,容器将无法通过主机的 IP 地址与外部网络通信。

限速网络

docker network create \
  --driver=bridge \
  --subnet=192.168.0.0/16 \
  --opt "com.docker.network.bandwidth.ingress"="10M" \
  --opt "com.docker.network.bandwidth.egress"="10M" \
  limited-network

容器权限

  • Docker特权模式:--privileged、--cap-add、--cap-drop
# –privileged
# --privileged      Give extended privileges to this container

# –cap-add、–cap-drop
# --cap-add     Add Linux capabilities
# --cap-drop        Drop Linux capabilities


# 限制网络访问
# NET_RAW:禁用 RAW 和 PACKET 套接字,限制网络访问。
# NET_ADMIN:禁用网络管理功能,限制网络配置。
# docker run --cap-drop=NET_RAW --cap-drop=NET_ADMIN -d your_image



镜像

  • 修改 /etc/docker/daemon.json
{
    "registry-mirrors": ["https://hub.gog.email"]
}

自建镜像

运行 Docker Registry 容器
docker run -d -p 5000:5000 --name registry registry:2
验证 Docker Registry 是否运行
curl http://localhost:5000/v2/

在推送镜像之前,你需要先将本地镜像标记为自建仓库的镜像。假设你有一个名为 myapp 的本地镜像,你可以使用以下命令进行标记:
docker tag myapp:latest localhost:5000/myapp:latest

推送镜像
docker push localhost:5000/myapp:latest

拉取镜像
docker pull localhost:5000/myapp:latest
  • 修改 /etc/docker/daemon.json
{
    "insecure-registries" : ["localhost:5000"]
}
  • 重启
systemctl daemon-reload
sudo systemctl restart docker