docker的网络与Harbor镜像仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
101上起的容器和103上起的容器不能通信

#查看容器的ip
#101起centos
[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

#102起centos
[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模式

image-20240905150011381

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

## 安装bridge-utils 查看
[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
/ # ifconfig
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
/ # ifconfig
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 性能最高

image-20240905151204236

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
/ # ifconfig
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)

image-20240905114345031

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
/ # ifconfig
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
/ # ifconfig
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
/ # ifconfig
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)

image-20240905113318250

5、Docker自定义网络模式

基于以上4种模式创建网络

image-20240905113509543

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模式,当有不同的·项目就要自己创建一个网络,把不同项目的主机放到这个模式里面

image-20240905113639559

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

image-20240905171032747

1、创建项目 -1 就是无限大

image-20240905171320050

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: #密码:Harbor12345
......
Login Succeeded

6、这次推送镜像成功,进入web页面,刷新一下查看

image-20240905173214933

image-20240905173246328

image-20240905173324730

3、下载Harbor仓库里面的镜像

image-20240905181051876

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下载镜像
#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: #密码:Harbor12345
......
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

#这个是http的80端口,一般在企业中,会在他前面加nginx代理,用nginx80代理他的5000端口,nginx上配置域名或者ip
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