1. 概述

    1. docker network 命令
  2. 背景

    1. newwork 是 docker 的一种资源
    2. 经常会使用
      1. 需要整理命令
  1. 概述

    1. docker run 时, 将容器端口映射到宿主机
  2. 场景

    1. 启动 容器 时, 经常会使用命令

      1. 将容器的某个端口暴露
      2. 并且映射到 host 的某个端口上
      3. 这样可以通过 host 的 ip 和 端口, 直接访问
    2. 这个可能是我们对 docker 网络最初的认识

    3. 端口查看

      1. 记得用 命令 查看端口是否被占用, 以免出现不必要的麻烦

      2. 命令

        > netstat -utnlp
        
  3. 命令

    # 注意 -p
    > docker container run --name some-nginx -p 10000:80 -v website:/usr/share/nginx/html -d nginx
    
  4. 结果

    1. 容器启动成功
    2. host 的 10000 端口, 被映射到容器的 80 端口
      1. 可以用以下命令 来查看
        > docker ps 
        > docker container port <container> 
        

2. docker --link

  1. 概述

    1. 不对外暴露端口, 也可以让容器连接
  2. 场景

    1. 容器不想在 host 上暴露端口
    2. 容器希望与其他容器连接
  3. 准备

    1. 已经起来了一个容器, 比如之前的 some-nginx
  4. 命令

    # 在 ubuntu 里, 将 some-nginx 映射为了 nginx
    > docker container run --name ubuntu --link some-nginx:nginx -it ubuntu /bin/bash
    
  5. 结果

    1. 创建容器成功
    2. 尝试 ping nginx 或者 some-nginx 都能成功
      1. 如果没有 ping, ref 里有一个链接可以解决
  6. 其他

    1. 查看环境变量, 会发现很多 nginx 相关的变量

      > env | grep -i 'nginx'
      
    2. 查看 hosts, 也会有

      > cat /etc/hosts
      
    3. 对于这个 --link 原理的猜测

      1. 向系统写入 环境变量
      2. 向系统写入 hosts 文件
    4. 其实, 后面有个 url, 就是这么理解的

      1. 但是老实说, 我没看明白, 所以我暂时不敢下结论
  7. 问题

    1. 问题1: 如果两个容器需要互相 link, 怎么办?

      1. 问题
        1. 先启动的那个, 肯定没办法 link 后启动的
      2. 解决
        1. 生产中, 让不需要找其他服务器的组件先启动
        2. 尝试在启动后, 加入 link
          1. 貌似不可行
        3. 启动后直接修改 hosts 文件
          1. 通过某种方式推送, 让所有机器认识自己人
            1. 那 link 的意义, 其实不大
    2. 问题2: 容器的 宕机 和 重启, 是否会影响连接

      1. 这个还没试过
    3. 问题3: 是否还有其他方式, 管理 容器间 的网络交互

3. docker network 命令

  1. ls

    1. 概述

      1. 查看网络连接
    2. 命令

      > docker network ls
      
  2. inspect

    1. 概述

      1. 查看网络连接详情
    2. 命令

      > docker network inspect <network>
      
  3. connect

    1. 概述

      1. 容器连接网络
    2. 命令

      > docker network connect <network> <container>
      
  4. disconnect

    1. 概述

      1. 断开网络连接
    2. 命令

      # -f 表示强制
      # 成功后可以通过 inspect 查看
      > docker network disconnect [-f] <network> <container>
      
  5. create

    1. 概述

      1. 创建网络
    2. 命令

      # 不能重名
      > docker network create <network>
      
  6. rm

    1. 概述

      1. 删除网络连接
    2. 命令

      > docker network rm <network>
      
  7. prune

    1. 概述

      1. 删除没有使用的网络连接
        1. 删除前会有确认
    2. 命令

      > docker network prune
      

ps

  1. ref

    1. Docker 容器与容器云
    2. Docker 经典实例
    3. Docker 实战
    4. docker network
    5. 关于对docker run --link的理解
    6. Docker的ubuntu镜像安装的容器无ifconfig和ping命令的解决
  2. 虚拟化

    1. 服务器虚拟化
    2. 存储虚拟化
    3. 网络虚拟化
  3. 网络虚拟化

    1. 有想法的话, 可以去学学 ovs/ovn
  4. linux 相关的防火墙

    1. linux 的防护机制
      1. iptables
      2. firewalld
      3. selinux
      4. cgroup
    2. 这些东西, 貌似并不好弄
  5. 后续

    1. docker network 真正的原理

      1. docker 容器与容器云这本书里有写
        1. 网络
          1. 各种 network
        2. 容器
          1. sandbox
          2. endpoint
    2. linux 网桥

      1. bridge 类型的网络, 都是 linux 网桥
        1. 有空可以找找资料
        2. Linux 虚拟网络设备详解之 Bridge 网桥
      2. 网桥的本质, 是 虚拟交换机
        1. 这玩意是个大课题, 一句两句搞不定了