我应该如何创建一个Dockerfile来在一个实例中运行多个服务?

时间:2017-06-16 12:32:35

标签: docker dockerfile

我正在尝试创建一个Dockerfile。我是Docker的新手。我正在创建这个Dockerfile,它将在一个实例中启动rabbitmq,ftp服务器和elasticsearch服务器。我创建了这样的文件:

# Pull base image
FROM alpine:latest
MAINTAINER Harshit Prasad

# define commonly used JAVA_HOME variable
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

# Expose the web interface ports
# 2121: ftp, a FTP server to be used for mass data / file storage
# 5672: rabbitmq, a rabbitmq message queue server to be used for global messages, queues and stacks
# 9300: elastic, an elasticsearch server or main cluster address for global database storage
EXPOSE 2121 5672 9300

# install Java
RUN \
  echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
  add-apt-repository -y ppa:webupd8team/java && \
  apt-get update && \
  apt-get install -y oracle-java8-installer && \
  rm -rf /var/lib/apt/lists/* && \
  rm -rf /var/cache/oracle-jdk8-installer

# install apache ftp server 1.1.0
RUN wget http://www-eu.apache.org/dist/mina/ftpserver/1.1.0/dist/apache-ftpserver-1.1.0.tar.gz
RUN tar xfz apache-ftpserver-1.1.0.tar.gz

# run ftp server
RUN cd apache-ftpserver-1.1.0 bin/ftpd.sh res/conf/ftpd-typical.xml

# install RabbitMQ server
RUN wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-generic-unix-3.6.6.tar.xz
RUN tar xf rabbitmq-server-generic-unix-3.6.6.tar.xz

# run the RabbitMQ server
RUN cd rabbitmq_server-3.6.6/sbin/rabbitmq-server

# install the management plugin to be able to use a web interface
RUN cd rabbitmq_server-3.6.6/sbin/rabbitmq-plugins enable rabbitmq_management

# install erlang programming language. RabbitMQ is written in erlang.
RUN apt-get install erlang

# elasticsearch service here

# set current working directory to yacy_grid_mcp
RUN git clone https://github.com/yacy/yacy_grid_mcp.git
WORKDIR /yacy_grid_mcp

我想知道我是否正确创建了Dockerfile。如果有人能帮助我,那将是很棒的。另外,请告诉我如何继续添加elasticsearch服务。提前谢谢!

2 个答案:

答案 0 :(得分:2)

  

如何创建Dockerfile以在一个实例中运行多个服务?

你不应该。

A docker container is not a full virtual machine运行完整的应用程序实例和服务堆栈。

Docker是应用程序虚拟化。这意味着单个容器运行单个进程。

在您的情况下,您需要3个容器。一个用于RabbitMQ,一个用于FTP服务,一个用于弹性搜索。

您可能希望使用命名数据卷来共享FTP服务和读取它之间的文件系统。

一旦你让所有三个容器都工作,你可以使用docker-compose来简化它们的运行。

答案 1 :(得分:1)

构建容器时,RUN将执行您的命令,然后保存文件系统并退出。因此,当您运行容器时,您的服务未运行。您应该使用CMD执行单个命令。

你应该绕过docker文档,你会发现像这样的运行倍数服务不是这样做的,你应该为每个服务都有一个容器。

但是,我同意,有时候,提供倍数服务会很有用(我认为不是你的情况),你可以查看https://docs.docker.com/engine/admin/multi-service_container/,你会找到一些方法来做到这一点