将我的容器启动文件转换为docker-compose.yml

xmakbtuz  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(506)

我是大数据领域的新手,这是我第一次使用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
jrcvhitl

jrcvhitl1#

重新启动容器的问题

我不确定我是否正确理解重新启动容器时提到的问题。因此,在下面的部分中,我尝试将重点放在从脚本和错误消息中可以看到的潜在问题上:
启动容器时 --rm ,它们将在停止后保持原位。如果有人想 run 具有相同端口Map或相同名称的容器(这里都是这种情况!)之后由于容器已经存在而失败。实际上,在此过程中不会启动任何容器。要解决这个问题,要么每次都重新创建容器(并将所有重要状态存储在容器之外),要么检测现有容器并启动它(如果存在)。有了名字,就可以很容易地做到:

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,但转到后台)这样的服务容器?我建议你和我一起去 -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 而不是文件。基本思想是定义一个 servicedocker run 指令并将命令行参数转换为各自的参数 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'

但上面的文件可能足以让你有个想法。

相关问题