在 Debian 上安装 Docker 作者: Hogwarts 发布于: 2023-01-01 更新于: 2023-03-18 分类: 默认分类 #一、使用存储库方法安装 ##1.1 设置存储库 ###1.1.1 更新apt包索引并安装包以允许apt通过 HTTPS 使用存储库 sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release ###1.1.2 添加 Docker 的官方 GPG 密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg ###1.1.3 使用以下命令设置存储库 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null ##1.2 安装 Docker 引擎 ###1.2.1 更新 apt 包索引 sudo apt-get update ###1.2.2 安装 Docker Engine、containerd 和 Docker Compose sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin ###1.2.3 通过运行 hello-world 镜像验证 Docker Engine 安装是否成功 sudo docker run hello-world ##1.3 注意iptables ### Docker安装完成后,会接管iptables,只要运行 `docker run` 命令,就会自动向iptables中添加规则。并且不受UFW或Firewall的限制。解决方法见第六节。 #二、Docker 操作基础命令 ##2.1 Dorker 运行命令 查看 Docker 安装版本等信息 docker version 启动 Docker 服务 systemctl start docker 查看 Docker 运行状态 systemctl status docker ##2.2 容器操作命令 查看容器在线状态及大小 docker ps -as 查看容器的运行输出日志 docker logs $name 重新启动容器 docker restart $name 停止容器 docker stop $name 移除容器 docker rm $name 查看镜像 docker images 删除镜像 docker rmi id #id是镜像的id #三、卸载旧版本 ##3.1 卸载 Docker Engine、CLI、containerd 和 Docker Compose 包 sudo apt-get remove docker docker-engine docker.io containerd runc ##3.2 删除所有镜像、容器和卷 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd #四、参考 1. [在 Debian 上安装 Docker 引擎](https://docs.docker.com/engine/install/debian/ "在 Debian 上安装 Docker 引擎") 1. [使用 Docker 快速部署 Shadowsocks-libev + v2ray-plugin](https://teddysun.com/569.html "使用 Docker 快速部署 Shadowsocks-libev + v2ray-plugin") #五、多说一句 - 原先多少对 Docker 有些偏见。 - 近期使用才发现,可以避免编译或配置的好多问题,简直是太方便了。 - 官方文档不大建议一键安装用于生产环境。 - 附 Docker 一键安装脚本 `wget -qO- get.docker.com | bash` #六、Docker与防火墙的问题 Docker会越过防火墙前端ufw或firewall更改iptables,从而使容器运行端口暴露。具体问题可自行Google。 **推荐使用前两个** ##6.1 Docker 容器不使用网络配置 - docker run 时加 `--network host`或 `--net=host` 或 `--net host` 选项,未充分测试。 - 详情请Google:Docker容器的四种网络模式 - 容器不再分配IP和端口,使用宿主机的网络配置。 ##6.2 Docker 仅对本机有效 docker run -p 宿主机端口:容器端口 时 将宿主机端口改为 127.0.0.1:宿主机端口:容器端口 使容器端口仅对本机有效 ##6.3 Docker禁用iptables规则 #查看Docker容器使用的端口 iptables -L DOCKER #修改Docker启动配置,禁用iptables规则 vim /lib/systemd/system/docker.service 在ExecStart选项后面加上 --iptables=flase #重启Docker使生效 systemctl daemon-reload systemctl restart docker systemctl status docker **此种方法会出现的问题是Docker容器间无法访问,而且容器无法访问外部网络。** ###6.3.1 解决方法Debian系UFW的设置 ####6.3.1.1 启用封包转发 ufw default allow routed ####6.3.1.2 添加转发规则 vim /etc/ufw/before.rules 加上以下内容 *nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING ! -o net -s 172.18.0.0/16 -j MASQUERADE COMMIT net为当前网桥的名称,可通过ifconfig查看,172.18.0.0/16为网桥的子网段,查看命令 docker network inspect net | grep Subnet ####6.3.1.3 重启ufw ufw reload ####6.3.1.4 参考 [无视系统防火墙的docker](https://www.binss.me/blog/docker-pass-through-system-firewall/ "无视系统防火墙的docker") ##6.3.2 解决方法Centos系Firewall的设置 firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD_direct 0 -i eth0 -j ACCEPT #eth0为宿主机网卡名 firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD_direct 0 -o eth0 -j ACCEPT firewall-cmd --zone=public --add-masquerade #默认docker0在public zone里 firewall-cmd --reload 缺点:容器内无法获取得到客户端的真实 IP ##6.4 使用 expose 方式暴露端口,然后采用 nginx 代理转发 操作太繁琐了,感兴趣的话,可学习这两篇文章。 [docker开放的端口是如何实现绕过防火墙的?](https://www.zhihu.com/question/64616650?utm_id=0 "docker开放的端口是如何实现绕过防火墙的?") [解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题](https://blog.51cto.com/u_15069438/4537315 "解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题") 标签: docker