docker网络和私有仓库

只愿长相守 提交于 2019-11-27 15:40:17

 
1.host网络
2.bridge
3.none
4.container
 
一. bridge模式
docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。
二. none模式
此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。
三. host模式
此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。
四. container模式
此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。
 
 
1.bridge网络
 
容器再启动的时候如果没有指定相应的网络模式的话,默认是bridge
 
[root@zxw99 ~]# docker run -it --network=bridge busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
2,none网络
再启动容器的时候需要指定网络模式,使用–network选项
[root@zxw99 ~]# docker run -it --network=none busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever

 
3.host网络
[root@zxw99 ~]# docker run -it --network=host busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:7a:74:30 brd ff:ff:ff:ff:ff:ff
inet 192.168.126.99/24 brd 192.168.126.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe7a:7430/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
link/ether 02:42:57:49:c9:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:57ff:fe49:c903/64 scope link
valid_lft forever preferred_lft forever
5: veth1d7cc65@if4: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0
link/ether 6a:db:d8:95:ea:6a brd ff:ff:ff:ff:ff:ff
inet6 fe80::68db:d8ff:fe95:ea6a/64 scope link
valid_lft forever preferred_lft forever

 
4,container网络
[root@zxw99 ~]# docker run -it --name=zxw busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #

[root@zxw99 ~]# docker run -it --network=container:zxw busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

 
--network=container:zxw
container为固定的关键词,zxw为启动容器名
 
如何创建自己的网络?
 
第一步:创建网络并查看
 [root@zxw99 ~]# docker network create -d bridge zxw
631faad6b52d0c85f529cb570c45b44990d1dec0a3c9c92317b7dbf240a0fc89
查看
[root@zxw99 ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
a8daefcdb62c bridge bridge local
5f2d40634f63 host host local
7ab7dcf8aa5c none null local
631faad6b52d zxw bridge local
第二步:使用创建的网络
[root@zxw99 ~]# docker run -it --network=zxw busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
 
第三步:自定义网段及网关
[root@zxw99 ~]# docker network create --subnet=10.0.0.0/16 --gateway=10.0.0.1 -d bridge zxw1

B885e1f614dad2712eaf1d5c276e9d528d8618ef872199015f0493e95260d469

[root@zxw99 ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
a8daefcdb62c bridge bridge local
5f2d40634f63 host host local
7ab7dcf8aa5c none null local
631faad6b52d zxw bridge local
b885e1f614da zxw1 bridge local
第四步:使用新创建的网络

[root@zxw99 ~]# docker run -it --network=zxw1 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
16: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.2/16 brd 10.0.255.255 scope global eth0
valid_lft forever preferred_lft forever

 
第五步:给容器分配固定的IP地址
 
root@zxw99 ~]# docker run -it --network=zxw1 --ip=10.0.0.8 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:0a:00:00:08 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.8/16 brd 10.0.255.255 scope global eth0
valid_lft forever preferred_lft forever

注意:
1.docker自带的网络模式无法分配固定的IP
2.只能使用自己创建的网络去分配固定IP地址
 3.docker可以同外网是由于iptables
 
 
容器之间通信?
 
1.IP
2.通过DNS主机名
3.join模式
 
 
1.通过IP地址通信
[root@zxw99 ~]# docker run -it --network=zxw1 --name zxw1 busybox
docker: Error response from daemon: Conflict. The container name "/zxw1" is already in use by container "6973f709a3d6c364a17e65db838d3bc63b3adb5768f5d5e43103b09747f0104c". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
[root@zxw99 ~]# docker run -it --network=zxw1 --name zxw2 --rm busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
28: eth0@if29: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:0a:00:00:03 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.3/16 brd 10.0.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ping zxw1
PING zxw1 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.049 ms

[root@zxw99 ~]# docker run -it --network=zxw1 --name zxw1 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
26: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.2/16 brd 10.0.255.255 scope global eth0
valid_lft forever preferred_lft forever
 
注意:通过IP地址通信,只能是相同网络模式的才够通信
 
 
那如何实现不同网络模式的容器可以进行通信那?
 [root@zxw99 ~]# docker run -it busybox
[root@zxw99 ~]# docker run -it --network=zxw1 --name zxw1 busybox
答案是给想要通信的容器连接到相同的网络模式下
[root@zxw99 ~]# docker network connect bridge zxw2
本质是给容器分配一块相同网段的网卡
 
验证
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.2/16 brd 10.0.255.255 scope global eth0
valid_lft forever preferred_lft forever
36: eth1@if37: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth1
valid_lft forever preferred_lft forever
 
 
也可以进行分离
[root@zxw99 ~]# docker network disconnect bridge zxw2
 
2.DNS通信
[root@zxw99 ~]# docker run -it --network=zxw1 --name zxw2 --rm busybox
/ #
[root@zxw99 ~]# docker run -it --network=zxw1 --name zxw1 --rm busybox
/ # ping zxw2
PING zxw2 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.098 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.063 ms


 
注意:
1.只能是相同网络模式的才可以DNS通信
2.只能是用户自己创建的网络模式 user defined network
 
3.join模式
[root@zxw99 ~]# docker run -it --network=zxw1 --name zxw2 --rm busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
56: eth0@if57: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.2/16 brd 10.0.255.255 scope global eth0
valid_lft forever preferred_lft forever

 
[root@zxw99 ~]# docker run -it --network=container:zxw2 --name=zxw1 --rm busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
56: eth0@if57: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.2/16 brd 10.0.255.255 scope global eth0
valid_lft forever preferred_lft forever
总结:
1.只能是用户创建的网络模式下才可以分配固定的IP地址
2.只能是用户创建的网络模式下才可以使用DNS进行通信
3.容器间的通信必须要有一个相同网络模式
4.外网如何访问容器?端口映射
5.容器本身就可以访问外网
 
 
 
docker仓库
 
1.阿里云仓库
2.dockerhub仓库
3.私有仓库registry
 
1.dockerhub需要依赖外网网络,registry无需外网网络
2.dockerhub是公共仓库,任何人都可以进行拉取,registry私有仓库免费而且安全
 
 
搭建docker私有仓库registry
 
 
小心 latest tag
千万别被 latest tag 给误导了。latest 其实并没有什么特殊的含义。当没指明镜像 tag 时,Docker 会使用默认值 latest,仅此而已。
虽然 Docker Hub 上很多 repository 将 latest 作为最新稳定版本的别名,但这只是一种约定,而不是强制规定。
所以我们在使用镜像时最好还是避免使用 latest,明确指定某个 tag,比如 httpd:2.3,ubuntu:xenial。
 
第一步:拉取registry镜像
 [root@zxw99 ~]# docker search registry
[root@zxw99 ~]# docker pull registry
第二步:查看registry镜像信息
 
root@zxw99 ~]# docker history registry
IMAGE CREATED CREATED BY SIZE COMMENT
f32a97de94e1 5 months ago /bin/sh -c #(nop) CMD ["/etc/docker/registr… 0B
<missing> 5 months ago /bin/sh -c #(nop) ENTRYPOINT ["/entrypoint.… 0B
<missing> 5 months ago /bin/sh -c #(nop) COPY file:507caa54f88c1f38… 155B
<missing> 5 months ago /bin/sh -c #(nop) EXPOSE 5000 0B
<missing> 5 months ago /bin/sh -c #(nop) VOLUME [/var/lib/registry] 0B
<missing> 5 months ago /bin/sh -c #(nop) COPY file:4544cc1555469403… 295B
<missing> 5 months ago /bin/sh -c #(nop) COPY file:21256ff7df5369f7… 20.1MB
<missing> 5 months ago /bin/sh -c set -ex && apk add --no-cache… 1.29MB
<missing> 5 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 5 months ago /bin/sh -c #(nop) ADD file:38bc6b51693b13d84… 4.41MB


搭建私有仓库需要和保存镜像的数据卷绑定
registry监听的是5000端口
 [root@zxw99 ~]# docker run -d -v /registry:/var/lib/registry/ -p 5000:5000 registry
第三步:使用registry
[root@zxw99 ~]# docker tag busybox 192.168.126.99:5000/busybox:v1

[root@zxw99 ~]# docker push 192.168.126.99:5000/busybox:v1
The push refers to repository [192.168.126.99:5000/busybox]
Get https://192.168.126.99:5000/v2/: http: server gave HTTP response to HTTPS client
想要使用registry私有仓库,需要首先把镜像名改为host:port/镜像名:tag
但是现在直接推得话会报上面的错误
 
第四步:解决上述错误
在docker文件添如下一行
[root@zxw99 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"],
"insecure-registries": [ "192.168.126.99:5000"]
}

ip地址指定的是registry所在的宿主机的IP地址
5000端口是registry仓库映射到宿主机的端口,建议就映射为特定的5000端口
 
第五步:重启docker和容器

[root@zxw99 ~]# systemctl restart docker

 [root@zxw99 ~]# docker run -d -v /registry:/var/lib/registry -p 5000:5000 registry
第六步:再次推送
[root@zxw99 ~]# docker push 192.168.126.99:5000/busybox:v1
 
第七步:查看仓库
[root@zxw99 ~]# ls /registry/docker/registry/v2/repositories/busybox/
 
其他人如何使用私有仓库?
 
第一步:也需要添加一行
"insecure-registries":["192.168.64.8:5000"]
 
第二步:重启docker

 
第三步:拉取镜像
[root@zxw66 ~]# docker pull 192.168.126.99:5000/busybox:v1
 
总结如何实现共享镜像?
1.把镜像制作成tar包,然后进行镜像共享
2.把镜像传到阿里云或者dockerhub仓库进行镜像共享harbor
3.把镜像传到公司内部私有镜像仓库,实现镜像共享

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!