Web服务与应用
- 10.1 Tomcat
- 10.1.1 准备工作
- 10.1.2 编写dockerfile
- 10.1.3 创建tomcat用户和密码脚本文件
- 10.1.4 编写启动脚本
- 10.1.5 创建和测试镜像
- 10.1.6 相关资源
- 10.2 Jetty
- 10.2.1 使用官方镜像
- 10.2.2 相关资料
- 10.3 LAMP
- 10.3.1 使用官方镜像
- 10.4 持续开发与管理
- 10.4.1 Jenkins及官方镜像
- 10.4.2 Gitlab及其官方镜像
- 10.4.3 相关资料
10.1 Tomcat
Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器, 按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServerPage (JSP)的支持。同时, 它提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 由于Tomcat本身也内含了一个HTTP服务器,也可以当作单独的Web服务器来使用。
下面将以sunjdk1.6、tomcat7.0、ubuntu18.04环境为例介绍如何定制Tomcat镜像。
10.1.1 准备工作
下载tomcat和jdk,并解压压缩包
[root@dbc-server-554 tomcat]# mkdir tomcat;cd tomcat
[root@dbc-server-554 tomcat]# wget https://mirror.bjtu.edu.cn/apache/tomcat/tomcat-8/v8.5.84/bin/apache-tomcat-8.5.84.zip
[root@dbc-server-554 tomcat]# unzip apache-tomcat-8.5.84.zip
[root@dbc-server-554 tomcat]# wget https://download.oracle.com/java/19/latest/jdk-19_linux-x64_bin.tar.gz
[root@dbc-server-554 tomcat]# tar -zxvf jdk-19_linux-x64_bin.tar.gz
[root@dbc-server-554 tomcat]# ll
total 196352
drwxr-xr-x 9 root root 220 Nov 16 13:34 apache-tomcat-8.5.84
-rw-r--r-- 1 root root 11141280 Nov 16 23:51 apache-tomcat-8.5.84.zip
-rw-r--r-- 1 root root 1339 Jan 17 15:24 create_tomcat_admin_user.sh
-rw-r--r-- 1 root root 1155 Jan 17 15:38 dockerfile
drwxr-xr-x 9 root root 136 Jan 17 11:50 jdk-19.0.1
-rw-r--r-- 1 root root 189905998 Oct 13 00:24 jdk-19_linux-x64_bin.tar.gz
-rw-r--r-- 1 root root 159 Jan 17 15:33 run.sh
10.1.2 编写dockerfile
[root@dbc-server-554 tomcat]# cat dockerfile
FROM sshd:dockerfile
#设置继承自用户创建的sshd镜像
MAINTAINER docker user (user@docker.com)
#下面是一些创建者的嘉本信息
#设置环境变屉,所有操作都是非交互式的
ENV DEBIAN FRONTEND noninteractive
RUN apt-get update && apt-get -y install tzdata
RUN echo "Asia/Shanghai"> /etc/timezone && \
dpkg-reconfigure -f noninteractive tzdata
#注意这里要更改系统的时区设置,因为在Web应用中经常会用到时区这个系统变量,默认ubuntu的设置会让你的应用程序发生不可思议的效果哦
#安装跟tomcat用户认证相关的软件
RUN apt-get install -yq --no-install-recommends wget pwgen ca-certificates && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
#设置tomcat的环境变值,若读者有其他的环境变量需要设置,也可以在这里添加
ENV CATALINA_HOME /tomcat
ENV JAVA_HOME /jdk
#复制tomcat和jdk文件到镜像中
ADD apache-tomcat-8.5.84 /tomcat
ADD jdk-19.0.1 /jdk
ADD create_tomcat_admin_user.sh /create_tomcat_admin_user.sh
ADD run.sh /run.sh
RUN chmod +x /*.sh
RUN chmod +x /tomcat/bin/*.sh
EXPOSE 8080
CMD ["/run.sh"]
10.1.3 创建tomcat用户和密码脚本文件
创建tomcat用户和密码脚本文件create_tomcat_admin_user.sh文件,内容为:
[root@dbc-server-554 tomcat]# cat create_tomcat_admin_user.sh
#!/bin/bash
if [ -f /.tomcat_admin_created]; then
echo "Tomcat 'admin' user already created"
exit 0
fi
#generate password
PASS=${TOMCAT_PASS:-$(pwgen -s 12 1)}
_word=$( [ ${TOMCAT_PASS} ] && echo "preset" || echo "random")
echo"=> Creating and admin user with a ${_word} password in Tomcat"
sed -i -r 's/<\/tomcat-users>//' ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-gui"/>'>> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-script"/>'>> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-jmx"/>'>> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="admin-gui"/>'>> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="admin-script"/>'>> ${CATALINA_HOME}/conf/tomcat-users.xml
echo "<user username=\"admin\" password=\"${PASS}\" roles=\"manager-gui,manager-script,manager-jmx,admin-gui,admin-script\"/>" >>${CATALINA_HOME}/conf/tomcat-users.xml
echo '</tomcat-users>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo"=> Done!"
touch /.tomcat_admin_created
echo "================================================================================"
echo "You can now configureto this Tomcat server using:"
echo ""
echo " admin:${PASS}"
echo ""
echo "================================================================================"
10.1.4 编写启动脚本
[root@dbc-server-554 tomcat]# cat run.sh
#!/bin/bash
if [ ! -f /.tomcat_admin_created ]; then
/create_tomcat_admin_user.sh
fi
/usr/sbin/sshd -D &
exec ${CATALINA_HOME}/bin/catalina.sh run
10.1.5 创建和测试镜像
[root@dbc-server-554 tomcat]# docker build -t tomcat8.5:jdk1.9 .
Sending build context to Docker daemon 550.1MB
Step 1/16 : FROM sshd:dockerfile
---> cae337d9b3f7
...
Successfully built 898f2593a0a9
Successfully tagged tomcat8.5:jdk1.9
[root@dbc-server-554 tomcat]# docker run -d -P tomcat8.5:jdk1.9
aaf7b89cf5c36ac2be1d708012459ed021aafff5420d241d38223a9993f5fb08
[root@dbc-server-554 tomcat]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aaf7b89cf5c3 tomcat8.5:jdk1.9 "/run.sh" 4 seconds ago Up 3 seconds 0.0.0.0:32833->22/tcp, :::32833->22/tcp, 0.0.0.0:32832->8080/tcp, :::32832->8080/tcp pensive_agnesi
[root@dbc-server-554 tomcat]# docker logs aaf
/create_tomcat_admin_user.sh: line 2: [: missing `]'
/create_tomcat_admin_user.sh: line 9: echo=> Creating and admin user with a random password in Tomcat: command not found
/create_tomcat_admin_user.sh: line 18: echo=> Done!: command not found
================================================================================
You can now configureto this Tomcat server using:
admin:sLxgdZ11fa0I
================================================================================
...
从docker logs
我们获取到密码,进行登录即可
10.1.6 相关资源
Tomcat官网:http://tomcat.apache.org/
Tomcat官方仓库:https://github.com/apache/tomcat
Tomcat官方镜像:https://hub.docker.com/_/tomcat/
Tomcat官方镜像仓库:https://github.com/docker-library/tomcat
10.2 Jetty
Jetty是一个优秀的开源servlet容器,以其高效、小巧、可嵌入式等优点深得人心,它为基于Java的Web内容(如JSP和servlet)提供运行环境。Jetty基于Java语言编写,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供Web服务。与相对老牌的Tomcat比,Jetty架构更合理,性能更优。尤其在启动速度上,让Tomcat望尘莫及。Jetty目前在国内外互联网企业中应用广泛。
10.2.1 使用官方镜像
Docker Hub官方提供了Jetty镜像,直接运行docker [container] run
指令即可:
[root@dbc-server-554 tomcat]# docker run -d jetty
Unable to find image 'jetty:latest' locally
latest: Pulling from library/jetty
...
a1012a570933: Pull complete
Digest: sha256:78d17c64b0b395fa86fdb1af5e070b98b7240fdb440beb17b7b1b083516d6881
Status: Downloaded newer image for jetty:latest
94db745896e9534b3a359f6f1da4d1abcab44369bfd5010e62b6ca967346f842
[root@dbc-server-554 tomcat]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94db745896e9 jetty "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 8080/tcp amazing_albattani
[root@dbc-server-554 tomcat]# docker stop 94
94
[root@dbc-server-554 tomcat]# docker run -d -P jetty
ab34c4077724d2d413b3d9af1d79261a972b93c32e45b2a257dcd742f723869e
[root@dbc-server-554 tomcat]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab34c4077724 jetty "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:32834->8080/tcp, :::32834->8080/tcp tender_dhawan
访问网页:
使用宿主机的浏览器访问32834端口,即可获得Jetty运行页面,由于当前没有内容,会提示错误信息
10.2.2 相关资料
Jetty官网:http://www.eclipse.org/jetty/
Jetty官方仓库:https://github.com/eclipse/jetty.project
Jetty官方镜像:https://hub.docker.com/_/jetty/
Jetty官方镜像仓库:https://github.com/appropriate/docker-jetty
10.3 LAMP
LAMP (Linux-Apache-MySQL-PHP
)是目前流行的Web工具栈,其中包括:Linux操作系统,Apache网络服务器,MySQL数据库,Perl、PHP或者Python编程语言。其组成工具均是成熟的开源软件,被大量网站所采用。和Java/J2EE架构相比,LAMP具有Web资源丰富、轻量、快速开发等特点;和微软的.NET架构相比,LAMP更具有通用、跨平台、高性能、低价格的优势。因此LAMP技术找得到了广泛的应用
注意:也有人用Nginx替换Apache,称为LNMP或LEMP,是十分类似的技术栈,并?不影响整个技术框架的选型原则
10.3.1 使用官方镜像
用户可以使用自定义Dockerfile或者Compose方式运行LAMP,同时社区也提供了十分成熟的镜像。
原书推荐的Iinode/lamp
和tutum/lamp
已7年未更新,所以此处使用较新的mattrayner/lamp
mattrayner/lamp docker hub链接
[root@dbc-server-554 tomcat]# docker search mattrayner/lamp
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mattrayner/lamp A simple LAMP docker image running the prere… 328 [OK]
[root@dbc-server-554 tomcat]# docker pull mattrayner/lamp:latest
[root@dbc-server-554 tomcat]# docker run -d -p 80:80 -p 33006:3306 mattrayner/lamp:latest
9ba77d1e0b8336fb2193281ae808157898b4190b3d13bea55f8f659ce75ed794
[root@dbc-server-554 tomcat]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9ba77d1e0b83 mattrayner/lamp:latest "/run.sh" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:33006->3306/tcp, :::33006->3306/tcp strange_galileo
后续可以部署自己的项目
10.4 持续开发与管理
信息行业日新月异,如何响应不断变化的需求,快速适应和保证软件的质量?持续集成( Continuous Integration , CI)正是针对解决这类问题的一种开发实践,它倡导开发团队定期进行集成验证。集成通过自动化的构建来完成,包括自动编译、发布和测试,从而尽快地发现错误。
持续集成的特点包括:
- 鼓励自动化的周期性的过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,减少人工干预;
- 需要有持续集成系统的支持,包括代码托管机制支持,以及集成服务器等
持续交付(Continuous Delivery, CD)则是经典的敏捷软件开发方法的自然延伸,它强调产品在修改后到部署上线的流程要敏捷化、自动化。甚至一些较小的改变也要尽早地部署上线,这与传统软件在较大版本更新后才上线的思路不同
10.4.1 Jenkins及官方镜像
Jenkins是一个得到广泛应用的持续集成和持续交付的工具。作为开源软件项目,它旨在提供一个开放易用的持续集成平台。Jenkins能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,并用图表的形式形象地展示项目构建的趋势和稳定性。Jenkins特点包括安装配置简单、支持详细的测试报表、分布式构建等。
Jenkis自2.0版本推出了“Pipelineas Code”,帮助Jenkins实现对CI和CD更好的支持。通过Pipeline,将原本独立运行的多个任务连接起来,可以实现十分复杂的发布流程
Jenkins官方在Docker Hub上提供了全功能的基于官方发布版的Docker镜像。可以方便地使用docker [container] run
指令一键部署Jenkins服务:
$docker run -p 8080:8080 -p 50000:50000 jenkins
Running from: /usr/share/jenkins/jenkins.war webroot: EnvVars.masterEnvVars.get(”JENKINS_ HOME") Jun 07, 2016 8 :14:26 AM winstone Logger loginternal INFO: Begi口ningextraction from war file
Jenkins容器启动成功后,可以打开浏览器访问8080端口,查看Jenkins管理界面
目前运行的容器中,数据会存储在工作目录/var/jenkins_home
中,这包括Jenkins中所有的数据,如插件和配置信息等。如果需要数据持久化,读者可以使用数据卷机制
docker run -p 8080:8080 -p 50000:50000 -v /your/home:/var/jenkins_home jenkins
以上指令会将Jenkins数据存储于宿主机的/your/home
目录(需要确保/your/home
目录对于容器内的Jenkins用户是可访问的)下。当然也可以使用数据卷容器:
docker run --name myjenkins - p 8080:8080 -p 50000:50000 -v /var/jenkins_home jenkins
关于更多的jenkins配置及使用,笔者会在后续推出的专栏中详细介绍
10.4.2 Gitlab及其官方镜像
GitLab是一款非常强大的开源源码管理系统。它支持基于Git的源码管理、代码评审、issue跟踪、活动管理、wiki页面、持续集成和测试等功能。基于GitLab,用户可以自己搭建一套类似于Github的开发协同平台。
GitLab官方提供了社区版本(GitLab CE)的DockerHub镜像,可以直接使用docker run
指令运行:
docker run --detach \
--hostname gitlab.example com \
--publish443:443 publish 80:80 --publish 23:23 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gi t lab \
--volume /srv/gitlab/data:/var/opt/gitlab\
gitlab/gitlab-ce:latest
成功运行镜像后,可以打开浏览器访问GitLab服务管理界面
10.4.3 相关资料
Jenkins官网:https://jenkins.io/
Jenkins官方仓库:https://github.com/jenkinsci/jenkins/
Jenkins官方镜像:https://hub.docker.com/jenkinsci/jenkins/
Jenkins官方镜像仓库:https://github.com/jenkinsci/docker
GitLab官网:https://github.com/gitlabhq/gitlabhq
GitLab官方镜像:https://hub.docker.com/r/gitlab/gitlab-ce/