-- 学习了 docker 之后实践机会较少,通过本次实践练习 dockerfile 的编写,docker compose 的使用,以及一些 linux 命令的回顾
操作系统基础镜像
选用 ubuntu 20.04 作为基础镜像,需要在引入镜像后第一时间修改源,以免后续软件下载过慢
代码语言:shell复制FROM ubuntu:20.04
# 换源
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 用于提供 ssh 服务、下载 及修改文件的工具
RUN apt install -y openssh-server wget openssh-client ntpdate neovim
下载JDK 及 hadoop
选用的是 JDK 8 及 Hadoop 3.3.3
代码语言:shell复制// 解压后删除压缩包,避免无用文件占据空间
RUN wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.3/hadoop-3.3.3.tar.gz
&& wget https://mirrors4.tuna.tsinghua.edu.cn/Adoptium/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u392b08.tar.gz
&& tar -xvf hadoop-3.3.3.tar.gz -C /var
&& tar -xvf OpenJDK8U-jdk_x64_linux_hotspot_8u392b08.tar.gz -C /var
&& rm hadoop-3.3.3.tar.gz OpenJDK8U-jdk_x64_linux_hotspot_8u392b08.tar.gz
配置环境变量
代码语言:shell复制# 配置 JDK 及 hadoop 环境变量
RUN echo 'export JAVA_HOME=/var/jdk8u392-b08' >> ~/.bashrc
&& echo 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc
&& echo 'export CLASSPATH=$JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar' >> ~/.bashrc
&& echo 'export HADOOP_HOME=/var/hadoop-3.3.3' >> ~/.bashrc
&& echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc
&& echo 'export JAVA_HOME=/var/jdk8u392-b08' >> /var/hadoop-3.3.3/etc/hadoop/hadoop-env.sh
&& echo 'export HDFS_NAMENODE_USER=root' >> /var/hadoop-3.3.3/etc/hadoop/hadoop-env.sh
&& echo 'export HDFS_DATANODE_USER=root' >> /var/hadoop-3.3.3/etc/hadoop/hadoop-env.sh
&& echo 'export HDFS_SECONDARYNAMENODE_USER=root' >> /var/hadoop-3.3.3/etc/hadoop/hadoop-env.sh
&& echo 'export YARN_RESOURCEMANAGER_USER=root' >> /var/hadoop-3.3.3/etc/hadoop/hadoop-env.sh
&& echo 'export YARN_NODEMANAGER_USER=root' >> /var/hadoop-3.3.3/etc/hadoop/hadoop-env.sh
# 存放hdfs数据
&& mkdir /var/data
注意事项:
- 与 >> 的区别 将直接覆盖原文件,>> 在原文件中追加内容
- echo 命令 '' 与 "" 的区别 '' 在 evaluate 变量之后再输出,"" 则直接将原字符串输出配置 Hadoop注意事项:
- xml文件配置时,标签之间不能有空格,否则将会出现错误配置 ssh
# config ssh
# 本来打算通过 sed 进行文本替换来修改配置文件,但一番尝试之后发现 sed 适合替换字符串,如单词等,但不适合带有空格的字符串,故直接使用 echo 在文件末尾追加
RUN echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
&& echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config
# 通过启动脚本文件来运行 ssh 服务,
# 直接将 "/usr/sbin/sshd -D" 作为启动命令将会报错
# 原因为 默认启用的是 /bin/sh, "/usr/sbin/sshd -D" 需要通过 /bin/bash 启动
RUN touch /var/run.sh
&& echo "#!/bin/bash " >> /var/run.sh
&& echo "/usr/sbin/sshd -D" >> /var/run.sh
&& chmod 777 /var/run.sh
&& mkdir /run/sshd
# 设置 root 密码
RUN echo "root:112233" | chpasswd
CMD [ "/var/run.sh" ]
# 进入node1 后,生成密钥并将公钥传给 其他 node
# ssh-keygen -t ed25519
# ssh-copy-id node1
# ssh-copy-id node2
# ssh-copy-id node3
配置 docker compose
代码语言:yaml复制// 输入代码内容
version: "3"
services:
# 主 node
node1:
build: .
hostname: node1
node2:
build: .
hostname: node2
node3:
build: .
hostname: node3
docker compose 的优点在于能够便捷地配置网络,实现 docker 之间的互联
使用
代码语言:shell复制# 简简单单的一句即可实现容器的相互连接
docker compose up
其他内容
可以通过 --net=host 参数来让容器使用宿主机的网络,从而访问外部网络,然而更好的方法是允许宿主机的 ip 路由转发,通过 docker 的虚拟网络来访问外部网络
项目地址