Docker安装, 以及使用Nftables

参考Install Docker on Debian镜像加速器-Docker-从入门到实践:

安装必要组件:

1
2
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release

设置Docker源:

1
2
3
4
5
6
# 腾讯云镜像源
curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
# 国内网络不推荐使用官方源
# curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://mirrors.cloud.tencent.com/docker-ce/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装Docker:

1
2
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

查看Docker版本:

1
docker version

将某一普通用户添加到Docker用户组中:

1
sudo usermod -aG docker UserName

设置Docker开机自启:

1
sudo systemctl enable docker.service

参考镜像加速器-Docker-从入门到实践:

编辑文件/etc/docker/daemon.json并添加以下内容, 如不存在就新建:

1
2
3
4
5
{
   "registry-mirrors": [
       "https://mirror.ccs.tencentyun.com"
  ]
}

重启Docker:

1
sudo systemctl restart docker.service

执行docker info, 如结果中有镜像源地址, 则说明配置成功。

1
2
Registry Mirrors:
 https://mirror.ccs.tencentyun.com/

编辑文件/etc/docker/daemon.json并添加以下内容:

1
2
3
{
   "iptables":false
}

重启Docker后生效:

1
sudo systemctl restart docker.service

但这样会使docker很多地方都会受到影响, 甚至会出现不能用的情况。

参考Nftables#Working with Docker:

一种可靠的方法是让docker在单独的网络名称空间中运行, 在那里它可以做任何它想做的事情。

编辑/etc/systemd/system/docker.service.d/netns.conf并写入以下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[Service]
PrivateNetwork=yes

# cleanup
ExecStartPre=-nsenter -t 1 -n -- ip link delete docker0

# add veth
ExecStartPre=nsenter -t 1 -n -- ip link add docker0 type veth peer name docker0_ns
ExecStartPre=sh -c 'nsenter -t 1 -n -- ip link set docker0_ns netns "$$BASHPID" && true'
ExecStartPre=ip link set docker0_ns name eth0

# bring host online
ExecStartPre=nsenter -t 1 -n -- ip addr add 10.0.0.1/24 dev docker0
ExecStartPre=nsenter -t 1 -n -- ip link set docker0 up

# bring ns online
ExecStartPre=ip addr add 10.0.0.100/24 dev eth0
ExecStartPre=ip link set eth0 up
ExecStartPre=ip route add default via 10.0.0.1 dev eth0

如果10.0.0.*IP地址不适合你的设置, 请调整它们。

在nftables的nat表的postrouting链中添加以下规则为docker0启用IP转发并设置NAT:

1
iifname docker0 oifname eth0 masquerade

然后, 确保Enable packet forwarding

现在, 你可以使用nftables为docker0接口设置防火墙和端口转发, 而不会产生任何干扰。