docker - 多重依赖? Dockerfiles 构建 LAMP 容器

标签 docker dockerfile

我正在尝试构建一个 LAMP 容器,并且我已经构建了几个容器: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 .但是然后我需要基于 mysql 和/或 redis 的 httpd ......我真的不喜欢这种设置。

我还安装了 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 应用程序的配置,可以使用 ADDCOPY命令将您的配置文件从容器外部添加到容器内部。更多详情可查看here .

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

关于docker - 多重依赖? Dockerfiles 构建 LAMP 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38553403/

相关文章:

docker - gcc:找不到命令

linux - Docker swarm,在容器中收听但不在外部收听

docker - 启动容器时加载外壳配置文件

Docker-compose:尝试运行 mongo 镜像时出错

ruby-on-rails - 在 docker 容器中使用像 RVM 这样的版本管理器是一种不好的做法吗?

Docker容器隔离,它关心底层Linux OS吗?

django - 将文件从 Docker 容器上传到 Google Cloud Storage

node.js - 在 docker 容器内重新加载代码。颗粒物。 Node js

docker - 易于获取错误 : Version '5:19.03.4~3-0~ubuntu-bionic' for 'docker-ce' was not found

docker - 如何让docker容器每次重启时都运行脚本?