0%

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=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${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

参考

感谢帮助!