docker4

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 端口映射到宿主机的端口 80889870:9870将容器内部的 Hadoop Namenode HTTP 端口映射到宿主机的端口 987050070:50070将容器内部的 Hadoop Namenode 端口映射到宿主机的端口 5007010000:10000将容器内部的 Hive JDBC 服务端口映射到宿主机的端口 1000019888:19888将容器内部的 Hadoop JobHistory 端口映射到宿主机的端口 198884040:4040将容器内部的 Spark UI 服务端口映射到宿主机的端口 40408080:8080将容器内部的 Hue 服务端口映射到宿主机的端口 80807077: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 /]#

然后同步到node2node3节点
password:111111

scp /etc/hosts root@node2:/etc/hosts
scp /etc/hosts root@node3:/etc/hosts

注意直接在容器中修改/etc/hosts文件将不会保存停止重启容器后将会被还原。可以考虑备份一份每次开机以后替换hosts文件

分别修改node1node2node3主机名

echo node1 > /etc/hostname # node1上执行
echo node2 > /etc/hostname # node2上执行
echo node3 > /etc/hostname # node3上执行

4ssh免密登录

连接进入node1容器

  1. 生成公钥私钥
ssh-keygen -t rsa

直接三个回车即可不用设置密码

  1. 拷贝公钥到同三台机器
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

三个结点设置完成后就可以在三台结点间免密登陆。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Docker