翼度科技»论坛 云主机 服务器技术 查看内容

docker容器启用ipv6地址的方法流程

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
Docker-Compose启用IPv6


  • 你如果没用使用Docker-Compose,就忽略配置,以了解为主,直接去看下面的docker配置。

    • docker-compose.yaml 文件必须使用
      1. version: “2.*”
      复制代码
      1. version: “3.*” 
      复制代码
      不支持
      1. enable_ipv6 
      复制代码
      配置
    • 如果已有旧的容器在运行(网络配置发生了变化),则需要先销毁容器
      1. docker-compose down
      复制代码
      然后再重新创建
      1.  docker-compose up
      复制代码
    • 仅需在network下添加如下内容即可,其他信息正常配置。

  1. networks:
  2.       local_bridge:
  3.         enable_ipv6: true
  4.         driver: bridge
  5.         ipam:
  6.           config:
  7.             - subnet: "2409:807e::/80"
复制代码
启用ipv6


  • 说明
    docker默认是不支持ipv6的,所以想要使用ipv6,就得单独开启这个功能。
  • 前提条件
    主机需要具备ipv6地址并能正常使用,如下,2409开头的正规v6地址,而非fe80这种内部用的v6地址哈。
  1. 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  2.     link/ether fa:16:3e:67:77:58 brd ff:ff:ff:ff:ff:ff
  3.     inet 10.241.102.245/24 brd 10.241.102.255 scope global dynamic noprefixroute ens3
  4.        valid_lft 63404sec preferred_lft 63404sec
  5.     inet6 2409:807e:58cc:114::a2d/120 scope global noprefixroute
  6.        valid_lft forever preferred_lft forever
  7.     inet6 fe80::f816:3eff:fe67:7758/64 scope link noprefixroute
  8.        valid_lft forever preferred_lft forever
复制代码

  • 执行
    1. vim /etc/docker/daemon.json
    复制代码
    配置文件【没有这个配置文件是正常的】,写入如下内容
    1. "fixed-cidr-v6": "2409::/80",
    复制代码
    这个后面的ip是自定义的。
  1. [root@xz-docker-tes-01 ~]# cat /etc/docker/daemon.json
  2. {
  3.     "ipv6": true,
  4.     "fixed-cidr-v6": "2409::/80",
  5.     "experimental": true,
  6.     "ip6tables": true
  7. }
  8. [root@xz-docker-tes-01 ~]#
复制代码
重启docker生效


  • 重启不报错,实际上此时docker就能支持ipv6了。
  1. [root@xz-docker-tes-01 ~]# systemctl restart docker
  2. [root@xz-docker-tes-01 ~]# systemctl status docker
  3. ● docker.service - Docker Application Container Engine
  4.    Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
  5.    Active: active (running) since Fri 2023-12-01 11:40:31 CST; 9s ago
  6.      Docs: https://docs.docker.com
  7. Main PID: 14470 (dockerd)
  8.     Tasks: 13
  9.    Memory: 47.3M
  10.    CGroup: /system.slice/docker.service
  11.            └─14470 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
复制代码
创建一个ipv6的docker网络


  • 这一步其实是不需要做的,因为,不使用这个网络的docker容器,也可以正常使用ipv6地址。我这多做一步是为了做测试而已。具体区别见下面测试说明。【测试后,我觉得这个没意义】
  1. [root@xz-docker-tes-01 ~]# docker network create -d bridge --ipv6 --subnet "2409:807e::/80" ipv6_bridge
  2. 09663034b21493f64d2484dc21923a789bc8ac51c403d422e397435df74f204b
  3. [root@xz-docker-tes-01 ~]#
复制代码

  • 创建好后的网络信息如下
  1. [root@xz-docker-tes-01 ~]# docker network  list
  2. NETWORK ID     NAME          DRIVER    SCOPE
  3. bf1937081949   bridge        bridge    local
  4. e98be3082c27   host          host      local
  5. 09663034b214   ipv6_bridge   bridge    local
  6. 7cee98cd58fe   none          null      local
  7. [root@xz-docker-tes-01 ~]#
复制代码
创建容器测试v6地址


使用ipv6的网络创建容器

我这使用上面创建的一个ipv6的网络做测试测试
  1. [root@xz-docker-tes-01 ~]# docker run -dit --name=v6 --restart=always --network=ipv6_bridge hub.c.163.com/library/centos:latest
  2. 49af16d7dd9c63afd2a43b24b6dfdb8b39d70ef8e39c1d1c067dcbe28c242efa
  3. [root@xz-docker-tes-01 ~]#
  4. [root@xz-docker-tes-01 ~]# docker ps
  5. CONTAINER ID   IMAGE                                 COMMAND       CREATED         STATUS         PORTS     NAMES
  6. 49af16d7dd9c   hub.c.163.com/library/centos:latest   "/bin/bash"   3 seconds ago   Up 2 seconds             v6
  7. [root@xz-docker-tes-01 ~]#
复制代码
容器内 ping其他v6地址和网关都能通,一切正常
  1. [root@xz-docker-tes-01 ~]# docker exec -it v6 bash
  2. [root@49af16d7dd9c /]# ls
  3. anaconda-post.log  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
  4. [root@49af16d7dd9c /]#
  5. [root@49af16d7dd9c /]# ping6 2409:807e:58cc:114::a2d
  6. PING 2409:807e:58cc:114::a2d(2409:807e:58cc:114::a2d) 56 data bytes
  7. 64 bytes from 2409:807e:58cc:114::a2d: icmp_seq=1 ttl=64 time=0.459 ms
  8. 64 bytes from 2409:807e:58cc:114::a2d: icmp_seq=2 ttl=64 time=0.093 ms
  9. 64 bytes from 2409:807e:58cc:114::a2d: icmp_seq=3 ttl=64 time=0.090 ms
  10. ^C
  11. --- 2409:807e:58cc:114::a2d ping statistics ---
  12. 3 packets transmitted, 3 received, 0% packet loss, time 2058ms
  13. rtt min/avg/max/mdev = 0.090/0.214/0.459/0.173 ms
  14. [root@49af16d7dd9c /]# ping6 2409:807e:58cc:114::a01
  15. PING 2409:807e:58cc:114::a01(2409:807e:58cc:114::a01) 56 data bytes
  16. 64 bytes from 2409:807e:58cc:114::a01: icmp_seq=1 ttl=63 time=10.2 ms
  17. 64 bytes from 2409:807e:58cc:114::a01: icmp_seq=2 ttl=63 time=2.04 ms
  18. 64 bytes from 2409:807e:58cc:114::a01: icmp_seq=3 ttl=63 time=2.23 ms
  19. 64 bytes from 2409:807e:58cc:114::a01: icmp_seq=4 ttl=63 time=2.35 ms
  20. ^C
  21. --- 2409:807e:58cc:114::a01 ping statistics ---
  22. 4 packets transmitted, 4 received, 0% packet loss, time 3004ms
  23. rtt min/avg/max/mdev = 2.048/4.208/10.200/3.461 ms
  24. [root@49af16d7dd9c /]#
  25. [root@49af16d7dd9c /]# exit
  26. exit
  27. [root@xz-docker-tes-01 ~]#
复制代码
该容器的网络容器里面呢,也会有一个ipv6地址,主机虽然能ping通,但这个ip是容器专属的,
  1. [root@xz-docker-tes-01 ~]# docker inspect v6 | grep "IPv6"
  2.             "LinkLocalIPv6Address": "",
  3.             "LinkLocalIPv6PrefixLen": 0,
  4.             "SecondaryIPv6Addresses": null,
  5.             "GlobalIPv6Address": "",
  6.             "GlobalIPv6PrefixLen": 0,
  7.             "IPv6Gateway": "",
  8.                     "IPv6Gateway": "2409:807e::1",
  9.                     "GlobalIPv6Address": "2409:807e::2",
  10.                     "GlobalIPv6PrefixLen": 80,
  11. [root@xz-docker-tes-01 ~]#
  12. [root@xz-docker-tes-01 ~]# ping 2409:807e::2
  13. PING 2409:807e::2(2409:807e::2) 56 data bytes
  14. 64 bytes from 2409:807e::2: icmp_seq=1 ttl=64 time=0.695 ms
  15. 64 bytes from 2409:807e::2: icmp_seq=2 ttl=64 time=0.090 ms
  16. ^C
  17. --- 2409:807e::2 ping statistics ---
  18. 2 packets transmitted, 2 received, 0% packet loss, time 50ms
  19. rtt min/avg/max/mdev = 0.090/0.392/0.695/0.303 ms
  20. [root@xz-docker-tes-01 ~]#
复制代码
容器内能ping通同样用这个网络创建的其他容器【但默认容器直接网络是隔离的哈】,具体这个v6地址的用途自行探索吧。
  1. [root@xz-docker-tes-01 ~]# docker exec -it v6 bash
  2. [root@49af16d7dd9c /]# ping6 2409:807e::3
  3. PING 2409:807e::3(2409:807e::3) 56 data bytes
  4. 64 bytes from 2409:807e::3: icmp_seq=1 ttl=64 time=0.346 ms
  5. 64 bytes from 2409:807e::3: icmp_seq=2 ttl=64 time=0.108 ms
  6. 64 bytes from 2409:807e::3: icmp_seq=3 ttl=64 time=0.107 ms
  7. ^C
  8. --- 2409:807e::3 ping statistics ---
  9. 3 packets transmitted, 3 received, 0% packet loss, time 2085ms
  10. rtt min/avg/max/mdev = 0.107/0.187/0.346/0.112 ms
  11. [root@49af16d7dd9c /]#
复制代码
使用普通网络创建容器测试
进入以后,能ping通网关和其他v6地址,没问题。
  1. [root@xz-docker-tes-01 ~]# docker run --name=test1 -it hub.c.163.com/library/centos
  2. [root@d866a511db84 /]# ping6 2409:807e:58cc:114::a17
  3. PING 2409:807e:58cc:114::a17(2409:807e:58cc:114::a17) 56 data bytes
  4. 64 bytes from 2409:807e:58cc:114::a17: icmp_seq=1 ttl=63 time=1.85 ms
  5. 64 bytes from 2409:807e:58cc:114::a17: icmp_seq=2 ttl=63 time=0.782 ms
  6. 64 bytes from 2409:807e:58cc:114::a17: icmp_seq=3 ttl=63 time=0.793 ms
  7. 64 bytes from 2409:807e:58cc:114::a17: icmp_seq=4 ttl=63 time=0.891 ms
  8. ^C
  9. --- 2409:807e:58cc:114::a17 ping statistics ---
  10. 4 packets transmitted, 4 received, 0% packet loss, time 3053ms
  11. rtt min/avg/max/mdev = 0.782/1.080/1.855/0.449 ms
  12. [root@d866a511db84 /]#
  13. [root@d866a511db84 /]# ping6 2409:807e:58cc:114::a01
  14. PING 2409:807e:58cc:114::a01(2409:807e:58cc:114::a01) 56 data bytes
  15. 64 bytes from 2409:807e:58cc:114::a01: icmp_seq=1 ttl=63 time=13.3 ms
  16. 64 bytes from 2409:807e:58cc:114::a01: icmp_seq=2 ttl=63 time=1.85 ms
  17. ^C
  18. --- 2409:807e:58cc:114::a01 ping statistics ---
  19. 3 packets transmitted, 3 received, 0% packet loss, time 2003ms
  20. rtt min/avg/max/mdev = 1.716/5.648/13.378/5.466 ms
  21. [root@d866a511db84 /]#
复制代码
默认生成的,没有这个v6地址的,但不影响使用ipv6.
  1. [root@xz-docker-tes-01 ~]# docker inspect test1 | grep "IP"
  2.             "LinkLocalIPv6Address": "",
  3.             "LinkLocalIPv6PrefixLen": 0,
  4.             "SecondaryIPAddresses": null,
  5.             "SecondaryIPv6Addresses": null,
  6.             "GlobalIPv6Address": "2409::242:ac11:2",
  7.             "GlobalIPv6PrefixLen": 80,
  8.             "IPAddress": "172.17.0.2",
  9.             "IPPrefixLen": 16,
  10.             "IPv6Gateway": "2409::1",
  11.                     "IPAMConfig": null,
  12.                     "IPAddress": "172.17.0.2",
  13.                     "IPPrefixLen": 16,
  14.                     "IPv6Gateway": "2409::1",
  15.                     "GlobalIPv6Address": "2409::242:ac11:2",
  16.                     "GlobalIPv6PrefixLen": 80,
  17. [root@xz-docker-tes-01 ~]#
复制代码
创建一个nginx容器用ipv6地址访问测试


容器创建

先创建一个映射端口的nginx容器
  1. [root@xz-docker-tes-01 ~]# docker run -dit --name=nginx --restart=always -p 80:80 --network=ipv6_bridge nginx
  2. 4a175fb0754961537b23111bab1251e9c9f36645e9936f07c5daeea28af4d898
  3. [root@xz-docker-tes-01 ~]# netstat -ntlp | grep 80
  4. tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      16074/docker-proxy  
  5. tcp6       0      0 :::80                   :::*                    LISTEN      16088/docker-proxy  
  6. [root@xz-docker-tes-01 ~]#
复制代码
我是指定了创建的ipv6网络的【其实不指定也一样,不影响外部访问的】
  1. [root@xz-docker-tes-01 ~]# docker inspect nginx | grep "IPv6"
  2.             "LinkLocalIPv6Address": "",
  3.             "LinkLocalIPv6PrefixLen": 0,
  4.             "SecondaryIPv6Addresses": null,
  5.             "GlobalIPv6Address": "",
  6.             "GlobalIPv6PrefixLen": 0,
  7.             "IPv6Gateway": "",
  8.                     "IPv6Gateway": "2409:807e::1",
  9.                     "GlobalIPv6Address": "2409:807e::3",
  10.                     "GlobalIPv6PrefixLen": 80,
  11. [root@xz-docker-tes-01 ~]#
复制代码
ipv4地址验证

直接浏览器输入ipv4的地址,不报错就行【我下面显示ccx是因为我修改过nginx的默认文件内容了】


ipv6地址访问验证

验证ipv6地址之前,需要保证你测试的主机上已经配置有ipv6地址并且能正常使用
首先测试能否ping通目标ipv6地址【就上面搭建ipv6的主机v6地址,是主机,而非容器的啊】

然后网页直接输入v6地址【就上面搭建ipv6的主机v6地址,是主机,而非容器的啊】

  • 访问格式
    1. [ipv6addr]
    复制代码
    【注意,v6地址用中括号扩起来的】
  • 其实下面内容就是nginx默认的内容,因为没有放任何东西,所以就会显示nginx界面,反正没报错就是正常的。


修改nginx容器网页内容

先进入nginx容器内部
  1. [root@xz-docker-tes-01 ~]# docker exec -it nginx bash
  2. root@4a175fb07549:/#
复制代码
因为不知道容器的http默认文件在哪里,所以可以用find搜索
  1. root@4a175fb07549:/# find / -name html
  2. find: '/proc/32/map_files': Permission denied
  3. find: '/proc/33/map_files': Permission denied
  4. find: '/proc/34/map_files': Permission denied
  5. find: '/proc/35/map_files': Permission denied
  6. /usr/share/nginx/html
  7. root@4a175fb07549:/#
复制代码
通过搜索已知html路径为:
  1. /usr/share/nginx/html
复制代码
那么就可以去修改了噻【懂了吧,想要显示啥内容,替换这个index.html文件就行了】
  1. root@4a175fb07549:/usr/share/nginx/html# ls
  2. 50x.html  index.html
  3. root@4a175fb07549:/usr/share/nginx/html# vi index.html
  4. bash: vi: command not found
  5. root@4a175fb07549:/usr/share/nginx/html# vim index.html
  6. bash: vim: command not found
  7. root@4a175fb07549:/usr/share/nginx/html# cat index.html
  8. <!DOCTYPE html>
  9. <html>
  10. <head>
  11. <title>Welcome to nginx!</title>
  12. <style>
  13.     body {
  14.         width: 35em;
  15.         margin: 0 auto;
  16.         font-family: Tahoma, Verdana, Arial, sans-serif;
  17.     }
  18. </style>
  19. </head>
  20. <body>
  21. <h1>Welcome to nginx!</h1>
  22. <p>If you see this page, the nginx web server is successfully installed and
  23. working. Further configuration is required.</p>

  24. <p>For online documentation and support please refer to
  25. <a href="http://nginx.org/" rel="external nofollow" >nginx.org</a>.

  26. Commercial support is available at
  27. <a href="http://nginx.com/" rel="external nofollow" >nginx.com</a>.</p>

  28. <p><em>Thank you for using nginx.</em></p>
  29. </body>
  30. </html>
  31. root@4a175fb07549:/usr/share/nginx/html# cp index.html index.html.bak
  32. root@4a175fb07549:/usr/share/nginx/html# echo ccx > index.html
  33. root@4a175fb07549:/usr/share/nginx/html#     
复制代码
如我上面,将ccx内容写入了index.html文件,那么正常情况,网页就只会显示
  1. ccx
复制代码
这3个字母

以上就是docker容器启用ipv6地址的方法流程的详细内容,更多关于docker启用ipv6地址的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/server/326512rlq.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具