• Docker网络功能


    基本网络功能

    Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。使用docker network子命令来管理Docker网络。

    外部访问容器可通过端口映射实现,启动容器时使用-p参数指定映射关系。-p可多次使用来绑定多个端口。使用docker port命令查看当前映射的端口配置。

    容器互联

    可以使用--link参数使容器互联。建议将容器加入自定义的Docker网络来连接多个容器。

    新建网络

    使用docker network create -d bridge my-net命令创建一个网络,其中-d参数指定Docker网络类型,有bridge、overlay等。

    容器连接网络

    运行容器时,通过--net参数指定要连接的网络。

    高级网络配置

    docker网络结构如下图所示

    快速配置指南

    下面是一个跟 Docker 网络相关的命令列表。其中有些命令选项只有在 Docker 服务启动的时候才能配置, 而且不能马上生效。

    • -b BRIDGE 或 --bridge=BRIDGE 指定容器挂载的网桥
    • --bip=CIDR 定制 docker0 的掩码
    • -H SOCKET... 或 --host=SOCKET... Docker 服务端接收命令的通道
    • --icc=true|false 是否支持容器之间进行通信
    • --ip-forward=true|false 请看下文容器之间的通信
    • --iptables=true|false 是否允许 Docker 添加 iptables 规则
    • --mtu=BYTES 容器网络中的 MTU

    下面2个命令选项既可以在启动服务时指定,也可以在启动容器时指定。在 Docker 服务启动的时候指定则会成为默认值,后面执行 docker run 时可以覆盖设置的默认值。

    • --dns=IP_ADDRESS... 使用指定的DNS服务器
    • --dns-search=DOMAIN... 指定DNS搜索域

    最后这些选项只有在 docker run 执行时使用, 因为它是针对容器的特性内容。

    • -h HOSTNAME 或 --hostname=HOSTNAME 配置容器主机名
    • --link=CONTAINER_NAME:ALIAS 添加到另一个容器的连接
    • --net=bridge|none|container:NAME_or_ID|host 配置容器的桥接模式
    • -p SPEC 或 --publish=SPEC 映射容器端口到宿主主机
    • -P or --publish-all=true|false 映射容器所有端口到宿主主机

    配置DNS

    配置全部容器的 DNS ,可以在 /etc/docker/daemon.json 文件中增加以下内容。

    1. {
    2. "dns" : [
    3. "114.114.114.114",
    4. "8.8.8.8"
    5. ]
    6. }

    实例

    创建一个点到点连接,两个容器之间可以直接通信,而不通过主句网桥进行桥接,解决方法是创建一对peer接口分别放到两个容器中,配置成点到点链路类型即可。

    启动2个容器,网络模式设置为none,如下:

    1. $ docker run -i -t --rm --net=none base /bin/bash
    2. root@1f1f4c1f931a:/#
    3. $ docker run -i -t --rm --net=none base /bin/bash
    4. root@12e343489d2f:/#

    找到进程号, 然后创建网络命名空间的跟踪文件。

    1. $ docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
    2. 2989
    3. $ docker inspect -f '{{.State.Pid}}' 12e343489d2f
    4. 3004
    5. $ sudo mkdir -p /var/run/netns
    6. $ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
    7. $ sudo ln -s /proc/3004/ns/net /var/run/netns/3004

    创建一对 peer 接口, 然后配置路由

    1. $ sudo ip link add A type veth peer name B
    2. $ sudo ip link set A netns 2989
    3. $ sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A
    4. $ sudo ip netns exec 2989 ip link set A up
    5. $ sudo ip netns exec 2989 ip route add 10.1.1.2/32 dev A
    6. $ sudo ip link set B netns 3004
    7. $ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B
    8. $ sudo ip netns exec 3004 ip link set B up
    9. $ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B

    现在这 2 个容器就可以相互 ping 通, 并成功建立连接。

  • 相关阅读:
    初学者如何打开ABAQUS力学有限元仿真的大门
    Arduino从零开始(0)——介绍与点亮LED
    UDP就一定比TCP快吗?
    cocos creater 鸿蒙 音频卡死 播放失败 不回调
    python 比较时间 删除mysql数据
    Oracle修改varchar类型为clob时,报错:ORA-22858
    最佳实践-LinkBlockingQueue改进
    0087 二叉树
    控制实体小车cartographer建图
    【JavaEE初阶】文件操作 和 IO (下篇)
  • 原文地址:https://blog.csdn.net/UFOfuck/article/details/132766002