【Docker江湖】之创建Web应用服务镜像——Apache/Nginx

简介:

写在前边的话

Web应用服务器的价格是真的贵,而且在一个web服务器上创建多个web应用也不是很方便,那么有没有好办法来解决这个问题,答案是肯定的,有了Docker那就可以在在一个服务器上创建多个docker容器了,每个容器启动一个web服务,这要管理起来也相对方便


Start Apache

1:创建一个apache-ubuntu的工作目录

mkdir apache-ubuntucd apache-ubuntu/vim Dockerfile123

在Docker中添加以下内容(thinkgamer/sshd_dockerfile:latest是在上一篇博客中创建的sshd镜像)

FROM thinkgamer/sshd_dockerfile:latest#设置继承自我们创建的sshd镜像#设置环境变量,所有操作都是非交互的ENV DEBIAN_FRONTEND noninteractive#安装RUN apt-get -yq install apache2 && rm -rf /var/lib/apt/lists/* RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata#注意这里要更改系统的时区,因为在web应用中经常会用到时区这个系统变量,默认的ubuntu会让你的应用程序发生不可思议的效果#添加我们的脚本,并设置权限,这会覆盖之前放在这个位置的脚本ADD run.sh /run.sh RUN chmod 755 /*.sh#添加一个示例的web站点,删除默认安装在apache文件夹下面的文件,并将我们添加的示例用软连接链接到/var/www/html目录下面RUN mkdir -p /var/lock/apache2 RUN rm -fr /var/www/html/* COPY sample/* /var/www/html/#设置Apache相关的一些变量,在容器启动的时候可以使用-e参数替代ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 ENV APACHE_PID_FILE /var/run/apache2.pid ENV APACHE_RUN_DIR /var/run/apache2 ENV APACHE_LOCK_DIR /var/lock/apache2 ENV APACHE_SERVERADMIN admin@localhostENV APACHE_SERVERNAME localhost ENV APACHE_SERVERALIAS docker.localhost ENV APACHE_DOCUMENTROOT /var/www EXPOSE 80WORKDIR / CMD ["/run.sh"]1234567891011121314151617181920212223242526272829303132333435363738

这里我们只做测试,所以sample的站点内容相对简单 
在apache-ubunt目录下,创建sample目录

mkdir samplecd samplevim index.html123

index.html内容为

<!DOCTYPE html><html><body><p> hello docker</p></body></html>12345678

在apache-ubuntu目录下创建执行

vim run.sh

添加以下内容

$cat run.sh#!/bin/bashexec apache2 -D FOREGROUND123

2:build镜像

在apache-ubuntu目录下执行

sudo docker build -t apache:ubuntu .

最终会输出类似下面这样的信息

Removing intermediate container 0933c4f11b73 Successfully built f244e1db152e12

查看我们build的镜像

sudo docker images

[redhat@localhost apache-ubuntu]$ sudo docker images [sudo] password for redhat: REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE apache                       ubuntu              821f09bee815        8 minutes ago       310.3 MB thinkgamer/sshd_dockerfile   latest              f530a7a43fd7        33 hours ago        220.6 MB thinkgamer/sshd_ubuntu       latest              cc0c1d242d82        34 hours ago        255 MB ubuntu                       latest              f753707788c5        2 weeks ago         127.1 MB1234567

3:测试镜像

运行镜像,并使用-p参数映射需要开放的端口(22和80端口)

[redhat@localhost apache-ubuntu]$ sudo docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                       NAMES8059064935c5        apache:ubuntu       "/bin/bash"         5 minutes ago       Up 5 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:10022->22/tcp   clever_yalow [redhat@localhost apache-ubuntu]$ sudo docker exec -it 80 /bin/bash root@8059064935c5:/# ./run.sh./run.sh: line 1: run.sh: command not foundAH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message12345678

在宿主机用curl抓取网页来验证刚才创建的sample站点

curl localhost

<!DOCTYPE html><html><body><p> hello docker</p></body></html>12345678

4:Docker创建的镜像拥有继承的特性

       需要说明的是在apache镜像的dockerfile中只用EXPOSE定义了对外开放的80端口,而在查看容器的时候,是映射两个端口:22和80 
       但是实际上,当尝试使用SSH登录到容器时,会发现无法登录,这是因为在run.sh中并未启动ssh服务,这说明在使用Dockerfile创建镜像时,会继承父镜像的开放端口,但却不会继承启动命令,因此,需要在run.sh脚本中添加启动sshd的服务的命令:

$ cat run.sh#!/bin/bash/usr/sbin/sshd &exec apache2 -D FOREGROUND1234

再次创建镜像

sudo docker build -t apache:ubuntu .

这次创建的镜像将会同时启动ssh和Apache服务

5:映射本地目录

可以通过映射本地目录的方式来指定容器内Apache服务相应的内容,这个时候只需要在启动命令中加入 -v参数即可

Start Nginx

1:创建nginx-ubuntu目录

mkdir nginx-ubuntu 
vim Dockerfile

#设置继承自己创建的sshd镜像FROM thinkgamer/sshd_dockerfile:latest#创建者的基本信息MAINTAINER http://blog.csdn.net/gamer_gyt#安装nginx,设置nginx以非daemon启动RUN apt-get install -y nginx && rm -rf /var/lib/apt/lists/*RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf && chown -R www-data:www-data /var/lib/nginxRUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata#注意这里要更改系统的时区,因为在web应用中会常用到时区这个系统变量,默认的ubuntu会让你的应用程序发送不可思议的效果#添加我们的脚本,并设置权限,这回覆盖之前放在这个位置的脚本ADD run.sh /run.shRUN chmod 755 /*.sh#定义可以被挂载的目录,分别是虚拟主机的挂载目录,证书目录,配置目录和日志目录VOLUME ["/etc/nginx/sites-enabled","/etc/nginx/certs","/etc/nginx/conf.d","/var/log/nginx"]#定义工作目录WORKDIR /etc/nginx#定义输出命令CMD ["/run.sh"]#定义输出端口EXPOSE 80EXPOSE 44312345678910111213141516171819202122232425262728

创建run.sh

$cat run.sh#!/bin/bash/usr/sbin/sshd & /usr/sbin/nginx1234

2:build镜像

sudo docker build -t thinkgamer/nginx:a2_u16

3:测试

启动并进入容器

[redhat@bogon nginx-ubuntu]$ sudo docker run -it -d -p 10022:22 -p 80:80 thinkgamer/nginx:a2_u16 /bin/bash074466a9a455ee581fcdd21f6195a4575eb7dbb9ee50aa341dd093ca369b2246 [redhat@bogon nginx-ubuntu]$ sudo docker psCONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS                                                NAMES074466a9a455        thinkgamer/nginx:a2_u16   "/bin/bash"         3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp, 443/tcp, 0.0.0.0:10022->22/tcp   silly_bartik [redhat@bogon nginx-ubuntu]$ sudo docker exec -it 07 /bin/bash123456

执行run.sh

/run.sh

web访问ip

0f6744c556481845ddf2f5c9d1b821f0.png



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

相关文章
|
8天前
|
数据采集 Web App开发 API
FastAPI与Selenium:打造高效的Web数据抓取服务 —— 采集Pixabay中的图片及相关信息
本文介绍了如何使用FastAPI和Selenium搭建RESTful接口,访问免版权图片网站Pixabay并采集图片及其描述信息。通过配置代理IP、User-Agent和Cookie,提高爬虫的稳定性和防封禁能力。环境依赖包括FastAPI、Uvicorn和Selenium等库。代码示例展示了完整的实现过程,涵盖代理设置、浏览器模拟及数据提取,并提供了详细的中文注释。适用于需要高效、稳定的Web数据抓取服务的开发者。
50 15
FastAPI与Selenium:打造高效的Web数据抓取服务 —— 采集Pixabay中的图片及相关信息
|
3天前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
24 7
|
19天前
|
Linux Docker 容器
Linux 中停止 Docker 服务报 warning 导致无法彻底停止问题如何解决?
在 Linux 系统中,停止 Docker 服务时遇到警告无法彻底停止的问题,可以通过系统管理工具停止服务、强制终止相关进程、检查系统资源和依赖关系、以及重置 Docker 环境来解决。通过以上步骤,能够有效地排查和解决 Docker 服务停止不彻底的问题,确保系统的稳定运行。
88 19
|
20天前
|
Dubbo 应用服务中间件 API
使用 Apifox、Postman 测试 Dubbo 服务,Apache Dubbo OpenAPI 即将发布
Apache Dubbo 3.3.3(即将发布)实现了与 OpenAPI 的深度集成,通过与 OpenAPI 的深度集成,用户能够体验到从文档生成到接口调试、测试和优化的全流程自动化支持。不论是减少手动工作量、提升开发效率,还是支持多语言和多环境,Dubbo 3.3.3 都展现了其对开发者体验的极大关注。结合强大的 Mock 数据生成和自动化测试能力,这一版本为开发者提供了极具竞争力的服务治理解决方案。如果你正在寻找高效、易用的微服务框架,Dubbo 3.3.3 将是你不容错过的选择。
|
3月前
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
106 1
|
3月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
3月前
|
负载均衡 前端开发 JavaScript
Nginx 代理多服务
以上是 Nginx 代理多服务的几种常见方式,在实际应用中,可以根据具体的业务需求和系统架构选择合适的代理方式,并结合其他 Nginx 的功能和配置来优化和完善系统的性能和功能。
|
3月前
|
Go UED
Go Web服务中如何优雅平滑重启?
在生产环境中,服务升级时如何确保不中断当前请求并应用新代码是一个挑战。本文介绍了如何使用 Go 语言的 `endless` 包实现服务的优雅重启,确保在不停止服务的情况下完成无缝升级。通过示例代码和测试步骤,详细展示了 `endless` 包的工作原理和实际应用。
76 3
|
3月前
|
JSON Go UED
Go Web服务中如何优雅关机?
在构建 Web 服务时,优雅关机是一个关键的技术点,它确保服务关闭时所有正在处理的请求都能顺利完成。本文通过一个简单的 Go 语言示例,展示了如何使用 Gin 框架实现优雅关机。通过捕获系统信号和使用 `http.Server` 的 `Shutdown` 方法,我们可以在服务关闭前等待所有请求处理完毕,从而提升用户体验,避免数据丢失或不一致。
46 1
|
3月前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。

热门文章

最新文章