ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

docker部署只允许宿主机访问

docker部署只允许宿主机访问 1、简介在 Docker 中实现“只允许宿主机访问”有几种常见方案具体取决于你是用桥接网络还是主机网络以及是否需要跨容器通信。核心原则只要将容器端口绑定在127.0.0.1上外部网络就无法直接访问。2、方案一绑定到宿主机回环地址最推荐这是最标准、最安全的做法。在docker run或docker-compose中将端口映射明确指定为127.0.0.1。1. 使用 docker run 命令docker run -d -p 127.0.0.1:8080:80 nginx效果宿主机上通过curl http://localhost:8080可以访问。外部同局域网其他设备如手机、另一台电脑通过http://宿主机IP:8080无法连接。2. 使用 docker-compose.ymlversion: 3 services: web: image: nginx ports: - 127.0.0.1:8080:80 # 关键写法3、方案二仅使用容器内部端口不映射如果只有宿主机上的其他容器需要访问该服务而宿主机本身不需要通过localhost访问可以不进行端口映射。docker run -d --name myapp nginx此时宿主机curl localhost无法访问。宿主机上的其他容器可以通过容器名称访问需在同一自定义网络中。# 创建网络 docker network create mynet # 运行两个容器 docker run -d --name app1 --network mynet nginx docker run -it --rm --network mynet alpine sh # 在 alpine 容器内执行curl http://app1:80 可以访问4、方案三使用防火墙iptables进行严格限制如果由于某些原因比如必须使用-p 0.0.0.0:8080:80可以借助宿主机防火墙拦截外部流量。在宿主机执行以 Linux iptables 为例# 只允许本机127.0.0.1访问 8080 端口其他全部拒绝 iptables -I INPUT 1 -p tcp --dport 8080 ! -s 127.0.0.1 -j DROP注意Docker 默认会操作 iptables此规则可能与 Docker 自动生成的规则冲突维护较复杂建议优先使用方案一。5、方案四使用 Docker 的--internal网络隔离外部创建一个内部网络容器无法访问外网但宿主机仍可访问容器端口需做端口映射。docker network create --internal isolated-net docker run -d --network isolated-net -p 127.0.0.1:8080:80 nginx容器无法访问互联网安全性高但宿主机仍可通过localhost:8080访问。6、验证方法部署完成后可以在宿主机和外部设备上分别测试# 在宿主机上应该成功 curl http://localhost:8080 # 在另一台电脑上应该超时或拒绝连接 curl http://宿主机IP:80807、补充特殊场景容器内需要访问宿主机服务如果你的需求是“容器只允许宿主机访问”但容器内又需要调用宿主机上的某个服务可以这样配置在容器内使用host.docker.internalMac/Windows或172.17.0.1Linux访问宿主机# Linux 下获取宿主机在 docker0 上的 IP ip addr show docker0 # 通常是 172.17.0.1在容器内执行curl http://172.17.0.1:宿主机端口即可。已存在的容器-重建容器推荐最干净步骤# 1. 停止并删除旧容器注意数据卷不会丢但容器配置会丢 docker stop 容器名 docker rm 容器名 # 2. 用同样的镜像重新创建但加上 127.0.0.1 docker run -d --name 容器名 -p 127.0.0.1:8080:80 其他参数 镜像名问题如果你之前有环境变量、挂载卷等复杂配置重新输入命令容易遗漏。解决方法使用docker inspect导出旧配置# 查看旧容器的完整启动命令 docker inspect 容器名 | grep -A 5 Cmd docker inspect 容器名 | grep -A 10 Env # 或者直接用 --restart 参数生成新命令推荐工具 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike 容器名这会输出完整的docker run命令你复制出来把-p 8080:80改成-p 127.0.0.1:8080:80再执行即可。
返回列表