CentOS下的Docker容器-<nginx下的cache服务>

前端之家收集整理的这篇文章主要介绍了CentOS下的Docker容器-<nginx下的cache服务>前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原由:
因为有一个Nginx的cache服务需要迁移到新的主机,所以最终决定使用docker的容器来解决这个问题:
思路:
首先肯定要使用到docker的服务,那么在centos6.6上面本来是没有办法安装docker服务的,
因为centos6.6上面的内核版本是2.6.32-504.el6.x86_64,而需要安装docker服务的话,必须为
3.10以上的内核版本才可以。所以需要升级内核才可以。@H_403_7@

Centos6.6下的Docker安装:

1.升级linux-centos内核版本:@H_403_7@

查看内核版本

uname –r

2.6.32-504.el6.x86_64

第一步:
替换key文件
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
第二步:
根据本地centos版本下载对应的Elrepo:
CentOS 5x版本:
rpm -Uvh http://www.elrepo.org/elrepo-release-5-5.el5.elrepo.noarch.rpm
CentOS 6x版本:
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
CentOS 7x版本:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

第三步:

安装内核:

yum --enablerepo=elrepo-kernel install kernel-lt -y

修改/etc/grub.conf的配置文件
vi /etc/grub.conf

修改/etc/grub.cof文件内的default=0,表示第一个title下的内容为默认启动的kernel(一般新安装的内核在第一个位置)

最后修改完成和保存完毕之后,记得reboot重启系统。

2.再次查看内核并确认升级成功:@H_403_7@

uname –r
3.10.5-3.el6.x86_64

3.安装docker@H_403_7@

a. 关闭selinux
vim /etc/selinux/config
修改内容SELINUX=disabled
b. 在下epel的rpm包,因为epel里面带有docker-io的包:
cd /etc/yum.repos.d/
wget http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
vim epel.repo

修改epel.repo文件内的mirror=https为mirros=http
c. Yum安装docker-io
yum -y install docker-io
安装完成以后启动docker并查看版本
Service docker start
docker version

也可以查看docker的日志
cat /var/log/docker

在centos下创建Nginx的cache缓存docker镜像及端口映射

1.查看现有的镜像:@H_403_7@ docker images


2.创建容器:@H_403_7@docker run -itd -v /root:/root --name=centos-Nginx --restart=always centos /bin/bash

(这里先不做端口映射是为了后面生成可灵活运用的镜像使用)


“-i”表示输入

“-t”表示终端

“-d”表示后台运行

“--name=centos-Nginx”表示即将生成的docker镜像的名字

“--restart=always”表示容器开启以后,不会因为exit退出容器而关闭容器(如果没有这一条,那么在使用exit退出容器的时候,容器会自动关闭,需要重新启动)

“-v /root:/root”表示挂载本地/root目录到docker这个新建容器的/root目录下面

“/bin/bash”表示让新建立的容器有根本交互的能力(这里可以替换成命令执行)

“-p 60001:60001” 表示将内里容器的60001端口映射到docker宿主机的60001端口

(只有在映射了端口之后,才能通过宿主机的curl通过端口访问容器内的website)

3.查看刚刚创建的容器:@H_403_7@docker ps -a


ContainerID 就是容器ID

IMAGE 就是从属镜像,表示从哪一个现有的镜像上面生成

COMMAND 生成容器时候的交互命令

CREATED 创建时间

STATUS 当前状态

PORT 当前应用的端口映射状态

NAMES 创建的容器名称

4.进入容器:@H_403_7@docker attach ae8(ae8是containerID,可以简写为钱三个以上的字符串)


5.进行必要的yum安装:@H_403_7@(因为再选取镜像生成容器以后,有些基础的功能是没有的,所以需要安装,不过建议先进行yum的update的升级

yum -y install wget vim curl

wget http://Nginx.org/download/Nginx-1.8.1.0.tar#下载Nginx的安装包

wget http://labs.frickle.com/Nginx_ngx_cache_purge.tar.gz#下载Nginx_ngx_cache_purge的清除cache缓存用的purge安装包

tar -zxvf Nginx-1.8.1.0.tar#解压

tar -zxvf ngx_cache_purge-2.3.tar.gz

6.进行Nginx依赖包的安装:@H_403_7@

yum install -y make gcc pcre-devel zlib-devel openssl*

7.进行Nginx的正式安装:@H_403_7@

cdNginx-1.8.1.0

./configure --user=Nginx --group=Nginx --add-module=/home/ngx_cache_purge-2.3 --with-http_stub_status_module --with-http_ssl_module --prefix=/usr/local/Nginx

make

make install#最后一步安装完成

8.启动Nginx服务@H_403_7@

/usr/local/Nginx/sbin/Nginx

9.验证Nginx安装@H_403_7@成功,只要可以访问Nginx的欢迎页面就可以了

curl localhost:80


10.修改Nginx配置文件:@H_403_7@

-------------------------------------------------------

user Nginx;
worker_processes 4;

error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/Nginx.pid;
worker_rlimit_nofile 65535;

events {
use epoll;
worker_connections 10240;
}
http {
server_tokens off;
# server_tag off;
# autoindex off;
access_log off;
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 10m;
client_body_buffer_size 256k;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_buffer_size 128k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 128;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_temp_path /usr/local/Nginx/proxy_temp; #注意这里两行的路径
proxy_cache_path /usr/local/Nginx/proxy_cache levels=1:2keys_zone=cache_one:2048m inactive=30m max_size=60g;

#这里的cache_one跟下一个配置文件对应
# backend web server address pool
# include set/*.conf;

# system resource overload protect
# server {
# sysguard on;
# sysguard_load load=10.5 action=/loadlimit;
# sysguard_mem swapratio=20% action=/swaplimit;
# sysguard_mem free=100M action=/freelimit;
# location /loadlimit {
# return 503;
# }
# location /swaplimit {
# return 503;
# }
# location /freelimit {
# return 503;
# }
# }

# refuse request server by ipaddr
# server {
# server_name _;
# return 404;
# }
# web page cache and proxy setting
include /usr/local/Nginx/conf/web/*.conf;#此处路径下的配置文件可以用作服务器集群下面单个website站点的缓存配置文件
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

11.在/usr/local/Nginx/conf/下添加web目录,并建立站点配置文件:@H_403_7@

cd /usr/local/Nginx/conf/

mkdir web

cd /usr/local/Nginx/conf/web/

vim web_60001.conf

--------------------------------------------------------------

upstream 60001_servers{
#consistent_hash $request_uri; #此处是哈希算法的模块,如果在编译Nginx的时候添加了,这里就可以不用注释掉

#server 10.0.0.41:60001 weight=1;
server 172.16.40.1:60001; #此处为调用真实环境资源的服务器地址

#check interval=3000 rise=2 fall=5 timeout=1000 type=tcp;
#check_http_expect_alive http_2xx http_3xx; #这两行是check健康检查模块,如果在编译Nginx的时候添加了,这里就可以不用注释掉
}

server {
listen 60001;

location ~ /_clear(/.*) {#此行内的“_clear”的名称是可以更改的
allow all;#这一行可以添加允许使用这个清除缓存命令的主机IP地址,类似于:“allow 192.168.100.100;”
proxy_cache_purge cache_one $host$1$is_args$args;
} #这里的整个模块就是缓存清除模块了,请务必将整个模块置于静态页面的前方,让其优先匹配,否则会有可能报“404 not found”错误

location /_status {
#check_status; #check模块
allow 172.16.0.0/16;
deny all;
}

location ~* /Shopping/ActivityPage.aspx {
#proxy_hide_header "cache-control";
#proxy_hide_header Expires;
proxy_hide_header Set-Cookie;
proxy_hide_header X-AspNet-Version;
proxy_hide_header X-Powered-By;

proxy_ignore_headers Set-Cookie;
proxy_ignore_headers Cache-Control;
proxy_ignore_headers Expires;
proxy_ignore_headers X-Accel-Expires;

#add_header Cache-Control 'private max-age=300';

proxy_cache cache_one; #这里注意跟上面的名称对应一致
proxy_cache_valid 200 304 30m;
proxy_cache_valid 301 302 1m;
proxy_cache_valid any 60s;

proxy_pass http://60001_servers;#跟开头一样
proxy_redirect default;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header X-Real-IP $remote_addr;
add_header Nginx-Cache "$upstream_cache_status";
#add_header Kss-Upstream $upstream_addr;
proxy_cache_key $host$uri$is_args$args; #这一行必须要有,参数不要随意更改

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plainapplication/x-javascript text/css application/xml;
gzip_vary on;

#expires 10m;
}
}

------------------------------------------------------------------------------------------------------------------------------------------------------

12.经过上面的步骤之后,请重启Nginx的服务,这里不建议是使用@H_403_7@ /usr/local/Nginx/sbin/Nginx -s reload

请使用:(因为reload后配置不一定生效,经验之谈。说不定也可以的。)

/usr/local/Nginx/sbin/Nginx -s stop

/usr/local/Nginx/sbin/Nginx

重新启动Nginx之后,使用 curl localhost:60001 进行验证,如果成功,则会出现几大篇的60001的网页代码文件

如果可以,则证明已经可以成功调取到60001的网页文件了。那么Nginx安装没有问题,接着再次测试“_clear”是否生效:

curl localhost:60001/_clear/

如果出现下面的页面,则证明缓存模块也已经可以启用了。

<html>
<head><title>Successful purge</title></head>
<body bgcolor="white">
<center><h1>Successful purge</h1>
<br>Key : www.xxxxxx.com/
<br>Path: /usr/local/Nginx/proxy_cache/1/53/36a66aaffb1ebcd9f532f3f2d121b531
</center>
<hr><center>Nginx/1.8.1</center>
</body>
</html>

13.验证完@H_403_7@了之后,那么证明这个容器的环境没有问题,那么就可以制作镜像了,不过在制作镜像之后,有两个问题需要面对,我也是在踩过坑之后,才明白:

a.要解决容器在exit退出后,容器还能保持继续运行,这个问题在上面已经解决了,在建容器的时候加入 --restart=always 就可以了。

b.既然容器在exit退出后,那么里面的服务还会在继续运行吗?答案是不会,所以必须要保证在容器运行的时候,里面的服务也能够正常的跑起来,而不会停止。

比如上面创建的容器里面的Nginx服务,而我再查了诸多资料之后,发现还是需要将这个服务吊着,不让它运行完了就自动关闭了。

而我解决这个问题的办法是给Nginx配置文件的最末行加上daemon off;” 让其以非daemon的方式运行。

echo “daemon off;” >> /usr/local/Nginx/conf/Nginx.conf

再然后为了让里面的服务能够跟随容器一起启动,再添加一个简单的脚本文件

cd /opt

vim run.sh

脚本内容

######################

#!/bin/bash

/usr/local/Nginx/sbin/Nginx

######################

最后exit退出容器,查看容器ID:

docker ps -a


14.好了,一切准备就绪,开始创建镜像:@H_403_7@

docker commit ae8982926fec -m=“this is for Nginx cache” -a=“franz” Nginxcache:v1

“docker commit” 创建镜像的命令

“ae8982926fec” containerID 容器ID

“-m=“this is for Nginx cache” ”表示添加容器的描述

-a=“franz” ”表示添加创建容器的人名

Nginxcache:v1” 表示即将要创建的镜像的名称,冒号后面的v1就是版本号的意思

镜像创建完成以后,需要让之前创建的Nginxcache的服务跑起来,那么还得在刚刚创建的镜像的基础上再生成一个容器来跑:

docker run -itd -p 60001:60001 --dns=172.16.30.10 --dns=172.16.30.11 --restart=always Nginxcache:v3 /opt/run.sh

“--dns=172.16.30.10”表示给容器添加DNS,可以添加两条

/opt/run.sh表示当容器运行起来的时候,运行run.sh的脚本文件,以便启动内里的Nginx服务。

15.再次沿用之前第12步的方法在宿主机上进行验证测试@H_403_7@,没问题之后,就可以直接在浏览器里面进行验证了,如下图所示:


到此就全部安装完成了。

参考文献:

http://www.centoscn.com/image-text/install/2014/1128/4202.html

原文链接:/centos/378742.html

猜你在找的CentOS相关文章