前言

前面我们已经准备了本地源环境,以及了解了ambari 相关结构原理。本章节将隆重介绍如何构建docker镜像,由前面文章易知,我们需要构建两个镜像一个 ambari-server 、一个是ambria-agent。

一 构建sephora/ambari_os:7 底层镜像

这里简单提一句,我们知道dockerfile 里面的每一个命令都会使得镜像打包一层,因此我们要惜字如金,能合并的命令尽量使用&& 合并操作,这样尽量减少docker images 的复杂度。

总体而言需要三步操作:

  1. 编写sephora/ ambari_os:7 dockerfile
  2. 拷贝前面准备的离线包
  3. 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”]

  1. 注意生产环境建议使用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)
  2. <a name="a4Xqx"></a>
  3. ## 1.2 指定位置存放文件
  4. 同级目录 存放一个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)
  5. <a name="ARdLe"></a>
  6. ## 1.3 build sephora/ ambari_os:7
  7. 构建os7镜像,执行构建镜像命令
  8. ```dockerfile
  9. docker build -t sephora/ambari_os:7 .

验证结果
image.png
注意:构建成功后,我们可以run 起来,验证环境 jdk 、ssh好不好使。然后再操作下一步。

二 构建 sephora/ambari_agent:2.7.4 镜像

总体来说也是三步:

  1. 编写dockerfile
  2. 拷贝前面准备的离线包
  3. 构建镜像

    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
    

    我存放的位置:
    image.png

    2.2 指定位置存放文件

    注意是放三个repo文件与dockerfile 同级。
    image.png

    2.3 build sephora/ ambari_agent:2.7.4

    构建ambari_agent镜像

    docker build -t sephora/ambari_agent:2.7.4 .
    

    验证结果
    image.png

    三 构建 sephora/ambari_server:2.7.4 镜像

    这个镜像较为复杂,主要涉及一些集群的配置和搭建操作,但是我已经写好脚本全部自动化配置。这块的镜像构建也是分成四步:

  4. 编写dockerfile

  5. 编写脚本
  6. 拷贝提前准备的离线包
  7. 构建镜像

    3.1 sephora/ambari_server:2.7.4 dockerfile

    这里面有许多坑,要反复测试验证最好才能得到的配置。
    vi docker-compose.yml
    FROM 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脚本。image.png
    image.png
    上面的手工操作变成下面的脚本。
    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
    #!/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;
    
    值得注意的事情,是flag.conf只是一个配置文件控制初始化数据只执行一次,其实它也只能执行一次,我加个条件判断防止误操作。
    vi flag.conf
    #初始化数据参数1:表示需要初始化,0表示不需要初始化
    requireInit=1
    
    image.png

    3.3 指定位置存放文件

    image.png

    3.4 build sephora/ambari_server:2.7.4

    构建 ambari_server 镜像
    docker build -t sephora/ambari_server:2.7.4 .
    
    查看验证结果
    image.png

    总结

    本篇内容看起来也不是特别复杂,主要包含两个初始化脚本和一个dockerfile。较为遗憾的是官网目前没有出镜像dockerfile,只能自己构建镜像。