docker學習-lnmp+redis之搭建lnp容器服務

nginx+php7.0容器服務php

原本想用單獨的容器(nginx和php分開),可是由於是初學,php容器安裝擴展的時候一直失敗,因此就把centos+nginx+php放一塊兒搭建了,優勢是擴展簡單,缺點就是整個容器顯得臃腫,html

我想最好的辦法應該是使用Dockerfile吧。學習ing...mysql


1. 下載centos鏡像
[root@T1 ~]# docker pull centos
[root@T1 lnmp]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql  5.7 b  a7a93aae2a8  11 days  ago  372MB
centos latest 1e1148e4cc2c 5  weeks ago  202MBlinux

 

2. 更新鏡像安裝nginx和php.更新鏡像以前,咱們須要使用鏡像來建立一個容器
[root@T1 ~]# docker run -itd --name lnp_7.0 --privileged=true centos /usr/sbin/init
612dc8d34520339bc6cbac9ecbeb9e74e8d00c3ea64364474263ccd7be34e73enginx

[root@T1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
612dc8d34520  centos  "/usr/sbin/init"  4  seconds ago  Up 2  seconds  lnp_7.0c++


2.1. 安裝nginx 默認是1.12
[root@T1 lnmp]# docker exec -it lnp_7.0 /bin/bash
[root@612dc8d34520 /]# yum -y install epel-release
[root@612dc8d34520 /]# yum clean all
[root@612dc8d34520 /]# yum makecacheweb

--nginx依賴的一些軟件包安裝
[root@612dc8d34520 /]# yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
[root@612dc8d34520 /]# yum -y install nginx
[root@612dc8d34520 /]# systemctl start nginx
[root@612dc8d34520 /]# systemctl enable nginx
[root@612dc8d34520 /]# systemctl status nginx正則表達式


2.2. 安裝Php7.0
[root@612dc8d34520 /]# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
[root@612dc8d34520 /]# yum search php70w --//查看
[root@612dc8d34520 /]# yum -y install php70w-fpm php70w-cli php70w-gd php70w-mcrypt php70w-mysql php70w-pear php70w-xml php70w-mbstring php70w-pdo php70w-json php70w-pecl-apcu php70w-pecl-apcu-devel php70w-common php70w-curl php70w-dom libapache2-mod-php php-redis
[root@612dc8d34520 /]# systemctl start php-fpm
[root@612dc8d34520 /]# systemctl enable php-fpm
[root@612dc8d34520 /]# vi /etc/php.ini
cgi.fix_pathinfo = 0
[root@8374deb4d982 /]# systemctl restart php-fpmredis


2.3 查看php和nginx的版本
[root@612dc8d34520 /]# php -v
PHP 7.0.33 (cli) (built: Dec 6 2018 22:30:44) ( NTS )
[root@612dc8d34520 /]# nginx -v
nginx version: nginx/1.12.2算法

 

3. 安裝好nginx和php 後,docker commit來提交容器副本,完成鏡像的更新[至關於建立一個新的鏡像]
[root@T1 ~]# docker ps |grep lnp_7.0
612dc8d34520 centos "/usr/sbin/init" 4 hours ago Up 4 hours lnp_7.0
[root@T1 ~]# docker commit -m="centos7+nginx1.12+php7.0" -a ="xliang" 612dc8d34520 xliang/centos_lnp7.0
sha256:06dbdf60a84bc9f97278ef5fe8073a1dbd941a23aa22bd49248595729999ff2d

[root@T1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xliang/centos_lnp7.0  latest  06dbdf60a84b  36 seconds ago  750MB
mysql                 5.7     ba7a93aae2a8  12 days    ago  372MB
centos                latest  1e1148e4cc2c  5  weeks   ago  202MB


個參數說明:
  -m:提交的描述信息
  -a:指定鏡像做者
  612dc8d34520:容器ID
  xliang/centos_lnp7.0:指定要建立的目標鏡像名

------------------------------------------------------------->
備份咱們的鏡像[能夠拷貝至其餘主機load建立鏡像運行]
[root@T1 ~]# docker save -o lnp7.0.tar xliang/centos_lnp7.0
------------------------------------------------------------->

 

4. 測試 lnp環境
4.1 映射目錄在安裝mysql的時候已經建立了
/lnmp/
├── conf
│   ├── mysql mysql配置文件
│   ├── nginx nginx配置文件
│   └── php php配置文件
├── data
│   ├── mysql MySQL數據文件目錄
│   └── www 站點根目錄
└── logs
├── mysql mysql日誌文件
├── nginx nginx日誌文件
└── php php日誌文件


4.2 php和nginx的目錄映射

容器日誌目錄的權限[我製做容器的時候ls的]
[root@612dc8d34520 php-fpm.d]# ls -l /var/log/
drwx------ 2 nginx nginx 41 Jan 10 06:37 nginx
drwxrwx--- 2 apache root 23 Jan 10 07:00 php-fpm


主機目錄映射容器關係
/lnmp/logs/php:/var/log/php-fpm
/lnmp/conf/nginx:/etc/nginx/conf.d
/lnmp/data/www:/usr/share/nginx/html
/lnmp/logs/nginx:/var/log/nginx

--/etc/php.ini 和/etc/php-fpm.d/www.conf    我這裏不映射了,如需優化,能夠docker cp 下載上傳來編輯,用重命名或移動文件來作備份
--/etc/nginx/nginx.conf                     能夠docker cp 下載上傳來編輯,用重命名或移動文件來作備份

[root@T1 lnmp]# docker run -d -p 80:80 -p 9000:9000 -v /lnmp/logs/php:/var/log/php-fpm -v /lnmp/conf/nginx:/etc/nginx/conf.d -v /lnmp/data/www:/usr/share/nginx/html -v /lnmp/logs/nginx:/var/log/nginx --name dnmp_lnp7.0 --privileged=true xliang/centos_lnp7.0 /usr/sbin/init
26c6acc6f19347a9c80f54ad7e403644d910c3e8a145301e78a1d53fd91647ca

[root@T1 lnmp]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26c6acc6f193 xliang/centos_lnp7.0  "/usr/sbin/init"        38 seconds ago Up 36 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:9000->9000/tcp  dnmp_lnp7.0
0b7e685c3cbc mysql:5.7             "docker-entrypoint.s…" 19 hours   ago Up 3  hours   0.0.0.0:3306->3306/tcp, 33060/tcp  dnmp_mysql5.7

修改容器日誌目錄的權限,否則沒法寫入日誌
[root@T1 lnmp]# docker exec -it dnmp_lnp7.0 /bin/bash -c "chown nginx:nginx /var/log/nginx/ -R"
[root@T1 lnmp]# docker exec -it dnmp_lnp7.0 /bin/bash -c "chown apache:root /var/log/php-fpm/ -R"


我在/lnmp/conf/nginx目錄下添加vhost,因此容器中默認的nginx.conf我這邊自定義替換掉,配置以下
[root@T1 lnmp]# cat /home/nginx.conf

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;


events {
worker_connections 1024;
}


http {
include /etc/nginx/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 /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;
}

--備份
[root@T1 lnmp]# docker exec -it dnmp_lnp7.0 /bin/bash -c "mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf_bak"

--替換
[root@T1 lnmp]# docker cp /home/nginx.conf 26c6acc6f193:/etc/nginx/

--vhost文件
[root@T1 lnmp]# cat /lnmp/conf/nginx/default.conf |grep -v "#" |grep -v "^$"
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

 

重啓容器,使配置生效
[root@T1 lnmp]# docker restart 26c6acc6f193    

[root@T1 lnmp]# netstat -nlp|grep 80
tcp6 0 0 :::80 :::* LISTEN 26258/docker-proxy
[root@T1 lnmp]# netstat -nlp|grep 9000
tcp6 0 0 :::9000 :::* LISTEN 26247/docker-proxy

訪問http://192.168.0.210 已經Ok
添加Php測試頁 [root@T1 nginx]# echo "<?php phpinfo(); ?>" > /lnmp/data/www/test.php
訪問http://192.168.0.210/test.php 已經Ok

 



遇到的問題:
------------------------------------------------------------------------------------------------>
安裝所需環境
一. gcc 安裝
安裝 nginx 須要先將官網下載的源碼進行編譯,編譯依賴 gcc 環境,若是沒有 gcc 環境,則須要安裝:
yum install gcc gcc-c++

二. PCRE pcre-devel 安裝
PCRE(Perl Compatible Regular Expressions) 是一個Perl庫,包括 perl 兼容的正則表達式庫。nginx 的 http 模塊使用 pcre 來解析正則表達式,因此須要在 linux 上安裝 pcre 庫,pcre-devel 是使用 pcre 開發的一個二次開發庫。nginx也須要此庫。命令:
yum install -y pcre pcre-devel

三. zlib 安裝
zlib 庫提供了不少種壓縮和解壓縮的方式, nginx 使用 zlib 對 http 包的內容進行 gzip ,因此須要在 Centos 上安裝 zlib 庫。
yum install -y zlib zlib-devel

四. OpenSSL 安裝
OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、經常使用的密鑰和證書封裝管理功能及 SSL 協議,並提供豐富的應用程序供測試或其它目的使用。
nginx 不只支持 http 協議,還支持 https(即在ssl協議上傳輸http),因此須要在 Centos 安裝 OpenSSL 庫。
yum install -y openssl openssl-devel

------------------------------------------------------------------------------------------------>
------------------------------------------------------------------------------------------------>

Docker容器使用問題:Failed to get D-Bus connection: Operation not permitted
在CentOS7 中,docker容器中yum 安裝完nginx後,啓動nginx報錯
# systemctl start nginx
Failed to get D-Bus connection: Operation not permitted


解決辦法:
生成容器:
[root@T1 ~]# docker run -itd --name nginx_php7.0_centos --privileged=true centos /usr/sbin/init


進入容器:
[root@T1 ~]# docker exec -it nginx_php7.0_centos /bin/bash
這樣可使用systemctl啓動服務了。


Docker的設計理念是在容器裏面不運行後臺服務,容器自己就是宿主機上的一個獨立的主進程,也能夠間接的理解爲就是容器裏運行服務的應用進程。一個容器的生命週期是圍繞這個主進程存在的,因此正確的使用容器方法是將裏面的服務運行在前臺。

再說到systemd,這個套件已經成爲主流Linux發行版(好比CentOS七、Ubuntu14+)默認的服務管理,取代了傳統的SystemV風格服務管理。systemd維護系統服務程序,它須要特權去會訪問Linux內核。而容器並非一個完整的操做系統,只有一個文件系統,並且默認啓動只是普通用戶這樣的權限訪問Linux內核,也就是沒有特權,因此天然就用不了!
所以,請遵照容器設計原則,一個容器裏運行一個前臺服務!

+ 參數 --privileged=true 和 /usr/sbin/init

--------------------------------------------------------------------------------------------》

相關文章
相關標籤/搜索