我是大数据领域的新手,这是我第一次使用docker。我刚刚发现了一个惊人的项目:https://kiwenlau.com/2016/06/26/hadoop-cluster-docker-update-english/ 使用docker创建一个由一个主节点和两个从节点组成的hadoop集群。
在完成所有的安装之后,我只运行容器,它们工作得很好。有一个start-containers.sh文件,可以帮助我使用集群。我决定安装一些工具,比如sqoop,将本地关系数据库导入hbase,这样就可以了。之后,我停止在我的pc中的所有码头集装箱点击
docker stop $(docker ps -a -q)
第二天,当我试图通过运行相同的脚本./start-container.sh重新启动容器时,我发现了以下错误:
启动hadoop主容器。。。
启动hadoop-slave1容器。。。
启动hadoop-slave2容器。。。
来自守护程序的错误响应:容器
e942e424a3b166452c9d2ea1925197d660014322416c869dc4a982fdae1fb0ad未运行
甚至,我午餐这个恶魔;群集的容器无法相互连接,并且无法访问存储在hbase上的数据。
首先,谁能告诉我为什么这个守护进程不工作。
ps:在start-container.sh文件中有一行,如果容器在创建之前存在,它会删除容器,我会删除这一行,因为如果我不删除它们,每次我都会从头开始。
经过搜索,我发现最好是用 Docker 组成,给我的手午餐所有的容器在一起。
但我找不到如何将start-container.sh文件转换为docker-compose.yml文件。这是在同一时间吃我所有容器午餐的最佳方式吗?这是start-containers.sh文件的内容:
# !/bin/bash
sudo docker network create --driver=bridge hadoop
# the default node number is 3
N=${1:-3}
# start hadoop master container
# sudo docker rm -f hadoop-master &> /dev/null
echo "start hadoop-master container..."
sudo docker run -itd \
--net=hadoop \
-p 50070:50070 \
-p 8088:8088 \
-p 7077:7077 \
-p 16010:16010 \
--name hadoop-master \
--hostname hadoop-master \
spark-hadoop:latest &> /dev/null
# sudo docker run -itd \
# --net=hadoop \
# -p 5432:5432 \
# --name postgres \
# --hostname hadoop-master \
# -e POSTGRES_PASSWORD=0000
# --volume /media/mobelite/0e5603b2-b1ad-4662-9869-8d0873b65f80/postgresDB/postgresql/10/main:/var/lib/postgresql/data \
# sameersbn/postgresql:10-2 &> /dev/null
# start hadoop slave container
i=1
while [ $i -lt $N ]
do
# sudo docker rm -f hadoop-slave$i &> /dev/null
echo "start hadoop-slave$i container..."
port=$(( 8040 + $i ))
sudo docker run -itd \
-p $port:8042 \
--net=hadoop \
--name hadoop-slave$i \
--hostname hadoop-slave$i \
spark-hadoop:latest &> /dev/null
i=$(( $i + 1 ))
done
# get into hadoop master container
sudo docker exec -it hadoop-master bash
1条答案
按热度按时间jrcvhitl1#
重新启动容器的问题
我不确定我是否正确理解重新启动容器时提到的问题。因此,在下面的部分中,我尝试将重点放在从脚本和错误消息中可以看到的潜在问题上:
启动容器时
--rm
,它们将在停止后保持原位。如果有人想run
具有相同端口Map或相同名称的容器(这里都是这种情况!)之后由于容器已经存在而失败。实际上,在此过程中不会启动任何容器。要解决这个问题,要么每次都重新创建容器(并将所有重要状态存储在容器之外),要么检测现有容器并启动它(如果存在)。有了名字,就可以很容易地做到:其他条目也一样。请注意,我不明白为什么会使用组合
-itd
(交互式,分配tty,但转到后台)这样的服务容器?我建议你和我一起去-d
在这里?其他一般脚本建议:首选
bash -e
(导致脚本在出现未处理的错误时停止)。docker compose与启动脚本
这个问题有点怀疑
docker-compose
应该是一种方式,或者如果启动脚本应该是首选。在我看来,最重要的区别在于:脚本在灵活性方面很好:每当需要从环境中检测到超出环境变量的东西时,脚本就提供了执行命令和依赖于环境的灵活性。有人可能会说,这在一定程度上违背了容器隔离的精神,即依赖于这样的环境,但是许多docker环境用于测试目的,而这并不是主要关注的问题。
docker-compose
提供了一些独特的优势“开箱即用”。有命令up
以及down
(甚至像down -v --rmi all
)这使得环境能够迅速地被创造和破坏。编写脚本时,需要分别实现所有这些内容,这通常会导致不太完整的解决方案。一个经常被忽视的优点是可移植性:docker-compose
也适用于windows。另一个有趣的特性(虽然不像听起来那么“简单”)是部署的能力docker-compose.yml
文件到docker群集。最后docker-compose
还提供了一些额外的隔离(例如,所有容器都成为专门为此创建的网络的一部分)docker-compose
(默认情况下为示例)从启动脚本到docker编写
手头的开始脚本已经处于良好状态,可以考虑转移到
docker-compose.yml
而不是文件。基本思想是定义一个service
每docker run
指令并将命令行参数转换为各自的参数docker-compose.yml
名字。文档非常全面地介绍了这些选项。其思路如下:
顺便说一句,我不能测试
docker-compose.yml
因为图像spark-hadoop:latest
似乎无法通过docker pull
:但上面的文件可能足以让你有个想法。