网站首页 文章专栏 docker基础学习(三)----容器固定IP

docker基础学习(三)----容器固定IP

编辑时间:2021-11-22 16:48:21 作者:苹果 浏览量:5738




经过前两章的学习,可以搭建一个基础的web网站构架,算是摸到了门槛边缘, 真正开始学习现在才开始。


经过最初始的配置,多次重启服务器发现容器的ip总是变动的,这时候就要去了解下docker 的网络模式了。


大致的概念:

    docker 有四种网络模式:

    host模式:容器和宿主机共享Network namespace。

    container模式:容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。

    none模式 –net=none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。这个

    bridge模式 –net=bridge (默认为该模式)此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。



用通俗易懂来说的话,默认 的是bridge 联网模式,就类似一个名字为 docker0 ,网关地址为 172.17.0.1 的路由器,所有容器则都连接在这个路由器上,随机分配 IP 地址,IP 地址范围为 172.17.0.2—172.17.0.254。容器之间的通信可以直接使用内网 IP 地址进行,但默认这个 “路由器” 的缺点也十分明显,无法给容器设定固定 IP。在有多个容器存在的情况下,由于启动有先后,因此会造成容器 IP 地址出现变化。


而 host 模式则等同于容器直接使用物理机网络,这种联网模式需要创建容器时手动指定参数,宿主机的 IP 就是容器的 IP,端口也可以直接调用。

此模式的缺点是容易造成宿主机和容器端口冲突,而且降低了安全性,在有多个容器的情况下使用也不方便,一般此模式很少使用。


container模式即新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。这个容器少多点就很绕,不建议使用。


最后则是 none 模式,也就是容器默认不联网的模式,此模式实际一般也不用,了解一下即可。


另外还有两种更高级的网络模式,overlay 和 macvlan,分别用于跨宿主机的容器通信和给每个容器分配一个 mac 地址,这两个模式初期单机模式基本用不到,后续会学习。


我们使用 bridge模式 创建一个自定义ip的容器组。

查看docker网络:

    docker network ls

    ls.jpg


因为默认的bridge网桥模式不支持自定义ip,所以我们必须自定义一个网桥

创建一个自定义的网桥:

    docker network create --subnet=172.0.0.0/16 default-network    
    docker nerwork inspect default-network  #查看网络信息

    inspect.jpg


    此时在宿主机上可以查看到新增加的网卡:

    ip-addr.jpg


    

重新配置一套web项目容器组,并且在创建的时候直接指定到自己新建的网关上。

#nginx留在默认网关

nginx:

docker run --name nginx -p 80:80 -v /data/docker/www/:/data/www   -v /data/docker/nginx/conf.d/:/etc/nginx/conf.d -d nginx


php、mysql、redis 指定在新建的网关上,并且定义ip,这三个最好保持在同一个网段上,这样直接可以相互ping 通

docker run --name php -p 9000:9000  --net=default-network --ip=172.0.0.3   -v /data/docker/www:/data/www -d php:8.0-fpm
docker run -p 6379:6379 --name redis  --net=default-network --ip=172.0.0.20   -v /data/docker/redis/redis.conf:/etc/redis/redis.conf  -v /data/docker/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
docker run -p 3306:3306 --name mysql   --net=default-network --ip=172.0.0.10   -v /data/docker/mysql/conf:/etc/mysql/conf.d   -v /data/docker/mysql/logs:/var/log/mysql  -v /data/docker/mysql/data:/var/lib/mysql   -e MYSQL_ROOT_PASSWORD=123456  -d mysql


    配置相应的nginx文件、php扩展

    

    上面我们把nginx 默认留在了172.17 的网段上,而其他都配在了 172.0网段上,跨网段访问不了。

    此时,我们给当前容器添加一块其他容器的网卡就能和其他容器进行通信了

    建立两个容器之间的连接(比如给php容器添加nginx 的网卡)

    进入php容器之后,

    docker network  connect default-network  nginx

    此时可以在nginx容器中访问php容器了。


docker的bridge自定义网络之间:双方可以随便添加对方的网卡 ,但是docker的bridge自定义网络与系统自带的网桥之间只能是:系统自带的网桥对应的容器 添加 bridge自定义网络对应的容器的网卡。而反过来会报错。 

而docker的系统自带的网桥之间:是可以通信的,因为是在一个网络桥接上。



    出自:何冰华个人网站

    地址:https://www.hebinghua.com/

    转载请注明出处


来说两句吧
最新评论