多重依赖? Dockerfiles构build一个LAMP容器

我试图build立一个LAMP容器,我已经build立了几个容器:httpd 2.4.23,redis 3.0.7,mysql 5.6.30通过从源代码下载档案自己编译它们。 我已经把所有这些基于debian容器。

现在我正在做PHP 5.6.20容器,它抱怨说,它不知道有关Apache和MySQL。

这里是PHP容器的Dockerfile:

FROM debian RUN apt-get update RUN apt-get install -y build-essential; RUN apt-get install -y cmake; RUN apt-get install -y libfreetype6-dev libjpeg-dev libpng12-dev libcurl4-openssl-dev libbz2-dev libxml2-dev libxslt-dev libgd2-xpm-dev php5-imap libz-dev WORKDIR /usr/bin/ COPY php-5.6.20.tar.gz /usr/bin/ RUN gzip -d php-5.6.20.tar.gz RUN tar -xvf php-5.6.20.tar RUN ln -s php-5.6.20 php WORKDIR /usr/bin/php/ RUN ./configure \ --prefix=/usr/bin/ \ --with-apxs2=/usr/bin/apache/bin/apxs \ --with-config-file-path=/usr/bin/php-5.6.20/ \ --enable-libgcc \ --with-mysqli=/usr/bin/mysql/mysql_config \ --with-zlib-dir=/usr \ --with-jpeg-dir=/usr \ --with-png-dir=/usr \ --with-gd \ --enable-gd-native-ttf \ --with-freetype-dir=/usr \ --enable-ftp \ --enable-xml \ --enable-zip \ --with-bz2 \ --enable-wddx \ --without-pear \ --enable-mbstring \ --with-curl RUN make RUN make install 

我想知道是否应该把它放在: FROM httpd:2.4.23 。 但是,然后我需要基于httpd在mysql的一个,和/或在redis之一…我不太喜欢这个设置。

我也安装了Docker Compose,但是我想知道它是否会对我的情况有所帮助。

更新:这是完全正常工作的Dockerfile

 FROM debian RUN apt-get update RUN apt-get install -y build-essential; RUN apt-get install -y cmake; RUN apt-get install -y openssl libssl-dev; RUN apt-get install -y libpcre3 libpcre3-dev WORKDIR /usr/bin/ COPY httpd-2.4.23.tar.gz /usr/bin/ RUN gzip -d httpd-2.4.23.tar.gz RUN tar -xvf httpd-2.4.23.tar RUN ln -s httpd-2.4.23 httpd COPY apr-1.5.2.tar.gz /usr/bin/httpd/srclib/ COPY apr-util-1.5.4.tar.gz /usr/bin/httpd/srclib/ WORKDIR /usr/bin/httpd/srclib/ RUN gzip -d apr-1.5.2.tar.gz RUN gzip -d apr-util-1.5.4.tar.gz RUN tar -xvf apr-1.5.2.tar RUN tar -xvf apr-util-1.5.4.tar RUN ln -s apr-1.5.2 apr; RUN ln -s apr-util-1.5.4 apr-util WORKDIR /usr/bin/httpd/ RUN ./configure \ --prefix=/usr/bin/apache \ --enable-rewrite \ --enable-deflate \ --enable-ssl RUN make RUN make install RUN apt-get update RUN apt-get install -y libncurses-dev COPY mysql-5.6.30.tar.gz /usr/bin/ WORKDIR /usr/bin/ RUN gzip -d mysql-5.6.30.tar.gz RUN tar -xvf mysql-5.6.30.tar RUN ln -s mysql-5.6.30 mysql WORKDIR /usr/bin/mysql/ RUN mkdir install; mkdir install/data; mkdir install/var; mkdir install/etc; mkdir install/tmp RUN cd /usr/bin/mysql/; cmake \ -DCMAKE_INSTALL_PREFIX=/usr/bin/mysql/install \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DMYSQL_DATADIR=/usr/bin/mysql/install/data \ -DDOWNLOAD_BOOST=1 \ -DWITH_BOOST=/usr/bin/mysql/install/boost \ -DMYSQL_UNIX_ADDR=/usr/bin/mysql/install/tmp/mysql.sock RUN make RUN make install RUN apt-get update RUN apt-get install -y libfreetype6-dev libjpeg-dev libpng12-dev libcurl4-openssl-dev libbz2-dev libxml2-dev libxslt-dev libgd2-xpm-dev php5-imap libz-dev WORKDIR /usr/bin/ COPY php-5.6.20.tar.gz /usr/bin/ RUN gzip -d php-5.6.20.tar.gz RUN tar -xvf php-5.6.20.tar RUN ln -s php-5.6.20 php WORKDIR /usr/bin/php/ RUN ./configure \ --prefix=/usr/bin/php \ --with-apxs2=/usr/bin/apache/bin/apxs \ --with-config-file-path=/usr/bin/php-5.6.20/ \ --enable-libgcc \ --with-mysqli=/usr/bin/mysql/install/bin/mysql_config \ --with-zlib-dir=/usr \ --with-jpeg-dir=/usr \ --with-png-dir=/usr \ --with-gd \ --enable-gd-native-ttf \ --with-freetype-dir=/usr \ --enable-ftp \ --enable-xml \ --enable-zip \ --with-bz2 \ --enable-wddx \ --without-pear \ --enable-mbstring \ --with-openssl --with-curl RUN make RUN make install ENTRYPOINT ["/usr/bin/apache/bin/apachectl", "start", "-D FOREGROUND"] EXPOSE 80 # Build the container: docker build -t stephaneeybert/httpd:2.4.23 . # Run the container: docker run -d -p 127.0.0.1:80:80 --name httpd stephaneeybert/httpd:2.4.23 # Check that the port is open: nmap -p 8081 localhost 

如果你需要在你的容器中运行apache,你可以使用上面的Dockerfile在你的镜像中安装apache,就像你安装build-essential的东西一样。 意思是:

 RUN apt-get install -y apache2 

或类似的命令。 如果你还需要这个apache应用程序的configuration,你可以使用ADD或者COPY命令将你的configuration文件从外部添加到你的容器内部。 更多细节可以在这里find。

如果你需要apache作为一个独立的容器,你可以使用docker-compse来实现它。 在另一个容器中启动Apache,然后使用depends_on来configuration容器之间的依赖关系。 您可以使用端口来更改每个容器的端口号,以便它们可以相互通信。