時間:2018年2月php
一.項目背景html
我單位現web服務架構爲lnmp環境,服務器軟件、硬件升級部署難;同時開源軟件突飛猛進,考慮到技術升級,領導決定服務器架構總體升級爲容器架構,維護性、移植性強。mysql
二.項目說明nginx
原服務器架構爲lnmp環境,服務器運行穩定,升級爲容器架構,應平穩過分;採用單個鏡像逐個構造容器,將容器互聯,部署爲lnmp環境;原服務器項目代碼、配置文件,數據庫數據等採用數據掛載方式與容器互聯,訪問端口採用端口映射方式,實現客戶訪問。c++
三.實施步驟web
1.鏡像構造sql
1)mysql鏡像構造docker
咱們採用dockerfile 構造vim Dockerfile數據庫
FROM mysql:5.7 vim
MAINTAINER yst <691699086@qq.com>
ENV TZ "Asia/Shanghai"
基礎鏡像爲mysql5.7
docker build -t mysql .
build 爲構造鏡像, mysql 爲鏡像的倉庫及標籤,.爲當前路徑
出現success就表明成功了。
2)php鏡像構造
vim Dockerfile
FROM centos:centos7 #以centos7爲基礎
MAINTAINER yst <mushouhxh@tom.com> #製做者
ENV TZ "Asia/Shanghai" #時區
#安裝依賴包
RUN yum -y install libxml2-devel libmcrypt-devel libmcrypt mcrypt mhash libjpeg libjpeg-devel libpng libpng-devel net-tools gcc gcc-c++ make
ADD php-5.6.36.tar.gz / #拷貝安裝包
#運行源碼包安裝程序
RUN cd /php-5.6.36 && ./configure --prefix=/usr/local/php --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --enable-mbstring --with-zlib --with-libxml-dir=/usr --enable-xml --enable-fpm --with-gd && make && make install
#複製文件
RUN cp /php-5.6.36/php.ini-production /usr/local/php/etc/php.ini
RUN cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
#配置php
RUN useradd -M -s /sbin/nologin php
#修改配置文件
RUN sed -i -e 's\;pid = run/php-fpm.pid\pid = run/php-fpm.pid\g' -e 's\nobody\php\g' -e 's\listen = 127.0.0.1:9000\listen = 0.0.0.0:9000\g' /usr/local/php/etc/php-fpm.conf
RUN sed -i 's\;daemonize = yes\daemonize = no\g' /usr/local/php/etc/php-fpm.conf
EXPOSE 9000 #暴露端口
CMD ["/usr/local/php/sbin/php-fpm"] #啓動php-fpm
docker build -t php .
3)nginx 鏡像構造
先寫好配置文件nginx.conf
vim nginx.conf
user nginx; worker_processes 1;
error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;
pid logs/nginx.pid;
events { worker_connections 1024; }
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on; #tcp_nopush on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
#存放網頁代碼目錄
root html;
index index.php index.html index.htm;
}
# redirect server error pages to the static page /50x.html
#重定向到錯誤頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
#若是結尾爲.php 文件,轉向容器名爲php的容器,由該容器負責.php,而且端口爲9000,
location ~ \.php$ {
root html;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /$document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
from centos:centos7
MAINTAINER yst mushouhxh@tom.com
RUN yum -y install gcc gcc-c++ pcre-devel zlib-devel make
RUN useradd nginx -s /sbin/nologin
ADD nginx-1.10.3.tar.gz /
RUN cd /nginx-1.10.3 && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_gzip_static_module --with-pcre && make && make install
#建立日誌目錄
RUN mkdir /var/log/nginx
#拷貝配置文件
ADD nginx.conf /usr/local/nginx/conf/nginx.conf #將寫好的配置文件添加到鏡像中
EXPOSE 80 443
ENTRYPOINT ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"] #以守護進程方式運行nginx
docker build -t nginx .
2.生成並運行容器
由於要升級爲 docker 環境的lnmp,要以數據庫爲後臺,因此要先生成數據庫容器,再生成PHP容器,最後生成Nginx容器。
1)運行並啓動mysql容器
docker run -d -it --name mysql -p 3306:3306 -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
-d :以守護進程運行容器
-i :讓容器的輸入保持打開
-t : 分配一個僞終端
--name:爲該容器的名字
-p:爲宿主機的端口映射到容器的端口
-e:設置數據庫登陸root密碼
-v 掛載宿主機/root/bo/data/mysql到容器的/var/lib/mysql,也就是宿主機與容器實現數據同步
最後的mysql 爲鏡像的倉庫名及標籤
2)運行並啓動PHP容器
docker run -d -it --name php -p 9000:9000 -v /root/php/data/:/usr/local/nginx/html --link mysql:mysql php
-v : 此處爲宿主機的目錄掛載到nginx容器中nginx 安裝目錄的網頁代碼存放目錄,把.php爲結尾的代碼文件掛載映射到該目錄
可把原舊lnmp服務器中的代碼遷移至該宿主機,實現數據與容器的互聯
--link :爲鏈接mysql 容器,名字爲mysql
3)運行並啓動nginx容器
docker run -d -it --name nginx -p 80:80 -v /root/nginx/data:/usr/local/nginx/html --link php:php nginx
--link :爲鏈接PHP容器,名字爲php
-v : 映射宿主機存放網頁代碼路徑到容器的Nginx安裝目錄的放網頁代碼目錄,可把原舊lnmp服務器中的代碼遷移至該宿主機,實現數據與容器的互聯
3.測試
1)準備 index.html,index.php,test.php
分別爲普通網頁文件,PHP網頁文件,測試PHP與mysql連通的測試文件
vim index.html
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
vim index.php
<?php
phpinfo();
?>
此處mysql版本爲5.7,因此測試代碼爲mysqli_connect('爲宿主機中的容器名字:對應的宿主機端口','登陸服務器的用戶名','密碼')
若是是其餘版本,語句會不一樣
mysqli_close($link);爲關閉鏈接
vim test.php
<?php
$link=mysqli_connect('mysql:3306','root','123456');
if($link) echo "鏈接成功";
mysqli_close($link);
?>
2)訪問測試
打開瀏覽器,輸入http://宿主機的ip回車
顯示咱們準備的index.html
輸入http://宿主機的ip/index.php回車
輸入http://宿主機的ip/test.php回車
3)數據庫操做測試
打開navicat for mysql
創建新的鏈接
主機名爲宿主機的ip,此處爲何爲宿主機的ip呢,由於,數據庫容器創建在該主機上,而宿主機與容器在運行容器時已用參數-p 3306:3306進行了端口映射,因此,訪問宿主機的3306就至關於訪問容器的3306端口,也就是訪問mysql容器的mysql服務。
用戶名爲root
密碼爲咱們在運行容器時,-e MYSQL_ROOT_PASSWORD=123456設置的root的密碼123456
創建好鏈接,咱們就能夠在Windows桌面對容器進行操做了,操做的結果都會反饋到容器內,從而實現數據互聯。
4.總結
項目難點
1)如何生成合適的鏡像
mysql 鏡像是咱們在docker鏡像庫中下載mysql純淨鏡像,docker tag 命令將原鏡像標籤標記爲咱們本身的命名
PHP鏡像是以centos7純淨鏡像爲基礎,經過源碼安裝,配置好配置文件,並開啓端口而構建的
nginx 鏡像是以centos7純淨鏡像爲基礎,經過源碼安裝,修改配置文件,開啓端口而構建的
2)如何正確啓動鏡像並運行容器
先開啓mysql容器;開啓php容器及nginx容器時,發生
容器運行命令執行後,容器就關閉了,這不是咱們要的結果,咱們但願容器要一直運行服務,咱們才能訪問容器內的服務。
咱們從查詢鏡像生成文件dockerfile 文件開始,一步步查找緣由,通過反覆試驗,不斷生成鏡像,運行容器,我發如今生成鏡像的最後,咱們必定要開啓在該鏡像中的服務,好比PHP鏡像,咱們在運行容器時,須要在容器中開啓php-fpm服務,這就須要咱們在建立竟像時,開啓這個服務進程,就是
CMD ["/usr/local/php/sbin/php-fpm"];而nginx 容器運行時出現一樣問題,反覆查詢,調試,應在生成鏡像時要執行入口命令
ENTRYPOINT ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"],或在執行運行容器的命令加入--restart=always參數不然在容器啓動運行完入口名,容器也會中止。
3)如何鏈接各個容器
單個容器,每一個容器提供有每一個的服務功能,這是docker容器的一個容器一個功能,也是 docker 容器的優勢所在,每一個容器提供的服務封裝起來,用的時候運行它,不用的時候能夠遷移,拷貝到哪裏均可以提供服務。咱們如何實現它,就是用--ling參數,將有關聯的幾個容器互聯起來,一塊兒完成一個更增強大的服務功能。
好比:構建容器環境的lnmp,須要mysql,php,nginx等幾個容器提供的服務,須要將幾個容器鏈接起來一同完成 lnmp服務
docker run -d -it --name nginx -p 80:80 -v /root/nginx/data:/ usr/local/nginx/html --link php:php --link mysql: mysql nginx