bilibili: 给我一首歌的时间,让我配置hadoop docker集群
根据官方教程安装Docker
- Windows在安装Docker时可能遇到各种问题,建议Windows用户在Linux虚拟机中安装Docker
- 在 Linux 中,你需要确保非root用户可以使用Docker CLI,可参考官方教程 Run the Docker daemon as a non-root user (Rootless mode) 与 Manage Docker as a non-root user
简单来说Docker镜像就是容器模版,我们可以在Docker镜像上创建容器实例,一般我们编写Dockerfile来定制我们自己的Docker镜像,想了解更多请看 官方教程
docker build . -t hadoop # . 为当前目录,你应该保证 Dockerfile 在当前目录下
我们非常建议创建用户自定义桥接网络,因为在用户自定义桥接网络中容器之间不仅可以通过IP地址进行沟通,还可以通过容器名进行连接,Docker会自动将容器名解析成IP地址,这一功能叫做 automatic service discovery 。
docker network create hadoop-network # 默认为桥接网络
一个容器就是可运行的镜像实例, 想了解更多请看 官方教程
下面的Docker命令根据hadoop镜像创建了四个容器,以交互的方式(-i)以及附着在终端的方式(-t)运行,并且指定容器hostname(-h),指定容器名(--name=...), 连接容器到指定网络(--network ...)
docker run -it -h master --name=master -p 9870:9870 --network hadoop-network hadoop
docker run -it -h slave1 --name=slave1 --network hadoop-network hadoop
docker run -it -h slave2 --name=slave2 --network hadoop-network hadoop
docker run -it -h slave3 --name=slave3 --network hadoop-network hadoop
接着在master容器中运行 hdfs namenode -format && start-all.sh
即可
打开四个终端运行docker run ...
非常的笨重,如果不使用用户自定义网络,那么搭建过程还要更慢,有没有一种更方便快捷的方式搭建hadoop集群呢,下面将介绍。
vscode-docker 插件可以提供非常友好的图形化界面,帮助你更好地管理 docker
一种传统但有效的方式是使用 shell 脚本一次性创建四个容器,需要注意的是docker容器在运行完指定的程序后会立即退出,在Dockerfile中,我们使用 CMD ["bash", "-c", "service ssh restart; bash"]
设定容器在启动时打开ssh服务器然后运行bash,如果不以交互式的方式打开,就会因为bash没有输入而立即退出,所以shell脚本应该这样写,-d 表示 detach,bash -c "service ssh restart && tail -f /dev/null"
会覆盖Dockerfile中的CMD,tail -f /dev/null
是一个可以保证容器一直运行下去的技巧。
docker run -d -h slave1 --name=slave1 --network hadoop-network hadoop bash -c "service ssh restart && tail -f /dev/null"
docker run -d -h slave2 --name=slave2 --network hadoop-network hadoop bash -c "service ssh restart && tail -f /dev/null"
docker run -d -h slave3 --name=slave3 --network hadoop-network hadoop bash -c "service ssh restart && tail -f /dev/null"
docker run -d -h master --name=master -p 9870:9870 --network hadoop-network hadoop bash -c "service ssh restart && hdfs namenode -format && start-all.sh && tail -f /dev/null"
更加现代的方法是使用 docker-compose
,你可以在仓库中看到 docker-compose.yaml
配置文件,创建集群只需要在命令行中使用docker-compose up -d
即可