玩转Docker实战篇!使用Docker搭建Nginx静态网站,附加介绍Docker容器数据卷

news/2024/5/10 20:38:57/文章来源:https://dongshao.blog.csdn.net/article/details/107397371

一、文本目的

  • 前面学完了Docker的一些常用语法,现在来开始将Docker用于构建和测试
  • 将Docker作为本地Web开发环境是Docker的一个最简单的应用场景。这样的环境可以完全复制生产环境,并确保用户开发的东西在生产环境中也能运行。下面从将Nginx Web服务器安装到容器来架构一个简单的网站开始,这个网站的名字暂时命名为sample

本文的代码、文件链接

  • 下载方式1:公众号【多栖技术控小董】回复【3672】获取免费下载链接。
  • 下载方式2:Github链接https://github.com/dongyusheng/csdn-code/tree/master/Docker/sample。进入之后,目录存储了文本用到的所有文件

二、创建相关文件

  • 首先在根目录下创建一个sample目录,用来存放本次镜像构建的上下文
mkdir ~/sample

创建Dockerfile文件

  • 进入sample目录,在该目录内建立一个Dockerfile文件,用于后面构建镜像
cd ~/sampletouch Dockerfile

  • Dockerfile文件的内容如下:
    • FROM指令:表示要构建的镜像蓝本,此处以ubuntu:16.04为例开始构建新的镜像
    • MAINTAINER指令:指定该镜像的作者与邮箱
    • ENV指令:为了重新构建缓存,详情请参阅前文的“基于构建缓存的Dockerfile模板”专题:https://blog.csdn.net/qq_41453285/article/details/107389320
    • 第1条RUN指令:更新软件包,并安装Nginx
    • 第2条RUN指令:创建一个目录,作为Nginx服务器的根目录
    • 第1条ADD指令:将宿主机的当前路径下的nginx/global.conf文件(这个文件我们在下面创建,见下面)复制到镜像的/etc/nginx/conf.d/目录
    • 第2条ADD指令:将宿主机的当前路径下的nginx.conf文件复制到镜像的/etc/nginx/nginx.d/目录下,名为nginx.conf
    • EXPOSE指令:公开镜像的80端口
FROM ubuntu:16.04
MAINTAINER dongyusheng "1286550014@qq.com"
ENV PEFRESHED_AT 2020-07-17RUN apt-get -yqq update && apt-get -yqq install nginx
RUN mkdir -p /var/www/html/website# 一个指定目录, 一个指定存放目录和文件名, 没什么区别
ADD nginx/global.conf /etc/nginx/conf.d/
ADD nginx/nginx.conf /etc/nginx/nginx.confEXPOSE 80

创建Nginx配置文件

  • 在sample目录内创建一个nginx目录,然后在nginx目录内创建两个配置文件,分别名为global.conf和nginx.conf
mkdir nginxtouch nginx/global.conftouch nginx/nginx.confls nginx

  • global.conf的内容如下:
server {# nginx监听在80端口上listen 0.0.0.0:80;server_name _;# nginx网站的根路径root /var/www/html/website;index index.html index.htm;access_log /var/log/nginx/deafulr_access.log;error_log  /var/log/nginx/deafulr_error.log;
}

  • nginx.conf的内容如下:
user www-data;
worker_processes 4;
pid /run/nginx.pid;
daemon off;events {  }http {sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;types_hash_max_size 2048;include /etc/nginx/mime.types;default_type application/octet-stream;access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;gzip on;gzip_disable "msie6";include /etc/nginx/conf.d/*.conf;
}

  • 为什么此处要让nginx在容器中以非守护进程模式运行,原因如下:
    • 默认的情况下,Nginx会以守护进程的方式启动
    • 在下面“docker run”运行容器的时候,我们让容器去运行Nginx,如果Nginx是以守护进程运行的,那么当容器将Nginx以守护进程运行之后,容器就认为自己的任务完成了,于是就关闭自己这个进程,此时容器就停止运行了,Nginx也跟着关闭
    • 因此,我们将Nginx运行在容器的前台,这使得容器一直保持有任务可执行的状态,从而容器不会关闭

创建网页文件

  • 在sample目录下创建一个website目录用来存放网页,网页名为index.html
mkdir websitetouch website/index.htmlls website

  • index.html内容如下:
<head><title>Test website</title></head><body><h1>This is a test website</h1></body>

  • 现在整个sample目录的内容如下:

三、构建镜像

  • 上面的Dockerfile创建好之后,在sample目录内,输入“docker build”来构建镜像了。命令如下:
# 构建镜像, 镜像名为dongshao/nginx
sudo docker build -t dongshao/nginx .

  • 创建完成之后,可以使用下面的命令查看该镜像的构建历史。命令如下:
sudo docker history dongshao/nginx

  • 输入下面命令查看创建好的镜像:
sudo docker images dongshao/nginx

四、创建/运行容器

  • 上面的镜像构建好之后,可以利用该镜像来创建一个容器。命令如下:
    • -d:让容器不在前台运行,在宿主机中以守护进程的模式运行
    • -p:将容器的80端口映射到宿主机的任意端口上
    • --name:将容器的名字取名为website
    • -v:将宿主机的目录作为卷,挂在到容器中。此处我们把宿主机的“$PWD/website”目录挂在到容器的“/var/www/html/website”目录,在上面的global.conf配置文件中,我们将“/var/www/html/website”作为Nginx网页的根目录(关于“卷”,详情见下面介绍)
    • dongshao/nginx:指定镜像,为我们上面创建的镜像
    • nginx:这是一条命令,让容器执行该命令来运行Nginx,Nginx会默认以上面的nginx.conf为配置文件启动
sudo docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website dongshao/nginx nginx

  • 现在我们可以通过下面的命令查看运行的容器,命令如下,可以看到容器的80端口映射到宿主机的32769端口上:
sudo docker ps -l
  • 通过浏览器访问,成功: 

运行的原理

  • 在上面docker run运行容器时,我们把宿主机的"$PWD/website"目录挂在到容器的“/var/www/html/website”目录
  • 在镜像中,Nginx的global.conf配置文件中使用“/var/www/html/website”作为Nginx网页的根目录
  • 当我们通过网页去访问容器中的Nginx时,其会去访问容器中/var/www/html/website目录下的index.html文件,而我们把宿主机的"$PWD/website"目录挂在到容器的“/var/www/html/website”目录,所以访问的就是宿主机"$PWD/website"目录下的index.html文件
  • 所以结果最终如下所示

五、附加知识:卷

  • 卷在Docker里非常重要,也很有用
  • 卷是在一个或多个容器内被选定的目录,可以绕过分层的联合文件系统(Union File System),为Docker提供持久数据或者共享数据提供几个有用的特性:
    • 卷可以在容器间共享和重用
    • 共享卷时不一定要运行相应的容器
    • 对卷的修改会直接在卷上反映出来
    • 更新镜像时不会包含对卷的修改
  • 这意味着对卷的修改会直接生效,并绕过镜像。当提交或者创建镜像时,卷不会被包含在镜像里
  • 利用卷,可以在不用提交镜像修改的情况下,向镜像里加入数据(如源代码、数据或者其他内容),并且可以在容器间共享这些数据

查看卷

  • 卷在Docker宿主机的/var/lib/docker/volumes目录下,每个容器的卷目录都会对应一个目录
sudo ls -l /var/lib/docker/volumes

  • 还可以通过docker inspect命令查看某个容器使用的卷的目录。例如,下面的sample_app有一个卷,我们查看其卷所在的位置
sudo docker inspect -f "{{ range.Mounts }} {{ . }} {{ end }}" sample_app

  • 可以看到返回的目录名为“0f15606bad9162f64e392bb20b3302f2c2ad890617777e2d9ae2ba9aa0c807bd”,查看该目录会有一个_data目录,该目录下就有该容器卷中存在的文件的内容
sudo ls -l /var/lib/docker/volumes/0f15606bad9162f64e392bb20b3302f2c2ad890617777e2d9ae2ba9aa0c807bd

提示

  • 在DoCKER 1.9中,卷功能已经得到扩展,能通过插件的方式支持第三方存储系统,如Ceph、Flocker和EMC等。可以在卷插件文档(https://docs.docker.com/engine/extend/plugins_volume/)和Docker valume create命令文档(https://docs.docker.com/engine/reference/commandline/volume_create/)中获得更详细的解释

提示

  • 卷可以在容器间共享
  • 即便容器被删除了,卷的内容依旧在宿主机汇总存在,因为一般卷的内容都存放在宿主机中
  • 在上面的例子中,我们因为某些原因不想把应用或者代码构建到镜像中,就可以利用卷。例如:
    • 希望同时对代码做开发和测试
    • 代码改动很频繁,不想在开发过程中重构镜像
    • 希望在多个容器间共享代码

"docker run"的-v选项

  • 上面演示案例用到了"-v"选项
  • 通过指定一个目录或者登上与容器上与该目录分离的本地宿主机来工作
  • 两个目录用“:”隔离,前面的目录表示宿主机的目录,后面的目录为容器的目录。如果容器目录不存在,Docker会自动创建一个

rw、ro标志

  • 如果想要指定容器内目录的读写状态,可以用这两个标志来指示。例如:
# 我们指定了ro, 此时容器的/var/www/html/website目录变为只读状态
sudo docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website:ro dongshao/nginx nginx

"docker run"的--volumes-from选项

  • 该选项使一个容器的目录挂载到另一个容器中
  • 演示案例可参阅:https://blog.csdn.net/qq_41453285/article/details/107609836

容器卷的备份

  • 演示案例可参阅:https://blog.csdn.net/qq_41453285/article/details/107609836

Dockerfile的VOLUME指令 

  • 用来向基于镜像创建的容器添加卷,可参阅Dockerfile指令: https://blog.csdn.net/qq_41453285/article/details/107389320

六、修改测试

  • 有了“卷”的好处之后,我们现在可以在不修改镜像的情况下,修改宿主机中的网页文件来改变网页的内容
  • 例如,下面将smaple/wensite/目录下的index.html文件修改为下面的内容:
vim website/index.html

  • 重新访问或刷新网页,可以看到内容改变

总结

  • 现在sample网页已经更新了,可以看到这个操作是非简单,也十分符合生产环境里的真实状态
  • 你可以模仿本文做法,给每个用于生产的网页服务环境(如Apache、Nginx)配置一个容器,给不同开发框架的运行环境(如PHP或者Ruby on Rails)配置一个容器,或者给后端数据库配置一个容器,等等。

  • 我是小董,V公众点击"笔记白嫖"解锁更多【Docker】资料内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_774271.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转Docker实战篇!使用Docker构建Apache+Jekyll博客网站,附加介绍卷的备份

一、本文目的 本文新增的Docker知识点有&#xff1a; Dockerfile中VOLUME指令的使用Dockerfile中WORKDIR指令的使用docker run中--volumes-from选项的使用&#xff1a;使一个容器的目录挂载到另一个容器中docker run中--rm选项的使用&#xff1a;容器只运行一次&#xff0c;随…

上传JSPX文件绕过网站后缀名检查

这几天在做渗透测试的时候&#xff0c;发现一个有趣的东西。目标有上传漏洞&#xff0c;但是无论如何都没法让webshell执行。访问任何jsp文件都跳到登录的地 方&#xff0c;然后尝试过变换jsp的大小写&#xff0c;虽然不跳了&#xff0c;但是直接不解析&#xff0c;利用apache的…

方舟服务器租贷网站,方舟租云服务器

方舟租云服务器 内容精选换一换锁定弹性云服务器。租户可以锁定自己的弹性云服务器&#xff0c;不能锁定其他租户的云服务器。弹性云服务器被锁定后&#xff0c;租户将不能再对云服务器执行管理操作。POST /v2.1/{project_id}/servers/{server_id}/action参数说明请参见表1。参…

网站报红怎么解决?驰网科技

网站报红有分2种情况&#xff0c;第一种就是微信在手机端打开显示“已停止访问该网页”&#xff0c;另一种则是QQ网站报红&#xff1f;一开始域名都是没有问题的呀 网站报红可能是因为有用户投诉&#xff0c;也有可能存在同行竞争&#xff0c;遇到这种情况应该如何处理呢&…

Windows server 用IIS搭建网站详细教程

IIS搭建网站教程Windows 2003Windows 2008通常开通服务器后&#xff0c;需要进行 网站搭建&#xff0c;下面是win03、win08系统的操作方法网站搭建前需要将 域名解析到搭建的本机服务器ip&#xff0c;在哪里搞的域名就在哪里解析&#xff0c;备案域名需要联系机房售后运维进行过…

记用Linux服务器搭建WordPress网站教程,今天又是学习的一天

由于没有编程基础&#xff0c;学起来比较慢&#xff0c;但是在学习过程中也有了收获&#xff0c;通过CSDN平台&#xff0c;将我第一次用Linux服务器搭建WordPress网站的步骤记下来&#xff0c;方便日后重温 在搭建网站之前需要先准备好服务器、备案域名&#xff0c;Linux服务器…

如何在自己的网站上添加HTML悬浮音乐播放器?

为了美化网站&#xff0c;我在网站上面添加了一个HTML悬浮音乐播放器&#xff0c;先来看看一下效果图。 如何在自己的网站上添加HTML悬浮音乐播放器呢&#xff1f;今天和你们分享 首先申明三点&#xff1a; 1、本播放器实际上是调用网易音乐云的音乐进行播放&#xff0c;音乐版…

Windows服务器禁ping怎么打开?服务器禁ping有什么用?对网站的影响

一般企业为了安全对服务器都是设置禁止ping命令的&#xff0c;这样可以有效避免ping攻击和扫描&#xff0c;降低服务器被这类攻击的风险&#xff0c;那么服务器禁止Ping如何设置呢&#xff1f;今天飞飞给大家分享下禁ping的设置方法 1、在电脑桌面使用快捷键winR弹出运行窗口&…

服务器内网可以打开外网打不开怎么办?网站搭建后打不开怎么办?

服务器内网可以打开外网打不开怎么办&#xff1f;服务器大本营——技术文章内容集合站发车啦&#xff01; 开服或是做网站建设的朋友在搭建网站的时候有遇到搭建网站后打不开的情况吗&#xff1f;相信应该有挺多新手小白是会遇到的&#xff0c;今天我给大家分享一下搭建网站打…

Service unavailable是什么意思?是网站有问题吗?怎么解决?

Service unavailable是什么意思&#xff1f;1、 web服务器正在重启2、 IIS连接数不够3、 超出系统分配CPU资源4、 网站程序有问题导致web服务应用程序池被系统自动禁用服务器大本营——技术文章内容集合站发车啦&#xff01; 不知道大家有没有遇到过网站提示&#xff1a;Servi…

title: 010 - Hexo配置SEO优化

title: 010 - Hexo配置SEO优化 date: 2020-04-01 23:31:42 tags: [Hexo,建站] categories: [建站] 进行SEO优化前&#xff0c;最好设置下永久链接&#xff0c;具体可以查看上一片。或者直接进入http://your 安装插件 一个是传统sitemap&#xff0c;可以适用Google搜索引擎&…

java服务器并发测试_如何测试一个网站的性能(并发数)?

JMeter网站并发性测试Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java小服务程序、CGI脚本、Java 对象、数据库&#xff0c…

python刷题网站_五个编程刷题网站,让你强大到没朋友!

力扣 (LeetCode) 官网 - 全球极客挚爱的技术成长平台​leetcode-cn.com据不完全统计&#xff0c;这上面可以刷的题能绕地球三圈&#xff0c;谁用谁知道。 Tech Recruiting Platform, Online Code Testing - Codility​www.codility.comCodility是一家著名的国外刷题网站&#x…

复制网站部分内容_网站内容防止抄袭的方法

今天我们来讲一下wordpress网站 文章禁止复制方法 。说到网站的原创文章&#xff0c;很多同学对其都是又爱又恨&#xff0c;原创文章要不停的想新思路新话题&#xff0c;还要写的充分富有可读性&#xff0c;最怕的还是辛辛苦苦的发布了原创文章结果被同行的竞争对手轻轻松松的就…

java网站创意_20+个创意十足的斜线网站设计

大多数传统的网页都是直愣愣的竖直水平的设计。不过现在&#xff0c;斜线网页设计与视差滚动设计(译者注&#xff1a;一种特殊的网页形式呈现形式&#xff0c;其基础原理是让多层背景以不同的速度搬动&#xff0c;形成立体的感觉&#xff0c;带来卓越的视觉体验)正在挑战这一传…

css中橙色,css实现适用于团购网站的橙色导航菜单代码

本文实例讲述了css实现适用于团购网站的橙色导航菜单代码。分享给大家供大家参考。具体如下&#xff1a;这是一款橙色风格的CSS菜单&#xff0c;没有使用Javascript技术&#xff0c;完全CSS代码实现&#xff0c;当初主要是想用在团购网站上&#xff0c;大家修改一下&#xff0c…

如何判断html数据是不是主页,[访问深度]网站“页面的访问深度”知道是什么吗?...

我们在触碰SEO提升中&#xff0c;对一个网站开展总流量评定&#xff0c;就需要采用lp和pv2个数据信息指标值。这就是我们常说的网址访问深度。下边给大伙儿详细介绍下网页页面访问深度地的必要性和常见问题。“网页页面访问深度”对 SEO 很重要这是为什么呢?简易了解&#xff…

怎么查网站服务器空间大小,如何查看服务器可用内存大小

如何查看服务器可用内存大小 内容精选换一换弹性云服务器创建成功后&#xff0c;使用free -m命令查询内存大小&#xff0c;查询结果与实际配置不符&#xff0c;较之创建时的配置要小一些。示例&#xff1a;假设创建该弹性云服务器时&#xff0c;配置的实际内存大小为4194304KB(…

2017年最受欢迎的编程难题网站集合,这些资源你一定要get!

源 | 程序猿 编译 | 猿妹 编程几乎已经成为了人类所知每个行业的必要组成部分&#xff0c;如今有越来越多的人开始了他们的编程之旅。 如果你正在在学习编程&#xff0c;那么我可以告诉你一个提高技能的好方法&#xff0c;那就是敢于去解决编码过程中遇到的难题。解决不同类…

大数据和AI领域最实用且绝不能错过的10大网站

随着人工智能和大数据技术的快速发展&#xff0c;相关的技术知识也普及开来。如何在众多网站中寻找最有价值的知识信息&#xff1f;如何在最短的时间内获得最新的所需技术资讯?哪里有最权威的技术知识和经验&#xff1f;本文整理出人工智能和大数据相关领域最实用、质量最高的…