理解ref="/tag/2019/" style="color:#E3A3CF;font-weight:bold;">Docker镜像与网络的关系
Docker镜像本身并不直接包含网络配置,它更像是一个静态的“打包程序”,里面包含了应用运行所需的所有依赖和文件。真正涉及网络的部分,是在容器启动时由Docker引擎根据镜像创建容器,并为其分配网络环境。
比如你在公司开发一个Web服务,打包成镜像后推送到测试环境。虽然镜像没变,但测试环境里这个容器可能要连数据库、要被前端访问,这时候网络配置就变得关键了。
默认网络模式:bridge
当你运行一个容器而没有指定网络时,Docker会自动使用默认的bridge网络。这种模式下,容器通过虚拟网桥与宿主机通信,拥有独立的IP地址,但仅在本机内部可访问。
docker run -d --name web-app nginx上面这条命令启动的Nginx容器,默认就在bridge网络中。你可以通过宿主机的端口映射让外部访问:
docker run -d -p 8080:80 --name web-site nginx这样访问宿主机的8080端口,就能看到Nginx页面了。
自定义网络提升管理效率
多个容器之间经常需要互相通信,比如后端服务要调用Redis缓存。使用默认bridge容易造成IP混乱,推荐创建自定义网络。
docker network create app-network创建完成后,把相关容器加入这个网络:
docker run -d --name backend --network app-network my-backend:latest
docker run -d --name redis --network app-network redis这样一来,backend容器可以直接用redis这个名字访问Redis服务,Docker内置的DNS会自动解析,就像公司内网里用“财务系统”而不是IP地址去访问一样方便。
其他常用网络类型
host模式适合对网络性能要求高的场景,容器直接使用宿主机的网络栈,省去中间层。启动时加上--network=host即可:
docker run -d --network=host --name high-perf-app my-app不过要注意端口冲突问题,因为不再隔离。
如果容器只需要访问外网而不希望被外部访问,可以用none模式:
docker run -d --network=none --name private-worker worker-image这种容器完全没有网络接口,适合跑一些纯计算任务。
容器间通信的最佳实践
避免在代码里写死IP地址。假设你把MySQL容器的IP写进配置文件,一旦重启IP变了,服务就断了。正确的做法是利用自定义网络+服务名访问。
另外,生产环境中常结合Docker Compose统一管理网络和容器。例如在docker-compose.yml中定义网络:
version: '3'
services:
web:
image: nginx
networks:
- app-net
api:
image: my-api
networks:
- app-net
networks:
app-net:
driver: bridge执行docker-compose up后,web和api自动在同一网络下,可以自由通信。
网络配置看着复杂,其实核心就是:镜像不带网络设置,容器运行时才决定怎么联网。搞清楚这一点,再根据实际需求选择合适的网络模式,就能避免大多数连接问题。