0%

Hadoop-Docker

通过 Docker 形式安装 Apache 版本的 Hadoop 及相关组件。


Docker概述

软件开发最大的麻烦事之一,就是环境配置。操作系统的设置、各种库和组件的安装,只有它们都正确,软件才能运行。环境配置如此麻烦,换一台机器,就要重来一次,那么能不能在安装的时候,把原始环境一模一样地复制过来?

虚拟机就是一种带环境安装的解决方案。它可以在一种操作系统里面运行另一种完整的操作系统,但也存在着资源占用多、冗余步骤多、启动慢等问题。

Linux 发展出了另一种虚拟化技术:Linux 容器(Containers)。Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个 保护层 。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。由于容器是进程级别的,相比虚拟机有着资源占用少、体积小、启动快等优势。

Docker 属于 Linux 容器的一种封装,它是创建容器的工具与应用容器的引擎,提供了简单易用的容器使用接口。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

Docker架构

Docker引擎

Docker 引擎是一个 C/S 架构的应用程序,主要包含下面几个组件:

  • 常驻后台的守护进程 dockerd;
  • 用来和 dockerd 通信的 REST API;
  • 命令行 CLI 接口,和 REST API 进行交互。

Docker架构

Docker 的三个主要概念:

  • Docker image:Docker 把应用程序及其依赖,打包在镜像(image)文件里面。image 是只读的二进制文件,可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。镜像可以通过 Dockerfile 创建,也可以从 Docker hub/registry 上下载。
  • Docker container:容器(container)是 Docker 的运行组件。启动一个镜像就是一个容器,容器是一个隔离环境,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。
  • Docker hub/registry:仓库负责共享和管理 Docker 镜像。Docker Hub 是 Docker 官方提供的一个公共仓库,用户可以上传或者下载上面的镜像。

准备Docker环境

安装Docker

1
2
3
4
5
6
7
$ curl -sSL https://get.docker.com/|sudo sh
$ systemctl enable docker && systemctl start docker

$ curl -L "https://github.com/docker/compose/releases/download/1.28.5/ \
docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

$ chmod +x /usr/local/bin/docker-compose

创建网络

创建自定义网络(bridge),这样网络中的主机除了可以使用 IP 访问外,还可以用容器名作为 hostname 相互访问:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建网络bigdata
$ docker network create bigdata

# 查看网络列表
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
8dc59d0036d7 bigdata bridge local
395484b151bd bridge bridge local
9ed6a8494749 host host local
ad68f2065635 none null local

# 删除网络(如需)
$ docker network rm bigdata

使用Docker

通过 Dockerfile 构建基础镜像,以及从仓库远程拉取镜像两种方式,介绍 Docker 镜像、容器的创建及使用。

通过Dockerfile构建基础镜像

通过 Docekrfile 构建 base 镜像,该镜像为大数据组件提供了基础环境,安装了 JDK 以及 which、vim、lrzsz 等常用软件,并配置了免密登录,主要用来被其他镜像继承。

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
FROM centos:7
LABEL author="sannaha@sannaha.moe"
LABEL description="annaha bigdata base docker images"
# 设置工作目录
WORKDIR /opt/bigdata
# 安装任何镜像之前更新一下源
RUN yum -y update
# Docker安装过程是无交互的,必须使用-y参数来避免等待确认
RUN yum -y install java-1.8.0-openjdk-devel
RUN yum -y install openssh-clients openssh-server net-tools inetutils-ping
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" &&\
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" &&\
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
RUN yum -y install which vim-common vim-enhanced

RUN mkdir /var/run/sshd

# 设置登录密码
RUN echo 'root:root' | chpasswd
# 使用sed文本编辑器通过正则表达式对配置文件内容进行修改
# 确保root用户可以ssh登录
RUN sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -ri 's/^#PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
# 设置支持公钥登录
RUN sed -ri 's/^PubkeyAuthentication\s+.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
RUN sed -ri 's/^#PubkeyAuthentication\s+.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
RUN sed -ri 's/^#AuthorizedKeysFile/AuthorizedKeysFile/' /etc/ssh/sshd_config
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN sed -ri 's/^StrictHostKeyChecking\s+.*/StrictHostKeyChecking no/' /etc/ssh/ssh_config
RUN sed -ri 's/^#.*StrictHostKeyChecking\s+.*/StrictHostKeyChecking no/' /etc/ssh/ssh_config
# 禁止密码登录
RUN sed -ri 's/^PasswordAuthentication\s+.*/PasswordAuthentication no/' /etc/ssh/sshd_config
RUN sed -ri 's/^#PasswordAuthentication\s+.*/PasswordAuthentication no/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

COPY run.sh run.sh
RUN chmod +x run.sh
WORKDIR /root
ADD .ssh.tar /root/
RUN chown root:root /root/.ssh
RUN chmod 700 /root/.ssh

RUN echo PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin >> /etc/profile
ENTRYPOINT /opt/bigdata/run.sh

Dockerfile 中使用到的其他脚本和文件:

run.sh

run.sh
1
2
3
4
#!/bin/sh
/usr/sbin/sshd > /dev/null &
# docker容器需要一个进程(最后一个命令)来保持运行容器状态的运行,否则该容器将退出/停止
/bin/sh

.ssh.tar 存储给定的公钥和私钥:

.ssh.tar
1
2
3
4
5
.ssh
├── authorized_keys
├── id_rsa
├── id_rsa.pub
└── known_hosts

指令解析

  • FROM:定制的镜像都是基于其他镜像,这里的 centos:7 就是定制需要的基础镜像。后续的操作都是基于 centos:7

  • RUN:用于执行后面的 Linux 命令。有两种格式:

  • RUN <Linux命令>

  • RUN ["可执行文件","参数1","参数2",...]

  • COPY:从上下文目录中复制文件或目录到容器里的指定目录。源路径支持通配符,目标路径如果不存在会自动创建。

  • ADD:使用格式和 COPY 一致,当源文件为 tar 压缩文件的话,会自动解压到目标路径。

  • CMD:用于运行程序,与 RUN 指令不同的是,CMD 是在 docker run 时运行,RUN 是在 docker build 时运行。作用是为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。Dockerfile 中的多个 CMD 指令仅最后一个生效。

  • ENTRYPOINT:类似于 CMD 指令,但它不会被 docker run 的命令行参数指定的指令所覆盖,反而是这些命令行参数会作为参数传给 ENTRYPOINT 指令指定的程序。经常与 CMD 指令搭配使用,ENTRYPOINT 设置定参,CMD 设置变参。

  • ENV:设置环境变量,格式为 ENV <key> <value>,后续指令可以通过 $key 使用这个环境变量。

  • ARG:设置环境变量,只是与 ENV 的作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

  • VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

  • EXPOSE:声明端口。帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

  • WORKDIR:指定容器的一个目录为工作目录,该目录需提前创建好,会在构建镜像的每一层都存在。容器启动时执行的命令会在该目录下执行。

  • LABEL:用于给镜像添加一些元数据,如镜像作者等,格式为 LABEL <key>=<value> ...

Dockerfile 每执行一次指令都会在 docker 上新建一层,为了避免过多无意义的层造成镜像膨胀过大,可以用 && 连接多条 RUN 指令:

1
2
3
4
5
6
7
- RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
- RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
- RUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""

+ RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" &&\
+ ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" &&\
+ ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""

构建镜像

有了 Dockerfile,就可以使用 docker build 命令来根据 Dockerfile 文件以及上下文来构建 Docker 镜像。上下文是指一个本地路径或 URL 地址(Git 仓库地址)。

1
2
3
4
5
$ docker build -t bigdata:base-1.0 .

# 格式
$ docker build [OPTIONS] PATH | URL | -
--tag, -t:设置镜像的名字及标签,使用name:tag或者name格式

创建容器

1
2
3
4
5
6
7
8
9
10
$ docker run --name base --network bigdata --network-alias base -dit bigdata:base-1.0

# 格式
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
--name:为容器指定一个名称
--network:将容器连接到网络
--network-alias:为容器添加网络范围的别名
-d:后台运行容器,并返回容器ID
-i:即使未连接,也要保持STDIN(标准输入)打开,通常与-t同时使用
-t:为容器分配一个伪输入终端,通常与-i同时使用

通过仓库拉取MySQL镜像

从仓库拉取 MySQL 镜像并创建容器,用于存储 Hive 元数据。

1
2
3
4
5
6
7
8
9
10
$ docker pull mysql:5.7

$ docker run -p 3306:3306 --name mysql \
--network bigdata \
--network-alias mysql \
-v conf:/etc/mysql \
-v logs:/var/log/mysql \
-v data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

通过仓库拉取ftp镜像

从仓库拉取 vsftpd 镜像并创建容器,用作 FTP 服务器:

1
2
3
4
$ docker pull fauria/vsftpd

# 创建vsftpd容器,文件存储在/home/vsftpd/ftpadmin/目录下
$ docker run -d -v /home/vsftpd:/home/vsftpd -p 20:20 -p 21:21 -p 21100-21110:21100-21110 -e FTP_USER=ftpadmin -e FTP_PASS=ftpadmin --privileged --name vsftpd fauria/vsftpd

hadoop

安装 Hadoop、Flume 和 Hive。

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
FROM base:1.0
LABEL author="sannaha@sannaha.moe"
LABEL description="sannaha bigdata hadoop and hive docker images"
# 设置工作目录
WORKDIR /opt/bigdata
# 在做任何安装镜像之前都必要更新一下源
RUN yum -y update

# Docker安装过程是无交互的,必须使用-y参数来避免等待确认
RUN mkdir -p /data/hadoop/namenode /data/hadoop/datanode /data/hadoop/tmp /data/flume/data /data/flume/checkpoint

# 配置Hadoop
ADD hadoop-2.7.3.tar.gz /opt/bigdata
RUN mv hadoop-2.7.3 hadoop
ENV HADOOP_HOME /opt/bigdata/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

RUN echo HADOOP_HOME=/opt/bigdata/hadoop >> /etc/profile
RUN echo PATH=$HADOOP_HOME/bin:$PATH >> /etc/profile

COPY core-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY hadoop-env.sh /opt/bigdata/hadoop/etc/hadoop/
COPY hdfs-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY yarn-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY mapred-env.sh /opt/bigdata/hadoop/etc/hadoop/
COPY mapred-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY slaves /opt/bigdata/hadoop/etc/hadoop/

RUN /opt/bigdata/hadoop/bin/hdfs namenode -format

# 配置Hive
ADD apache-hive-2.3.4-bin.tar.gz /opt/bigdata
RUN mv /opt/bigdata/apache-hive-2.3.4-bin /opt/bigdata/hive
ENV HIVE_HOME /opt/bigdata/hive
ENV PATH $HIVE_HOME/bin:$PATH

RUN echo HIVE_HOME=/opt/bigdata/hive >> /etc/profile
RUN echo PATH=$HIVE_HOME/bin:$PATH >> /etc/profile
# 删除hive中的slf4j包,避免与hadoop中的slf4j冲突
RUN mv /opt/bigdata/hive/lib/log4j-slf4j-impl-2.6.2.jar /opt/bigdata/hive/lib/log4j-slf4j-impl-2.6.2.jar.bk
# 复制hive中版本较高的guava包到hadoop中
RUN mv /opt/bigdata/hadoop/share/hadoop/common/lib/guava-11.0.2.jar /opt/bigdata/hadoop/share/hadoop/common/lib/guava-11.0.2.jar.bk && \
cp /opt/bigdata/hive/lib/guava-14.0.1.jar /opt/bigdata/hadoop/share/hadoop/common/lib/

COPY hive-env.sh /opt/bigdata/hive/conf/
COPY hive-site.xml /opt/bigdata/hive/conf/
COPY mysql-connector-java-5.1.38.jar /opt/bigdata/hive/lib/

# 配置Flume
ADD apache-flume-1.9.0-bin.tar.gz /opt/bigdata
RUN mv /opt/bigdata/apache-flume-1.9.0-bin /opt/bigdata/flume
# RUN cp /opt/bigdata/flume/conf/flume-env.sh.template /opt/bigdata/flume/conf/flume-env.sh

COPY flume-env.sh /opt/bigdata/flume/conf/
COPY core-site.xml /opt/bigdata/flume/conf/
COPY hadoop-env.sh /opt/bigdata/flume/conf/
COPY slaves /opt/bigdata/flume/conf/

RUN mkdir -p /conf/hadoop /opt/bigdata/flume/task /conf/flume
RUN mv /opt/bigdata/hadoop/etc/hadoop/slaves /conf/hadoop
RUN ln -s /conf/hadoop/slaves /opt/bigdata/hadoop/etc/hadoop/slaves
RUN mv /opt/bigdata/flume/task /conf/flume
RUN ln -s /conf/flume/task /opt/bigdata/flume/task

# COPY runFlumeSh /conf/flume
# RUN chmod +x /conf/flume/runFlumeSh
# COPY kafka-flume-log-handle.conf /opt/bigdata/flume/task

WORKDIR /
RUN tar -czf data.tgz data
RUN tar -czf conf.tgz conf

VOLUME ["/data","/conf"]

COPY run.sh /opt/bigdata/run.sh
ENTRYPOINT /opt/bigdata/run.sh

Hadoop配置

Dockerfile 中使用到的 Hadoop 相关配置文件。

core-site.xml

core-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoopserver:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/data/hadoop/tmp</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>

hadoop-env.sh

hadoop-env.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# The java implementation to use.
# 注意检查此处JDK路径应与base镜像中安装的JDK路径是否一致,避免报错
# export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.el7_9.x86_64/jre
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64/jre

# The jsvc implementation to use. Jsvc is required to run secure datanodes
# that bind to privileged ports to provide authentication of data transfer
# protocol. Jsvc is not required if SASL is configured for authentication of
# data transfer protocol using non-privileged ports.
#export JSVC_HOME=${JSVC_HOME}

export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}

# Extra Java CLASSPATH elements. Automatically insert capacity-scheduler.
for f in $HADOOP_HOME/contrib/capacity-scheduler/*.jar; do
if [ "$HADOOP_CLASSPATH" ]; then
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f
else
export HADOOP_CLASSPATH=$f
fi
done

# The maximum amount of heap to use, in MB. Default is 1000.
#export HADOOP_HEAPSIZE=
#export HADOOP_NAMENODE_INIT_HEAPSIZE=""

# Extra Java runtime options. Empty by default.
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"

# Command specific options appended to HADOOP_OPTS when specified
export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS"
export HADOOP_NFS3_OPTS="$HADOOP_NFS3_OPTS"
export HADOOP_PORTMAP_OPTS="-Xmx512m $HADOOP_PORTMAP_OPTS"

# The following applies to multiple commands (fs, dfs, fsck, distcp etc)
export HADOOP_CLIENT_OPTS="-Xmx512m $HADOOP_CLIENT_OPTS"
#HADOOP_JAVA_PLATFORM_OPTS="-XX:-UsePerfData $HADOOP_JAVA_PLATFORM_OPTS"

# On secure datanodes, user to run the datanode as after dropping privileges.
# This **MUST** be uncommented to enable secure HDFS if using privileged ports
# to provide authentication of data transfer protocol. This **MUST NOT** be
# defined if SASL is configured for authentication of data transfer protocol
# using non-privileged ports.
export HADOOP_SECURE_DN_USER=${HADOOP_SECURE_DN_USER}

# Where log files are stored. $HADOOP_HOME/logs by default.
#export HADOOP_LOG_DIR=${HADOOP_LOG_DIR}/$USER

# Where log files are stored in the secure data environment.
export HADOOP_SECURE_DN_LOG_DIR=${HADOOP_LOG_DIR}/${HADOOP_HDFS_USER}

###
# HDFS Mover specific parameters
###
# Specify the JVM options to be used when starting the HDFS Mover.
# These options will be appended to the options specified as HADOOP_OPTS
# and therefore may override any similar flags set in HADOOP_OPTS
#
# export HADOOP_MOVER_OPTS=""

###
# Advanced Users Only!
###

# The directory where pid files are stored. /tmp by default.
# NOTE: this should be set to a directory that can only be written to by
# the user that will run the hadoop daemons. Otherwise there is the
# potential for a symlink attack.
export HADOOP_PID_DIR=${HADOOP_PID_DIR}
export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR}

# A string representing this instance of hadoop. $USER by default.
export HADOOP_IDENT_STRING=$USER

hdfs-site.xml

hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoopserver:50070</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/data/hadoop/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/data/hadoop/datanode</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>

yarn-site.xml

yarn-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0"?>
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoopserver</value>
</property>
</configuration>

mapred-env.sh

mapred-env.sh
1
2
3
4
5
6
7
8
9
10
# export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.el7_9.x86_64/jre
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64/jre
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000
export HADOOP_MAPRED_ROOT_LOGGER=INFO,RFA
#export HADOOP_JOB_HISTORYSERVER_OPTS=
#export HADOOP_MAPRED_LOG_DIR="" # Where log files are stored. $HADOOP_MAPRED_HOME/logs by default.
#export HADOOP_JHS_LOGGER=INFO,RFA # Hadoop JobSummary logger.
#export HADOOP_MAPRED_PID_DIR= # The pid files are stored. /tmp by default.
#export HADOOP_MAPRED_IDENT_STRING= #A string representing this instance of hadoop. $USER by default
#export HADOOP_MAPRED_NICENESS= #The scheduling priority for daemons. Defaults to 0.

mapred-site.xml

mapred-site.xml
1
2
3
4
5
6
7
8
<?xml version="1.0"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

slaves

slaves
1
hadoopserver

Hive配置

Dockerfile 中使用到的 Hadoop 相关配置文件。

hive-site.xml

hive-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://mysql:3306/hive?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8&amp;useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoopserver</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoopserver:9083</value>
</property>
</configuration>

hive-env.sh

hive-env.sh
1
2
3
4
5
6
7
8
9
10
11
# Set HADOOP_HOME to point to a specific hadoop install directory
# HADOOP_HOME=${bin}/../../hadoop
HADOOP_HOME=/opt/bigdata/hadoop

# Hive Configuration Directory can be controlled by:
# export HIVE_CONF_DIR=
export HIVE_CONF_DIR=/opt/bigdata/hive/conf
export HADOOP_OPTS="$HADOOP_OPTS -Dfile.encoding=UTF-8"

# Folder containing extra libraries required for hive compilation/execution can be controlled by:
# export HIVE_AUX_JARS_PATH=

Flume配置

flume-env.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# If this file is placed at FLUME_CONF_DIR/flume-env.sh, it will be sourced
# during Flume startup.

# Enviroment variables can be set here.
# 注意检查此处JDK路径应与base镜像中安装的JDK路径是否一致,避免报错
# export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.el7_9.x86_64/jre
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64/jre

# Give Flume more memory and pre-allocate, enable remote monitoring via JMX
# export JAVA_OPTS="-Xms100m -Xmx2000m -Dcom.sun.management.jmxremote"

# Let Flume write raw event data and configuration information to its log files for debugging
# purposes. Enabling these flags is not recommended in production,
# as it may result in logging sensitive user information or encryption secrets.
# export JAVA_OPTS="$JAVA_OPTS -Dorg.apache.flume.log.rawdata=true -Dorg.apache.flume.log.printconfig=true "

# Note that the Flume conf directory is always included in the classpath.
#FLUME_CLASSPATH=""

其他脚本

runFlume

1
2
3
4
5
#!/bin/sh
if [ -f /opt/bigdata/flume/task/kafka-flume-log-handle.conf ]; then
cd /opt/bigdata/flume/task
nohup /opt/bigdata/flume/bin/flume-ng agent -n a1 -c conf -f kafka-flume-log-handle.conf -Dflume.root.logger=INFO,console &
fi

run.sh

run.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh
/usr/sbin/sshd >/dev/null &
PATH=/opt/bigdata/hive/bin:/opt/bigdata/hadoop/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

if [ -f /data.tgz ]; then
cd /
tar -xf data.tgz
rm -f /data.tgz
fi

if [ -f /conf.tgz ]; then
cd /
tar -xf conf.tgz
rm -f /conf.tgz
fi

/opt/bigdata/hadoop/sbin/start-dfs.sh
sleep 10
/opt/bigdata/hadoop/sbin/start-yarn.sh
sleep 10
/bin/bash

构建镜像

1
$ docker build -t hadoop:1.0 .

创建容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ docker run -p 50070:50070 -p 9000:9000 -p 8020:8020 --cpus 1 -m 4GB  -v /data/hadoopData:/data -v hadoopConf:/conf --name hadoopserver --network bigdata --network-alias hadoopserver -dit hadoop:1.0

# 格式
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-p:指定端口映射,格式为:宿主机端口:容器端口
--cpus:CPU数量
-m:容器最大内存使用限制
-v:绑定挂载卷,格式为:宿主机目录:容器目录。默认挂载在/var/lib/docker/volumes/
--name:为容器指定一个名称
--network:将容器连接到网络
--network-alias:为容器添加网络范围的别名
-d:后台运行容器,并返回容器ID
-i:即使未连接,也要保持STDIN(标准输入)打开,通常与-t同时使用
-t:为容器分配一个伪输入终端,通常与-i同时使用

初始化元数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
# 进入hadoopserver容器
$ docker exec -it hadoopserver bash

# 初始化hive元数据库
$ /opt/bigdata/hive/bin/schematool -initSchema -dbType mysql
...
Metastore connection URL: jdbc:mysql://mysql:3306/hive?createDatabaseIfNotExist=true&useSSL=false
Metastore Connection Driver : com.mysql.jdbc.Driver
Metastore connection User: root
Starting metastore schema initialization to 2.3.0
Initialization script hive-schema-2.3.0.mysql.sql
Initialization script completed
schemaTool completed

启动Hive

启动 Metastore Server 服务和 HiveServer2 服务:

/opt/bigdata/hive/bin
1
2
$ ./hive --service metastore 2>&1 &
$ ./hive --service hiveserver2 2>&1 &

进入 Hive CLI 或 Beeline:

/opt/bigdata/hive/bin
1
2
$ ./hive
$ ./beeline -n root -p root -u jdbc:hive2://hadoopserver:10000

spark

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
FROM bigdata:base-1.0
LABEL author="sannaha@sannaha.moe"
LABEL description="sannaha bigdata docker images"
#设置工作目录
WORKDIR /opt/bigdata
#在做任何安装镜像之前都必要更新一下源
RUN yum -y update
#使用-y 表示在遇到提示时,一律是YES。这在docker安装中是必须 的。因为docker 安装过程是无交互的

RUN mkdir -p /data/hadoop/namenode
RUN mkdir -p /data/hadoop/datanode
RUN mkdir -p /data/hadoop/tmp
RUN mkdir -p /data/spark

RUN yum install crontabs -y

#配置hadoop
ADD hadoop-2.7.3.tar.gz /opt/bigdata
RUN mv hadoop-2.7.3 hadoop
ENV HADOOP_HOME /opt/bigdata/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

RUN echo HADOOP_HOME=/opt/bigdata/hadoop>>/etc/profile
RUN echo PATH=$HADOOP_HOME/bin:$PATH>>/etc/profile

COPY core-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY hadoop-env.sh /opt/bigdata/hadoop/etc/hadoop/
COPY hdfs-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY yarn-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY mapred-env.sh /opt/bigdata/hadoop/etc/hadoop/
COPY mapred-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY slaves1 /opt/bigdata/hadoop/etc/hadoop/
COPY capacity-scheduler.xml /opt/bigdata/hadoop/etc/hadoop/

RUN rm -rf /opt/bigdata/hadoop/etc/hadoop/slaves
RUN mv /opt/bigdata/hadoop/etc/hadoop/slaves1 /opt/bigdata/hadoop/etc/hadoop/slaves

#RUN chmod +x /opt/bigdata/hadoop/bin/hdfs

RUN /opt/bigdata/hadoop/bin/hdfs namenode -format

#配置spark
ADD spark-2.1.1-bin-hadoop2.7.tgz /opt/bigdata

RUN mv /opt/bigdata/spark-2.1.1-bin-hadoop2.7 /opt/bigdata/spark

RUN mv /opt/bigdata/spark/conf/spark-env.sh.template /opt/bigdata/spark/conf/spark-env.sh
COPY spark-env.sh /opt/bigdata/spark/conf/

RUN mv /opt/bigdata/spark/conf/slaves.template /opt/bigdata/spark/conf/slaves
COPY slaves /opt/bigdata/spark/conf/



ENV SPARK_HOME /opt/bigdata/spark
ENV PATH $SPARK_HOME/bin:$PATH

ADD scala-2.11.8.tgz /opt/bigdata
RUN mv scala-2.11.8 scala
ENV SCALA_HOME /opt/bigdata/scala
ENV PATH $SCALA_HOME/bin:$PATH

RUN echo SCALA_HOME=/opt/bigdata/scala>>/etc/profile
RUN echo PATH=$SCALA_HOME/bin:$PATH>>/etc/profile

RUN mkdir -p /conf/hadoop
RUN mkdir -p /conf/spark/conf
RUN mkdir -p /opt/bigdata/spark/jars
RUN mkdir -p /opt/bigdata/spark/task

COPY runTask.sh /opt/bigdata/spark/

RUN chmod +x /opt/bigdata/spark/runTask.sh

#hadoop软链接
RUN mv /opt/bigdata/hadoop/etc/hadoop/slaves /conf/hadoop
RUN ln -s /conf/hadoop/slaves /opt/bigdata/hadoop/etc/hadoop/slaves

#spark软链接
RUN mv /opt/bigdata/spark/conf/slaves /conf/spark/conf
RUN ln -s /conf/spark/conf/slaves /opt/bigdata/spark/conf/slaves


RUN mv /opt/bigdata/spark/jars /conf/spark/
RUN ln -s /conf/spark/jars /opt/bigdata/spark/jars

RUN mv /opt/bigdata/spark/task /conf/spark/
RUN ln -s /conf/spark/task /opt/bigdata/spark/task

RUN mv /opt/bigdata/spark/runTask.sh /conf/spark/
RUN ln -s /conf/spark/runTask.sh /opt/bigdata/spark/runTask.sh

WORKDIR /
RUN tar -czf data.tgz data
RUN tar -czf conf.tgz conf

VOLUME ["/data","/conf"]

COPY run.sh /opt/bigdata/run.sh

COPY runSlave.sh /opt/bigdata/runSlave.sh

ENTRYPOINT /opt/bigdata/run.sh

构建镜像

1
$ docker build -t spark:1.0 .

创建容器

1
2
3
4
5
# 创建spark-slave1容器
docker run --entrypoint="/opt/bigdata/runSlave.sh" -v sparkData:/data -v sparkConf:/conf --name spark-slave1 --network bigdata --network-alias spark-slave1 -dit spark:1.0

# 创建spark-masater容器
docker run -p 8088:8088 -p 8042:8042 -v sparkData:/data -v sparkConf:/conf --name spark-master --network bigdata --network-alias spark-master -dit spark:1.0

kafka

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
FROM bigdata:base-1.0
LABEL author="sannaha@sannaha.moe"
LABEL description="sannaha bigdata docker images"
#设置工作目录
WORKDIR /opt/bigdata
#在做任何安装镜像之前都必要更新一下源
RUN yum -y update
#使用-y 表示在遇到提示时,一律是YES。这在docker安装中是必须 的。因为docker 安装过程是无交互的
RUN mkdir -p /data/zookeeper/zkData
RUN mkdir -p /data/kafka/logs

#配置zookeeper
ADD zookeeper-3.4.10.tar.gz /opt/bigdata
RUN mv zookeeper-3.4.10 zookeeper

RUN mv /opt/bigdata/zookeeper/conf/zoo_sample.cfg /opt/bigdata/zookeeper/conf/zoo.cfg
COPY zoo.cfg /opt/bigdata/zookeeper/conf/zoo.cfg

#配置kafka
ADD kafka_2.12-2.3.0.tgz /opt/bigdata
RUN mv kafka_2.12-2.3.0 kafka
ENV KAFKA_HOME /opt/bigdata/kafka
ENV PATH $KAFKA_HOME/bin:$PATH

RUN echo KAFKA_HOME=/opt/bigdata/kafka >>/etc/profile
RUN echo PATH=$KAFKA_HOME/bin:$PATH >>/etc/profile

COPY server.properties /opt/bigdata/kafka/config/server.properties

COPY run.sh /opt/bigdata/

RUN mkdir -p /conf/kafka
RUN mkdir -p /conf/zookeeper

RUN mv /opt/bigdata/kafka/config/server.properties /conf/kafka
RUN ln -s /conf/kafka/server.properties /opt/bigdata/kafka/config/server.properties

RUN mv /opt/bigdata/zookeeper/conf/zoo.cfg /conf/zookeeper
RUN ln -s /conf/zookeeper/zoo.cfg /opt/bigdata/zookeeper/conf/zoo.cfg

WORKDIR /
RUN tar -czf data.tgz data
RUN tar -czf conf.tgz conf

VOLUME ["/data","/conf"]

ENTRYPOINT /opt/bigdata/run.sh

构建镜像

1
$ docker build -t kafka:1.0 .

创建容器

1
$ docker run -p 9092:9092  -p 2181:2181 --cpus 1 -m 1GB  --name kafkaserver -v kafkaData:/data -v kafkaConf:/conf --network bigdata --network-alias kafkaserver -dit kafka:1.0

修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 进入kafka容器
$ docker exec -it kafkaserver bash

# 修改kafka中的配置 server.properties
添加
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://103.118.52.155:9092

将kafkaserver名称修改为真实的 并设置

修改完 重启kakfa服务 可以进入 /opt/bigdata/run.sh 查看启动kafka命令

nohup /opt/bigdata/kafka/bin/kafka-server-start.sh /opt/bigdata/kafka/config/server.properties&

# 删除容器
$ docker stop kafkaserver &&docker rm kafkaserver

常用命令

网络

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建网络
$ docker network create bigdata

# 查看网络列表
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
8dc59d0036d7 bigdata bridge local
395484b151bd bridge bridge local
9ed6a8494749 host host local
ad68f2065635 none null local

# 删除网络
$ docker network rm bigdata

镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 通过 Dockerfile 构建镜像
$ docker build -t bigdata:base-1.0 .
# 格式
$ docker build [OPTIONS] PATH | URL | -
--tag, -t:设置镜像的名字及标签,使用name:tag或者name格式

# 通过仓库拉取镜像
$ docker pull mysql:5.7

# 查看镜像列表
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hadoop 1.0 994c7bf60f99 18 hours ago 2.75GB
bigdata base-1.0 718ece27b5ae 20 hours ago 1.23GB
mysql 5.7 09361feeb475 2 weeks ago 447MB
centos 7 8652b9f0cb4c 7 months ago 204MB

# 删除镜像(需删除使用该镜像的全部容器)
$ docker rmi 994c7bf60f99

# 将指定镜像保存为tar归档
$ docker save -o ./hadoop_1_0.tar hadoop:1.0
# 导入归档的镜像
$ docker load --input ./hadoop_1_0.tar

容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 创建容器
$ docker run -p 50070:50070 -p 9000:9000 -p 8020:8020 --cpus 1 -m 4GB -v /data/hadoopData:/data -v hadoopConf:/conf --name hadoopserver --network bigdata --network-alias hadoopserver -dit hadoop:1.0
# 格式
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-p:指定端口映射,格式为:宿主机端口:容器端口
--cpus:CPU数量
-m:容器最大内存使用限制
-v:绑定挂载卷,格式为:宿主机目录:容器目录
--name:为容器指定一个名称
--network:将容器连接到网络
--network-alias:为容器添加网络范围的别名
-d:后台运行容器,并返回容器ID
-i:即使未连接,也要保持STDIN(标准输入)打开,通常与-t同时使用
-t:为容器分配一个伪输入终端,通常与-i同时使用

# 查看所有容器
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05d764353843 hadoop:1.0 "/bin/sh -c /opt/big…" 18 hours ago Up 25 seconds 0.0.0.0:8020->8020/tcp, :::8020->8020/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:50070->50070/tcp, :::50070->50070/tcp hadoopserver
3110f7f459c6 mysql:5.7 "docker-entrypoint.s…" 19 hours ago Exited (0) 17 hours ago mysql
2ad4d3248e8c bigdata:base-1.0 "/bin/sh -c /opt/big…" 20 hours ago Exited (137) 18 hours ago base

# 查看运行中的容器
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05d764353843 hadoop:1.0 "/bin/sh -c /opt/big…" 18 hours ago Up 2 seconds 0.0.0.0:8020->8020/tcp, :::8020->8020/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:50070->50070/tcp, :::50070->50070/tcp hadoopserver

# 启动容器
$ docker start hadoopserver

# 重启容器
$ docker restart hadoopserver

# 进入容器
$ docker exec -it hadoopserver bash

# 关闭容器
$ docker stop hadoopserver

# 删除容器(需停止容器运行)
$ docker rm hadoopserver

# 导出容器快照
$ docker export 05d764353843 > hadoopserver.tar
# 从容器快照导入为镜像
$ cat hadoopserver.tar | docker import - hadoop:2.0

# 复制文件到指定容器ID中的指定目录下
$ docker cp apache-hive-2.3.4-bin.tar.gz 05d764353843:/opt/bigdata
# 复制容器中的文件到宿主机指定目录下
$ docker cp 05d764353843:/opt/bigdata/hive/conf /opt/bigdata/work/conf/

docker export 导出的容器快照文件会丢弃所有的历史记录和元数据信息(仅保存容器当时的快照状态),而 docker save 保存的镜像归档文件会保存完整记录,体积也要大。docker import 导入容器快照和 docker load 导入归档镜像时都会将其恢复为镜像,此外,导入容器快照时可以重新指定标签等元数据信息,导入归档镜像时则不能重命名。

创建其他容器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 启动hadoop
$ docker run -p 50070:50070 -p 9000:9000 -p 8020:8020 --cpus 1 -m 8GB -v /data/hadoopData:/data -v hadoopConf:/conf --name hadoopserver --network base-bigdata --network-alias hadoopserver -dit hadoop:1.0

# 启动web
$ docker run -p 8081:8081 -p 8080:8080 -p 6379:6379 -p 8443:8443 --cpus 4 -m 4GB -v webData:/data -v webConf:/conf --name javaserver --network base-bigdata --network-alias javaserver -dit web:1.0

# 先启动spark-slave1
$ docker run --entrypoint="/opt/bigdata/runSlave.sh" -v sparkData:/data -v sparkConf:/conf --name spark-slave1 --network base-bigdata --network-alias spark-slave1 -dit spark:1.0

# 后启动spark-master
$ docker run -p 8088:8088 -p 8042:8042 -v sparkData:/data -v sparkConf:/conf --name spark-master --network base-bigdata --network-alias spark-master -dit spark:1.0

# 启动elasticsearch
$ chmod -R 777 /var/lib/docker/volumes/ES*

$ docker run -p 9200:9200 -p 9300:9300 --name elasticsearchserver -e ES_JAVA_POTS="-Xms8g -Xmx8g" -e "discovery.type=single-node" \
-v ESconfig:/usr/share/elasticsearch/config \
-v ESdata:/usr/share/elasticsearch/data \
-v ESplugins:/usr/share/elasticsearch/plugins \
--network base-bigdata \
--network-alias elasticsearchserver \
-d elasticsearch:6.8.0

添加端口映射

使用 docker run 创建容器时可以通过 -p 进行端口映射,如果后续想要添加端口映射,可以采取以下两种方法。

修改容器配置文件

停止容器和 docker 服务,在配置文件中添加端口绑定和端口暴露:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 查看容器ID
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05d764353843 hadoop:1.0 "/bin/sh -c /opt/big…" 4 days ago Up 6 hours 0.0.0.0:8020->8020/tcp, :::8020->8020/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:50070->50070/tcp, :::50070->50070/tcp hadoopserver

# 停止容器和docker服务
$ docker stop 05d764353843 && systemctl stop docker

# 进入容器对应目录
cd /var/lib/docker/containers/05d764353843e860b3cbb2f80c9197e1a2a73fea60f14320c1639e7da56bbe93/

# 修改hostconfig.json,在PortBindings中添加端口绑定
$ vim hostconfig.json

# 修改config.v2.json,在ExposedPorts中添加暴露端口
$ vim config.v2.json

# 启动docker服务
$ systemctl stop docker

# 运行容器,查看端口已经绑定
$ docker start hadoopserver && docker ps
hadoopserver
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05d764353843 hadoop:1.0 "/bin/sh -c /opt/big…" 4 days ago Up Less than a second 0.0.0.0:8020->8020/tcp, :::8020->8020/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:10000->10000/tcp, :::10000->10000/tcp, 0.0.0.0:50070->50070/tcp, :::50070->50070/tcp hadoopserver

创建新容器

将已有容器打包为镜像,通过该镜像创建新容器。由于镜像使用过程中执行了许多命令并且有着大量的文件改动,生成的镜像会极为臃肿。docker commit 对镜像的操作都是黑箱,因此 docker commit 生成的镜像也被称为黑箱镜像,不推荐使用

1
2
3
4
5
6
7
8
9
10
11
# 停止现有容器
$ docker stop hadoopserver

# 将已有容器打包为镜像
$ docker commit hadoopserver hadoop:1.1

# 删除旧容器
$ docker rm hadoopserver

# 创建新容器
$ docker run -p 50070:50070 -p 9000:9000 -p 8020:8020 -p 10000:10000 --cpus 1 -m 4GB -v /data/hadoopData:/data -v hadoopConf:/conf --name hadoopserver --network bigdata --network-alias hadoopserver -dit hadoop:1.1

参考资料

Docker 入门教程

todo https://www.runoob.com/docker/docker-run-command.html

https://www.runoob.com/docker/docker-image-usage.html