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

简介: 打开微信扫一扫,关注微信公众号【数据与算法联盟】 http://blog.csdn.net/gamer_gyt/article/details/52976232转载请注明出处:http://blog.

这里写图片描述
打开微信扫一扫,关注微信公众号【数据与算法联盟】
http://blog.csdn.net/gamer_gyt/article/details/52976232转载请注明出处: http://blog.csdn.net/gamer_gyt
博主微博: http://weibo.com/234654758
Github: https://github.com/thinkgamer


Docker江湖


写在前边的话

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


Start Apache

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

mkdir apache-ubuntu
cd apache-ubuntu/
vim Dockerfile

在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@localhost
ENV APACHE_SERVERNAME localhost
ENV APACHE_SERVERALIAS docker.localhost
ENV APACHE_DOCUMENTROOT /var/www

EXPOSE 80
WORKDIR /

CMD ["/run.sh"]

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

mkdir sample
cd sample
vim index.html

index.html内容为

<!DOCTYPE html>

<html>
<body>
<p> hello docker</p>
</body>
</html>

在apache-ubuntu目录下创建执行

vim run.sh

添加以下内容

$cat run.sh
#!/bin/bash
exec apache2 -D FOREGROUND

2:build镜像

在apache-ubuntu目录下执行

sudo docker build -t apache:ubuntu .

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

Removing intermediate container 0933c4f11b73
Successfully built f244e1db152e

查看我们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 MB

3:测试镜像

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

[redhat@localhost apache-ubuntu]$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                       NAMES
8059064935c5        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 found
AH00558: 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 message

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

curl localhost

<!DOCTYPE html>

<html>
<body>
<p> hello docker</p>
</body>
</html>

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 FOREGROUND

再次创建镜像

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/nginx
RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
#注意这里要更改系统的时区,因为在web应用中会常用到时区这个系统变量,默认的ubuntu会让你的应用程序发送不可思议的效果

#添加我们的脚本,并设置权限,这回覆盖之前放在这个位置的脚本
ADD run.sh /run.sh
RUN 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 80
EXPOSE 443

创建run.sh

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

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/bash
074466a9a455ee581fcdd21f6195a4575eb7dbb9ee50aa341dd093ca369b2246
[redhat@bogon nginx-ubuntu]$ sudo docker ps
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS                                                NAMES
074466a9a455        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/bash

执行run.sh

/run.sh

web访问ip

这里写图片描述

相关文章
|
9天前
|
存储 安全 持续交付
【Docker 专栏】Docker 镜像的版本控制与管理
【5月更文挑战第9天】本文探讨了Docker镜像版本控制与管理的重要性,包括可重复性、回滚能力、协作开发和持续集成。常用方法有标签、构建参数和版本控制系统。管理策略涉及定期清理、分层管理和镜像仓库。语义化标签、环境变量和配置文件在版本控制中有应用。版本系统与Docker结合能跟踪历史和促进协作。注意点包括优化镜像大小、确保安全性和兼容性。案例分析和未来趋势展示了持续发展的镜像管理技术,为Docker应用的稳定与进步保驾护航。
【Docker 专栏】Docker 镜像的版本控制与管理
|
1天前
|
缓存 Linux 开发工具
Ubantu docker学习笔记(二)拉取构建,属于你的镜像
Ubantu docker学习笔记(二)拉取构建,属于你的镜像
|
2天前
|
Java Maven Docker
Docker化Spring Boot3应用:从镜像构建到部署
本文介绍了如何在Linux上通过命令行构建和运行Spring Boot 3服务的Docker镜像。首先,基于Ubuntu创建包含JDK 21的基础镜像,然后使用Maven打包Spring Boot应用。接着,构建服务镜像,将应用和依赖添加到镜像中,并设置工作目录和暴露端口。最后,利用docker-compose部署服务,挂载宿主机目录以方便更新静态文件。Docker简化了应用部署,确保了不同环境的一致性。
37 2
Docker化Spring Boot3应用:从镜像构建到部署
|
7天前
|
存储 Linux Docker
CentOS7修改Docker容器和镜像默认存储位置
CentOS7修改Docker容器和镜像默认存储位置
|
9天前
|
存储 安全 开发者
如何删除 Docker 镜像、容器和卷?
【5月更文挑战第11天】
46 2
如何删除 Docker 镜像、容器和卷?
|
7天前
|
数据安全/隐私保护
那些酷炫的网页你也可以做到——第六篇,小型公司web开发
那些酷炫的网页你也可以做到——第六篇,小型公司web开发
|
8天前
|
存储 安全 前端开发
第五章 跨域资源共享(CORS):现代Web开发中的关键机制
第五章 跨域资源共享(CORS):现代Web开发中的关键机制
|
9天前
|
设计模式 开发框架 数据库
Python Web开发主要常用的框架
【5月更文挑战第12天】Python Web开发框架包括Django、Flask、Tornado和Pyramid。Django适用于复杂应用,提供ORM、模板引擎等全套功能;Flask轻量级,易于扩展,适合小型至中型项目;Tornado擅长处理高并发,支持异步和WebSockets;Pyramid灵活强大,可适配多种数据库和模板引擎,适用于各种规模项目。选择框架需依据项目需求和技术栈。
125 2
|
1天前
|
缓存 应用服务中间件 数据库
Python Web Service开发及优化
随着互联网的快速发展,Web服务已成为现代技术的核心。Python作为一种功能强大且易于学习的编程语言,在Web服务开发领域占据着重要地位。Python Web服务开发的重要性在于它能够提供高效、可扩展且易于维护的解决方案。本篇博客将探讨如何使用Python的Flask框架、Gunicorn WSGI服务器和Nginx网页服务器来实现高性能的Web服务。
|
4天前
|
存储 人工智能 前端开发
从前端到后端,探索Web开发的奥秘
Web开发是当今最热门的技术领域之一,涉及前端、后端、数据库等多个方面。本文将介绍Web开发的基本架构和技术要点,并深入探讨前后端交互、安全性等问题,帮助读者更好地理解Web开发的奥秘。