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

来源:互联网 发布:linux chromium log 编辑:程序博客网 时间:2024/06/16 02:21

原由:
    因为有一个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

    修改/etc/grub.conf的配置文件:
    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站点的缓存配置文件
}

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

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

         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的服务,这里不建议是使用 /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.验证完了之后,那么证明这个容器的环境没有问题,那么就可以制作镜像了,不过在制作镜像之后,有两个问题需要面对,我也是在踩过坑之后,才明白:

           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

0 0
原创粉丝点击