最近用windows安装DockerDeskTop发现使用windows版的docker启动nginx的时候无法使用host模式,启动fastdfs镜像(本质上来说是nginx)时,指定host网络是,无法访问到nginx页面。查阅资料后发现windows安装的docker不支持host共享宿主机网络的这种方式。因此要想做到容器与容器之间互相访问共享网络固定ip的话就要采用别的方式。
docker run -d --restart=always --privileged=true --net=host --name=fastdfs -e IP=172.0.0.1 -e WEB_PORT=80 -v D:/docker/Data:/var/local/fdfs -v D:/docker/Html:/usr/local/nginx/html registry.cn-beijing.aliyuncs.com/tianzuo/fastdfs
这里我把IP改成自己的宿主机ip,本意上想使用host模式使容器公用宿主机的所有端口,这样可以fastdfs就能完美运行了,但是在windows中这样启动后,容器反而无法访问,windows根本没有开启80端口。linux使用此命令可以正常启动。经过反复实验,终于找到了解决方案,且看下文。
这里我们先简单了解下Docker共有四种网络模式
1、host模式,使用“–net=host”指定;
2、container模式,用“–net=container:NAME_or_ID”指定;
3、none模式,用“–net=none”指定;
4、bridge模式
为什么要使用-host模式呢,无非就是docker对于每个容器都有自己的生成的一份ip,而容器与容器之间是默认网络隔离的,我们想要容器之间直接能访问除了使用-host指定共享宿主机网络外,还有三个方法可以实现这种效果。
docker run --name testcontainer --hostname myhostname testimage
给容器绑定上域名后,我们就可以在另一个容器中直接通过域名访问这个容器了
单向的建立A容器访问B容器
docker run -d -p 80:80 --link node-app:node-app --name nginx-proxy nginx-proxy
创建网桥
docker network create --driver=bridge --subnet=172.25.0.0/16 mybridge
启动容器的同时绑定网桥同时设置固定ip
docker run -d --restart=always --network mybridge --ip=172.25.0.4 --privileged=true --name=fastdfs -e IP=172.25.0.4 -e WEB_PORT=80 -p 80:80 -p 22122:22122 -v D:/docker/Data:/var/local/fdfs -v D:/docker/Html:/usr/local/nginx/html registry.cn-beijing.aliyuncs.com/tianzuo/fastdfs
? 启动另一个服务
docker run -d -p 27001:7001 --network=mybridge --ip=172.25.0.2 --name ma-test
base-server
? 使用网桥的好处就是容器之间是共享网络的,双向的,比–link的方式要灵活,而且容器内ip可以指定号,更加可控