天天看点

【系列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              #端口范围

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

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

继续阅读