docker4_搭建hadoop集群
- 1集群规划
- 进入容器base_centos
- 2创建容器
- 创建三个docker容器,分别作为三个结点(注意端口的设置)
- gpb_hdp_node3 容器
- gpb_hdp_node2 容器
- 删除容器
- 查看已经创好的容器
- gpb_hdp_node1容器(最后创建)
- 问题1:容器名和 hostname的区别
- 3配置hosts文件
- 问题2:为什么要配置配置hosts
- 连接进入node1容器
- 4ssh免密登录
1集群规划
进入容器base_centos
docker exec -it gpb_base_centos bash
2创建容器
创建三个docker容器,分别作为三个结点(注意端口的设置)
gpb_hdp_node3 容器
docker run -d --name gpb_hdp_node3 -p 10124:22 --privileged gpb_base_node:v1 /usr/sbin/init
gpb_hdp_node2 容器
docker run -d --name gpb_hdp_node2 -p 10123:22 --privileged gpb_base_node:v1 /usr/sbin/init
删除容器
docker rm -f 1e560fca3906
查看已经创好的容器
docker ps
docker ps -a
gpb_hdp_node1容器(最后创建)
docker run -d --name gpb_hdp_node1 \
-p 10122:22 \
-p 8088:8088 \
-p 9870:9870 \
-p 50070:50070 \
-p 10000:10000 \
-p 19888:19888 \
-p 4040:4040 \
-p 8080:8080 \
-p 7077:7077 \
--link gpb_hdp_node2:node2 \
--link gpb_hdp_node3:node3 \
--privileged \
gpb_base_node:v1 /usr/sbin/init
这个命令用于在 Docker 中运行一个 Hadoop 分布式集群下的节点容器,下面是各个参数的解释:
run - 运行一个容器。
-d - 后台运行容器,并打印容器 ID。
--name - 设置容器的名称为 gpb_hdp_node1。
-p - 将容器内部的通信端口映射到宿主机上的端口,具体映射的端口包括:
10122:22:将容器内部的 SSH 服务端口 22 映射到宿主机的端口 10122,让宿主机可以通过这个端口远程登录到容器中。
8088:8088:将容器内部的 Hadoop Application Master 端口映射到宿主机的端口 8088。
9870:9870:将容器内部的 Hadoop Namenode HTTP 端口映射到宿主机的端口 9870。
50070:50070:将容器内部的 Hadoop Namenode 端口映射到宿主机的端口 50070。
10000:10000:将容器内部的 Hive JDBC 服务端口映射到宿主机的端口 10000。
19888:19888:将容器内部的 Hadoop JobHistory 端口映射到宿主机的端口 19888。
4040:4040:将容器内部的 Spark UI 服务端口映射到宿主机的端口 4040。
8080:8080:将容器内部的 Hue 服务端口映射到宿主机的端口 8080。
7077:7077:将容器内部的 Spark Master 端口映射到宿主机的端口 7077。
--link - 连接到其他容器,并给连接的容器指定别名,具体连接的容器包括:
mysql_test:mysql:连接到名称为 mysql_test 的容器,并将别名设置为 mysql。
gpb_hdp_node2:node2:连接到名称为 gpb_hdp_node2 的容器,并将别名设置为 node2。
gpb_hdp_node3:node3:连接到名称为 gpb_hdp_node3 的容器,并将别名设置为 node3。
--privileged - 开启容器的特权模式,让容器拥有和宿主机相同的特权,这样容器中的各个进程就可以执行一些宿主机上被禁止的操作。
base_node:v1 - 基于 base_node:v1 镜像运行容器。
/usr/sbin/init - 启动容器时运行的命令。使用 init 进程来启动系统,这是一个特殊的进程,负责启动和关闭其他进程,也是系统的第一个进程。
总结:这个 Docker 命令运行了一个包含 Hadoop 分布式集群下节点的容器,容器名称为 hdp_node1,开启了特权模式,将容器内部的多个通信端口映射到宿主机上,同时连接了三个其他容器,并给它们分别指定了别名。
问题1:容器名和 hostname的区别
容器名和 hostname 是两个不同的概念。
容器名是在创建容器时给容器起的一个名字,用来唯一标识一个容器。在使用 Docker 命令时,可以通过容器名来操作对应的容器。例如,可以使用 docker start 命令启动一个容器,其中 container_name 表示容器的名称:
docker start container_name
而 hostname 则是指容器内部的主机名,用来标识容器内部的网络地址。可以通过将主机名添加到 /etc/hosts 文件或使用 DNS 进行解析,来在容器内部访问其他容器或宿主机上的服务。
在 Docker 中,如果没有显式指定容器的 hostname,则默认使用容器名作为主机名。如果需要设置容器的 hostname,则可以在 Dockerfile 中使用 hostname 指令或在容器启动时使用 -h 参数指定。
总之,容器名用于标识容器,而 hostname 则用于在容器内部进行网络通信。
3配置hosts文件
问题2:为什么要配置配置hosts
Hosts 文件是一种计算机操作系统中的文本文件,它用于将 IP 地址映射到主机名,从而实现域名解析。
使用 hosts 文件可以在本地轻松进行域名解析,而无需依赖于 DNS 服务器。
在开发或测试过程中,需要模拟多个虚拟主机或测试环境,也可以通过配置 hosts 文件,使用本地 IP 地址映射不同的域名来实现。
在 Docker 中,如果不配置 hosts 文件,容器内的应用程序可能无法访问本地主机或内部网络的其他计算机。
因此,在某些场景下,需要在容器的 hosts 文件中添加相应的 IP 和域名映射,以实现容器内的网络连接和应用程序的运行。
例如,在 Docker 中运行分布式系统时,需要将每个容器的 IP 地址和主机名称写入 hosts 文件以实现容器之间的相互通信。
连接进入node1容器
docker exec -it gpb_hdp_node1 bash
或
ssh -p 10122 root@localhost
查看/etc/hosts文件
[root@69432059c763 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.6 node2 7797b90e0ccd gpb_hdp_node2
172.17.0.5 node3 068874a8c481 gpb_hdp_node3
172.17.0.7 69432059c763
[root@69432059c763 /]#
具体的容器id以实际情况为准
修改为如下内容
[root@69432059c763 /]# vim /etc/hosts
[root@69432059c763 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.6 node2 7797b90e0ccd gpb_hdp_node2
172.17.0.5 node3 068874a8c481 gpb_hdp_node3
172.17.0.7 node1 69432059c763 gpb_hdp_node1
[root@69432059c763 /]#
然后同步到node2,node3节点
password:111111
scp /etc/hosts root@node2:/etc/hosts
scp /etc/hosts root@node3:/etc/hosts
注意:直接在容器中修改/etc/hosts文件将不会保存,停止重启容器后将会被还原。可以考虑备份一份,每次开机以后替换hosts文件
分别修改node1,node2,node3主机名
echo node1 > /etc/hostname # node1上执行
echo node2 > /etc/hostname # node2上执行
echo node3 > /etc/hostname # node3上执行
4ssh免密登录
连接进入node1容器
- 生成公钥私钥
ssh-keygen -t rsa
直接三个回车即可,不用设置密码
- 拷贝公钥到同三台机器
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
现在只是设置的node1 到node1 node2 node3的ssh免密登录,还要分别设置node1 到…,node2 到…。的ssh免密登录
ssh node2
ssh-keygen -t rsa
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
ssh node3
ssh-keygen -t rsa
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
三个结点设置完成后,就可以在三台结点间免密登陆。