zoukankan      html  css  js  c++  java
  • docker 学习笔记-7

    桥接网络 Bridge Network

    docker的桥接网络使用虚拟网桥,bridge网络用于同一主机上的docker容器相互通信,连接到同一个网桥的docker容器可以相互通信,当我们启动docke时,会自动创建一个默认bridge网络,除非我们进行另外的配置,新创建的容器都会自动连接到这个网络,我们也可以自定义自己的bridge网络,docker文档建议使用自定义bridge网络,默认的bridge网络具有一定的缺陷

    相关操作命令

    • 创建一个自定义网络 docker network create [net-name]

    • 实例化容器到自定义网络:docker run --network [net-name] [CONTAINER]

    • 运行容器加入到自定义网络docker network connect [net-name] [CONTAINER]

    • 离开用户自定义网络docker network disconnect [net-name] [CONTAINER]

    • 查看当前网络模式 docker network ls

    • 移除自定义网络:docker network rm [net-name]

    ps:移除自定义网络前先移除该网络上的所有容器

    实例演示:容器之间通过自定义bridge通讯

    1. 创建自定义网络test-bridge
    docker network create test-bridge
    
    1. 初始化容器mysql_bridge,加入到自定义网络test-bridge
    docker run -d --name mysql_bridge --network test-bridge -e MYSQL_ROOT_PASSWORD=root mysql:5.7
    

    ps:我们这里的mysql服务没有发布端口,依然可以在bridge网络内暴露使用

    1. 初始化容器redis_bridge,加入到自定义网络test-bridge中,并发布端口6397
     docker run -d --name redis_bridge --network test-bridge -p  16397:6397 redis:5.0
    
    1. 检查mysql_bridge与redis_bridge网络
    root@ubuntu:/home/hui# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
    607aa323a3a2        mysql:5.7           "docker-entrypoint.s…"   4 seconds ago       Up 3 seconds        3306/tcp, 33060/tcp                 mysql_bridge
    b9b2ca3e0cff        redis:5.0           "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        6379/tcp, 0.0.0.0:16397->6397/tcp   redis_bridge
    

    从redis容器中测试连接mysql

    root@ubuntu:/home/hui# docker exec -it redis_bridge /bin/bash
    root@b9b2ca3e0cff:/data# 
    root@b9b2ca3e0cff:/data# ping mysql_bridge
    PING mysql_bridge (172.19.0.3) 56(84) bytes of data.
    64 bytes from mysql_bridge.test-bridge (172.19.0.3): icmp_seq=1 ttl=64 time=0.125 ms
    64 bytes from mysql_bridge.test-bridge (172.19.0.3): icmp_seq=2 ttl=64 time=0.137 ms
    64 bytes from mysql_bridge.test-bridge (172.19.0.3): icmp_seq=3 ttl=64 time=0.131 ms
    ^C
    --- mysql_bridge ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2043ms
    rtt min/avg/max/mdev = 0.125/0.131/0.137/0.005 ms
    root@b9b2ca3e0cff:/data# 
    root@b9b2ca3e0cff:/data# telnet mysql_bridge 3306
    Trying 172.19.0.3...
    Connected to mysql_bridge.
    Escape character is '^]'.
    

    由上面的结果可知,在redis容器中,已成功与mysql容器进行通信。

    宿主网络 Host Network

    如果在创建容器的时候使用--network=host选项,那么容器会使用宿主机的网络,容器与宿主机的网络并没有隔离。
    使用这种网络类型的好处就是网络性能很好,基本上跟宿主机的网络一样,它很大的弊端就是不安全。如果你的程序是用root用户运行的,有可能会通过Docker容器来控制宿主机的网络。

    docker run -it --network=host redis:5.0 
    
    root@ubuntu:/home/guanfuchang# netstat -nap | grep "6379"| grep -w LISTEN
    tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      31894/redis-server  
    tcp6       0      0 :::6379                 :::*                    LISTEN      31894/redis-server 
    

    Overlay Network

    overlay 网络驱动程序在多个 Docker 守护进程主机之间创建一个分布式网络(跨docker主机通信),所有连接该自定义网络的容器自动相互暴露所有端口。

    相关操作命令

    • 将 Docker 守护进程初始化为 swarm manager docker swarm init

    • 创建overlay网络 docker network create --driver=overlay --attachable [net-name]

    • 加入overlay网络 docker run --network [net-name] [CONTAINER]

    • 加入集群 docker swarm join [OPTIONS] HOST:PORT

    • 离开集群 docker swarm leave

    更多命令,请参考docker官方文档
    https://docs.docker.com/engine/reference/commandline/swarm/

    实例演示:容器之间通过自定义Overlay 跨主机通讯

    为了演示跨主机,我这里克隆一个虚拟机,现两个虚拟机的信息如下

    虚拟机IP安装
    ubuntu 192.168.147.128 redis
    ubuntu_copy1 192.168.147.130 mysql
    1. 在128上初始化集群
    docker swarm init

    2. 在128上查看当前节点
    docker node ls

    3. 在128上创建overlay network
    docker network create --driver=overlay --attachable test-overla

    4. 在128上实例redis容器,并加入overlay 网络
    docker run -tid --name redis_overlay --network test-overlay redis:5.0

    5. 在130中,加入集群
    docker swarm join --token SWMTKN-1-32pd1ytuwho780hrehx8687y4s54g0fvhf4sh8tx8ea1qp9a6g-9foali4ph3tm0xn5vmu0emomd 192.168.147.128:2377
    

    如果不记得token了,可以在128上执行命令
    docker swarm join-token worker 即可显示加入集群的命令

    1. 在130上实例mysql容器,并加入overlay网络
    docker run -tid --name mysql_overlay --network test-overlay -e MYSQL_ROOT_PASSWORD=root  mysql:5.6

    7. 从128中redis容器中测试连接130中的mysql容器
    docker exec -it redis_overlay /bin/telnet mysql_overlay 3306

    到这里,已经说明通过加入overlay网络,在两个主机的两个容器之间可以实现通信了。

    如果容器内telnet命令不存在,在容器内先更新apt,然后安装telnet即可
    apt update
    apt install telnet

  • 相关阅读:
    自编游戏
    宣言
    Leetcode: 12. Integer to Roman
    Leetcode: 11. Container With Most Water
    Leetcode: 10. Regular Expression Matching
    网络编程:listen函数
    网络编程:connect函数
    Leetcode: 9. Palindrome Number
    Leetcode: 8. String to Integer (atoi)
    Leetcode: 7. Reverse Integer
  • 原文地址:https://www.cnblogs.com/yanhuidj/p/12920246.html
Copyright © 2011-2022 走看看