原由:
因为有一个nginx的cache服务需要迁移到新的主机,所以最终决定使用docker的容器来解决这个问题:
思路:
首先肯定要使用到docker的服务,那么在centos6.6上面本来是没有办法安装docker服务的,
因为centos6.6上面的内核版本是2.6.32-504.el6.x86_64,而需要安装docker服务的话,必须为
3.10以上的内核版本才可以。所以需要升级内核才可以。
Centos6.6下的Docker安装:
1.升级linux-centos内核版本:
查看内核版本
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
vi /etc/grub.conf
修改/etc/grub.cof文件内的default=0,表示第一个title下的内容为默认启动的kernel(一般新安装的内核在第一个位置)。
最后修改完成和保存完毕之后,记得reboot重启系统。
2.再次查看内核并确认升级成功:
uname –r
3.10.5-3.el6.x86_64
3.安装docker
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.查看现有的镜像: docker images
2.创建容器: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.查看刚刚创建的容器:docker ps -a
ContainerID 就是容器ID
IMAGE 就是从属镜像,表示从哪一个现有的镜像上面生成的
COMMAND 生成容器时候的交互命令
CREATED 创建时间
STATUS 当前状态
PORT 当前应用的端口映射状态
NAMES 创建的容器名称
4.进入容器:docker attach ae8 (ae8是containerID,可以简写为钱三个以上的字符串)
5.进行必要的yum安装:(因为再选取镜像生成容器以后,有些基础的功能是没有的,所以需要安装,不过建议先进行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依赖包的安装:
yum install -y make gcc pcre-devel zlib-devel openssl*
7.进行nginx的正式安装:
cd nginx-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服务
/usr/local/nginx/sbin/nginx
9.验证nginx安装成功,只要可以访问nginx的欢迎页面就可以了
curl localhost:80
10.修改nginx配置文件:
-------------------------------------------------------
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站点的缓存配置文件
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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;
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------
请使用:(因为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.验证完了之后,那么证明这个容器的环境没有问题,那么就可以制作镜像了,不过在制作镜像之后,有两个问题需要面对,我也是在踩过坑之后,才明白:
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.好了,一切准备就绪,开始创建镜像:
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步的方法在宿主机上进行验证测试,没问题之后,就可以直接在浏览器里面进行验证了,如下图所示:
到此就全部安装完成了。
参考文献:
http://www.centoscn.com/image-text/install/2014/1128/4202.html