如何创建docker network

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何创建docker network相关的知识,希望对你有一定的参考价值。

使用docker network create命令来创建,只能创建docker内建的网络模式
使用docker plugin,创建自定义网络

使用docker命令创建网络

Docker中内置的网络模式包括如下几种:

bridge 我们基于该网络模式创建了mynet网络
host 本地网络模式
macvlan 这个模式貌似是最新加的
null 无网络
overlay 用于swarm集群中容器的跨主机网络访问

docker create network命令包含以下参数:
Flag shorthand -h has been deprecated, please use --help

Usage: docker network create [OPTIONS] NETWORK

Create a network

Options:
--attachable Enable manual container attachment
--aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
-d, --driver string Driver to manage the Network (default "bridge")
--gateway stringSlice IPv4 or IPv6 Gateway for the master subnet
--help Print usage
--internal Restrict external access to the network
--ip-range stringSlice Allocate container ip from a sub-range
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label list Set metadata on a network (default [])
-o, --opt map Set driver specific options (default map[])
--subnet stringSlice Subnet in CIDR format that represents a network segment

创建overlay模式的全局网络,我们可以看到新创建的mynet1的scope是swarm,即集群范围可见的。

172.18.0.1:root@sz-pg-oam-docker-test-001:/root]# docker network create -d overlay mynet1
x81fu4ohqot2ufbpoa2u8vyx3
172.18.0.1:root@sz-pg-oam-docker-test-001:/root]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ad3023f6d324 bridge bridge local
346c0fe30055 crane_default bridge local
4da289d8e48a docker_gwbridge bridge local
3d636dff00da host host local
tx49ev228p5l ingress overlay swarm
x81fu4ohqot2 mynet1 overlay swarm
cc14ee093707 none null local
172.18.0.1:root@sz-pg-oam-docker-test-001:/root]# docker network inspect mynet1
[

"Name": "mynet1",
"Id": "x81fu4ohqot2ufbpoa2u8vyx3",
"Created": "0001-01-01T00:00:00Z",
"Scope": "swarm",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM":
"Driver": "default",
"Options": null,
"Config": []
,
"Internal": false,
"Attachable": false,
"Containers": null,
"Options":
"com.docker.network.driver.overlay.vxlanid_list": "4097"
,
"Labels": null

]

注意,overlay模式的网络只能在swarm的manager节点上创建,如果在work节点上创建overlay网络会报错:

172.18.0.1:root@sz-pg-oam-docker-test-002:/root]# docker network create -d overlay mynet1
Error response from daemon: Cannot create a multi-host network from a worker node. Please create the network from a manager node.

如果不使用-d指定driver将默认创建本地bridge网络。

自定义网络

创建自定义网络需要设置网络的driver和ipam。
参考技术A 熟悉 Linux 技术的人都知道,容器只是利用名字空间进行隔离的进程而已,Docker 在容器实现上也是利用了 Linux 自身的技术。
有时候,我们需要在宿主机上对容器内进行一些操作,当然,这种绕过 Docker 的操作方式并不推荐。
如果你使用的是比较新的 Docker 版本,会尴尬的发现,直接使用系统命令,会无法访问到容器名字空间。
这里,首先介绍下逗 ip netns地 系列命令。这些命令负责操作系统中的网络名字空间。
首先,我们使用 逗add地 命令创建一个临时的网络名字空间。
ip netns add test

然后,使用 show 命令来查看系统中的网络名字空间,会看到刚创建的 test 名字空间。
ip netns show test

另外,一个很有用的命令是 exec,会在对应名字空间内执行命令。例如
ip netns exec test ifconfig

使用 del 命令删除刚创建的 test 名字空间。
ip netns del test

接下来运行一个 Docker 容器,例如
docker run -it ubuntu

再次执行 ip netns show命令。很遗憾,这里什么输出都没有。
原因在于,Docker 启动容器后仍然会以进程号创建新的名字空间,但在较新的版本里面,默认删除了系统中的名字空间信息文件。
网络名字空间文件位于 /var/run/netns 下面,比如我们之前创建的 test 名字空间,则在这个目录下有一个 test 文件。诸如 netns 类似的系统命令依靠这些文件才能获得名字空间的信息。
在容器启动后,查看这个目录,会发现什么都没有。
OK,那让我们手动重建它。
首先,使用下面的命令查看容器进程信息,比如这里的1234。
docker inspect --format='. State.Pid ' container_id 1234

接下来,在 /proc 目录(保存进程的所有相关信息)下,把对应的网络名字空间文件链接到 /var/run/netns 下面
ln -s /proc/1234/ns/net /var/run/netns/

然后,就可以通过正常的系统命令来查看或访问容器的名字空间了。例如
ip netns show 1234 ip netns exec 1234 ifconfig eth0 172.16.0.10/16...
参考技术B 安装好docker并启动swarm集群后,会在集群的每个node中找到如下network

容器之间的 Docker HTTP 请求

【中文标题】容器之间的 Docker HTTP 请求【英文标题】:Docker HTTP-requests between containers 【发布时间】:2016-12-27 01:11:54 【问题描述】:

我正处于学习如何使用 Docker 的第一阶段,所以我正在尝试一些基本的东西。我创建了两个需要通过 HTTP 请求交换数据的 Node Express 服务。

我的docker-compose.yml 文件

networks:
  isolation-network:
    driver: bridge

services:
  service1-nodejs:
    build:
    context: ./service1/
    dockerfile: .docker/node.dockerfile
    ports:
      - "10000:9000" 
      - "10001:5858" 
    env_file: ./service1/.docker/env/app.$APP_ENV.env
    networks:
      - isolation-network

  service2-nodejs:
    build:
    context: ./service2/
    dockerfile: .docker/node.dockerfile
    ports:
      - "10010:9000" 
      - "10011:5858" 
    env_file: ./service2/.docker/env/app.$APP_ENV.env
    networks:
      - isolation-network

service1 使用request module 向service 2 发出POST 请求。

request( url: "http://service2:10010/api/",
                method: "POST",
                headers:  "Content-Type": "application/json" ,
                json: true,
                body:  ... ,
                time: true
            , function (err, res, body) 
                if (!err && res.statusCode == 200) 
                    // success
                

                // failed
            );

这个调用的结果是:

错误:连接 ECONNREFUSED 172.18.0.3:10010

使用邮递员,我可以在http://localhost:10010/api/ 测试service2,我可以确认它们实际上可以联系到并按预期工作。

我错过了一些东西,但无法弄清楚。这里出了什么问题?

【问题讨论】:

【参考方案1】:

See the document。端口 10010 是主机端口,但不是容器端口。直接访问service2容器时应该使用9000。

所以只需将"http://service2:10010/api/" 更改为"http://service2:9000/api/" 即可。

【讨论】:

+ 你需要将容器链接到另一个 @JohannesMerz 他使用网络,并且确实将“service2”解析为“172.18.0.3”。 我正在使用网络,因此不需要使用容器的内部端口进行链接解决了我的问题 http//中真的没有:吗? @DanNissenbaum 有趣...我以为我有冒号,问题也与冒号有关...

以上是关于如何创建docker network的主要内容,如果未能解决你的问题,请参考以下文章

如何使用docker创建容器

Docker:如何重新创建 dockers 的附加 iptables 规则?

markdown [Docker HowtTo]如何创建Docker容器#docker #howto

如何创建一个docker service 服务

如何禁止使用 docker-compose up 重新创建 docker 容器

如何加载从原始 Docker 映像的 .tar 文件创建的 Docker 映像?