[英]translate my containers starter file to docker-compose.yml
我是大数据领域的新手,这是我第一次使用 Docker。 我刚刚发现了这个惊人的项目: https://kiwenlau.com/2016/06/26/hadoop-cluster-docker-update-english/它创建了一个hadoop 集群,它使用 ZC5C5FD214CDDB0D2B 创建了一个由一个主设备和两个从设备组成的集群。
完成所有安装后,我只运行容器,它们工作正常。 有start-containers.sh文件,它可以帮助我在集群中吃午饭。 我决定安装一些像 sqoop 这样的工具来将我的本地关系数据库导入到 Hbase,这很好。 之后,我通过点击停止我的电脑中的所有 Docker 容器
docker stop $(docker ps -a -q)
第二天,当我尝试通过运行相同的脚本./start-container.sh重新启动容器时,我发现了这个错误:
启动 hadoop-master 容器...
启动 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
我不确定我是否理解正确重启容器的上述问题。 因此,在下文中,我尝试专注于从脚本和错误消息中可以看到的潜在问题:
在没有--rm
的情况下启动容器时,它们将在停止后保持原位。 如果尝试run
具有相同端口映射或相同名称的容器(此处都是这种情况。)之后由于容器已经存在而失败,有效。 过程中不会启动容器,来解决这个问题。 应该每次都重新创建容器(并将所有重要的 state 存储在容器之外)或检测现有容器并在存在时启动它:使用名称它可以像这样做一样简单:
if ! docker start hadoop-master; then
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
fi
其他条目类似。 请注意,我不明白为什么要为这样的服务容器使用组合-itd
(交互式,分配 TTY,但 go 到后台)? 我建议在这里只使用-d
吗?
其他一般脚本建议:首选bash -e
(导致脚本在未处理的错误上停止)。
这个问题包含一些疑问docker-compose
是否应该是 go 的方式,或者是否应该首选启动脚本。 在我看来,最重要的区别是:
脚本具有很好的灵活性:每当需要从环境中检测到超出环境变量的事物时,脚本提供了执行命令所需的灵活性并依赖于环境。 有人可能会争辩说,这在一定程度上违背了容器隔离依赖于这样的环境的精神,但是许多 Docker 环境用于测试目的,而这不是主要问题。
docker-compose
提供了一些“开箱即用”的明显优势。 有up
命令(甚至像down
down -v --rmi all
这样的激进命令)可以快速创建和销毁环境。 在编写脚本时,需要单独实现所有这些事情,这通常会导致解决方案不够完整。 一个经常被忽视的优势也是可移植性问题: docker-compose
也存在 docker-compose。 另一个有趣的功能(虽然听起来并不那么“容易”)是能够将docker-compose.yml
文件部署到 Docker 集群。 最后docker-compose
还提供了一些额外的隔离(例如,默认情况下,所有容器都成为专门为此docker-compose
实例创建的网络的一部分)
手头的启动脚本已经处于良好状态,可以考虑移至docker-compose.yml
文件。 基本思想是为每个docker run
指令定义一个service
,并将命令行 arguments 转换为各自的docker-compose.yml
名称。 文档非常彻底地涵盖了这些选项。
这个想法可能如下:
version: "3.2"
services:
hadoop-master:
image: spark-hadoop:latest
ports:
- 50070:50070
- 8088:8088
- 7077:7077
- 16010:16010
hadoop-slave1:
image: spark-hadoop:latest
ports:
- 8041:8042
hadoop-slave2:
image: spark-hadoop:latest
ports:
- 8042:8042
hadoop-slave2:
image: spark-hadoop:latest
ports:
- 8043:8042
顺便提一句。 我无法测试docker-compose.yml
文件,因为图像spark-hadoop:latest
似乎无法通过docker pull
获得:
# docker pull spark-hadoop:latest
Error response from daemon: pull access denied for spark-hadoop, repository does not exist or may require 'docker login'
但是上面的文件可能足以让您有所了解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.