- 前言
- 一 构建sephora/ambari_os:7 底层镜像
- 作者信息 烟雨楼:18915152022@163.com
- 将 yum 源更换一下,速度更快,本地包可以不用配置
- install 小工具。ssh时必须的,其他都可以去除,但是为了测试调试,建议加上这些常用的工具。
- install java
- kerberos client initscripts (service wrapper for servicectl) is need othewise the Ambari is unable to start mysql
- 设置 ssh
- 直接在此处设置免密登录,便于后续的操作。
- setting up systemd
- 二 构建 sephora/ambari_agent:2.7.4 镜像
- 三 构建 sephora/ambari_server:2.7.4 镜像
- 总结
前言
前面我们已经准备了本地源环境,以及了解了ambari 相关结构原理。本章节将隆重介绍如何构建docker镜像,由前面文章易知,我们需要构建两个镜像一个 ambari-server 、一个是ambria-agent。
一 构建sephora/ambari_os:7 底层镜像
这里简单提一句,我们知道dockerfile 里面的每一个命令都会使得镜像打包一层,因此我们要惜字如金,能合并的命令尽量使用&& 合并操作,这样尽量减少docker images 的复杂度。
总体而言需要三步操作:
- 编写sephora/ ambari_os:7 dockerfile
- 拷贝前面准备的离线包
- build 镜像
1.1 编写sephora/ ambari_os:7 dockerfile
ambari_os是基于centos:7然后他将来是做为 ambari-server 、ambari-agent的底层镜像。它主要包括了一些常用的工具组件,为了测试方便,我把很多工具都装上了,你们可以自行取舍。然后这个要配置个ssh免密登录。
注意:构建镜像的命令、每一个我都写好注释了,可以根据自身需求,或增或减
vi docker-compose.yml ```dockerfile FROM centos:7作者信息 烟雨楼:18915152022@163.com
MAINTAINER yanyulou:18915152022@163.com将 yum 源更换一下,速度更快,本地包可以不用配置
RUN yum -y install wget \ && mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup\ && curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo\ && yum makecache\ && yum -y update
install 小工具。ssh时必须的,其他都可以去除,但是为了测试调试,建议加上这些常用的工具。
RUN /bin/cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && groupadd -r admin && useradd -g admin admin \ && yum install -y git \ && yum install -y zsh \ && yum install -y which \ && yum install -y openssh-server \ && yum install -y man \ && yum install -y dstat \ && yum install -y unzip \ && yum install -y nc \ && yum install -y tar \ && yum install -y perl \ && yum install -y file \ && yum install -y crontabs
install java
RUN mkdir /usr/local/jdk ADD jdk-8u241-linux-x64.tar.gz /usr/local/jdk ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_241 ENV JRE_HOME /usr/local/jdk/jdk1.8.0_241/jre ENV PATH $JAVA_HOME/bin:$PATH
kerberos client initscripts (service wrapper for servicectl) is need othewise the Ambari is unable to start mysql
RUN yum install -y krb5-workstation && yum install -y initscripts && yum -y install ntp
设置 ssh
RUN mkdir /var/run/sshd RUN echo ‘root:1234’ |chpasswd RUN sed -ri ‘s/^PermitRootLogin\s+./PermitRootLogin yes/‘ /etc/ssh/sshd_config RUN sed -i ‘s/.StrictHostKeyChecking ask/StrictHostKeyChecking no/‘ /etc/ssh/ssh_config
直接在此处设置免密登录,便于后续的操作。
RUN ssh-keygen -t rsa -P ‘’ -f ~/.ssh/id_rsa && \ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && \ chmod 700 ~/.ssh && \ chmod 600 ~/.ssh/id_rsa && \ chmod 644 ~/.ssh/authorized_keys RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \ && ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key\ && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ecdsa_key
setting up systemd
ENV container docker RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in ; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \ rm -f /lib/systemd/system/multi-user.target.wants/;\ rm -f /etc/systemd/system/.wants/;\ rm -f /lib/systemd/system/local-fs.target.wants/; \ rm -f /lib/systemd/system/sockets.target.wants/udev; \ rm -f /lib/systemd/system/sockets.target.wants/initctl; \ rm -f /lib/systemd/system/basic.target.wants/;\ rm -f /lib/systemd/system/anaconda.target.wants/; RUN yum install -y systemd EXPOSE 22 VOLUME [ “/sys/fs/cgroup” ] ENTRYPOINT [“/usr/sbin/init”]
注意生产环境建议使用openjdk8<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1502688/1597721586586-573da86f-a13c-44bb-99d2-d464e7b45781.png#align=left&display=inline&height=204&margin=%5Bobject%20Object%5D&name=image.png&originHeight=408&originWidth=1638&size=98517&status=done&style=none&width=819)
<a name="a4Xqx"></a>
## 1.2 指定位置存放文件
同级目录 存放一个jdk包备用<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1502688/1597894112684-3e8a7337-7d4b-404c-8ffc-63d6f31fd103.png#align=left&display=inline&height=142&margin=%5Bobject%20Object%5D&name=image.png&originHeight=284&originWidth=846&size=40561&status=done&style=none&width=423)
<a name="ARdLe"></a>
## 1.3 build sephora/ ambari_os:7
构建os7镜像,执行构建镜像命令
```dockerfile
docker build -t sephora/ambari_os:7 .
验证结果
注意:构建成功后,我们可以run 起来,验证环境 jdk 、ssh好不好使。然后再操作下一步。
二 构建 sephora/ambari_agent:2.7.4 镜像
总体来说也是三步:
- 编写dockerfile
- 拷贝前面准备的离线包
-
2.1 sephora/ ambari_agent:7 dockerfile
vi docker-compose.yml
FROM sephora/ambari_os:7 # 作者信息 烟雨楼:18915152022@163.com MAINTAINER yanyulou:18915152022@163.com # 拷贝本地源 repo COPY ambari.repo /etc/yum.repos.d/ COPY HDP.repo /etc/yum.repos.d/ COPY HDP-UTILS.repo /etc/yum.repos.d/ # install ambari-agent RUN yum install -y ambari-agent && systemctl enable sshd && systemctl enable ntpd # Hdfs ports EXPOSE 50010 50020 50070 50075 50090 8020 9000 # Mapred ports EXPOSE 19888 # Yarn ports EXPOSE 8030 8031 8032 8033 8040 8042 8088 # Other ports EXPOSE 49707 2122
2.2 指定位置存放文件
2.3 build sephora/ ambari_agent:2.7.4
构建ambari_agent镜像
docker build -t sephora/ambari_agent:2.7.4 .
三 构建 sephora/ambari_server:2.7.4 镜像
这个镜像较为复杂,主要涉及一些集群的配置和搭建操作,但是我已经写好脚本全部自动化配置。这块的镜像构建也是分成四步:
编写dockerfile
- 编写脚本
- 拷贝提前准备的离线包
- 构建镜像
3.1 sephora/ambari_server:2.7.4 dockerfile
这里面有许多坑,要反复测试验证最好才能得到的配置。
vi docker-compose.ymlFROM sephora/ambari_os:7 # 作者信息 烟雨楼:18915152022@163.com MAINTAINER yanyulou:18915152022@163.com # add ambari repo COPY ambari.repo /etc/yum.repos.d/ COPY HDP.repo /etc/yum.repos.d/ ADD mysql-community-release-el7-5.noarch.rpm /opt/ RUN rpm -ivh /opt/mysql-community-release-el7-5.noarch.rpm RUN yum install -y mysql-community-server && yum install -y ambari-server && yum install -y expect && systemctl enable sshd && systemctl enable ntpd COPY mysql-connector-java-5.1.40.jar /opt/ COPY init.sh /opt/ COPY flag.conf /opt/ RUN mkdir /usr/share/java/ RUN cp /opt/mysql-connector-java-5.1.40.jar /usr/share/java/mysql-connector-java.jar RUN cp /usr/share/java/mysql-connector-java.jar /var/lib/ambari-server/resources/ RUN echo "" >> /etc/ambari-server/conf/ambari.properties RUN echo "server.jdbc.driver.path=/usr/share/java/mysql-connector-java.jar" >> /etc/ambari-server/conf/ambari.properties COPY ambari-setup.sh /usr/bin/ambari-setup.sh RUN chmod 777 /usr/bin/ambari-setup.sh RUN chmod 777 /opt/init.sh RUN chmod 777 /opt/flag.conf RUN chmod +x /opt/init.sh && chmod +x /etc/rc.d/rc.local RUN echo /opt/init.sh >> /etc/rc.d/rc.local EXPOSE 8080
3.2 编写自动化脚本
3.2.1 自动设置脚本 setup.sh
当我们进入容器(server服务器),执行ambari setup 后需要执行的操作(这个是网上旧版本的设置操作,与新版略有不同)帮组我们理解setup.sh脚本。
上面的手工操作变成下面的脚本。
vi ambari-setup.sh#!/usr/bin/expect # excute interactive command spawn echo "*******************start ambari-server setup*****************" set timeout 300 set javahome /usr/local/jdk/jdk1.8.0_241 set mysqlport 3306 set databasename ambari set username root set dbpass 1234 spawn ambari-server setup #expect { expect "daemon*" send "n\r" expect "*?" send "y\r" expect "choice (*" send "2\r" expect "JAVA_HOME:" send "$javahome\r" expect "LZO packages*" send "y\r" expect "configuration*" send "y\r" expect "choice (*" send "3\r" expect "Hostname*" send "\r" expect "Port (*" send "$mysqlport\r" expect "Database name (*" send "$databasename\r" expect "Username (*" send "$username\r" expect "Database Password (*" send "$dbpass\r" expect "Re-enter *" send "$dbpass\r" expect "properties*" send "y\r" expect eof
3.2.2 初始化脚本 init.sh
这个脚本主要干两个事情,一个是初始化mysql数据库,另一个是启动server服务。值得注意的是这个设置初始化的步骤只需要再第一次启动的时候配置。
vi init.sh
值得注意的事情,是flag.conf只是一个配置文件控制初始化数据只执行一次,其实它也只能执行一次,我加个条件判断防止误操作。#!/bin/bash requireInit=`sed '/^requireInit=/!d;s/.*=//' /opt/flag.conf`; echo print-requireInit: $requireInit .... if [ $requireInit -eq 1 ]; then echo start init....; sed -i 's/^requireInit=.*/requireInit=0/' /opt/flag.conf; expect /usr/bin/ambari-setup.sh; mysql -u root <<EOF set password for 'root'@'localhost' = password('1234'); grant all privileges on *.* to 'root'@'%' identified by '1234'; grant all privileges on *.* to 'root'@'localhost' identified by '1234'; grant all privileges on *.* to 'root'@'master' identified by '1234'; UPDATE mysql.user t1 SET t1.Grant_priv = 'Y',t1.Super_priv = 'Y' WHERE t1.USER = 'root'; CREATE DATABASE ambari; use ambari; CREATE USER 'ambari'@'%' IDENTIFIED BY '1234'; GRANT ALL PRIVILEGES ON *.* TO 'ambari'@'%'; CREATE USER 'ambari'@'localhost' IDENTIFIED BY '1234'; GRANT ALL PRIVILEGES ON *.* TO 'ambari'@'localhost'; CREATE USER 'ambari'@'master' IDENTIFIED BY '1234'; GRANT ALL PRIVILEGES ON *.* TO 'ambari'@'master'; FLUSH PRIVILEGES; source /var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql show tables; use mysql; CREATE DATABASE hive; use hive; CREATE USER 'hive'@'%' IDENTIFIED BY 'hive'; GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%'; CREATE USER 'hive'@'localhost' IDENTIFIED BY 'hive'; GRANT ALL PRIVILEGES ON *.* TO 'hive'@'localhost'; CREATE USER 'hive'@'master' IDENTIFIED BY 'hive'; GRANT ALL PRIVILEGES ON *.* TO 'hive'@'master'; FLUSH PRIVILEGES; CREATE DATABASE oozie; use oozie; CREATE USER 'oozie'@'%' IDENTIFIED BY 'oozie'; GRANT ALL PRIVILEGES ON *.* TO 'oozie'@'%'; CREATE USER 'oozie'@'localhost' IDENTIFIED BY 'oozie'; GRANT ALL PRIVILEGES ON *.* TO 'oozie'@'localhost'; CREATE USER 'oozie'@'master' IDENTIFIED BY 'oozie'; GRANT ALL PRIVILEGES ON *.* TO 'oozie'@'master'; FLUSH PRIVILEGES; EOF echo init sql success... fi echo 启动ambari-server.... ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java.jar ambari-server start; systemctl enable ambari-server;
vi flag.conf#初始化数据参数1:表示需要初始化,0表示不需要初始化 requireInit=1
3.3 指定位置存放文件
3.4 build sephora/ambari_server:2.7.4
构建 ambari_server 镜像
查看验证结果docker build -t sephora/ambari_server:2.7.4 .
总结
本篇内容看起来也不是特别复杂,主要包含两个初始化脚本和一个dockerfile。较为遗憾的是官网目前没有出镜像dockerfile,只能自己构建镜像。