• Docker应用容器化


    Docker应用容器化 -- 以Hadoop集群为例

    1、安装Docker容器

    # 删除可能有的旧版本
    sudo apt-get remove docker docker-engine docker.io containerd runc
    
    # 更新apt
    sudo apt-get update
    
    # 让apt支持https
    sudo apt-get install apt-transport-https  ca-certificates  curl  gnupg-agent  software-properties-common
    
    # 安装官方GPG密钥
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    
    // 阿里云
    // curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    // sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    
    # 安装docker-ce
    sudo apt-get update
    sudo apt-get install docker-ce
    sudo apt-get install docker-ce-cli
    sudo apt-get install containerd.io  

    2、在Docker中拉取Ubuntu18.04镜像并创建容器

    # 拉取ubuntu 18.04镜像
    sudo docker pull ubuntu:18.04
    
    # 查找拉取的镜像id
    sudo docker images
    
    # 启动一个master容器
    sudo docker run -dit -h master <image-id>
    
    # 查找创建的容器id
    sudo docker ps
    
    # 进入容器
    sudo docker exec -it <container-id> /bin/bash

    # 绑定端口

    sudo docker run -dit -h master -p 9870:9870 -p 8080:8080 -p 4040:4040 -p 8088:8088 -p 8099:8099 <image-id>

    注:<container-id>和<container-id>需要换成对应的id,及生成的hash,如不清楚,可以查看附录1中查看Docker中image、container的命令。

    3、配置容器

    # 更新apt
    apt-get update
    apt-get pagrade
    
    # 安装net-tools
    apt-get install net-tools
    
    # 安装vim
    apt-get install vim
    
    # 安装ssh,配置无密码登录
    apt-get install openssh-server
    ssh-keygen -t rsa -P ''
    回车
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    
    # 查询是否开启ssh
    /etc/init.d/ssh status
    
    # 开启ssh
    /etc/init.d/ssh start
    
    # 配置开机启动
    vim /etc/rc.local
    # 在exit 0语句前加入  /etc/init.d/ssh start  

    4、安装与配置Java

    #安装wget库
    apt install wget
    
    #进入usr/local/src目录下
    cd /usr/local/src
    
    #获取JDK1.8包
    wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz
    
    #解压jdk-8u161-linux-x64.tar.gz
    tar -zxvf jdk-8u131-linux-x64.tar.gz
    
    #重命名为JDK8
    mv jdk1.8.0_131 jdk8
    
    #配置环境变量
    vim  ~/.bashrc #打开环境变量配置文件
    
    #增加下面内容到该文件最后
    export JAVA_HOME=/usr/local/src/jdk8
    export PATH=$JAVA_HOME/bin:$PATH  
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
    
    #使环境生效
    source ~/.bashrc

    5、安装与配置Hadoop

    # 安装hadoop
    wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz
    # 解压
    tar -zxvf hadoop-3.2.0.tar.gz
    # 重命名
    mv hadoop-3.2.0 hadoop
    # 添加环境变量
    sudo vim ~/.bashrc
    # 添加以下代码
    # hadoop
    export HADOOP_HOME=/home/hadoop
    export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
    export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    # 生效
    sudo source ~/.bashrc

    # 配置分布式hadoop

    # 当前路径为/home/hadoop/
    # 创建三个文件夹备用
    mkdir -p hdfs/{data,name,tmp}

    cd /home/hadoop/etc/hadoop

    #  以下修改XXX,均使用“vim XXX”方式进行编写,不再赘述
    修改hadoop-env.sh

    # 在文中只改这一行
    export JAVA_HOME=/home/bigdata/jdk1.8

    # 修改core-site.xml

    <configuration>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://master:9000</value>
    </property>
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/bigdata/hdfs/tmp</value>
    </property>
    </configuration>

    # 修改hdfs-site.xml

    <configuration>
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>/home/bigdata/hadoop/hdfs/name</value>
    </property>
    <property>
    <name>dfs.http.address</name>
    <value>0.0.0.0:50070</value>
    </property>
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>/home/bigdata/hdfs/data</value>
    </property>
    <property>
    <name>dfs.replication</name>
    <value>2</value>
    </property>
    </configuration>

    # 修改mapred-site.xml,注意这里的目录一定要和上面定义的目录相统一,否则DataNode会崩溃,无法集群

    <configuration>
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    <property>
    <name>yarn.app.mapreduce.am.env</name>
    <value>HADOOP_MAPRED_HOME=/home/hadoop</value>
    </property>
    <property>
    <name>mapreduce.map.env</name>
    <value>HADOOP_MAPRED_HOME=/home/hadoop</value>
    </property>
    <property>
    <name>mapreduce.reduce.env</name>
    <value>HADOOP_MAPRED_HOME=/home/hadoop</value>
    </property>
    </configuration>

    # 修改yarn-site.xml

    <configuration>
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>master</value>
    </property>
    </configuration>

    # 创建workers文件

    touch workers
    vim workers
    # 添加:
    master
    slave01
    slave02

    # 格式化HDFS

    cd /home/hadoop/bin
    # 该命令只需运行一次
    hdfs namenode -format

    #  修改运行文件

    cd /home/hadoop/sbin
    # 在start-dfs.sh,stop-dfs.sh文件顶部加入以下配置
    #!/usr/bin/env bash
    HDFS_DATANODE_USER=root
    HADOOP_SECURE_SECURE_USER=hdfs
    HDFS_NAMENODE_USER=root
    HDFS_SECONDARYNAMENODE_USER=root

    # 在start-yarn.sh,stop-yarn.sh文件顶部加入以下配置
    #!/usr/bin/env bash
    YARN_RESOURCEMANAGER_USER=root
    HADOOP_SECURE_DN_USER=yarn
    YARN_NODEMANAGER_USER=root

    6、安装与配置Spark

    wget http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.3/spark-2.4.3-bin-hadoop2.7.tgz
    tar -zxvf spark-2.4.3-bin-hadoop2.7.tgz
    mv spark-2.4.3-bin-hadoop2.7 spark

    # 配置 spark

    cd /home/spark/conf
    cp spark-env.sh.template spark-env.sh
    # spark-env.sh添加以下代码
    export JAVA_HOME=/home/jdk1.8
    export HADOOP_HOME=/home/hadoop
    export HADOOP_CONF_DIR=/home/hadoop/etc/hadoop
    export SCALA_HOME=/home/scala
    export SPARK_HOME=/home/spark
    export SPARK_MASTER_HOST=master
    export SPARK_MASTER_PORT=7077
    export SPARK_MASTER_WEBUI_PORT=8099
    export SPARK_WORKER_CORES=3
    export SPARK_WORKER_INSTANCES=1
    export SPARK_WORKER_MEMORY=5G
    export SPARK_WORKER_WEBUI_PORT=8081
    export SPARK_EXECUTOR_CORES=1
    export SPARK_EXECUTOR_MEMORY=1G
    export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$HADOOP_HOME/lib/native

    cp slaves.template slaves
    # slaves添加以下代码
    master
    slave01
    slave02

    7、提交master并克隆出slaves

    # 退出容器
    exit
    # 提交容器更改
    sudo docker commit <container-id> ubuntu-hadoop-spark:1.0
    # 用刚刚提交的ubuntu-hadoop-spark:1.0创建两个slave
    sudo docker run -dit -h slave01 <image-id>
    sudo docker run -dit -h slave02 <image-id>
    # 运行两个slave
    sudo docker exec -it slave01 /bin/bash
    sudo docker exec -it slave02 /bin/bash
    

    8、hosts配置

    分别进入master、slave01和slave02,用ifconfig命令找出相应的ip,并分别修改hosts文件

    vim /etc/hosts
    # 添加
    xxx.xxx.xxx.xx1   master 
    xxx.xxx.xxx.xx2   slave01
    xxx.xxx.xxx.xx3   slave02
    

      

    9、启动

    分别进入三个容器,启动命令相同

    # 启动hadoop
    cd /home/hadoop/sbin
    ./start-dfs.sh
    ./start-yarn.sh
    # 启动spark
    cd /home/spark/sbin
    ./start-all/sh
    

      

    附录1 Docker常用命令

    # 重启docker服务 
    sudo service docker restart
    # 关闭docker服务 
    sudo service docker stop
    # 开启docker服务
    sudo service docker start
    
    # 拉取ubuntu 18.04镜像
    sudo docker pull ubuntu:18.04
    # docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。 
    sudo docker create <image-id>
    # docker run = docker create + docker start
    sudo docker run  -p 宿主机端口:docker端口 <image-id> 
    # 后台运行
    sudo docker run -dit <image-id>
    # 运行直接进入bash,退出后后台不运行
    sudo docker run -it <image-id> /bin/bash 
    # 查看本地镜像
    sudo docker images
    # 删除镜像
    sudo docker rmi <image-id>
    
    # docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。 
    docker start <container-id>
    # 查看当前运行的容器
    docker ps
    # 查询存在的容器
    docker ps -a
    # 删除容器
    docker rm  <container-id>
    # 强制删除容器
    docker rm -f  <container-id>
    # 不能够删除一个正在运行的容器,会报错。需要先停止容器。
    # 进入容器内部
    sudo docker exec -it (container name or id) /bin/bash
    # 退出容器
    exit
    # 容器重命名
    docker container rename <container-id> newname
    
    # 提交
    docker commit <container-id> <image-name>
    

     

    注意:

    这可以先把镜像保存一下个人镜像仓库,如果不保存,在容器关闭后就会失去所做的所有修改。首先到这个网址注册一个账号https://hub.docker.com/;账号注册成功后,然后在终端输入以下信息:

    docker login 

    再输入你注册时的账号和密码即可登录,然后保存镜像,中间会卡顿一会,正常。

    docker ps # 查看当前运行的容器,方便 id 的查看

    docker commit [容器id] [新镜像名称]

  • 相关阅读:
    第一次团队作业
    第二次结对作业
    动态代理与AOP
    笔试题
    java并发面试题(带答案)
    线程问题——同步和死锁
    java线程的方法
    java实现多线程的方法
    使用java闭锁实现并发
    Java多线程——同步问题
  • 原文地址:https://www.cnblogs.com/Skypeduty1225/p/16246280.html
Copyright © 2020-2023  润新知