繁体   English   中英

将我的容器启动文件翻译成 docker-compose.yml

[英]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 与启动脚本

这个问题包含一些疑问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

手头的启动脚本已经处于良好状态,可以考虑移至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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM