08 docker搭建大数据集群
由于电脑资源不足,免费使用了阿里云的云服务器,使用docker搭建大数据集群
1. 创建普通用户并修改用户权限
详见01 Hadoop集群部署_Hadoop安装与部署步骤详解-CSDN博客
2. centos镜像配置
#下载centos镜像,加tag下载指定版本,在root用户下操作
docker pull centos:7.5.1804#查看镜像
docker images
3. 创建容器serverbase
#用centos镜像创建容器
docker run -itd --name serverbase --privileged centos:7.5.1804 init# name 容器名称# privileged 表示用root身份操作容器# centos:版本号或latest 指定镜像,可以用镜像id代替# 查看正在运行的容器
docker ps
# 进入容器docker exec -it serverbase /bin/bash
# 设置root用户密码
passwd
# 修改镜像源(阿里镜像源)
cd /etc/yum.repos.d/
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* # 把以CentOS-*格式的文件中mirrorlist替换为#mirrorlist,即注释掉该行sed -i 's|#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com|g' /etc/yum.repos.d/CentOS-* # 替换为阿里镜像源
yum makecache # 重建yum缓存
安装一些必要工具
# 安装epel-release,软件仓库
yum install -y epel-release
# 安装网络工具
yum install -y net-tools
# 安装 Vim 编辑器
yum install -y vim
# 安装 passwd(修改密码工具)
yum install passwd
# 安装 Telnet 客户端(用于测试远程端口连通性)
yum install telnet
# 安装 OpenSSH 服务端和客户端
yum install openssh-server -y
yum install openssh-clients -y
修改ssh配置文件
vi /etc/ssh/sshd_config
# 使配置生效
systemctl start sshd
退出容器,将修改后的容器打包成新的镜像
docker commit -a "jale" -m "basic server" serverbase centos:serverbase
# -m:提交说明(类似 Git 的 commit message)。
# -a:指定作者信息(可选)。
# <容器ID或名称>:通过 docker ps -a 查看。
# <新镜像名称>:<标签>:自定义镜像名称和版本
4. IP问题
查看docker的网络(默认使用桥接模式)
Docker 默认创建的 bridge
网络使用子网 172.17.0.0/16
。第一个容器通常分配 172.17.0.2
,后续容器依次递增(如 172.17.0.3
、172.17.0.4
)。宿主机作为网关占用 172.17.0.1
。
Docker 内嵌的 IP 分配服务(类似 DHCP)动态分配 IP 地址。每次容器启动时,Docker 会从可用 IP 池中选择一个未被占用的地址。
docker network ls
固定ip分配
(1)自定义桥接网络
docker network create --subnet=192.168.100.0/24 my_bridge
# --subnet 指定一个docker网段,要和docker自建的不同
# my_bridge 自定义网络名称
再次查看已有网络
5. 集群节点配置
5.1 创建节点
按照原本设定,创建3个节点,节点命名最好不要有下划线或特殊字符
docker run -d \ --name hadoop102 \ --hostname hadoop102 \--net bigdatadockernetwork \--ip 192.168.10.102 \-p 10200:22 \-p 10201:8020 \-p 10202:9870 \-p 10203:2181 \-p 10204:9092 \-p 10205:8081 \-p 10206:16010 \-p 10207:7030 \--privileged \centos:serverbase \/usr/sbin/init# -d:以“分离模式”(后台)运行容器。
# --name hadoop102:将容器命名为 hadoop102,便于后续管理(如启动/停止)。
# --hostname hadoop102:设置容器内部的主机名为 hadoop102,容器内进程(如 Hadoop 服务)会识别此主机名。
# --net bigdatadockernetwork:将容器连接到名为 bigdatadockernetwork 的自定义 Docker 网络
# --ip 192.168.10.102:为容器分配静态 IP 地址 192.168.10.102(需网络支持自定义 IP)。
# 端口映射 (-p):将宿主机的端口映射到容器内部端口,格式为 -p <宿主机端口>:<容器端口>:
# --privileged:赋予容器特权模式,允许访问宿主机的设备(如内核模块),通常用于需要系统级权限的服务(如某些 Hadoop 组件依赖此选项)。
# centos:serverbase:使用的镜像名称,基于 CentOS 并预装了基础服务(如 systemd,因为启动命令是 /usr/sbin/init)。
# /usr/sbin/init:容器启动时运行的进程,这里是 systemd 的初始化系统
测试IP地址是否能连通
# 进入容器
docker exec -it hadoop102 bash
# 查看IP地址
ifconfig
# ping通外网
ping www.baidu.com
# ping通宿主机ping <宿主机ip>
依次创建节点hadoop103,hadoop104
# hadoop103
docker run -d --name hadoop103 --hostname hadoop103 --net bigdatadockernetwork --ip 192.168.10.103 -p 10300:22 -p 10301:8020 -p 10303:2181 -p 10304:9092 -p 10305:8081 -p 10306:16010 -p 10307:7040 --privileged centos:serverbase /usr/sbin/init
# hadoop104
docker run -d --name hadoop104 --hostname hadoop104 --net bigdatadockernetwork --ip 192.168.10.104 -p 10400:22 -p 10401:8020 -p 10402:9868 -p 10403:2181 -p 10404:9092 -p 10405:8081 -p 10406:16010 --privileged centos:serverbase /usr/sbin/init
修改节点root用户密码
# 依次进入3个容器docker exec -it hadoop102 bash
# 修改密码passwd
5.2 配置主机名称使容器之间可以相互识别
分别修改三个容器中的/etc/bashrc文件,使容器每次启动时检查hosts文件中是否有对应的映射,没有则添加
# hadoop102
result=$(cat /etc/hosts | grep ".*192.168.10.102.*hadoop102.*")
if [[ "$result" = "" ]]
thenecho "192.168.10.102 hadoop102" >> /etc/hosts
fi# hadoop103
result=$(cat /etc/hosts | grep ".*192.168.10.103.*hadoop103.*")
if [[ "$result" = "" ]]
thenecho "192.168.10.103 hadoop103" >> /etc/hosts
fi# hadoop104
result=$(cat /etc/hosts | grep ".*192.168.10.104.*hadoop104.*")
if [[ "$result" = "" ]]
thenecho "192.168.10.104 hadoop104" >> /etc/hosts
fi# 设置ll命令
alias ll="ls -alF"
修改完执行
source /etc/bashrc
在自己电脑的hosts文件中配置域名解析(Windows系统C:\Windows\System32\drivers\etc)
# 添加以下内容
宿主机ip hadoop102
宿主机ip hadoop103
宿主机ip hadoop104
5.3 容器自启动
# 容器自启动
docker update --restart=always hadoop102# 关闭容器自启动
docker update --restart=no hadoop102
重启docker检查
# 停止所有容器docker stop $(docker ps -aq)
# 重启dockersudo systemctl restart docker
# 查看运行中的容器docker ps
5.4 ssh免密登录
以hadoop102为例:
# 产生密钥对,长度为4096,一直回车即可
ssh-keygen -t rsa -b 4096
# 复制公钥给hadoop102,hadoop103,hadoop104,填yes和对应容器密码即可
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
5.5 集群时区修改与时间同步
5.5.1 时区修改
# 查看当前时间(CentOS默认时区非东八区)
date
# 查看节点服务器时间时区
timedatectl
# 修改时区
timedatectl set-timezone Asia/Shanghai
#修改后可再查看时区
5.5.2 时间同步
# 下载chrony
yum -y install chrony
# 启动chrony
systemctl start chronyd
# 设置自启动
systemctl enable chronyd
# 修改配置
vi /etc/chrony.conf
# Allow NTP client access from local network.
allow 0.0.0.0/0# Serve time even if not synchronized to a time source.
local stratum 10
allow 0.0.0.0/0:允许 任何 IP 地址(0.0.0.0/0) 的客户端访问此 NTP 服务器,同步时间。
local stratum 10:
即使 NTP 服务器未同步到任何上游时间源(如互联网 NTP 服务器),也允许作为时间源对外提供服务,并声明自己的 stratum(层级)为 10。
在hadoop103,hadoop104上下载chrony,启动服务,设置自启动,修改配置
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst
pool hadoop102 iburst
# 使用 自定义的 NTP 服务器池(hadoop102)作为时间源,并启用 iburst 加速同步
查看chrony服务运行和同步节点信息
chronyc activity
chronyc tracking
5.6 防火墙管理
对三个容器做以下操作
# 下载防火墙
yum install firewalld firewall-config
# 停止防火墙
systemctl stop firewalld
# 关闭防火墙自启动
systemctl disable firewalld
以上内容参考https://blog.csdn.net/weixin_41878387/article/details/127972541?spm=1001.2014.3001.5506
十分感谢!
6. 复制安装包到容器中
如果创建时绑定挂载某个宿主机路径,则可以将安装包传入该路径
或者在容器中直接联网下载安装包
我的情况是容器已经创建好了,安装包是本地上传的,所以需要先将安装包上传到宿主机中,然后从宿主机复制到容器中进行安装
# 创建普通用户
adduser <name>
# 设置密码
passwd <name>
# 安装sudo
yum install sudo
# 修改普通用户sudo权限
vim sudoers
从宿主机将安装包文件复制到容器中
docker cp /opt/software/ hadoop102:/opt/
docker cp <宿主机路径> <容器名称或id>:<容器路径>
还有一种方式,使用dockerfile:把现有容器保存成镜像,在dockerfile中继承这个镜像并构建新的镜像,然后基于新镜像创建容器。把dockerfile和安装包放在宿主机的同一目录下,然后编写dockerfile并在该目录下进行。
我的理解,镜像像是原来在VMware中设置的快照,可以把当前容器的状态保存下来,就可以实现像github版本管理一样管理不同时期的容器,出错了也可以回退,只需要基于之前某一状态的的镜像生成新的容器即可。