docker学习-lnmp+redis之搭建lnp容器服务

nginx+php7.0容器服务

本来想用单独的容器(nginx和php分开),但是因为是初学,php容器安装扩展的时候一直失败,所以就把centos+nginx+php放一起搭建了,优点是扩展简单,缺点就是整个容器显得臃肿,

我想最好的办法应该是使用Dockerfile吧。学习ing...


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  202MB

 

2. 更新镜像安装nginx和php.更新镜像之前,我们需要使用镜像来创建一个容器
[root@T1 ~]# docker run -itd --name lnp_7.0 --privileged=true centos /usr/sbin/init
612dc8d34520339bc6cbac9ecbeb9e74e8d00c3ea64364474263ccd7be34e73e

[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.0


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 makecache

--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-fpm


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发行版(比如CentOS7、Ubuntu14+)默认的服务管理,取代了传统的SystemV风格服务管理。systemd维护系统服务程序,它需要特权去会访问Linux内核。而容器并不是一个完整的操作系统,只有一个文件系统,而且默认启动只是普通用户这样的权限访问Linux内核,也就是没有特权,所以自然就用不了!
因此,请遵守容器设计原则,一个容器里运行一个前台服务!

+ 参数 --privileged=true 和 /usr/sbin/init

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

猜你喜欢

转载自www.cnblogs.com/xl999/p/10280279.html