docker實現apache+php容器和mysql容器獨立運行


【參考】:實現lamp docker數據容器(mysql)與應用容器(apache+php)獨立運行

參考了博主的幾篇文章,mysql是直接pull的官方,Apache+php用dockerfile實現,以【docker容器CentOS+ssh】中的鏡像為基礎鏡像

 


 

一、生成mysql容器

下載鏡像

docker pull mysql

下載完成后查看鏡像:

docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
mysql               latest              e206c8d4ffcf        4 days ago          324.3 MB

 

生成mysql容器 

創建一個文件夾用於掛載數據庫文件

mkdir /mysql_lamp

然后生成容器

docker run -d -p 33060:3306 -e mysqld -e MYSQL_ROOT_PASSWORD=test-e MYSQL_USER=test -e MYSQL_PASSWORD=test -e MYSQL_DATABASE=discuz -v /
mysql_lamp:/var/lib/mysql --name mysql_db mysql

命令詳解: 

1、mysqld,#啟動mysql服務,必須
2、MYSQL_ROOT_PASSWORD,#設置mysql的root密碼,必須
3、MYSQL_USER ,#添加用戶,可選
4、MYSQL_PASSWORD,#為用戶設置密碼,可選
5、MYSQL_DATABASE,#設置生成容器時需要新建的數據庫,可選
6、將宿主機的目錄“/mysql_data”映射到容器的“/var/lib/mysql”目錄,可選。這是因為默認情況下數據庫的數據庫文件和日志文件都會存放於容器的AUFS文件層,這不僅不使得容器變得越來越臃腫,不便於遷移、備份等管理,而且數據庫的性能也會受到影響,因此建議掛載到宿主機的目錄到容器內。
7、mysql:鏡像名字

 

-d: 后台運行容器,並返回容器ID;
-i: 以交互模式運行容器,通常與 -t 同時使用;
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
-p:端口映射
--name:生成容器的名字

 

二. 生成APACHE+PHP容器

編寫Dockerfile

Dockergile:

#name:test
#use:test  
#date:2017-11-29  
  
FROM centos_sshd:v1  
MAINTAINER test test@163.com
###1
ENV HTTPD_SOURCE http://archive.apache.org/dist/httpd/httpd-2.4.17.tar.gz
ENV PHP_SOURCE http://cn2.php.net/distributions/php-5.6.14.tar.gz
ENV MYSQL_SOURCE https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.38.tar.gz

#WORKDIR /root/
############apache
RUN yum -y install wget \
                   gcc \
                   make \
                   apr-devel \
                   apr \
                   apr-util \
                   apr-util-devel \
                   pcre-devel \
                   perl \
                   epel-release \  ###2
RUN cd /usr/local/src \
    && curl -fSL "$HTTPD_SOURCE" -o httpd-2.4.17.tar.gz \
    && tar -zxvf httpd-2.4.17.tar.gz \
    && cd httpd-2.4.17 \
    && ./configure \
        --prefix=/usr/local/apache2  \
        --enable-mods-shared=most  \
        --enable-so \
    && make \
    && make install
    
###mysql,we need mysql modules When we compile our PHP and PHP modules to connect 
###to the
database, so we need to install them.we don't need to install and
###launch mysql, just
decompress and copy it to /usrl/local/mysql RUN curl -fSL "$MYSQL_SOURCE" -o mysql-5.6.38.tar.gz \ && tar -zxvf mysql-5.6.38.tar.gz \ && mv ./mysql-5.6.38 /usr/local/mysql ############php RUN yum -y install \ bzip2-devel \ openssl-devel \ perl-devel \ libxml2-devel \ libjpeg \ libjpeg-devel \ libpng-devel \ freetype-devel \ libmcrypt-devel ###3 RUN curl -fSL "$PHP_SOURCE" -o php-5.6.14.tar.gz \ && tar -zxvf php-5.6.14.tar.gz \ && cd php-5.6.14 \ && ./configure \ --prefix=/usr/local/php \ --with-apxs2=/usr/local/apache2/bin/apxs \ --with-config-file-path=/usr/local/php/etc \ --with-mysql \ ###4 --with-libxml-dir \ --with-gd \ --with-jpeg-dir \ --with-png-dir \ --with-freetype-dir \ --with-iconv-dir \ --with-zlib-dir \ --with-bz2 \ --with-openssl \ --with-mcrypt \ --enable-soap \ --enable-gd-native-ttf \ --enable-mbstring \ --enable-sockets \ --enable-exif \ --disable-ipv6 \ --enable-mods-shared=most \ --enable-so \ && make \ && make install \ && cd .. \ && rm -r /usr/local/src/ /usr/local/php/ \ \ && sed -i \ ###5 -e '1,/\<AddType application\/x-gzip .gz .tgz\>/{s/\<AddType application\/x-gzip .gz .tgz\>/AddType application\/x-gzip .gz .tgz\n AddType application\/x-httpd-php .php/}' \ -e 's/\<DirectoryIndex index.html\>/DirectoryIndex index.html index.htm index.php/' \ -e 's/#ServerName www.example.com:80/ServerName localhost:80/g' \ /usr/local/apache2/conf/httpd.conf COPY httpd-foreground.sh /usr/local/sbin/ RUN chmod u+x /usr/local/sbin/httpd-foreground.sh EXPOSE 80 CMD ["/usr/local/sbin/httpd-foreground.sh"]

 

httpd-foreground.sh

#!/bin/bash
set -e
/usr/sbin/sshd &
/usr/local/apache2/bin/httpd -D FOREGROUND

 

解釋一下Dockerfile:

1. 這三個環境變量分別是下載APACHE,PHP,MYSQL,執行前先試試鏈接是否有效,也可以換成自己想要版本鏈接,如果瀏覽器能下載但是編譯過程中這里報錯了,檢查一下虛擬機能不能聯網。

2. 這個模塊我最初是放在下面###3的地方安裝的,但是報了一個錯:

Error configuring php 5.6 configure: error: mcrypt.h not found. Please reinstall libmcrypt

網上解決方法有幾種,我用的是:

yum install -y epel-release
yum install -y libmcrypt-devel
兩個不能一起安裝,因為CentOs6默認的yum源沒有 libmcrypt-devel這個包,只能借助epel的yum源,所以先安裝epel,再安裝libmcrypt

3. 編譯PHP時需要用到mysql進行模塊編譯,同時在php模塊連接數據庫時也需要用到mysql相關的模塊,所以需要安裝mysql,由於我們的mysql數據服務在另外的容器中運行,因此,並不需要安裝和啟動mysql,只需要解壓並復制到/usrl/local/mysql即可。

4. 博主文章中編譯php用的參數是--with-mysql=/usr/local/mysql,但是我在運行中會報錯,去掉路徑后正常。 

5.  這里是shell的sed命令,sed是stream editor的縮寫,一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接着用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接着處理下一行,這樣不斷重復,直到文件末尾。

這一步實現的功能是:

vi /usr/local/apache2/conf/httpd.conf
#找到:
AddType application/x-gzip .gz .tgz
#在該行下面添加:
AddType application/x-httpd-php .php

#找到:
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
#將該行改為:
<IfModule dir_module>
    DirectoryIndex index.html index.htm index.php
</IfModule>

#找到:
#ServerName www.example.com:80
#修改為:
ServerName localhost:80

關於sed的分析:

具體事例:

#把每行的12換成34,如果沒有g標記,則只有每行第一個12被替換
sed 's/12/34/g'  
#匹配到第一個12的行號,把第一行到這個行號之間的12換成34,簡單說就是只替換第一個12,后面的不變
sed '1,/12/{s/12/34/}' 
#替換最后一個12為34
sed ':a;$!{N;ba};s/\(.*\)12/\134/' file
    :a 創建一個labela
    N 將下一行讀入到模式空間
    $! 如果不是最后一行,ba跳轉到label a處
    步驟1-3(即:a;N;$!ba;)就是為了將file全部內容讀到模式空間中
#精確匹配555,某一行是5556的話並不匹配,a是追加,即在555下一行寫入555888
sed -i '/\<555\>/a\555888' file  
#精確匹配第一個555,並把其替換為2行數據,第1行是666,第2行是4個空格然后888
sed -i '1,/\<555\>/{s/\<555\>/666\n    888/}' file 

參數介紹:

[root@www ~]# sed [-nefr] [動作]
選項與參數:
-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的數據一般都會被列出到終端上。但如果加上 -n 參數后,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。
-e :直接在命令列模式上進行 sed 的動作編輯;
-f :直接將 sed 的動作寫在一個文件內, -f filename 則可以運行 filename 內的 sed 動作;
-r :sed 的動作支持的是延伸型正規表示法的語法。(默認是基礎正規表示法語法)
-i :直接修改讀取的文件內容,而不是輸出到終端。

動作說明: [n1[,n2]]function
n1, n2 :不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作是需要在 10 到 20 行之間進行的,則『 10,20[動作行為] 』

function:
a :新增, a 的后面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
c :取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
d :刪除,因為是刪除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p :列印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行~
s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!

 

生成Apache+php鏡像:

docker build -t apache_php:v1 .

 

生成Apache+php容器:

docker run -d -p 10022:22 -p 8001:80  --name apache_php --link mysql_db:mysql_db -v /var/www/html:/usr/local/apache2/htdocs apache_php:v1
--link mysql_db:mysql_db # 連接名為“mysql_db”的容器,並將其別名命名為mysql_db。

 查看新生成的容器

docker ps

如果沒有,一般是沒啟動,如果docker start  容器ID 也無法啟動的話,查看日志

docker logs 容器ID

 

 正常啟動后,查看是否能訪問:

vim /var/www/html/test.php

<?php
phpinfo()
?>

輸入IP:PORT 訪問一下

 

最后下載一個CMS,能完整的測試整個環境是否正常。

 

官方centos有200M,以此為基礎安裝了ssh后鏡像有400M,再以此為鏡像只安裝Apache是650M,而安裝了Apache+php是1.5個G,不知道該怎樣優化。


 

 其他命令

1. 重命名鏡像

如把entel_zmc_images :latest指定為entel_zmc_images:zmc_base

#docker tag entel_zmc_images  entel_zmc_images:zmc_base

重命名后的鏡像和原來的鏡像擁有一樣的imageID,所以刪除的時候不能用

docker rmi ID 

#要用docker rmi 名字:tag,如

#entel_zmc_images:zmc_base

 

2. 進入運行中的容器

當docker容器在 “-d”守護態運行的時候,比如通過supervisord控制兩個程序非守護態運行:
ssh -D
tomcat
那么這個時候,用戶就無法直接進入到容器中去,docker attach 容器id 就會一直卡着。

因為此時容器運行的進程是ssh,而不是/bin/bash 也沒有虛擬終端(-it)參數,所以是進入不到的,

那么這種情況下,該如何attach進去並進入到一個/bin/bash里呢?
 使用如下:
#docker exec -it containerID /bin/bash

 

3. 查詢容器IP

1. 使用命令

docker inspect 容器ID

2.過慮出 IPAddress

docker inspect 容器ID | grep IPAddress

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM