首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将我的容器启动文件转换为docker-compose.yml

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

Stack Overflow用户
提问于 2019-11-06 19:00:27
回答 1查看 175关注 0票数 0

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

完成所有的安装之后,我只运行容器,它们就可以正常工作了。有一个start-containers.sh文件,它给了我午餐,集群。我决定安装一些工具,比如sqoop,将我的本地关系数据库导入到Hbase,这很好。在那之后,我通过敲击停止了我电脑中所有的码头集装箱。

代码语言:javascript
复制
docker stop $(docker ps -a -q)

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

启动hadoop-主容器. 启动hadoop 1容器..。 启动hadoop 2容器..。 来自守护进程的错误响应:容器 e942e424a3b166452c9d2ea1925197d660014322416c869dc4a982fdae1fb0ad没有运行

甚至,我还吃了这个守护进程;我的集群的容器不能相互连接,也不能访问存储在Hbase.上的数据。

首先,谁能告诉我为什么这个守护进程不能工作。

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

经过搜索,我发现最好是使用码头组成,这给我手到午餐所有容器在一起。

但是我找不到如何将我的start-cuer.sh文件转换为docker-come.yml文件。这是在同一时间吃我所有容器的最好方法吗?这是start-containers.sh文件的内容:

代码语言:javascript
复制
#!/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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-07 20:51:49

重新启动容器的问题

我不确定我是否理解上述重新启动容器的问题。因此,在下面,我试图集中讨论我可以从脚本和错误消息中看到的潜在问题:

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

代码语言:javascript
复制
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环境用于测试目的,而这并不是主要考虑的问题。
  • docker-compose提供了一些“开箱即用”的独特优势。有一些命令updown (甚至是激进的命令,比如down -v --rmi all)允许快速创建和销毁环境。在编写脚本时,需要分别实现所有这些事情,这通常会导致不太完整的解决方案。一个经常被忽视的优点也是可移植性的问题:docker-compose也存在于Windows中。另一个有趣的特性(虽然不像听起来那么“容易”)是将docker-compose.yml文件部署到Docker集群的能力。最后,docker-compose还提供了一些额外的隔离(例如,所有容器都成为专门为该docker-compose实例创建的网络的一部分)

从启动脚本到码头组合

手头的start脚本已经处于良好的状态,可以考虑移到docker-compose.yml文件中。其基本思想是为每个service指令定义一个docker run,并将命令行参数转换为各自的docker-compose.yml名称。文档相当彻底地涵盖了这些选项。

设想如下:

代码语言:javascript
复制
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获得。

代码语言:javascript
复制
# docker pull spark-hadoop:latest
Error response from daemon: pull access denied for spark-hadoop, repository does not exist or may require 'docker login'

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58736886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档