2016-07-24 71 views
0

我想構建一個LAMP容器,並且我已經構建了幾個容器:httpd 2.4.23,redis 3.0.7,mysql 5.6.30,通過自己從源代碼下載的歸檔中編譯它們。我已經將所有這些基於debian容器。多重依賴? Dockerfiles構建一個LAMP容器

現在我正在做php 5.6.20容器,它抱怨說它不知道apache和mysql。

這裏是Dockerfile的PHP容器:

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 
+0

你的意思是「它抱怨說它不知道apache和mysql」,你可以發佈日誌嗎? –

+0

它是有道理的,它不知道有關Apache和MySQL,因爲有兩個沒有安裝在容器中。我的問題是如何解決容器依賴問題。 – Stephane

+0

這裏是日誌輸出:'./configure:line 8417:/ usr/bin/apache/bin/apxs:沒有這樣的文件或目錄 configure:error:Aborting' – Stephane

回答

2

如果您需要Apache在容器中運行,你可以在你的形象與上述Dockerfile安裝apache,就像你一樣安裝建立必要的東西。這意味着:

RUN apt-get install -y apache2 

或類似命令。如果您還需要此apache應用程序的配置,則可以使用ADDCOPY命令將您的配置文件從外部添加到容器內部。更多細節可以在here找到。

如果你需要apache作爲一個獨立的容器,你可以使用docker-compse來實現它。在另一個容器中啓動apache,然後使用depends_on配置容器之間的依賴關係。您可以使用ports更改每個容器的端口號,以便它們可以相互通信。

+0

我仍然與我的問題。我想編譯並構建php服務器。你可以看到它的configure腳本使用了一些apache和mysql路徑:'--with-apxs2 =/usr/bin/apache/bin/apxs'和'--with-mysqli =/usr/bin/mysql/mysql_confi '但是這個路徑不存在於這個php容器中。它們各自存在於自己的容器中。我想知道如何在沒有這兩條路徑的情況下構建PHP,並且在一天結束時仍然安裝燈泡。 – Stephane

+0

@Stephane當你說「他們自己的容器」,這是否意味着你的mysql和apache運行在兩個獨立的容器中,但運行在另一個容器中的php 5.6.20容器?如果是這樣,您可能需要考慮將它們全部放在一個容器中。將每個容器映像爲虛擬機或物理機器,您可以在三臺不同的機器上運行Apache,MySQL,php,但仍然可以運行LAMP嗎?如果您可以通過任何特殊配置進行配置,那麼該配置也適用於您的集裝箱情況。 –

+0

是的,我希望有三個容器,一個用於MySQL,另一個用於Apache,另一個用於PHP。不,我不能在三臺不同的機器上運行這三臺。我現在意識到每個服務應該有一個容器,在我的情況下,它應該翻譯爲一個MySQL容器和一個Apache-PHP容器。現在我只需要看看如何在沒有MySQL的情況下構建Apache-PHP,並且仍然可以與MySQL進行通信。 – Stephane