1. 程式人生 > >實現lamp docker資料容器(mysql)與應用容器(apache+php)獨立執行

實現lamp docker資料容器(mysql)與應用容器(apache+php)獨立執行

在我之前寫的文章中已經實現了在獨立的容器中執行apache和mysql。
請參閱:
《建立帶Apache服務的Centos Docker映象》
《詳解如何使用DockerHub官方的mysql映象生成容器》
但是在實際的應用過程中,很少有讓這二個服務單獨執行的,最常見的應用是lamp環境,將apache、php和mysql結合到一起。在實際生產環境中,除非訪問量不是很大的站點,一般都會將mysql放到一臺伺服器上,apache+php放到另外一臺伺服器上,以提高效能。
現在我就分步驟演示這個環境的搭建,搭建後將通過安裝Discuz結合資料容器與應用容器,實現lamp,並測試是否工作正常。
一、執行mysql容器
mysql的docker映象以Docker Hub提供的官方映象為基礎,來生成資料容器。
1、在宿主機上建立對映到容器的mysql資料目錄

mkdir /mysql_lamp

2、建立容器
2.1、生成容器

docker run -d -e mysqld -e MYSQL_ROOT_PASSWORD=147258 -e MYSQL_USER=steven -e MYSQL_PASSWORD=147258  -e MYSQL_DATABASE=discuz -v /mysql_lamp:/var/lib/mysql --name mysql_db  mysql

name 是給新生成的容器命名,起一個很好記憶的名字。如果不指定系統將會自動生成。

2.2、檢視生成的容器:

[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d427e7c85505 mysql "/entrypoint.sh mysq 5 seconds ago Up 4 seconds 3306/tcp mysql_db

2.3、檢視資料目錄下是否生成相應的檔案:

[[email protected]
~]# ll /mysql_lamp/ 總用量 110608 -rw-rw---- 1 999 999 56 1018 13:34 auto.cnf drwx------ 2 999 999 4096 10月 18 13:34 discuz -rw-rw---- 1 999 999 12582912 1018 13:35 ibdata1 -rw-rw---- 1 999 999 50331648 1018 13:35 ib_logfile0 -rw-rw---- 1 999 999 50331648 1018 13:34 ib_logfile1 drwx------ 2 999 999 4096 10月 18 13:34 mysql drwx------ 2 999 999 4096 10月 18 13:34 performance_schema

一切正常!

二、生成apache+php的映象
這裡的基礎映象以《建立帶Apache服務的Centos Docker映象》介紹的映象為基礎。
1、檢視現有映象

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
apache_dockerfile   centos              f8f30b4a0ee8        4 days ago          440 MB
mysql               latest              e206c8d4ffcf        4 days ago          324.3 MB
sshd                dockerfile          411d5fb16366        5 days ago          278 MB
centos              latest              0f73ae75014f        5 weeks ago         172.3 MB

2、以生成臨時容器,安裝php

[root@localhost ~]# docker run -d -P apache_dockerfile:centos

檢視新生成的apache容器:

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS              PORTS                                          NAMES
aea12b125d33        apache_dockerfile:centos   "/usr/local/sbin/run   5 seconds ago       Up 5 seconds        0.0.0.0:32794->22/tcp, 0.0.0.0:32793->80/tcp   condescending_perlman
d427e7c85505        mysql                      "/entrypoint.sh mysq   8 minutes ago       Up 8 minutes        3306/tcp                                       mysql_db       

3、進入容器:

ssh localhost -p 32794

4、mysql
編譯PHP時需要用到mysql進行模組編譯,同時在php模組連線資料庫時也需要用到mysql相關的模組,所以需要安裝。

#下載已編譯檔案包
wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.27-linux-glibc2.5-x86_64.tar.gz

#解壓
tar -zxvf mysql-5.6.27-linux-glibc2.5-x86_64.tar.gz

#將解壓後的檔案移動到指定的目錄/usr/local並重命名為:mysql
mv ./mysql-5.6.27-linux-glibc2.5-x86_64 /usr/local/mysql

由於我們的mysql資料服務在另外的容器中執行,因此,並不需要安裝和啟動mysql,只需要解壓並複製到/usrl/local/mysql即可。

5、編譯安裝php
5.1、編譯前的準備

cd /usr/local/src
#下載原始碼包
wget http://cn2.php.net/distributions/php-5.6.14.tar.gz
#解壓原始碼包
tar -zxvf php-5.6.14.tar.gz
cd php-5.3.28
#下載軟體依賴
yum -y install epel-release
yum install -y make perl perl-devel libxml2-devel openssl-devel bzip2-devel libjpeg libjpeg-devel libpng-devel freetype-devel libmcrypt-devel

由於我之前的apache docker 映象裡沒有安裝perl,如果這時要開始編譯就會報錯:

Sorry, I cannot run apxs.  Possible reasons follow:

1. Perl is not installed
2. apxs was not found. Try to pass the path using --with-apxs2=/path/to/apxs
3. Apache was not built using --enable-so (the apxs usage page is displayed)

解決方案為:

vi /usr/local/apache2/bin/apxs

#!/replace/with/path/to/perl/interpreter -w

替換為:

#!/usr/bin/perl -w

5.2、編譯安裝PHP

 ./configure   --prefix=/usr/local/php   --with-apxs2=/usr/local/apache2/bin/apxs   --with-config-file-path=/usr/local/php/etc   --with-mysql=/usr/local/mysql   --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 

make

make install

檢視php是否編譯了apache支援檔案

[root@aea12b125d33 php-5.6.14]# ll /usr/local/apache2/modules/libphp5.so
-rwxr-xr-x 1 root root 36555844 Oct 18 07:02 /usr/local/apache2/modules/libphp5.so

OK!

6、配置apache

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

更新配置檔案使之生效

 /usr/local/apache2/bin/apachectl -k graceful

新建測試檔案:

 vi /usr/local/apache2/htdocs/1.php

內容如下:

<?php
        echo phpinfo();
?>

測試:

 curl localhost/1.php

如果出現php配置資訊就說明解析成功。

7、生成映象
7.1、清理臨時容器裡的檔案
在生成映象之前需要在容器裡清理一下之前安裝留下的檔案,包括/usr/local/src目錄下面的原始碼、/usr/local/php目錄(這個目錄只在編譯PHP模組時用到,編譯過後就沒有用了)

7.2、檢視剛剛配置的容器資訊


[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS              PORTS                                          NAMES
aea12b125d33        apache_dockerfile:centos   "/usr/local/sbin/run   About an hour ago   Up 10 minutes       0.0.0.0:32796->22/tcp, 0.0.0.0:32795->80/tcp   condescending_perlman
d427e7c85505        mysql                      "/entrypoint.sh mysq   About an hour ago   Up About an hour    3306/tcp                                       mysql_db 

7.3、根據容器ID生成映象:

docker commit aea12 apache_php

檢視剛剛生成的容器資訊:

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
apache_php          latest              d5b82ef788ed        About a minute ago   800 MB
apache_dockerfile   centos              f8f30b4a0ee8        4 days ago           440 MB
mysql               latest              e206c8d4ffcf        4 days ago           324.3 MB

三、安裝Discuz!
能過以上二步操作,新建了資料容器mysql_db,也新建了apache+php的映象apache_php。之所以沒有立即新建apache_php的容器,是因為還需要一些準備工作:下載Discuz原始碼包到本地資料夾,在生成apache_php容器時對映到容器的目錄下。通過Discuz,就完成了資料容器與應用容器的結合,形成了完整的lamp架構。
通常我們會將程式碼和資料放到容器外的本地主機的目錄裡進行存放,一方面是保證資料安全,便於管理,另一方面也是出於效能方面的考慮。

1、獲得Discuz原始碼包,並解壓到指定目錄
在宿主機上新建一個目錄

mkdir /discuz
cd /discuz

下載原始碼包

wget http://download2.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_UTF8.zip

解壓

yum -y install unzip
unzip Discuz_X3.2_SC_UTF8.zip
mv upload/* .

2、新建apache_php容器,並連線mysql_db容器

docker run -d -p 2222:22 -p 8000:80  --name web --link mysql_db:mysql_db -v /discuz:/usr/local/apache2/htdocs apache_php  /usr/local/sbin/run.sh

命令說明:

分別開放容器的2280埠宿主機的22228000埠;
指定新生成的容器的名稱為:“web”;
將mysql_db容器連線到新生成的容器上;
將本地磁碟目錄/discuz對映到容器的/usr/local/apache2/htdocs目錄;
生成容器後執行指定角本。

檢視新生成的容器:

[[email protected] discuz]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS              PORTS                                          NAMES
79d56e19f981        apache_php                 "/usr/local/sbin/run   14 minutes ago      Up 14 minutes       0.0.0.0:2222->22/tcp, 0.0.0.0:8000->80/tcp     web          
aea12b125d33        apache_dockerfile:centos   "/usr/local/sbin/run   2 hours ago         Up 44 minutes       0.0.0.0:32796->22/tcp, 0.0.0.0:32795->80/tcp   condescending_perlman
d427e7c85505        mysql                      "/entrypoint.sh mysq   2 hours ago         Up 2 hours          3306/tcp                                       mysql_db

3、在瀏覽器裡執行:本機IP:8000
正常會出現Discuz的安裝介面。
Discuz安裝在這裡無須多做說明,只有二個地方的操作需要注意
第一,安裝程式會提示一些目錄的許可權不正確,需要修改,這時需要進入視窗更改所提示的資料夾許可權。

進入容器

 docker exec -it 79d56 /bin/bash

修改許可權

cd /usr/local/apache2/htdocs
chown -R daemon:daemon ./config ./data ./uc_client ./uc_server

第二、連線資料庫
這裡寫圖片描述
如上圖:
資料庫伺服器:填寫新建apache_php容器時連線資料視窗的alias ,即mysql_db
資料庫名:填寫在新建資料容器時新建的資料庫,即discuz
使用者名稱和密碼,也是在新建資料容器時指定的root或者新建的使用者的使用者名稱和密碼

最後,如果以上操作無誤的話會順利完成Discuz的安裝,進入首頁。同時也表明我們已經實現了獨立執行資料容器與應用視窗的架構。