将我的容器入门文件翻译为docker-compose.yml

我在大数据领域比较新,这是我第一次使用Docker。我刚刚发现了一个令人惊叹的项目:https://kiwenlau.com/2016/06/26/hadoop-cluster-docker-update-english/,该项目使用Docker创建了一个由一个主机和两个从机组成的 hadoop集群

完成所有安装后,我只运行了容器,它们可以正常工作。有 start-containers.sh 文件,它可以帮助我在群集上进餐。我决定安装一些工具,例如sqoop,以将我的本地关系数据库导入到Hbase中,并且一切正常。之后,通过点击

,停止我PC中的所有Docker容器
docker stop $(docker ps -a -q)

第二天,当我尝试通过运行相同的脚本 ./ start-container.sh 重新启动容器时,发现此错误:

  

启动hadoop-master容器...

     

启动hadoop-slave1容器...

     

启动hadoop-slave2容器...

     

守护程序的错误响应:容器

     

e942e424a3b166452c9d2ea1925197d660014322416c869dc4a982fdae1fb0ad是   没有运行

我什至在这个守护进程中吃午饭;群集中的容器无法相互连接,并且我无法访问存储在Hbase上的数据。

首先有人可以告诉我该守护程序为什么不起作用。

PS:在 start-container.sh 文件中,有一行会删除容器(如果它们在创建容器之前就已存在),因此我删除了此行,因为如果我不删除它们,每次从一开始就做所有事情。

搜索后,我发现最好使用 docker compose ,它可以帮助我将所有容器一起吃午餐。

但是我找不到如何将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
candycandysweet 回答:将我的容器入门文件翻译为docker-compose.yml

重新启动容器的问题

我不确定我是否正确理解重新启动容器时提到的问题。因此,在下文中,我尝试着重于从脚本和错误消息中可以看到的潜在问题:

启动不带--rm的容器时,它们在停止后将保留在原处。如果之后尝试run使用相同端口映射或相同名称的容器(在这种情况下都是这样!),则由于该容器已经存在而失败。实际上,在此过程中不会启动任何容器。为了解决这个问题,应该要么每次都重新创建容器(并将所有重要状态存储在容器外部),要么检测一个现有的容器并启动(如果存在)。有了名称,就可以像这样做一样简单:

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“开箱即用”提供了一些明显的优势。有updown命令(甚至还有down -v --rmi all之类的激进命令),它们允许快速创建和销毁环境。在编写脚本时,需要分别实现所有这些功能,这通常会导致解决方案不够完整。一个经常被忽视的优点是可移植性:Windows也存在docker-compose。另一个有趣的功能(虽然听起来并不那么“容易”)是能够将docker-compose.yml文件部署到Docker集群。最后,docker-compose还提供了一些额外的隔离措施(例如,默认情况下,所有容器都成为专门为此docker-compose实例创建的网络的一部分)

从启动脚本到Docker-Compose

手头的启动脚本已经很不错,可以考虑转移到docker-compose.yml文件中。基本思想是为每个service指令定义一个docker run并将命令行参数转换为它们各自的docker-compose.yml名称。 Documentation涵盖了所有选项。

想法可能如下:

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'

但是上面的文件可能足以使您了解一个想法。

本文链接:https://www.f2er.com/3149578.html

大家都在问