實現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 10月 18 13:34 auto.cnf
drwx------ 2 999 999 4096 10月 18 13:34 discuz
-rw-rw---- 1 999 999 12582912 10月 18 13:35 ibdata1
-rw-rw---- 1 999 999 50331648 10月 18 13:35 ib_logfile0
-rw-rw---- 1 999 999 50331648 10月 18 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
命令說明:
分別開放容器的22和80埠宿主機的2222和8000埠;
指定新生成的容器的名稱為:“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的安裝,進入首頁。同時也表明我們已經實現了獨立執行資料容器與應用視窗的架構。