Docker 学习4

三十一、发布镜像到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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值