第11章 Web服务于应用
Apache
Apache是一个高稳定性的、商业级别的开源Web服务器,是目前世界使用排名第一的Web服务器软件。由于其良好的跨平台和安全性,Apache被广泛应用在多种平台和操作系统上。Apache作为软件基金会支持的项目,其开发者社区完善而高效,自1995年发布至今,一直以高标准进行维护与开发。Apache音译为阿帕奇,源自美国西南部一个印第安人部落的名称(阿帕奇族)。
使用DockerHub镜像
DockerHub官方提供的Apache镜像,并不带PHP环境。如果需要PHP环境支持,可以选择PHP镜像(htps:/registry.hub.docker..com/_phpl/),并请使用含-apache标签的镜像,如7.0.7-apache。如果仅需要使用Apache运行静态HTML文件,则使用默认官方镜像即可。
编写Dockerfile文件
FROM httpd:2.4
COPY ./public-html /usr/local/apache2/htdocs/
创建对应的文件夹并创建一个index.html文件,然后构建镜像
运行构建的镜像
docker run -it --name myapache -p 80:80 apache2-image
可以直接直接运行 httpd:2.4通过映射的方式将文件挂载到容器中
同样也可以使用自定义的镜像构建镜像
Apache的相关资源如下:
Apache官网:httpd.apache.org/
Nginx
Nginx是一款功能强大的开源反向代理服务器,支持HTTP、HTTPS、SMTP、POP3、IMAP等协议。它也可以作为负载均衡器、HTTP缓存或Web服务器。
Nginx一开始就专注于高并发和高性能的应用场景。它使用类BSD开源协议,支持Linux、BSD、Mac、Solaris、AIX等类Unix系统,同时也有Windows上的移植版本。
特性如下:
- 热部署:采用master管理进程与worker工作进程的分离设计,支持热部署。在不间断服务的前提下,可以直接升级版本。也可以在不停止服务的情况下修改配置文件,更换日志文件等。
- 高并发连接:Ngx可以轻松支持超过100K的并发,理论上支持的并发连接上限取决于机器内存。
- 低内存消耗:在一般的情况下,10K个非活跃的HTTP Keep-Alivei连接在Nginx中仅消耗2.5MB的内存,这也是Nginx支持高并发连接的基础。
- 响应快:在正常的情况下,单次请求会得到更快的响应。在高峰期,Ngix可以比其他的Web服务器更快地响应请求。
- 高可靠性:Nginx是一个高可靠性的Web服务器,这也是用户为什么选择Nginx的基本条件,现在很多的网站都在使用Ngix,足以说明Nginx的可靠性。高可靠性来自其核心框架代码的优秀设计和实现。
使用dockerhub镜像
用户可以直接使用docker run指令直接运行官方的Nginx镜像
17286@LAPTOP-IV46MOMH ~ docker run -d -p 80:80 --name webServer nginx
3550280bb8d6f46ee7e36939adb8c7a916733903a2ecaa6439d6b05f132b5811
17286@LAPTOP-IV46MOMH ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3550280bb8d6 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp webServer
17286@LAPTOP-IV46MOMH ~
在1.9版本之后,镜像支持debug模式,镜像包含nginx-debug,可以支持丰富的log信息
使用Dockerfile来构建镜像
FROM nginx
COPY ./public/index /usr/share/nginx/html
开始构建镜像,并运行镜像
17286 F: study-docker master docker build -t my-nginx . 21:03:00 羽1.465s
[+] Building 0.2s (7/7) FINISHED docker:default
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 95B 0.0s
=> [internal] load metadata for docker.io/library/nginx:latest 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 704B 0.0s
=> CACHED [1/2] FROM docker.io/library/nginx 0.0s
=> [2/2] COPY ./public/index.html /usr/share/nginx/html 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:56d3d15b5c4988b83e30a133b6a677b9eaba86ddd8d1e98a5056ee36890f9167 0.0s
=> => naming to docker.io/library/my-nginx 0.0s
What's Next?
View summary of image vulnerabilities and recommendations → docker scout quickview
17286 F: study-docker master docker run --name nhhtml -d my-nginx 21:03:51 羽1.25s
48bc52b58a0e4738b9411192404a9bfe6d171f33125b30df40ce17c54bd11b03
17286 F: study-docker master docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48bc52b58a0e my-nginx "/docker-entrypoint.…" 6 seconds ago Up 4 seconds 80/tcp nhhtml
相关资源:
Nginx官网:www.nginx.com
Nginx官方仓库:github.com/nginx/.ngin…
Nginx官方镜像:hub.docker.com/nginx/
Nginx官方镜像仓库:github.com/nginxinc/do…
Tomcat
Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持。同时,它提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomeat阀等。由于Tomcat本身也内含了一个HTTP服务器,也可以当作单独的Wb服务器来使用。
Jetty
Jetty是一个优秀的开源servlet容器,以其高效、小巧、可嵌入式等优点深得人心,它为基于Java的Web内容(如JSP和servlet)提供运行环境。Jety基于Java语言编写,它的API以一组JAR包的形式发布。开发人员可以将Jy容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供Web服务。
与相对老牌的 Tomcat 比, Jetty 架构更合理,性能更优。尤其在启动速度上,让 Tomcat 望尘莫及。 Jetty 目前在国内外互联网企业中应用广泛。
Docker Hub 官方提供了 Jetty 镜像,直接运行docker run即可运行
LAMP
LAMP(Linux-Apache-MySQL-PHP)是目前流行的Web工具栈,其中包括:Linux操作系统,Apache网络服务器,MySQL数据库,Perl、PHP或者Python编程语言。其组成工具均是成熟的开源软件,被大量网站所采用。和Java/J2EE架构相比,LAMP具有Web资源丰富、轻量、快速开发等特点;和微软的.NET架构相比,LAMP更具有通用、跨平台、高性能、低价格的优势。因此LAMP技术栈得到了广泛的应用。
现在一般是使用nginx替代apache,称为LNMP或者LEMP
官方镜像
社区提供的linode/lamp和tutum/lamp
使用linode/lamp镜像
直接执行docker run
docker run -p 80:80 -t -i linode/lamp /bin/bash
在容器内启动apache以及mysql
17286@LAPTOP-IV46MOMH ~ docker run -p 80:80 -t -i linode/lamp /bin/bash
root@0feb67164da1:/# service apache2 start
* Starting web server apache2 *
root@0feb67164da1:/# service mysql start
* Starting MySQL database server mysqld [ OK ]
* Checking for tables which need an upgrade, are corrupt or were
not closed cleanly.
root@0feb67164da1:/#
使用tutum/lamp镜像
直接执行docker run
docker run -d -p 80:80 -p 3306:3306 tutum/lamp
容器启动成功之后,打开浏览器,访问页面
持续开发与管理
信息行业日新月异,如何响应不断变化的需求,快速适应和保证软件的质量?持续集成(Continuous Integration,CI)正是针对解决这类问题的一种开发实践,它倡导开发团队定期进行集成验证。集成通过自动化的构建来完成,包括自动编译、发布和测试,从而尽快地发现错误。
持续集成的特点包括:
- 鼓励自动化的周期性的过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,减少人工干预;
- 需要有持续集成系统的支持,包括代码托管机制支持,以及集成服务器等。
持续交付(Continuous Delivery,CD)则是经典的敏捷软件开发方法的自然延伸,它强调产品在修改后到部署上线的流程要敏捷化、自动化。甚至一些较小的改变也要尽早地部署
上线,这与传统软件在较大版本更新后才上线的思路不同。
Jenkins
Jenkins是一个得到广泛应用的持续集成和持续交付的工具。作为开源软件项目,它旨在提供一个开放易用的持续集成平台。Jenkins能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,并用图标的形式形象的展示项目的趋势和稳定性。
Jenkis自2.0版本推出了“Pipeline as Code”,帮助Jenkins实现对CI和CD更好的支持。通过Pipeline,将原本独立运行的多个任务连接起来,可以实现十分复杂的发布流程.
gitlab
GitLab是一款非常强大的开源源码管理系统。它支持基于Git的源码管理、代码评审、issue跟踪、活动管理、wiki页面、持续集成和测试等功能。基于GitLab,用户可以自己搭建一套类似于Github的开发协同平台。