Docker中Web集群迁移及共享数据

2022-11-21 17:33:15 浏览数 (1)

实验题

实验环境

ip

服务

192.168.2.66

dockerA

192.178.2.67

dockerB

192.168.2.11

NFS&Docker Registry

实验步骤

DockerA中搭建web集群 创建热数据持久化目录

代码语言:javascript复制
[root@localhost ~]# mkdir hy
[root@localhost ~]# echo "hy.com" > hy/index.html
[root@localhost ~]# 

运行集群容器

代码语言:javascript复制
[root@localhost ~]# docker run -d -p 80 --name hy --volume /root/hy/:/usr/local/apache2/htdocs httpd:latest
0e5c87513337406d79c7afe8d549ada86f5c9f46bf5922ed6daa77a4d2a73093
[root@localhost ~]# docker run -d -p 80 --name hy1 --volume /root/hy/:/usr/local/apache2/htdocs httpd:latest
73128e4462630b4507ba0349b401baf5524c1721729c5f0bb51b5ae51cdc6a56
[root@localhost ~]# docker run -d -p 80 --name hy2 --volume /root/hy/:/usr/local/apache2/htdocs httpd:latest
80229b37611a7c7bda6be90ce0a0c200f5bcee9427e2d53075ed900f8377d374

查看三台apache容器的80端口在物理机的映射端口

代码语言:javascript复制
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED              STATUS              PORTS                   NAMES
80229b37611a        httpd:latest        "httpd-foreground"   About a minute ago   Up About a minute   0.0.0.0:32781->80/tcp   hy2
73128e446263        httpd:latest        "httpd-foreground"   About a minute ago   Up About a minute   0.0.0.0:32780->80/tcp   hy1
0e5c87513337        httpd:latest        "httpd-foreground"   About a minute ago   Up About a minute   0.0.0.0:32779->80/tcp   hy

用物理机ip访问这些端口,来验证物理机的cyj目录是否被每台容器的htdocs挂载使用

代码语言:javascript复制
[root@localhost ~]# curl 192.168.2.66:32781
hy.com
[root@localhost ~]# curl 192.168.2.66:32780
hy.com
[root@localhost ~]# curl 192.168.2.66:32779
hy.com

迁移DockerA中的集群以及热数据到DockerB 设置私库 迁移时需要用到Registry私有仓库,所以需要现在NFS服务器中pull私库镜像

代码语言:javascript复制
[root@localhost yum.repos.d]# docker pull registry:2
2: Pulling from library/registry
486039affc0a: Pull complete 
ba51a3b098e6: Pull complete 
8bb4c43d6c8e: Pull complete 
6f5f453e5f2d: Pull complete 
42bc10b72f42: Pull complete 
Digest: sha256:7d081088e4bfd632a88e3f3bcd9e007ef44a796fddfe3261407a3f9f04abe1e7
Status: Downloaded newer image for registry:2
docker.io/library/registry:2

将私库在后台运行,并将5000端口映射到物理机1.13的5000端口

代码语言:javascript复制
[root@localhost yum.repos.d]# docker run -itd -p 5000:5000 --restart always --volume /opt/data/registry/:/var/lib/registry registry:2
2d790d31bc2132b1ef38af5926d9bb81b139b54fd97bdf36010b1cf2be2af708

在三台服务器中指定私库地址

NFS&Registry(192.168.2.11)

代码语言:javascript复制
[root@localhost yum.repos.d]# vim /usr/lib/systemd/system/docker.service
[root@localhost yum.repos.d]# systemctl daemon-reload 
[root@localhost yum.repos.d]# systemctl restart docker
#修改内容
14 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.2.11:5000

DockerA

代码语言:javascript复制
[root@localhost ~]# vim /usr/lib/systemd/system/docker.service 
[root@localhost ~]# systemctl daemon-reload 
[root@localhost ~]# systemctl restart docker

#修改内容
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.2.11:5000

DockerB

代码语言:javascript复制
[root@localhost ~]# vim /usr/lib/systemd/system/docker.service 
[root@localhost ~]# systemctl daemon-reload 
[root@localhost ~]# systemctl restart docker

#修改内容
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.2.11:5000

构建带有热数据的镜像 在DockerA中编写Dockerfile

代码语言:javascript复制
[root@localhost ~]# vim Dockerfile 

FROM busybox:latest
ADD hy /usr/local/apache2/htdocs
VOLUME /usr/local/apache2/htdocs

构建镜像

代码语言:javascript复制
[root@localhost ~]# docker build -t httpd_cluster .
Sending build context to Docker daemon  84.11MBB
Step 1/3 : FROM busybox:latest
 ---> be5888e67be6
Step 2/3 : ADD hy /usr/local/apache2/htdocs
 ---> 17931e0e9e6f
Step 3/3 : VOLUME /usr/local/apache2/htdocs
 ---> Running in 6b278ed07c5c
Removing intermediate container 6b278ed07c5c
 ---> 8b0d6a73ca37
Successfully built 8b0d6a73ca37
Successfully tagged httpd_cluster:latest

上传镜像到私库中

代码语言:javascript复制
[root@localhost ~]# docker tag httpd_cluster 192.168.2.11:5000/httpd_cluster
[root@localhost ~]# docker push 192.168.2.11:5000/httpd_cluster
The push refers to repository [192.168.2.11:5000/httpd_cluster]
9e9bf87f3138: Pushed 
5b0d2d635df8: Pushed 
latest: digest: sha256:b22a53ad7941ebfa6ef39a77cd29fa49a23d0e150caa774d21c6da6215a2c811 size: 734
[root@localhost ~]# 

验证是否上传成功

代码语言:javascript复制
[root@localhost ~]# curl 192.168.2.11:5000/v2/_catalog
{"repositories":["httpd_cluster"]}

DockerB下载镜像

代码语言:javascript复制
[root@localhost ~]# docker pull 192.168.2.11:5000/httpd_cluster
Using default tag: latest
latest: Pulling from httpd_cluster
e2334dd9fee4: Already exists 
e4588d532789: Pull complete 
Digest: sha256:b22a53ad7941ebfa6ef39a77cd29fa49a23d0e150caa774d21c6da6215a2c811
Status: Downloaded newer image for 192.168.2.11:5000/httpd_cluster:latest
192.168.2.11:5000/httpd_cluster:latest

DockerB构建与DockerA访问数据相同的集群 更改标签方便使用

代码语言:javascript复制
[root@localhost ~]# docker tag 192.168.2.11:5000/httpd_cluster:latest  httpd:cluster
[root@localhost ~]# docker rmi 192.168.2.11:5000/httpd_cluster:latest 
Untagged: 192.168.2.11:5000/httpd_cluster:latest
Untagged: 192.168.2.11:5000/httpd_cluster@sha256:b22a53ad7941ebfa6ef39a77cd29fa49a23d0e150caa774d21c6da6215a2c811
[root@localhost ~]# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
httpd                     cluster             8b0d6a73ca37        3 minutes ago       1.22MB

使用httpd:cluster创建容器,但不运行,作为volume使用

代码语言:javascript复制
[root@localhost ~]# docker create --name dockerweb httpd:latest
eac6c6f2ba6f99fee15d5cb34ca8a06b01689cf31a01b7eb55dd5e66b3f86dd5

使用dockerbweb运行容器,搭建集群

代码语言:javascript复制
[root@localhost ~]# docker run -d -p 80 --name hy3 --volumes-from dockerweb httpd:cluster
3c5ae82cbabd82606e1eca3eb1117cb76a4c7d7f4cf4d890261eefbe64a8a872
[root@localhost ~]# docker run -d -p 80 --name hy4 --volumes-from dockerweb httpd:cluster
b94793a48fe57af7303fb5872ccdff9538b7ea2641cd95ed4356949f2fe4a9ae
[root@localhost ~]# docker run -d -p 80 --name hy5 --volumes-from dockerweb httpd:cluster
f258c7effef67e87888be7cac611c045dadca804e4ee76ea87e4b70951f11363

查看三个web容器在主机物理机2.67映射的端口

代码语言:javascript复制
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
793f18ba350b        httpd               "httpd-foreground"       4 seconds ago       Up 3 seconds        0.0.0.0:32771->80/tcp    hy5
c447ef63e115        httpd               "httpd-foreground"       10 seconds ago      Up 9 seconds        0.0.0.0:32770->80/tcp    hy4
38b7ade3308c        httpd               "httpd-foreground"       19 seconds ago      Up 17 seconds       0.0.0.0:32769->80/tcp    hy3

访问验证与DockerA主机集群中的页面是否一致

代码语言:javascript复制
[root@localhost ~]# curl 192.168.2.67:32769
hy.com
[root@localhost ~]# curl 192.168.2.67:32770
hy.com
[root@localhost ~]# curl 192.168.2.67:32771
hy.com

DockerA新建集群,使用NFS共享数据 NFS&Registry

安装NFS

代码语言:javascript复制
[root@localhost ~]# yum -y install nfs-utils rpcbind

创建共享目录

代码语言:javascript复制
[root@localhost ~]# mkdir /dockera

将目录共享到所有网段

代码语言:javascript复制
[root@localhost ~]# vim /etc/exports
/dockera *(rw,no_root_squash,sync)
[root@localhost ~]# exportfs -r

启动nfs服务

代码语言:javascript复制
[root@localhost ~]# systemctl start rpcbind nfs-server
[root@localhost ~]# systemctl enable rpcbind nfs-server

清空防火墙策略

代码语言:javascript复制
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables-save

DockerA

查看是否可以获取到NFS的共享目录

代码语言:javascript复制
[root@localhost ~]# showmount -e 192.168.2.11
Export list for 192.168.2.11:
/dockera *

使用docker创建驱动类型为nfs的磁盘,并指定nfs的ip和目录

代码语言:javascript复制
[root@localhost ~]# docker volume create --driver local --opt type=nfs --opt o=addr=192.168.2.11,rw --opt device=:/dockera --name dockera-nfs
dockera-nfs

查看创建好的volume

代码语言:javascript复制
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME

local               volume-nfs

使用dockera-nfs卷来启动httpd镜像的web集群

代码语言:javascript复制
[root@localhost ~]# docker run -d -p 80 --name hy6 --volume dockera-nfs:/usr/local/apache2/htdocs httpd
1ee478d8464ba8eb631d8fc3b205fca2c2d70b8f2f6f428130004b3b6a44674f
[root@localhost ~]# docker run -d -p 80 --name hy7 --volume dockera-nfs:/usr/local/apache2/htdocs httpd
eb0025df59b3e2e77018ffea130f19d25ea680af6929d5236f292587a682d855
[root@localhost ~]# docker run -d -p 80 --name hy8 --volume dockera-nfs:/usr/local/apache2/htdocs httpd
b93d70e8819dc8f4964d76e0278d25cf29c13073e293aec83be32f4ff739fe35

查看三个集群容器在主机的映射端口

代码语言:javascript复制
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
b93d70e8819d        httpd               "httpd-foreground"   26 seconds ago      Up 24 seconds       0.0.0.0:1027->80/tcp   hy8
eb0025df59b3        httpd               "httpd-foreground"   32 seconds ago      Up 31 seconds       0.0.0.0:1026->80/tcp   hy7
1ee478d8464b        httpd               "httpd-foreground"   40 seconds ago      Up 38 seconds       0.0.0.0:1025->80/tcp   hy6

访问这几个映射端口,查看得到的页面内容

代码语言:javascript复制
[root@localhost ~]# curl 192.168.2.66:1025
<html><body><h1>It works!</h1></body></html>
[root@localhost ~]# curl 192.168.2.66:1026
<html><body><h1>It works!</h1></body></html>
[root@localhost ~]# curl 192.168.2.66:1027
<html><body><h1>It works!</h1></body></html>

发现都是It works!这是因为我们的NFS共享目录中的内容是空的 NFS&Registry

代码语言:javascript复制
[root@localhost yum.repos.d]# echo "2020ComeOnWH" > /dockera/index.html 

再次访问验证

代码语言:javascript复制
[root@localhost yum.repos.d]# curl 192.168.2.66:1025
2020ComeOnWH
[root@localhost yum.repos.d]# curl 192.168.2.66:1026
2020ComeOnWH
[root@localhost yum.repos.d]# curl 192.168.2.66:1027
2020ComeOnWH

成功!

0 人点赞