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 /]#

然后同步到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容器

  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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值