本章会展示两种创建镜像的过程,其中一些操作比较简单的镜像使用Dockerfile来创建,而像Weblogic这样复杂的应用,则使用commit方式来创建,读者可根据自己的需求进行选择。
通过本章的介绍,用户操作可以根据自己需求轻松定制Web服务或应用镜像。
11.2 Apache
Apache 是一个高稳定性的、商业级别的开源Web服务器。目前Apache已经是巨世界使用排名第一的Web服务器软件。由于其良好的跨平台和安全性。Apache被广泛应用在多种平台和操作系统上。作为Apache软件基金会支持的项目,这的开发者社区完善而高效。自1995年发布至今,一直以高标准进行维护与开发。Apache名 称源自美国西南部一个印第安人部落:阿帕奇族,它支持类UNIX和Window系统。
编写Dockerfile文件,内容如下:
FROM httpd:2.4 COPY ./public-html /usr/local/apache2/htdocs/
创建项目目录public-html,并在此目录下创建index.html文件:
<!DOCTYPE html> <html> <body> <p>Hello,Docker!</p> </body> </html>
构建自定义镜像:
[root@localhost ~]# docker build -t apache2-image .
构建完成后,使用docker run指令运行镜像:
[root@localhost ~]# docker run -it --rm --name apahce-container -p 80:80 apache2-image
通过本地的80端口即可访问静态页面,如图11-1所示。
图11-1 Apache 运行界面
也可以不创建自定义镜像,直接通过映射目录方式运行Apache容器:
[root@localhost ~]# docker run -it --rm --name my-apache -p 8080:80 -v "$PWD"/public-html:/usr/local/apache2/htdocs httpd:2.4
2.使用自定义镜像
首先,创建一个apache_ubuntu工作目录,在其中创建Dockerfile文件、run.sh文件和sample目录:
[root@localhost ~]# mkdir apache_ubuntu && cd apache_ubuntu
[root@localhost apache_ubuntu]# touch Dockerfile run.sh
下面是Dockerfile的内容和各个部分的说明:
#设置继承用户创建的sshd镜像 FROM sshd:dockerfile #创建者基本信息 MAINTAINER [email protected] #设置环境变量,所有操作都是非交互的 ENV DEBIAN_FRONTEND noninteractive #安装 RUN apt-get -yq install apache2 && \ rm -rf /var/lib/apt/lists/* #注意这里要更改系统的时区设置,因为在web应用中经常会用到时区这个系统变量,默认的ubuntu会让你的应用程序发生不可思议的后果 RUN echo "Asia/Shanghai" > /etc/timezone && \ dpkg-reconfigure -f noninteractive tzdata #添加用户脚本,并设置权限,这会覆盖之前在这个位置的脚本 ADD run.sh /run.sh RUN chmod 755 /*.sh #添加一个示例的web站点,删掉默认安装在apahce文件下面文件,并将应用添加到示例中,用软链接到/var/www/html目录下面 RUN mkdir -p /var/lock/apache2 && mkdir -p /app && rm -rf /var/www/html && ln -s /app /var/www/html COPY sample/ /app #设置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 /app CMD ["run.sh"]
此sample站点的内容为输出Hello Docker!。然后在sample目录下创建inde.html,内容如下:
<!DOCTYPE html> <html> <body> <p>Hello,Docker!</p> </body> </html>
run.sh脚本内容也很简单,只是启动apache服务
#!/bin/bash exec apache2 -D FOREGROUND
此时,apache_ubuntu目录下面的文件结构为:
[root@localhost apache_ubuntu]# tree . . ├── Dockerfile ├── index.html ├── run.sh └── sample 1 directory, 3 files
下面,创建apache_ubuntu镜像:
#docker build -t apahce:ubuntu .
下面开始使用docker run指令测试镜像。可以使用-P参数映射需要开放的端口(22和80端口):
[root@localhost apache_ubuntu]# docker run -d -P apache:ubuntu 80f0b3f9d01bda0b96c019bee6a48b627a45979b3d26b8b840e1eaf38d72dd43 [root@localhost apache_ubuntu]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 80f0b3f9d01b apache:ubuntu "/run.sh" 7 seconds ago Up 4 seconds 0.0.0.0:32771->22/tcp, 0.0.0.0:32770->80/tcp stupefied_bose
在本地上使用curl抓取网页来验证刚才创建的sample站点
[root@localhost apache_ubuntu]# curl 127.0.0.1:32770 <!DOCTYPE html> <html> <body> <p>Hello,Docker!</p> </body> </html>
读者也可以在其他设备上通过访问宿主主机ip:32770来访问sample站点。
不知道有没有细心的读者发现,在apache镜像的Dockerfile中只用EXPOSE定义了对外开放的80端口,而在docker ps -a命令的返回中,却看到新启动的内容映射了两个端口:22和80。
但是实际上,当尝试使用SSH登录到容器时,会发现无法登录。这是因为在run.sh脚本中并未启动SSH服务。这说明在使用Dockerfile创建镜像时,会继承父镜像的开放端口,但却不会继承启动命令。因此,需要在run.sh脚本中添加启动sshd的服务
命令
#!/bin/bash /usr/bin/sshd & exec apache2 -D FOREGROUND
再次创建镜像:
[root@localhost apache_ubuntu]# docker build -t apache:ubuntu .
这次创建的镜像,将默认会同时启动SSH和Apache服务。
下面,来看看如何映射本地目录。可以通过映射本地目录的方式,来指定容器内Apache服务响应的内容,例如映射本地主机上当前目录下的www目录到容器的/var/www目录:
[root@localhost ~]# docker run -i -d -P -e APACHE_SERVERNAME=test -v `pwd`/www:/var/www/html apache:ubuntu
在当前目录内创建 www目录,并放上定义的页面index.html,内容如下:
<!DOCTYPE HTML> <HTML> <body> <h1>HI,DOcker</h1> <p>This is the first day I meet the new world</p> <p>Huw are you?</p> <hr> </body> </HTML>
在本地主机上可访问测试容器提供的Web服务,查看获取内容为新配置的index.html页面信息。
11.2 Nginx
1.使用官方镜像
用户可以使用docker run指令直接运行官方Nginx镜像 :
[root@localhost ~]# docker run -d -p 80:80 --name webserver nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx f2aa67a397c4: Pull complete 3c091c23e29d: Pull complete 4a99993b8636: Pull complete Digest: sha256:0fb320e2a1b1620b4905facb3447e3d84ad36da0b2c8aa8fe3a5a81d1187b884 Status: Downloaded newer image for nginx:latest 54214f78667d8f9a197de3244cb698329ef673ebd050ce0bced39f917602869f然后使用docker ps指令查看当前运行的docker ps 指令查看当前运行的内容:
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 54214f78667d nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp webserver
目前,Nginx容器已经在0.0.0.80启动,并映射了80端口,此时可以打开浏览器访问此地址,就可以看到Nginx输出的页面,如图11-2所示:
图11-2 访问Nginx服务
2.自定义Web界面
同样的,创建index.html文件,并将index.html文件挂载至容器中,即可看到显示自定义的页面。
[root@localhost ~]# docker run -i -d -P -v `pwd`/www:/usr/share/nginx/html nginx
另外,也可以使用Dockerfile来构建新镜像。Dockerfile内容如下:
FROM nginx COPY ./index.html /usr/share/nignx/html
[root@localhost nginx_dockerfile]# docker search tomcat | wc -l 26
开始构建镜像my-nginx:
[root@localhost nginx_dockerfile]# docker build -t my-nginx .
构建成功后执行docker run指令:
[root@localhost nginx_dockerfile]# docker run --name nginx-container -d my-nginx
11.3 Tomcat
Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Mircosystems提供的技术规范,实现了对Servlet和Java Server Page(JSP)的支持。同时,它提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。由于Tomcat本身也内含了一个HTTP服务器,也可以当作一个单独的Web服务器来使用。下面介绍如何定制Tomcat镜像。
首先,尝试的Docker Hubh 搜索已有的Tomcat相关镜像的个数:
[root@localhost nginx_dockerfile]# docker search tomcat | wc -l 26
下面能Tomcat 7.0 为例介绍定制Tomcat镜像的步骤。
1.准备工作
创建tomcat7.0_jdk1.6文件夹,从www.oracle.com网站上下载sun_jdk 1.6压缩包,解压为jdkd目录。
创建Dockerfile和run.sh文件;
[root@localhost ~]# mkdir tomcat7.0_jdk1.6 [root@localhost ~]# cd tomcat7.0_jdk1.6/ [root@localhost tomcat7.0_jdk1.6]# touch DOckerfiel run.sh [root@localhost tomcat7.0_jdk1.6]# ls DOckerfiel run.sh
下载Tomact,可以到官方网站下载最新版本,也可以直接使用下面链接中给出的版本
[root@localhost tomcat7.0_jdk1.6]# wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.88/bin/apache-tomcat-7.0.88.zip解压后,tomcat7.0_jdk1.6目录结构应如下所示(多余的压缩文件忆被删除)