【系列3】使用Dockerfile创建yum安装nginx服务的Centos Docker镜像

 Nginx是一个高性能的Web和反向代理服务器,它具有很多非常优越的特性:

   ● 作为Web服务器:相比Apache,Nginx使用更少的资源,支持更多的并发连接,体现更高的效率,这点使Nginx尤其受到虚拟主机提供商的欢迎。一个Nginx实例能够轻松支持高达50000个并发连接数的响应。
   ● 作为负载均衡服务器:Nginx既可以在内部直接支持Rails和PHP,也可以支持作为HTTP代理服务器对外进行服务。Nginx用C编写,不论是系统资源开销还是CPU使用效率都比Perbal要好得多。
   ● 作为邮件代理服务器:Nginx同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm描述了成功并且美妙的使用经验。
   ● Nginx安装非常方便,配置文件非常简洁(还能够支持Perl语法),Bug非常少。Nginx启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下进行软件版本的升级。
   本节将首先介绍Nginx官方发行版本的镜像生成,然后介绍在国外应用量众多的Nginx淘宝增强版---Tengine镜像的生成。
   
Nginx官方版本
   由于使用Dockerfile生成镜像的步骤大多类似。为了节约篇幅,这里直接介绍使用的Dockerfile文件和需要的脚本文件,如果读者对使用Dockerfile创建镜像的步骤还有不清楚的地方,可以查看第一部分中关于Dockerfile的介绍章节和上一节Apache镜像的创建过程。
[root@docker1 ~]# mkdir nginx_centos && cd nginx_centos
[root@docker1 nginx_centos]# touch Dockerfile run.sh

① Nginx Dockerfile
[root@docker1 nginx_centos]# cat Dockerfile 
#设置继承docker.io/centos:latest镜像
FROM docker.io/centos:latest

#下面是一些创建者的基本信息
MAINTAINER from dockerpool.com by waitfish

#设置环境变量,所有操作都是非交互式的
ENV DEBIAN_FRONTEND noninteractive

RUN echo "Asia/Shanghai" > /etc/timezone #&& \
        # dpkg-reconfigure -f noninteractive tzdata      #这也是设置时区的
#注意这里要更改系统的时区设置,因为在Web应用中经常会用到时区这个系统变量,默认的centos会让你的应用此程序发生不可思议的效果哦

#需要使用yum需要执行这一步
RUN yum update
RUN yum install wget -y
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum repolist
RUN rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

#################################################################################
#安装sshd服务
RUN yum install -y openssh-server
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key 
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key

RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh

#取消pam限制
RUN sed -ri 's/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g' /etc/pam.d/sshd
###################################################################################


#安装nginx,设置nginx以非daemon启动
RUN \
   yum install -y nginx && \
   echo "daemon off;" >> /etc/nginx/nginx.conf #&& \

   #chown -R www-data:www-data /var/lib/nginx
   
#添加我们的脚本,并设置权限,这会覆盖之前放在这个位置的脚本
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh

#定义可以被挂载的目录,分别是虚拟主机的挂载目录、证书目录、配置目录和日志目录
VOLUME ["/etc/nginx/sites-enabled","/etc/nginx/certs","/etc/nginx/conf.d","/var/log/nginx"]


#定义工作目录
WORKDIR /etc/nginx

#定义输出端口
EXPOSE 80
EXPOSE 443
EXPOSE 22

#设置自启动命令
CMD ["/run.sh"]

② 查看run.sh脚本文件内容
[root@docker1 nginx_centos]# cat run.sh 
#!/bin/bash
/usr/sbin/sshd &
/usr/sbin/nginx


③ 在宿主主机上生成SSH密钥对,并创建authorized_keys文件:
# ssh-keygen -t rsa
....
# cat ~/.ssh/id_rsa.pub >authorized_keys  
    或[root@docker1 ~]# cp /root/.ssh/id_rsa.pub /root/sshd_centos/authorized_keys 

[root@docker1 nginx_centos]# cat authorized_keys 

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRlvK19B32F3cDKZnAhmizuKJotVhBeZdmGDJ6TGFyiRLEgiPPTiUEvUq9nLZqkGM/U0u6kZn8vFajThOFKyT2I/WTP3Ix3h1vHlre1U3c75FeRrRgkfYC4SVnvCVMjl7mtqNEfnfTuQQckvL/5moVymbpdqnBdNfiSBvw2e73iE+hQWs0YUOnFwOVdM1LCBFidqaP84gLRoDOtcG3ya68z3I0xKEIapW/TEsPmVOS3Xnf9SJS3QfB5sKUKA5DHVIeJaEEZB7uzaFQOmVhcguXmqtsgxciOeFhUpWm5tE+0tw/dygGLKOHD6K8s6/k7oSUZwGHZ/NnGB3npP698JrJ root@docker1


[root@docker1 nginx_centos]# ls

authorized_keys  Dockerfile  run.sh


④ 使用docker build命令,创建镜像nginx:centos:
[root@docker1 nginx_centos]# docker build -t nginx:centos .

⑤ 测试:
   启动容器,查看内部的80端口被映射到本地的32818端口:
   
[root@docker1 nginx_centos]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                  NAMES
9ef224c25678        sshd:nginx          "/run.sh"                About an hour ago   Up About an hour    0.0.0.0:32819->22/tcp, 0.0.0.0:32818->80/tcp, 0.0.0.0:32817->443/tcp   pedantic_engelbart

访问本地的32828端口:
[root@docker1 nginx_centos]# curl 127.0.0.1:32818
返回Nginx的欢迎页面,说明Nginx已经正常启动了:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>


<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>


<p><em>Thank you for using nginx.</em></p>
</body>
</html>


最后,为了能够充分发挥Nginx的性能,可对系统内核参数做一些调整:
下面是一份常见的Nginx内核的优化参数:
1. net.ipv4.ip_forward = 0
2. net.ipv4.conf.default.rp_filter =1
3. net.ipv4.conf.default.accept_source_route = 0
4. kernel.sysrq = 0
5. kernel.core_uses_pid = 1
6. net.ipv4.tcp_syncookies = 1
7. kernel.msgmnb = 65536
8. kernel.msgmax = 65536
9. kernel.shmmax = 68719476736
10. kernel.shmall = 4294967296
11. net.ipv4.tcp_max_tw_buckets = 6000           #timewait的数量
12. net.ipv4.tcp_sack = 1                                 #有选择的应答
13. net.ipv4.tcp_window_scaling = 1                 #设置tcp/ip会话滑动窗口是否可变,1可变,0不可变。开启使滑动窗口大小增加数个数量级,提高数据传输能力
14. net.ipv4.tcp_rmem = 4096        87380    4194304  #tcp接收缓冲区
15. net.ipv4.tcp_wmem = 4096        16384    4194304  #tcp发送缓冲区
16. net.core.wmem_default = 8388608                        #发送套接字缓冲区大小的缺省值(字节单位)
17. net.core.rmem_default = 8388608                         #接收套接字缓冲区大小的缺省值
18. net.core.rmem_max = 16777216                           #接收套接字缓冲区大小的最大值
19. net.core.wmem_max = 16777216                          #发送套接字缓冲区大小的最大值
20. net.core.netdev_max_backlog = 262144           #允许送到队列的数据包最大数目
21. net.core.somaxconn = 262144                        #web应用中listen函数的backlog(积压)
22. net.ipv4.tcp_max_orphans = 3276800              #最多有多少个TCP套接字不被关联到任何一个用户的句柄上
23. net.ipv4.tcp_max_syn_backlog = 262144          #记录那些尚未收到客户端确认信息的连接请求最大值,表示SYN队列的长度,可以容纳更多等待连接的网络连接数
24. net.ipv4.tcp_timestamps = 0                  #时间戳关闭
25. net.ipv4.tcp_synack_retries = 1               #这个设置决定了内核放弃连接之前发送SYN+ACK包的数量
26. net.ipv4.tcp_syn_retries = 1                    #内核放弃连接之前发送SYN包的数量
27. net.ipv4.tcp_tw_recycle = 1                     #timewait快速回收
28. net.ipv4.tcp_tw_reuse = 1                       #timewait 用于新的连接
29. net.ipv4.tcp_mem = 94500000 915000000 927000000     #out of socket memory
30. net.ipv4.tcp_fin_timeout = 1                   #保持在FIN-WAIT-2状态的时间,对端出错永不关闭甚至当机缺省值是60s
31. net.ipv4.tcp_keepalive_time = 30                                #keepalived 发送消息的频度
32. net.ipv4.ip_local_port_range = 1024    65000              #端口范围

………………………………………………………………………………………………………………………………………………

下载附录:NGINX各个版本: http://down.51cto.com/data/2369729 

       NGINX YUM源:  http://down.51cto.com/data/2387451 

    


本文转自 Mr_sheng 51CTO博客,原文链接:http://blog.51cto.com/sf1314/2044809

上一篇:DOCKER01_概述、软件安装、镜像命令、容器命令、(日志、进入容器、拷贝)、提交、push、(导入、导出)、(save、load)(一)


下一篇:三种在Linux上创建或扩展交换分区的简单方法