在Docker中使用Dockerfile實現(xiàn)ISO文件轉(zhuǎn)化為完整版Centos鏡像,并搭建集群數(shù)據(jù)倉庫
在上一篇文章中,我們提到了如何使用Docker官方版本的centos7搭建容器集群并實現(xiàn)同一ip下使用不同端口的ssh遠程登錄,但是其中遇到了非常多的問題,例如:
官方的centos7過于“簡陋”,導致我們運行腳本時因為沒有預(yù)裝依賴包而報錯!
這個可太致命了,所以這篇文章教大家如何使用Centos官方ISO文件搭建docker究極完整版鏡像,并實現(xiàn)數(shù)據(jù)倉庫搭建
注意了,如果你想在虛擬機上運行docker,本教程僅適合服務(wù)器版本的的Ubuntu(點這里下載服務(wù)器版本鏡像,點擊這里查看安裝教程)或者是Centos,因為默認桌面版本的Linux系統(tǒng)沒有默認啟動systemd服務(wù),會導致docker容器內(nèi)運行centos時無法啟動systemctl命令!
1. 創(chuàng)建docker鏡像
這里我們使用Dockerfile文件實現(xiàn)鏡像的一鍵創(chuàng)建,并在鏡像中預(yù)裝可能用到的依賴庫,讓我們的centos達到“基本能用”的程度:
Dcokerfile文件如下,注意這里會用到Cenos官方的ISO文件(點擊下載,或者你往下面看)
FROM centos:7.2.1511
COPY CentOS-7-x86_64-DVD-1511.iso /tmp/CentOS-7-x86_64-DVD-1511.iso
RUN yum -y update && \
yum -y install wget && \
yum -y install tar && \
yum -y install bzip2 && \
yum -y install unzip && \
yum -y install net-tools && \
yum -y install tcpdump && \
yum -y install telnet && \
yum -y install vim && \
yum -y install git && \
yum -y install openssh-server && \
yum -y install java-1.8.0-openjdk && \
yum -y install perl && \
yum -y install python && \
yum -y install ruby && \
yum -y install php && \
yum -y install gcc && \
yum -y install make && \
yum -y install autoconf && \
yum -y install automake && \
yum -y install libtool && \
yum -y install libxml2-devel && \
yum -y install libpng-devel && \
yum -y install libjpeg-devel && \
yum -y install freetype-devel && \
yum -y install openssl-devel && \
yum -y install libcurl-devel && \
yum -y install libxslt-devel && \
yum -y install bzip2-devel && \
yum -y install readline-devel && \
yum -y install sqlite-devel && \
yum -y install postgresql-devel && \
yum -y install mariadb-server && \
yum -y install httpd && \
yum -y install vsftpd && \
yum -y install epel-release && \
yum -y install supervisor && \
yum -y install libselinux-utils && \
yum -y install firewalld && \
yum -y install lrzsz && \
yum -y install NetworkManager &&\
yum -y clean all
RUN mkdir -p /var/run/sshd && \
echo 'root:password' | chpasswd && \
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config && \
sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config && \
sed -i 's/^#\?UseDNS.*/UseDNS no/' /etc/ssh/sshd_config && \
sed -i 's/^#\?Storage=.*/Storage=persistent/' /etc/systemd/journald.conf && \
systemctl enable mariadb.service && \
systemctl enable httpd.service && \
systemctl enable vsftpd.service && \
systemctl enable sshd.service
EXPOSE 22 80 3306 20 21
CMD ["/usr/sbin/init"]
注意,這里增加了一行
sed -i 's/^#\?Storage=.*/Storage=persistent/' /etc/systemd/journald.conf && \
,用于設(shè)置systemd journald的持久化存儲。同時,啟用了
systemctl enable mariadb.service、
systemctl enable httpd.service、
systemctl enable vsftpd.service
systemctl enable sshd.service
使得容器啟動后這些服務(wù)會自動啟動,這些都是一些網(wǎng)絡(luò)基礎(chǔ)服務(wù)。
同時我們的ssh可以自動啟動完成,不需要我們額外去配置了
Dockerfile編寫完成后我們在文件當前目錄下啟動如下命令(注意對應(yīng)ISO文件也應(yīng)該在當前目錄下)
docker build -t mycentos:7.2-iso .
# mycentos:7.2-iso可以換成自己的dockerhub上的名稱/鏡像名稱,規(guī)范命名才可以上傳到倉庫里
創(chuàng)建完成之后然后你可以使用如下命令進行查看
docker ps -a
如果你不想寫文件,也不想下載ISO,可以到我的docker公開倉庫上pull一個已經(jīng)搭建好了的鏡像
docker pull kibety/centos:7.2-iso
#或者mini版本的
docker pull kibety/centos:7.2-iso-mini
至此,我們的鏡像準備完畢,接下來我們準備搭建centos容器集群了
2. 搭建Centos容器集群
首先創(chuàng)建docker bridge網(wǎng)橋
sudo docker network create MyNetWork
創(chuàng)建網(wǎng)橋可以方便網(wǎng)絡(luò)管理,并且讓容器自動歸屬于同一網(wǎng)段下
創(chuàng)建三個不同端口的結(jié)點容器并加入網(wǎng)橋中
sudo docker run -itd --restart=always --hostname node01 --name Node01 -p 21001:8088 -p 30001:8443 -p 20001:50070 -p 10001:22 -v /data/sda/sharedata:/share --network MyNetWork --privileged=true kibety/centos:7.2-iso /sbin/init
sudo docker run -itd --restart=always --hostname node02 --name Node02 -p 21002:8088 -p 30002:8443 -p 20002:50070 -p 10002:22 -v /data/sda/sharedata:/share --network MyNetWork --privileged=true kibety/centos:7.2-iso /sbin/init
sudo docker run -itd --restart=always --hostname node03 --name Node03 -p 21003:8088 -p 30003:8443 -p 20003:50070 -p 10003:22 -v /data/sda/sharedata:/share --network MyNetWork --privileged=true kibety/centos:7.2-iso /sbin/init
# 參數(shù)解釋:
# -itd
# 選項 選項簡寫 說明
# –detach -d 在后臺運行容器,并且打印容器id
# –interactive -i 即使沒有連接,也要保持標準輸入保持打開狀態(tài),一般與 -t 連用
# –tty -t 分配一個偽tty,一般與 -i 連用
# --restart=always 機器啟動時自啟動
# --name 容器名稱
# --hostname 初始化的hostname
# -p 10001:22 端口映射 宿主機端口:容器端口這里為22表示容器內(nèi)ssh端口
# --privileged=true 通過特權(quán)模式進入docker,不僅可以使用systemctl命令(centos 7系統(tǒng)),還可以開啟ssh服務(wù)
# --network NodeNetWork 將容器結(jié)點加入網(wǎng)橋中
# 注意:在 Linux Docker中無法使用 systemd(systemctl) 相關(guān)命令的原因是 1號進程不是 init ,而是其他例如 /bin/bash ,所以導致缺少相關(guān)文件無法運行。(System has not been booted with systemd as init system (PID 1). Can't operat
#解決方案:/sbin/init并且--privilaged=true一定要加上
接下來我們進入容器,開始基礎(chǔ)配置(開啟三個終端)
sudo docker exec -it Node01 /bin/bash
sudo docker exec -it Node02 /bin/bash
sudo docker exec -it Node03 /bin/bash
每臺啟動passwd來初始化root用戶密碼(以node01為例)
passwd
查看三個centos容器中的網(wǎng)絡(luò)配置
ifconfig
在同一個網(wǎng)段下,完美!
接下來我們可以windows上使用docker宿主機的ip(在宿主機中ifconfig或者ip addr查看)與三個容器的22端口映射登錄容器,檢查是否正常
可以看到正常登錄node結(jié)點,可以使用windows的terminal或者ssh遠程連接容器結(jié)點了
至此,結(jié)點搭建完畢,下面我們進入數(shù)據(jù)倉庫的搭建工作
3. 數(shù)據(jù)倉庫的環(huán)境搭建
在上一步中我們已經(jīng)創(chuàng)建了3個加入同一網(wǎng)橋中的centos容器結(jié)點,所以我們不需要再去修改其ip地址了,這也是docker的優(yōu)勢之一
下面是我們要搭建的集群軟件規(guī)劃,這里采用的教程是b站上的up:哈嘍鵬程(在虛擬機上搭建的,講的非常不錯,大家可以去聽聽)
3.1 自動化腳本準備
首先在Node01上準備自動化腳本
由于腳本只能在hadoop上運行,所以我們先提前在home目錄下創(chuàng)建hadoop文件夾,將腳本clone至目錄下
[root@node01 ~]# mkdir /home/hadoop/
[root@node01 hadoop]# git clone https://github.com/MTlpc/automaticDeploy.git
額…clone失敗了,這多半是DNS沒有配置正確導致的,沒關(guān)系,一行代碼解決問題(其他結(jié)點也運行一下這個代碼,以除后患…)
echo "nameserver 8.8.8.8" > /etc/resolv.conf
再次clone,成功!
接著我們使用vim修改hadoop/automaticDeploy/文件夾下的host_ip.txt配置文件。
# vim修改腳本的host_ip配置文件
[root@node01 automaticDeploy]# ls
configs.txt frames.txt hadoop host_ip.txt logs.sh README.md systems
[root@node01 automaticDeploy]# vim host_ip.txt
例如我這里的配置(ip可以ifconfig查看各個容器結(jié)點的ip,hostname和密碼都可以自定義)
172.18.0.2 node01 root HUTB2001
172.18.0.3 node02 root HUTB2001
172.18.0.4 node03 root HUTB2001
給automaticDeploy腳本下的兩個目錄賦權(quán)
[root@node01 automaticDeploy]# chmod +x /home/hadoop/automaticDeploy/hadoop/* /home/hadoop/automaticDeploy//systems/*
安裝上傳組件(我們的dockerfile中已經(jīng)安裝好了可以不用安裝),并將frimes.zip(腳本)安裝包使用xshell軟件通過rz命令上傳
[root@node01 automaticDeploy]# yum install lrzsz -y
# 到home目錄下rz命令上傳安裝包,為了xshell防止亂碼,建議加入 -be參數(shù)
[root@node01 home]# rz -be
# 在home目錄下將frimes.zip腳本解壓到我們的automaticDeploy目錄下
[root@node01 home]# unzip frames.zip -d /home/hadoop/automaticDeploy/
解壓完成后我們在其他兩個結(jié)點也創(chuàng)建/home/hadoop目錄,并將node01上的目錄通過scp分享至其余結(jié)點
# 通過ssh創(chuàng)建node02、node03的目錄
[root@node01 hadoop]# ssh root@172.18.0.3 "mkdir /home/hadoop"
[root@node01 hadoop]# ssh root@172.18.0.4 "mkdir /home/hadoop"
# 將腳本文件分享給node02、node03
[root@node01 hadoop]# scp -r /home/hadoop/automaticDeploy/ root@172.18.0.3:/home/hadoop/
[root@node01 hadoop]# scp -r /home/hadoop/automaticDeploy/ root@172.18.0.4:/home/hadoop/
# 如果出現(xiàn)報錯bash: scp: command not found,那就yum install openssh-clients安裝這個命令,注意node02和03上也要安裝此命令
至此,結(jié)點腳本準備完畢,接下來運行腳本自動安裝程序
3.2 運行腳本
分享完成后,在每個結(jié)點的automaticDeploy/system目錄下都要啟動batchOperate.sh腳本文件
./batchOperate.sh
這個腳本主要是配置免密鑰登錄、更新yum源、安裝jdk、配置host等環(huán)境操作
啟動腳本完成后再驗證一下配置是否成功
# 首先查看是否可以在結(jié)點之間免密登錄,以node01到node02為例,如果不行那就ssh-copy-id解決問題
[root@node01 ~]# ssh node02
Last login: Fri Mar 24 07:57:14 2023 from 172.21.102.10
[root@node02 ~]# exit
logout
測試完成沒問題后,每個結(jié)點分別進入automaticDeploy/hadoop目錄下安裝hadoop集群,然后source一下
./installHadoop.sh
source /etc/profile
在Node01節(jié)點(主節(jié)點)上初始化namenode、啟動hadoop集群、查看運行狀態(tài)
[root@node01 hadoop]# hadoop namenode -format
[root@node01 hadoop]# start-all.sh
[root@node01 hadoop]# jps
# 從節(jié)點ndoe02、node03上也看一下
嗯。。。該有的都有了
至此hadoop安裝成功,可以在瀏覽器中使用宿主機ip:20001查看映射到node01上50070端口的hadoop網(wǎng)頁端(例如我這里訪問地址是:172.21.198.185:20001)
小提示:hadoop的瀏覽器端口是50070,如果要使用外網(wǎng)訪問docker容器中的hadoop,就要在創(chuàng)建容器時添加端口映射至容器內(nèi)的50070端口,這和ssh映射至22端口是一個道理
安裝完成hadoop之后我們首先安裝node02的mysql,因為node03上的hive和tez需要依賴mysql
[root@node02]/home/hadoop/automaticDeploy/hadoop# ./installMysql.sh
在運行時會出現(xiàn)卡住的情況。。。。一排查發(fā)現(xiàn)(排了兩小時。。。):./installMysql.sh中下面這條命令卡住了 :
systemctl start mysqld.service
問了一下chatGPT:
好吧,似乎這條命令占用了shell,導致文件下面的命令無法執(zhí)行,我們自己運行這條命令,然后在./installMysql.sh文件中注釋掉這條命令
# 無意間看到sh文件中有sudo命令,雖然我們是root用戶,但是沒有安裝sudo命令,所以先安裝一下(三個最好都安裝,怕報錯555)
yum install sudo
# 然后再node02上更新一下mysql(有些東西太古老了)
mysql_upgrade
# 最后,我們再node02上重新運行這個腳本
[root@node02]/home/hadoop/automaticDeploy/hadoop# ./installMysql.sh
有冒紅(血壓上來了…),乍一看沒關(guān)系,因為我們運行過這個腳本,所以mysql的3306端口被占用了很正常,還是有點害怕,先上mysql看一下databases正不正常
# 密碼是DBa2020*
[root@node02 hadoop]# mysql -uroot -p
# 在mysql中
show database;
一切正常(松了口氣。。。。)
node02搞定之后,我們在node03的automaticDeploy/hadoop目錄下啟動腳本安裝hive和tez
# 腳本會自動識別是否可以裝其他的庫,這里自動把tez和hive一起裝了
[root@node03 hadoop]# ./installHive.sh
然后會發(fā)現(xiàn)有報錯,但是都是info信息,ip指向了我們的node02結(jié)點,按照b站上作者哈嘍鵬程大佬的說法,應(yīng)該是node02結(jié)點的網(wǎng)絡(luò)或者配置有問題,我們先不管,重啟一下node02的網(wǎng)絡(luò)配置
root@node02 ~]# systemctl restart NetworkManager.service
重啟完成后我們繼續(xù)在ndoe03上安裝sqoop,然后source一下
[root@node03 hadoop]# ./installSqoop.sh
[root@node03 hadoop]# source /etc/profile
接著我們在三個結(jié)點上安裝presto、azkaban
[root@node01 hadoop]# ./installPresto.sh
[root@node02 hadoop]# ./installPresto.sh
[root@node03 hadoop]# ./installPresto.sh
沒問題,但是在安裝azkaban的時候出現(xiàn)了錯誤
[root@node01 hadoop]# ./installAzkaban.sh
[root@node02 hadoop]# ./installAzkaban.sh
[root@node03 hadoop]# ./installAzkaban.sh
網(wǎng)上查了一下發(fā)現(xiàn)在執(zhí)行installAzkaban.sh過程中,無法生成keystore,檢查后發(fā)現(xiàn)哈嘍鵬程大佬的實驗環(huán)境為中文,而我們使用的是centos7的英文版本,造成無法自動應(yīng)答密碼,地區(qū)等信息,從而導致無法拷貝keystore等問題,這里參考了這篇博主的文章來設(shè)置中文字符集:
在每個結(jié)點下以此執(zhí)行下面命令修改為中文字符集:
# 安裝中文字符集包和環(huán)境
yum install -y kde-l10n-Chinese
yum reinstall -y glibc-common
localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8
# 修改字符集配置
echo 'LANG="zh_CN.UTF-8"' > /etc/locale.conf && source /etc/locale.conf
echo "export LC_ALL=zh_CN.UTF-8" >> /etc/profile && source /etc/profile
# 最后驗證配置是否生效
[root@node01 hadoop]# echo $LANG
zh_CN.UTF-8
每個結(jié)點的中文字符配置成功后,我們繼續(xù)完成每個結(jié)點的azkaban的安裝
可以看到?jīng)]有問題了!
那么接下來我們在node03安裝一個presto的web可視化插件
[root@node03 hadoop]# ./installYanagishima.sh
文章來源:http://www.zghlxwxcb.cn/news/detail-663160.html
輕松搞定文章來源地址http://www.zghlxwxcb.cn/news/detail-663160.html
到最后我們在每個結(jié)點上source一下
source /etc/profile
至此,所有環(huán)境搭建完畢,下一篇博客我會帶著大家實現(xiàn)一些docker上centos集群數(shù)據(jù)倉庫的實戰(zhàn)。大家如果覺得這篇文章有幫助可以多多點贊支持一下。
該版本下其他常用命令
# 重啟網(wǎng)絡(luò)服務(wù)
systemctl restart NetworkManager.service
寫在最后:
搭建這個docker環(huán)境耗費了很多時間才肝出來,其中遇到的bug不計其數(shù),很多次都想要放棄,但是每次看著一個個錯誤被解決的時候,這種激動的心情支撐著我一步一步繼續(xù)往下走。所以我也希望大家在遇到很多問題的時候也要嘗試著自己找各種方式解決一下,打不敗我們的只會讓我們更加強大。也許這就是程序員喜歡折騰的樂趣所在。。。。。。
到了這里,關(guān)于在Docker中使用Dockerfile實現(xiàn)ISO文件轉(zhuǎn)化為完整版Centos鏡像,并搭建集群數(shù)據(jù)倉庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!