【问题标题】:translate my containers starter file to docker-compose.yml将我的容器启动文件翻译成 docker-compose.yml
【发布时间】:2019-11-08 04:51:49
【问题描述】:

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

完成所有安装后,我只运行容器,它们工作正常。有 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 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

【问题讨论】:

  • 对我来说有点不清楚这个问题是关于什么的:是关于启动集群的一些问题(如开头所述)还是关于创建 docker-compose.yml文件?
  • @linux-fan 我有两个问题,第一个问题是“如何解决 docker 的启动问题,究竟为什么第一次所有容器都正常工作而第二次出现错误”我的第二个问题是“使用 docker-compose 运行容器更好吗?如果是,如何从我的启动脚本创建 docker-compose.yml”

标签: bash docker hadoop docker-compose


【解决方案1】:

重启容器的问题

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

在没有--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 这样的激进命令)允许快速创建和销毁环境。在编写脚本时,需要单独实现所有这些事情,这通常会导致解决方案不够完整。一个经常被忽视的优势也是可移植性问题:docker-compose 也适用于 Windows。另一个有趣的特性(虽然听起来并不那么“简单”)是能够将docker-compose.yml 文件部署到 Docker 集群。最后docker-compose 还提供了一些额外的隔离(例如,默认情况下,所有容器都成为专门为此docker-compose 实例创建的网络的一部分)

从启动脚本到 Docker-Compose

手头的启动脚本已经处于良好状态,可以考虑移至docker-compose.yml 文件。基本思想是为每个docker run 指令定义一个service,并将命令行参数转换为它们各自的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'

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

【讨论】:

  • 非常感谢,这解决了我的问题,也挽救了我的生命:)
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 2017-01-20
  • 2020-11-17
  • 2019-11-20
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 2018-03-06
相关资源
最近更新 更多