三十一、发布镜像到DockerHub
1、登录网址:https://hub.docker.com/
2、账号:zlxwl
邮箱:*
密码:**
3、在我们自己服务上提交,登录DockerHub账号
”[[e[31docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
#登录
”[[e[31docker login -u zlxwl #登录 -u 账号名
Password: #密码
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
4、登录完毕后即可提交镜像,就是一步,就是docker push
”[[e[31docker push dittomcat
Using default tag: latest
The push refers to repository [docker.io/library/dittomcat]
7facfe3b4789: Preparing
010f71788a61: Preparing
f795852665f9: Preparing
74ddd0ec08fa: Preparing
denied: requested access to the resource is denied #被拒绝这样子
”[[e[31
push失败
因为push的时候,镜像名前面需要加上用户名(zlxwl是我的用户名。如果用户名不是当前登录用户则会拒绝push请求),所以需要使用命令docker tag 镜像名 新的镜像名复制出一份镜像重新打个Tag。(切记)
”[[e[31docker tag 9fbaefa2a0f0 zlxwl/diytomcat:1.0
”[[e[31docker push zlxwl/diytomcat:1.0
The push refers to repository [docker.io/zlxwl/diytomcat]
7facfe3b4789: Pushed
010f71788a61: Pushed
f795852665f9: Pushed
74ddd0ec08fa: Pushed
1.0: digest: sha256:62f5bd37617cc96c8e04840edd7368ffa2957e7df3408d6aae172243b389f6a0 size: 1161
三十二、发布镜像到阿里云容器服务
1、登录阿里云
2、找到容器服务
3、创建命名空间
4、创建镜像仓库
成功创建
5、浏览阿里云自己创建的镜像库
退出刚刚我们登录DockerHub官网的账号
”[[e[31docker logout #命令
Removing login credentials for https://index.docker.io/v1/
6、操作推送镜像
#首先按照文档步骤登录我自己阿里云账号
”[[e[31docker login --username=zlxwl registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
#然后再重新命名镜像
”[[e[31docker tag 9fbaefa2a0f0 registry.cn-hangzhou.aliyuncs.com/zhanglongdocker/zhanglongtest:1.0
”[[e[31docker images
#直接push上去
”[[e[31docker push registry.cn-hangzhou.aliyuncs.com/zhanglongdocker/zhanglongtest:1.0 #push版本号
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/zhanglongdocker/zhanglongtest]
7facfe3b4789: Pushed
7、在阿里云上看,发布成功
三十三、Docker小结
三十四、Docker网络详解
1、学习网络首先保证环境的纯净,清空所有的容器和镜像
查看本地网络:(是博主的信息图)
问题:docker是如何处理容器网络访问的?
#启动容器
”[[e[31docker run -d -P --name tomecat01 tomcat
#查看容器的内部网络地址 即在后面加ip addr即可
docker exec -it tomcat01 ip addr
#TM的,我就是一直报以下的错
”[[e[31docker exec -d tomcat01 ip addr
Error response from daemon: OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ip": executable file not found in $PATH: unknown
#所以就用docker inspect 容器id 查他的元数据,如下图:
接着在外部ping这个容器的ip
”[[e[31ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=127 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.111 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.102 ms
^C
--- 172.17.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.102/42.498/127.281/59.950 ms
原理
1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,使用的技术是evth-pair技术!我们服务器只要安装了一个docker,就会有一个网卡docker0,就是用桥接模式!
再次测试ip addr,多了一个网卡
2、再启动一个容器测试,多了一对网卡
#我们发现这个容器带来的网卡,都是一对的。
#使用的是veth-pair技术:就是一堆的虚拟设备接口。所以他们都是成对出现的,一端连着协议,一端彼此相连
#正因为有这个特征,使用veth-pair充当一个桥梁。连接各种网络虚拟设备的
#OpenStac,Docker容器之间的连接,OVS的连接,都是使用veth-pair技术。
3、我们来测试下tomcat01和tomcat02是否可以ping通
”[[e[31docker exec -it tomcat01 ping 172.17.0.3
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ping": executable file not found in $PATH: unknown
#TM的我就是用不了
#结论:容器和容器之间是可以互相ping通的
网络模型图:
结论:tomcat01和tomcat02是共用的一个路由器即docker0。
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的IP
Docker网络小结:
Docker使用的是Linux的桥接,宿主机中是Docker容器的网桥(Docker0),
Docker中的所有网络接口都是虚拟的,虚拟的转发效率高!
只要容器删除,对应的网桥一对就没了。
三十五、容器互联 --link
在微服务部署的场景下,注册中心是使用服务名来唯一识别微服务的,而我们上线部署的时候微服务对应的IP地址可能会改动,所以我们需要使用容器名来配置容器间的网络连接。使用–link可以完成这个功能。
首先不设置连接的情况下,是无法通过容器名来进行连接的。
下面启动一个Tomcat容器Tomcat03使用–link 连接已经启动的Tomcat02容器。这样容器Tomcat03就可以通过容器名Tomcat02连接到容器Tomcat02。
但是反过来容器Tomcat02通过容器名Tomcat03直接ping容器Tomcat03是不行的
这是因为–link的原理是在指定运行的容器上的/etc/hosts文件中添加容器名和ip地址的映射,如下:
而tomcat02容器不能够通过容器名连接tomcat03是因为tomcat02容器中并没有添加容器名tomcat03和ip地址的映射.
目前–link设置容器互连的方式已经不推荐使用。因为docker0不支持容器名访问,所以更多地选择自定义网络。
三十六、自定义网络
查看所有的Docker网络
”[[e[31docker network ls
NETWORK ID NAME DRIVER SCOPE
f715e8efc17c bridge bridge local
6cfd30c8f110 host host local
48cec8e7286a none null local
网络模式:
bridge:桥接 docker(默认)
none: 不配置网络
host: 和宿主机共享网络
container:容器内网络连通!(用的少!局限大)
我们刚刚直接启动的命令--net bridge 就是我们的docker0
docker run -d -P --name tomcat01 --net bridge diytomcat:1.0
docker run -d -P --name tomcat01 diytomcat:1.0 #这个命令默认有--net bridge
docker0特点:默认,域名不能访问,--link可以打通连接!
我们可以自定义网络:
#这条命令就是自己创建我们自己的命令
#--driver bridge 桥接
#--subnet 192.168.0.0/16 子网的地址 (地址可以从192.168.0.2到192.168.255.255)
#--gateway 192.168.0.1 网关(路由器的地址)
”[[e[31docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
dc4942663edde9511416646966de743f0c908592be25d2441d48f5432c57c327
”[[e[31docker network ls
NETWORK ID NAME DRIVER SCOPE
f715e8efc17c bridge bridge local
6cfd30c8f110 host host local
dc4942663edd mynet bridge local #这个就是我们自己创建的网络(路由器就是这样)
48cec8e7286a none null local
查看我们自己创建的网络元数据
”[[e[31docker network inspect mynet
[
{
"Name": "mynet",
"Id": "dc4942663edde9511416646966de743f0c908592be25d2441d48f5432c57c327",
"Created": "2021-12-27T09:46:28.791364661+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
把两个容器运行在这自己创建的网络上
”[[e[31docker run -d -P --name tomacat-net-01 --net mynet diytomcat:1.0
0a85614d52a7bb30eb4c38117bc31ce46d55b31bcf176134ecdb60edf7d5b8e1、
”[[e[31docker run -d -P --name tomacat-net-02 --net mynet diytomcat:1.0
5eb7ef92082604ca4ee58426eeedb318081a9a1abd643daac0435abf380d08e3
测试容器(tomacat-net-01)可以直接ping通(tomacat-net-02)
”[[e[31docker exec -it tomacat-net-01 ping tomacat-net-02
PING tomacat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomacat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.228 ms
64 bytes from tomacat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.122 ms
64 bytes from tomacat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.138 ms
64 bytes from tomacat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.173 ms
64 bytes from tomacat-net-02.mynet (192.168.0.3): icmp_seq=5 ttl=64 time=0.137 ms
^C
--- tomacat-net-02 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 0.122/0.159/0.228/0.040 m
结论:我们自定义的网络都已经帮我们维护好了对应的关系,推荐我们平时使用自定义网络!
三十八、网络联通
桥接在不同网关的容器,他们的网络是不可能通的,所以是让其中一个的容器连接到另一方的网卡(不可能是网关(Docker0和mynet)相连接的)。
然后docker提供了一个命令,查看文档如下两图:
测试打通tomacat01 到咱们的mynet
(用了这个在官方下就是叫一个容器(tomacat01)两个ip了)
”[[e[31docker network connect mynet tomacat01 #连通命令
”[[e[31docker network inspect mynet #查看网络的元数据
[
{
"Name": "mynet",
"Id": "dc4942663edde9511416646966de743f0c908592be25d2441d48f5432c57c327",
"Created": "2021-12-27T09:46:28.791364661+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0a85614d52a7bb30eb4c38117bc31ce46d55b31bcf176134ecdb60edf7d5b8e1": {
"Name": "tomacat-net-01",
"EndpointID": "cebd847e2ef1d1aeb96f592969b299385d72a0416bb5e8688a286e5959d8084f",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"5eb7ef92082604ca4ee58426eeedb318081a9a1abd643daac0435abf380d08e3": {
"Name": "tomacat-net-02",
"EndpointID": "71431685207ffbfdae07e9c96b6351502028c8450afe7dd6d44abc1394339ee8",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"80a3cccbbe5eb3b99d8e63f2d3d3dd343f5cf222d744323dac0b3be657a7f6e1": {
"Name": "tomacat01", *看这里*连通之后就是把tomacat01加到mynet网络下了
"EndpointID": "60479530c3d3cea6cd753520bceabbfcc922240a4d1e0c7a85544c6180ff9578",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
测试一下tomacat01能否平通mynet网关下的容器(tomacat-net-01)ip。
”[[e[31docker exec -it tomacat01 ping tomacat-net-01
PING tomacat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomacat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.401 ms
64 bytes from tomacat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.112 ms
64 bytes from tomacat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.142 ms
#tomacat02是联不通的
”[[e[31docker exec -it tomacat02 ping tomacat-net-01
ping: tomacat-net-01: Name or service not known
结论:
假设要跨网络操作别人,就需要用(docker network connect 网关 容器名 )连通。
三十八、部署redis集群
通过以下脚本创建六个Redis 的配置信息:
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done