docker的网络与Harbor镜像仓库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 101上起的容器和103上起的容器不能通信 [root@docker01 ~]# docker run --link mysql80 -it centos:7 /bin/bash [root@56db98b318bb /]# ping mysql80 PING mysql80 (172.17.0.2) 56(84) bytes of data. 64 bytes from mysql80 (172.17.0.2): icmp_seq=1 ttl=64 time=0.271 ms mysql80容器的ip是:172.17.0.2 [root@bdc4ac174cb6 /]# ping 172.17.0.2 PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data. 可以发现是ping不通的,如果开启内核转,就可以通信,A虚拟机里面起的容器就与B虚拟机可以通信
1、Bridge桥接模式 (docker 默认的网络模式)
Bridge:Docker设计的NAT网络模型 默认类型,类似于虚拟机里面的NAT模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 你的容器桥接到docker0那个网卡,容器的网卡和docker0那个网卡在同一网段 [root@docker02 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 870935df49b1 bridge bridge local a7fce1fe694d host host local d7fe2c2b78e7 none null local [root@docker01 ~]# docker network inspect bridge [root@docker01 ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242eca7bc4c no [root@docker01 ~]# docker run -it -d busybox /bin/sh 公司有规定 内网的ip规定192或者168的网段 方法1:修改docker的启动脚本 [root@docker01 ~]# vim /lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=192.168.10.1/24 [root@docker01 ~]# systemctl daemon-reload [root@docker01 ~]# systemctl restart docker [root@docker01 ~]# docker run -it busybox /bin/sh / eth0 Link encap:Ethernet HWaddr 02:42:C0:A8:0A:03 inet addr:192.168.10.3 Bcast:192.168.10.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:656 (656.0 B) TX bytes:0 (0.0 B) [root@docker02 ~]# docker run -it busybox /bin/sh 方法2:修改docker的配置文件 [root@docker01 ~]# vim /etc/docker/daemon.json { "bip" : "192.168.30.1/24" ,"registry-mirrors" : ["https://docker.1panel.live" ,"https://hub.rat.dev/" ,"https://docker.chenby.cn" , "https://docker.m.daocloud.io" ]} { "registry-mirrors" : ["https://docker.1panel.live" ,"https://hub.rat.dev/" ,"https://docker.chenby.cn" , "https://docker.m.daocloud.io" ],"bip" : "192.168.30.1/24" } [root@docker01 ~]# systemctl daemon-reload [root@docker01 ~]# systemctl restart docker [root@docker01 ~]# docker run -it busybox /bin/sh / eth0 Link encap:Ethernet HWaddr 02:42:C0:A8:14:03 inet addr:192.168.20.3 Bcast:192.168.20.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:516 (516.0 B) TX bytes:0 (0.0 B) 这样子就可以定义容器的网段了
**2、Host模式 **
host:与宿主机共享Network Namespace,–network=host 性能最高
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [root@docker01 ~]# docker run --network=host -d nginx:alpine [root@docker01 ~]# docker run -it --network=host nginx:alpine /bin/sh / docker0 Link encap:Ethernet HWaddr 02:42:77:C6:BE:B9 inet addr:192.168.20.1 Bcast:192.168.20.255 Mask:255.255.255.0 inet6 addr: fe80::42:77ff:fec6:beb9/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3150 errors:0 dropped:0 overruns:0 frame:0 TX packets:2794 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:7792958 (7.4 MiB) TX bytes:1119887 (1.0 MiB) eth0 Link encap:Ethernet HWaddr 00:0C:29:1A:2F:80 inet addr:10.0.0.101 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe1a:2f80/64 Scope:Link 和主机共享网卡的模式,一般起容器不会用到这个模式
3、container模式
Container:与另一个运行中的容器共享Network Namespace,–net=container:containerID(K8S)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [root@docker01 ~]# docker run -it busybox /bin/sh / eth0 Link encap:Ethernet HWaddr 02:42:C0:A8:14:03 inet addr:192.168.20.3 Bcast:192.168.20.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:516 (516.0 B) TX bytes:0 (0.0 B) [root@docker01 ~]# docker run -it --network=container:763cd9e2da94 centos:7 /bin/bash [root@docker01 ~]# docker run -it --network=container:763cd9e2da94 nginx:alpine /bin/sh / eth0 Link encap:Ethernet HWaddr 02:42:C0:A8:14:03 inet addr:192.168.20.3 Bcast:192.168.20.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:656 (656.0 B) TX bytes:0 (0.0 B)
4、None模式
None:不为客器配置任何网络功能,–net=none 没有网络的模式
1 2 3 4 5 6 7 8 9 10 11 启动的时候指定 [root@docker01 ~]# docker run -it --network=none busybox /bin/sh / lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
5、Docker自定义网络模式
基于以上4种模式创建网络
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 docker network create -d <mode> --subnet <CIDR> --gateway <网关> <自定义网路名称> 创建 docker network create -d bridge --subnet 192.168.100.0/24 --gateway 192.168.100.1 abc-net [root@docker01 ~]# docker run -it --network=abc-net busybox /bin/sh 就相当于创建了一个交换机 [root@docker01 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 2b0a232f6643 bridge bridge local 168f91213e19 host host local 4de4c2edcb74 none null local 7a7b8742e475 abc-net bridge local [root@docker01 ~]# docker network rm abc-net abc-net [root@docker01 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 2b0a232f6643 bridge bridge local 168f91213e19 host host local 4de4c2edcb74 none null local 创建了网络就创建了一个桥接的网卡,相当于一个网卡就是一个交换机 docker默认就是bridge模式,当有不同的·项目就要自己创建一个网络,把不同项目的主机放到这个模式里面
6、Docker私有创建Harbor
Harbor 是为企业用户设计的容器镜像仓库开源项目,包括了权限管理(RBAC)、+DAP、审计、安全漏洞扫描、镜像验真、管理界面、自我注册、HA 等企业必需的功能,同时针对中国用户的特点,设计镜像复制和中文支持等功舱 https://goharbor.io/
环境准备
主机名
ip
角色
elk1
10.0.0.76 / 172.16.1.76
Harbor图形化仓库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 harbor 图形化界面的 https://goharbor.io/ registry 命令行操作的 下载harbor带offline标签的,所有的镜像,安装包里面都在一起的所以比较大 1、#安装docker环境 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo sed -i "s@http://mirrors.aliyun.com@https://mirrors.huaweicloud.com@g" /etc/yum.repos.d/epel.repo cat > /etc/yum.repos.d/docker-ce.repo <<EOF [docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://mirrors.huaweicloud.com/docker-ce/linux/centos/7/x86_64/stable enabled=1 gpgcheck=1 gpgkey=https://mirrors.huaweicloud.com/docker-ce/linux/centos/gpg EOF sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io cat > /etc/docker/daemon.json <<EOF { "registry-mirrors":["https://docker.1panel.live","https://hub.rat.dev/","https://docker.chenby.cn", "https://docker.m.daocloud.io"] } EOF systemctl start docker systemctl enable docker 2.下载harbor [root@harbor ~]# wget https://github.com/goharbor/harbor/releases/download/v2.11.1/harbor-offline-installer-v2.11.1.tgz 3.解压 [root@harbor ~]# tar xf harbor-offline-installer-v2.11.1.tgz 4.进入harbor目录 [root@harbor harbor]# cd /root/harbor/ [root@elk1 harbor]# ll total 646848 -rw-r--r-- 1 root root 3646 Aug 15 18:07 common.sh -rw-r--r-- 1 root root 662330539 Aug 15 18:07 harbor.v2.11.1.tar.gz#harbor的所有镜像 -rw-r--r-- 1 root root 14270 Aug 15 18:07 harbor.yml.tmpl -rwxr-xr-x 1 root root 1975 Aug 15 18:07 install.sh -rw-r--r-- 1 root root 11347 Aug 15 18:07 LICENSE -rwxr-xr-x 1 root root 1882 Aug 15 18:07 prepare 5.改配置文件名 [root@harbor harbor]# cp /root/harbor/harbor.yml.tmpl /root/harbor/harbor.yml 6.修改配置文件 (注释HTTPS的配置) [root@harbor harbor]# vim harbor.yml 第5行 改成当前主机的ip hostname: 10.0.0.105 47行:先记录harbor的密码 harbor_admin_password: Harbor12345 7.执行安装脚本 [root@harbor harbor]# ./install.sh ✔ ----Harbor has been installed and started successfully.----#出现这个就安装成功 [root@harbor harbor]# docker images 会看到harbor自动安装的镜像 [root@harbor harbor]# netstat -lntup 会看到80端口 8、浏览器访问当前主机的IP
1、创建项目 -1 就是无限大
2、上传镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 需要修改镜像名称:命名规则 harbor的IP地址/项目名称/镜像名称:标签 1、将镜像重新命名 [root@docker02 ~]# docker tag wordpress:v7 10.0.0.76/wordpress/wordpress:v7 2、推送镜像 报错 [root@docker02 ~]# docker push 10.0.0.76/wordpress/wordpress:v7 The push refers to repository [10.0.0.76/wordpress/wordpress] Get "https://10.0.0.76/v2/" : dial tcp 10.0.0.76:443: connect: connection refused 原因是没有信任不安全的连接 3、修改docker配置文件,添加信任不安全的镜像仓库配置 [root@docker02 ~]# vim /etc/docker/daemon.json { "registry-mirrors" : ["https://docker.1panel.live" , "https://hub.rat.dev/" , "https://docker.chenby.cn" , "https://docker.m.daocloud.io" ], "insecure-registries" : ["http://10.0.0.76" ]#就是加这个配置,注意,需要在上一行结束位置加,逗号} 重启docker [root@docker02 ~]# systemctl restart docker 4、再次推送 报错 [root@docker02 ~]# docker push 10.0.0.76/wordpress/wordpress:v7 unauthorized: unauthorized to access repository: wordpress/wordpress, action: push: unauthorized to access repository: wordpress/wordpress, action: push 仓库没有做认证 5、命令行登录Harbor进行认证 [root@docker02 ~]# docker login 10.0.0.76 Username: admin Password: ...... Login Succeeded 6、这次推送镜像成功,进入web页面,刷新一下查看
3、下载Harbor仓库里面的镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 使用10.0.0.101下载镜像 1、修改docker配置文件,添加信任不安全的镜像仓库配置 [root@docker01 ~]# vim /etc/docker/daemon.json { "registry-mirrors" : ["https://docker.1panel.live" , "https://hub.rat.dev/" , "https://docker.chenby.cn" , "https://docker.m.daocloud.io" ], "insecure-registries" : ["http://10.0.0.76" ]#就是加这个配置,注意,需要在上一行结束位置加,逗号} [root@docker01 ~]# systemctl restart docker 2、登录harbor [root@docker01 ~]# docker login 10.0.0.76 Username: admin Password: ...... Login Succeeded 3、下载镜像 [root@docker01 ~]# docker pull 10.0.0.76/wordpress/wordpress@sha256:c23f172bdd40059652c0a45affd4c0d1740fa8578c56e0209316e43516560050 或者 [root@docker01 ~]# docker pull 10.0.0.76/wordpress/wordpress:v7
7、镜像仓库registry
环境准备
主机名
ip
角色
docker01
10.0.0.101 / 172.16.1.101
registry命令行仓库
1、使用10.0.0.101地址的机器搭建仓库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 1、搭建仓库 [root@docker01 ~]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry [root@docker01 wordpress]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 356673cd10da registry "/entrypoint.sh /etc…" 11 seconds ago Up 9 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp registry regsitry做集群可以挂载这个目录/opt/myregistry/docker/registry/v2/repositories/ Harbor:他本来就是http,如果想给harbor做集群,可以多起几个harbor,前面加个负载均衡,虽然数据不是统一的数据,可以使用NFS挂载,nginx负载均衡可以解决数据统一的问题,一台上面安装rsync,其他2台实时同步也可以,所有机器都要安装rsync,seysync registry可以使用nginx代理 habor不可以使用nginx代理
2、上传镜像到仓库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1、给镜像打tag标签,要写全仓库地址 地址:端口/镜像名:版本号 [root@docker02 ~]# docker tag wordpress-manual:v1 172.16.1.101:5000/wordpress-manual:v1 [root@docker02 ~]# docker tag nginx:alpine 172.16.1.101:5000/nginx:alpine [root@docker02 ~]# docker tag busybox:latest 172.16.1.101:5000/busybox:latest 2、其他机器需要将代码上传到仓库的机器配置文件,改机器就要信任仓库地址 [root@docker03 ~]# vim /etc/docker/daemon.json { "registry-mirrors" : ["https://docker.1panel.live" , "https://hub.rat.dev/" , "https://docker.chenby.cn" , "https://docker.m.daocloud.io" ], "insecure-registries" : ["http://10.0.0.76" ,"http://172.16.1.101:5000" ]#就是加这个配置,注意,需要在上一行结束位置加,逗号,地址写内外推送会比较快,如果写内外,命名就要用内外命名} 3、重启Docker [root@docker03 ~]# systemctl restart docker 4、推送镜像 [root@docker02 ~]# docker push 172.16.1.101:5000/wordpress-manual:v1 [root@docker02 ~]# docker push 172.16.1.101:5000/nginx:alpine
3、查看私有查看镜像列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1、随便在哪台机器查看都行,只要和registre查看的机器通,查看所有镜像仓库 [root@docker02 ~]# curl http://172.16.1.101:5000/v2/_catalog {"repositories" :["busybox" ,"nginx" ,"wordpress-manual" ]} 2、查看指定仓库的tag标签 [root@docker02 ~]# curl http://172.16.1.101:5000/v2/nginx/tags/list {"name" :"nginx" ,"tags" :["alpine" ]} 3、格式化输出json格式信息 [root@docker02 ~]# yum -y install jq [root@docker02 ~]# curl -s http://172.16.1.101:5000/v2/_catalog|jq { "repositories" : [ "busybox" , "nginx" , "wordpress-manual" ] }
4、删除私有仓库中的镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 1、查看映射的目录 [root@docker01 ~]# docker inspect registry "Mounts" : [ { "Type" : "bind" , "Source" : "/opt/myregistry" , "Destination" : "/var/lib/registry" , 2、查看/opt/myregistry目录下的文件,可以看到上传到的镜像 [root@docker01 ~]# ll /opt/myregistry/docker/registry/v2/repositories/ drwxr-xr-x 5 root root 55 Sep 6 16:40 busybox drwxr-xr-x 5 root root 55 Sep 6 16:32 nginx drwxr-xr-x 5 root root 55 Sep 6 16:17 wordpress-manual 3、由于做了映射,就不需要连到容器里面,直接在宿主机上删除 [root@docker01 ~]# rm -rf /opt/myregistry/docker/registry/v2/repositories/busybox [root@docker01 ~]# ll /opt/myregistry/docker/registry/v2/repositories/ drwxr-xr-x 5 root root 55 Sep 6 16:32 nginx drwxr-xr-x 5 root root 55 Sep 6 16:17 wordpress-manual [root@docker01 ~]# curl -s http://172.16.1.101:5000/v2/_catalog|jq { "repositories" : [ "nginx" , "wordpress-manual" ] } 4、查看是否生成blob二进制文件,如果有就删除,没有生成就不用管 [root@docker01 ~]# ll /etc/docker -rw-r--r-- 1 root root 219 Sep 6 16:52 daemon.json 删除方法: registry garbage-collect /etc/docker/registry/config.yml
5、拉取镜像
1 [root@docker03 ~]# docker pull 172.16.1.101:5000/wordpress-manual:v1