Windows Docker 安装部署 Hadoop(一)

本节 在 Windows Docker 完成 Hadoop 基础依赖环境的安装

0. 准备

Docker Desktop 2.3.0.3(45519) jdk1.8 (jdk-8u131-linux-x64.tar.gz) https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html hadoop-2.7.3.tar.gz https://archive.apache.org/dist/hadoop/common/hadoop-2.7.3/

1. 启动 Windows Docker

Docker 无法打开 问题1

遇以下问题,说明 Hyper-V 未开启,Windows 下 Docker 依赖于此

解决: 开启 Hyper-V 当然可以直接搜索 hyper 进入 Windows features
勾选 Hyper-V ,点击 OK 后,需要重启,点击 立即重启
注意:若需使用 VMware Workstation,需关闭 Hyper-V

Docker 无法打开 问题2

尝试再次启动 Docker
这是 因为 使用 VMware Workstation 时关闭了 hypervisorlaunchtype 解决:启用 按 win + x,再按 a 即 以管理员权限打开 Powershell
执行下方的语句
1
2
3
4
bcdedit /set hypervisorlaunchtype auto

# 补充,当需使用 VMware Workstation 时,需再次关闭
# bcdedit /set hypervisorlaunchtype off
重启生效 再次启动 Windows Docker,成功 补充: Windows 10 Home 家庭版 可能无法开启 Hyper-V,笔者 Windows 10 Pro 专业版
若使用 Windows 10 Home 家庭版,可能无法使用 Docker Desktop for Windows(因为需要开启 Hyper-V)
可 使用 Docker Toolbox 代替,或者 "绕过去" 强行开启 Hyper-V
Windows 10 Home 安装 Docker 可参考:
https://zhuanlan.zhihu.com/p/141539122
https://zhuanlan.zhihu.com/p/107411605

2. 安装配置 基础环境

2.1 拉取 ubuntu 镜像 到本地

1
docker pull ubuntu
注: 笔者之前就有此镜像,这里仅是更新,新拉取可能有所不同

2.2 查看本地镜像

1
docker images

2.3 启动一个容器

1
2
# 使用镜像 ubuntu 以交互模式(-it) 创建并启动一个容器, 并将容器命名(--name)为 ubuntuhadoop 在容器内执行 /bin/bash 命令
docker run --name ubuntuhadoop -it ubuntu /bin/bash
进入后 就默认拥有 root 权限,无需 sudo

2.4 安装 vim, ssh

在刚才的 命令行窗口 继续接下来的操作

2.4.1 更新apt源

1
apt-get update
默认 国外源 非常慢,接下来修改为 国内源

2.4.2 配置使用国内 apt 源

备份 /etc/apt/sources.list
1
2
# 注意: 这里是 mv ,移动
mv /etc/apt/sources.list /etc/apt/sources.list.bak
写入源配置信息,注意: 这里是 >> 追加文件内容,
如果之前使用 cp,那么需要先 echo "" > /etc/apt/sources.list 注意:下方配置文件内容需要 根据 Ubuntu 版本选择,国内阿里云Ubuntu镜像 https://developer.aliyun.com/mirror/ubuntu
笔者之前试过直接复制网上的配置文件,但当执行 apt-get update 时会报错,也无法安装 vim 等 查看 系统版本
1
2
cat /proc/version # 查看 Linux 内核版本
cat /etc/issue # 查看 Ubuntu 版本
可以看到 笔者是 Ubuntu 20.04.1 LTS,选择 阿里云Ubuntu镜像 中的 ubuntu 20.04(focal) 配置 写入配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
echo "deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse" >>/etc/apt/sources.list

echo "deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse" >>/etc/apt/sources.list

echo "deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse" >>/etc/apt/sources.list

echo "deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse" >>/etc/apt/sources.list

echo "deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse" >>/etc/apt/sources.list
可使用 cat /etc/apt/sources.list 效验文件内容 更新 apt 源
作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包
这个命令,会访问源列表里的每个网址,并读取软件列表,然后保存在本地电脑。
我们在软件包管理器里看到的软件列表,都是通过update命令更新的
1
apt-get update
update后,可能需要upgrade一下。(如果不需要更新软件就不用执行下面这条)
这个命令,会把本地已安装的软件,与刚下载的软件列表里对应软件进行对比,如果发现已安装的软件版本太低,
就会提示你更新。如果你的软件都是最新版本,会提示:
升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。
1
apt-get upgrade
补充: exit 退出 ubuntu 命令行, 由于未以后台方式运行,所以容器一并退出
运行 exit命令 或者 使用CTRL+D 来退出容器
TODO: 不太懂,猜测是这么回事
退出后,可使用 docker start -i ubuntuhadoop 重新进入 第二天,笔者容器已经退出,接下来将重新启动并进入容器 查看所有状态的容器
1
docker ps -a
可以看到容器已经退出,处于停止状态,现在我们重新启动并进入容器
1
docker start -i ubuntuhadoop
-i 允许你对容器内的标准输入 (STDIN) 进行交互
-t 在新容器内指定一个伪终端或终端
试了一下,笔者 docker start 没有 -t 选项,但 docker run 是有 -t 的
查了下官方文档 https://docs.docker.com/engine/reference/commandline/start/ ,docker start 没有 -t 执行完上方命令后,会发现我们已经进入 /bin/bash,看来 -i 与创建容器时 指定 /bin/bash 生效

2.4.3 安装 vim,文本编辑器

1
apt-get install vim
安装中途有 (Y/n) ,按 Enter 回车即可,因为 Y大写表示默认 安装完成后,执行 vim --version ,若出现下方,则说明安装成功

2.4.4 安装 ssh服务,保证 主机 与 从机 可以远程传输

1
apt-get install ssh
同样,中途 按 Enter 继续安装
这里要选地理位置,用于时区,个人感觉这个无所谓,这里输入 6,即亚洲,再选择城市,这里输入 31,即香港 安装完成后,执行下方 开启 ssh 服务
1
/etc/init.d/ssh start

检查是否 ssh服务 已开启
返回 sshd 说明已开启
1
ps -e | grep ssh

问题 apt-get install vim 无法安装

解决: 执行 apt-get update,还有问题就说明 国内镜像源没配置好,重新配置

2.5 配置ssh免密登陆

2.5.1 生成秘钥文件

1
ssh-keygen -t rsa
中途一直按 Enter 即可
生成成功后,你应该有一个 公钥 和一个 私钥 文件

2.5.2 把 id_rsa.pub 追加到 授权的key 里面去

1
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
授权文件 ~/.ssh/authorized_keys

2.5.3 测试连接

1
ssh localhost
连接成功

> Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
> 输入 yes,然后 按 Enter 笔者,实测,再次 ssh localhost 无需再 yes
连接失败: ssh: connect to host localhost port 22: Cannot assign requested address
连接失败: ssh: connect to host localhost port 22: Cannot assign requested address
解决: 查看 ssh服务 是否开启,重新启动容器,需要重新开启 ssh服务
1
2
ps -e | grep ssh # 什么都没返回,说明没开启
/etc/init.d/ssh start # 执行此命令 开启 ssh服务

补充: 你现在连接是 本机连接本机, Docker 内的 Ubuntu 连接 自己,本次输入 exit 退出远程登录后,还会处于 Docker Ubuntu 内,再次 exit 就会退出容器

3. 安装JDK

3.1 从 Windows 复制 jdk 到 Docker 容器中

请确保已退出 容器, 执行 exit 退出容器 将 宿主机 F:/Temp/jdk-8u131-linux-x64.tar.gz 复制到 Docker Container内 /home/
1
docker cp F:/Temp/jdk-8u131-linux-x64.tar.gz ubuntuhadoop:/home/
注意:文件路径分割符是 /,不知道 Windows 默认路径分割符 \ 行不行。
没有返回输出,就代表复制成功 再复制 hadoop-2.7.3.tar.gz
1
docker cp F:/Temp/hadoop-2.7.3.tar.gz ubuntuhadoop:/home/
启动并进入容器,检查文件是否复制成功
1
2
3
4
5
docker start -i ubuntuhadoop

cd home
ls -l
# 或者可以直接 ls -l /home
检查完后, 回到根目录
1
cd /

3.2 创建存放jdk文件目录

1
mkdir /usr/java

3.3 将 /home 下的JDK压缩包解压到 /usr/java 目录下

1
tar -xzvf /home/jdk-8u131-linux-x64.tar.gz -C /usr/java

3.4 配置 root 用户变量

3.4.1 使用 vim 修改 .bashrc

1
2
#vim ~/.bashrc # 或者这句话
vim /root/.bashrc
Shift+G 将光标定位到文件末尾,
按 i 进入插入模式,使用方向键调整到最末尾, 两次Enter换行空一行
复制以下内容, 返回输入处,Shift+0(右边的数字区) 粘贴(Windows Terminal弹出确定粘贴多行的话,仍然粘贴即可)
1
2
3
4
5
# set jdk_env
export JAVA_HOME=/usr/java/jdk1.8.0_131
export JRE_HOME={{hbeSeoContent}}#123;JAVA_HOME}/jre
export CLASSPATH=.:{{hbeSeoContent}}#123;JAVA_HOME}/lib:{{hbeSeoContent}}#123;JRE_HOME}/lib
export PATH={{hbeSeoContent}}#123;JAVA_HOME}/bin:$PATH
按 'Esc' 退出 Insert 模式, 输入 :wq 即保存并退出 vim操作: 按 i 执行插入, 这时左下角会显示 -- INSERT --, 将光标定位到要插入内容的位置,输入即可
GG: 跳转到文件头
Shift+G: 跳转到文件末尾
按 Shift+; 即 输入英文:,进入 命令模式 检查文件内容
1
tail -6 /root/.bashrc

3.4.2 使环境变量生效

1
source ~/.bashrc

3.4.3 测试 jdk 是否安装配置成功

1
java -version

3.4.3 保存当前安装好 jdk 的容器环境为镜像,方便日后使用

1
2
3
4
# 先退出容器
exit

docker commit ubuntuhadoop ubuntu/jdkinstalled
查看镜像是否保存成功
1
docker images

补充:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
https://docs.docker.com/engine/reference/commandline/commit/ 完成!本节 基础环境依赖安装配置 到此结束

补充

docker 常用命令

容器(container)

所有 正在运行 的容器
1
docker ps 
所有 状态 的容器
1
docker ps -a
容器 更名
1
docker rename CONTAINER NEW_NAME
启动、停止、重启一个容器
1
2
3
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker restart [OPTIONS] CONTAINER [CONTAINER...]
启动一个容器,然后 以交互模式 打开终端
1
2
docker start CONTAINER
docker exec -it CONTAINER bash
docker run 创建并启动一个容器。等同于 docker create && docker start https://docs.docker.com/engine/reference/commandline/run/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# 使用docker镜像 nginx:latest 以后台模式 创建并启动一个容器, 并将容器 命名为 mynginx
docker run --name mynginx -d nginx:latest

# 使用镜像 nginx:latest 以后台模式 创建并启动一个容器, 并将容器的 80端口 映射到 主机随机端口
docker run -P -d nginx:latest

# 使用镜像 nginx:latest 以后台模式 创建并启动一个容器, 将容器的80端口 映射到 主机的80端口,主机的目录/data 映射到 容器的/data
docker run -p 80:80 -v /data:/data -d nginx:latest

# 使用镜像 nginx:latest 以交互模式 创建并启动一个容器, 在容器内执行 /bin/bash 命令
docker run -it nginx:latest /bin/bash

# 使用镜像 ubuntu/hadoopinstalled 以交互模式 创建并启动一个容器, 容器名为 master, 容器主机名(hostname)为 master
docker run -it -h master --name master ubuntu/hadoopinstalled
TODO: 记得好像 不写 :latest 默认就是 :latest,: 后是 tagName

参考

感谢帮助! Windows+Docker+Hadoop的部署完整教程(一)基础依赖环境安装 Windows+Docker+Hadoop的部署完整教程(二)hadoop分布式系统部署 VMware Workstation 与 Device/Credential Guard 不兼容? Docker的常用命令 docker (base command) | Docker Documentation docker常用命令详解 Ubuntu apt-get 国内镜像源替换(新手必看,超详细!各种镜像源网站都有) 使用docker构建hadoop集群 在docker上安装hadoop集群