在本系列的前三篇文章中,我们学习了如何在Ubuntu操作系统上安装Docker,并通过实战练习,了解到Docker与宿主操作系统文件目录相互隔离的实现原理,以及DockerVolume的工作原理。通过手动修改NginxDocker镜像,达到自定义其首页显示的目的。Docker实战教程从入门到精进(一)Docker实战教程从入门到精进(二)Docker实战教程从入门到精进(三)系列第三篇包含使用Dockerfile基于已有的Nginx镜像步骤制作一个Nginx支持SSL访问的Docker镜像。本文继续我们的Docker学习之旅。练习一:基于空镜像scratch从头创建新的Docker镜像当我们使用Dockerfile构建docker镜像时,一种方式是使用官方预配置的容器镜像。好处是我们不用从头开始构建,省了很多工作,但是付出的代价就是需要下载一个很大的镜像包。比如我机器上dockerimages返回的基于nginx的镜像,每个100多MB,一个简单的Ubuntu容器就有200多MB。如果安装相关软件,体积会更大。如果我们的需求是在构建符合我们实际业务需求的Docker镜像的前提下,保证镜像的体积尽可能小,那该怎么办呢?这个想法是使用一个空的图像划痕。新建文件夹,使用wget下载rootfs.tar.xz压缩包。wget-Orootfs.tar.xzhttps://github.com/debuerreot...这个将近30MB的压缩包是什么?解压后可以看到内容,里面包含了大部分操作系统的常用命令。wget-Onginx.confhttps://github.diablo.corp/ra...新建一个dockerfile文件,将下面的内容粘贴进去:FROMscratch#settheenvironmenttohonorSAP'sproxyserversENVhttp_proxyhttp://sap.corp:8080ENVhttps_proxyhttp://sap.corp:8080ENVno_proxy.sap.corp#给自己一些信用LABELmaintainer="JerryWang"#添加并解压一个包含Debian根文件系统的存档ADDrootfs.tar.xz/#使用apt-get包管理器安装nginx和wgetRUNapt-getupdate&&\apt-get-yinstallnginxwget#使用wget将自定义网站下载到镜像中RUNwget--no-check-certificate-O/usr/share/nginx/html/cheers.jpghttps://github.diablo.corp/raw/slvi/docker-k8s-training/master/docker/res/cheers.jpg&&\wget--no-check-certificate-O/usr/share/nginx/html/index.htmlhttps://github.diablo.corp/raw/slvi/docker-k8s-training/master/docker/res/cheers.html#复制自定义nginx配置到镜像中COPYnginx.conf/etc/nginx/nginx.conf#将nginx日志文件链接到Docker日志收集设施RUNln-sf/dev/stdout/var/log/nginx/access.log&&\ln-sf/dev/stderr/var/log/nginx/error.log#exposeport80-webservers的标准端口EXPOSE80#并确保在创建容器时运行nginxCMD["nginx","-g","daemonoff;"]执行构建镜像的命令:dockerbuild-tnginx-来自-scratch1.0。生成日志:终于看到镜像构建成功的信息了。基于这个名为nginx-from-scratch:localhost:1083的镜像启动一个新的nginx容器,看到主页,说明新建的镜像运行正常。练习2:删除所有正在运行和退出的Docker实例经过这一系列三篇文章的练习,我们一定在这台机器上创建了很多Docker实例,是时候清理它们了。dockerps-a可以显示所有docker实例的状态,包括已经退出的docker实例:添加-q参数只显示容器id。使用此命令将dockerps-aq生成的输入作为输入传递给dockerrm命令,以达到移除所有容器实例的效果。dockerrm$(dockerps-aq)练习3:在Docker容器中运行指定的web应用程序有很多方法可以实现题目中描述的需求。作为介绍,让我们从最简单的方法开始。首先确保当前没有使用命令dockerps运行的Docker实例。运行命令dockerrun-itnginx:然后我们再打开一个终端,使用dockerps命令查看正在运行的容器实例。Status的Up54seconds表示实例启动后已经过去了54秒。使用命令进入这个容器实例:dockerexec-itbbc5d48a761c/bin/sh进入后看到shell提示#,我们可以在nginx容器中执行一些常用的命令。/usr/share/nginx/html是web应用程序在nginx服务器中的存储位置。现在我们只需要找到一种方法将我们的Web应用程序放在这个文件夹中。问题是如何将这个web应用放到容器中对应的文件夹中。我使用dockervolume来实现docker和宿主机之间的数据共享。使用dockerstop停止原来的docker实例,然后启动一个新的实例。假设我下载了webapp文件夹到~目录下,然后使用如下命令行将webapp文件夹附加到nginx容器中的同名文件夹:dockerrun-d-p1081:80-vpwd/webapp:/usr/share/nginx/html/webapp--namejerry-customnginx最后使用urllocalhost:8081/webapp访问运行在Docker容器中的web应用。小结本文首先介绍如何在scratch空镜像的基础上创建一个新的Docker镜像,以减小最终镜像文件的大小。然后它展示了如何使用命令行删除所有正在运行和退出的Docker实例。最后,通过一个实际示例说明如何在Docker容器中运行已开发的Web应用程序。本系列前三篇文章链接:Docker实战教程从入门到精进(一)Docker实战教程从入门到精进(二)Docker实战教程从入门到精进(三)
