本次部署的容器类型为Linux。右击docker图标可以知道。
使用Hub中centos镜像、jdk包和tomcat包制作tomcat镜像
准备工作
打开powershell,下载centos,默认为最新版。
因为配置了镜像加速,所以下载很快。
PS C:\Users\liu> docker pull centos
在D盘建立dockertest目录并进入。
PS C:\Users\liu> cd D:
PS D:\> mkdir dockertest
PS D:\> cd .\dockertest\
建立一个说明文件与dockerfile文件,dockerfile文件是docker的精华之一。
PS D:\dockertest> new-item readme.txt
PS D:\dockertest> new-item Dockerfile
jdk下载地址:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html#license-lightbox
tomcat下载地址:
https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.50/
将下载的文件移到dockertest目录下。
编写Dockerfile
之所以将dockerfile文件命名为Dockerfile,是为了在build时,不用-f
指定文件,会自动找到Dockerfile,更方便一些。
用记事本打开Dockefile文件,输入:
FROM centos
MAINTAINER xuliu<liuxuecan@njust.edu.cn>
COPY readme.txt /usr/local/readmei.txt
ADD jdk-8u291-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.0.50.tar.gz /usr/local/
RUN yum -y install vim
RUN yum -y install net-tools
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_291
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.50
ENV CATALINA_BASH /usr/local/apache-tomcat-8.0.50
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.0.50/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.0.50/logs/catalina.out
命令解释:
RUN tar.gz时会自动解压缩到/usr/local。
FROM # 基础镜像,一切从这里开始构建 centos
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令,等同与在shell中输入的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包就说添加内容。
WORKDIR # 镜像的工作目录,可指定
VOLUME # 挂载的目录 -v
EXPOSE # 暴露端口配置 -p
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承的dockerfile,这个时候就会运行ONBUILD指令(触发指令)
COPY # 类似ADD命令,将我们文件拷贝到镜像中
ENY # 构建时设置环境变量,-e
建立镜像
PS D:\dockertest> docker build -t mytomcat .
注意最后面的.
查看镜像:
PS D:\dockertest> docker images REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat latest 7603ecae93c7 About a minute ago 657MB
centos latest 300e315adb2f 6 months ago 209MB
在软件中也能看到:
启动镜像,建立容器
docker run -d -p 9090:8080 --name xuliutomcat -v D:/dockertest/xuliu/build/tomcat/webapps:/usr/local/apache-tomcat-8.0.50/webapps -v D:/dockertest/xuliu/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-8.0.50/logs mytomcat
- -d: 后台运行
- -p: 宿主机端口与容器端口的映射
- -v: 挂载路径,宿主机路径:容器路径
查看建立的容器,发现正在运行:
PS D:\dockertest> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d24a7845535b mytomcat "/bin/sh -c '/usr/lo…" 3 minutes ago Up 3 minutes 0.0.0.0:9090->8080/tcp, :::9090->8080/tcp xuliutomcat
在软件中也能看到:
可以进入容器:
PS D:\dockertest> docker exec -it d24a7845535b /bin/bash
[root@d24a7845535b local]# ls
apache-tomcat-8.0.50 bin etc games include jdk1.8.0_291 lib lib64 libexec readmei.txt sbin share src
可见,默认路径为/usr/local,与Dockerfile文件设置一致。这实际上是一个精简版的centos。
查看容器内webapps文件夹:
[root@d24a7845535b local]# ls /usr/local/apache-tomcat-8.0.50/webapps/
[root@d24a7845535b local]#
发现为空,所以在浏览器中访问不到。
发布项目sample,测试tomcat
tomcat的例子下载地址https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/ 下载下来是一个war包:sample.war。
在启动镜像时,-v参数将宿主机与容器做了卷挂载:
-v D:/dockertest/xuliu/build/tomcat/webapps:/usr/local/apache-tomcat-8.0.50/webapps
-v D:/dockertest/xuliu/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-8.0.50/logs
一个是D:/dockertest/xuliu/build/tomcat/webapps
与/usr/local/apache-tomcat-8.0.50/webapps
对应。
一个是D:/dockertest/xuliu/build/tomcat/tomcatlogs/
与/usr/local/apache-tomcat-8.0.50/logs
对应。
因此将下载得到的sample.war放到D:/dockertest/xuliu/build/tomcat/webapps
中,同时也会出现在容器内。
查看容器内地址/usr/local/apache-tomcat-8.0.50/webapps
:
[root@d24a7845535b local]# ls /usr/local/apache-tomcat-8.0.50/webapps/
sample sample.war
其中文件夹sample是sample.war的解包。
此时宿主机:
重新进入浏览器,输入localhost:9090/sample/index.html
。
其中localhost也可写为本机的ip地址,可通过ipconfig
查看。
另一个卷挂载结果:
容器中:
宿主机中:
直接使用docker hub中的镜像
这是别人做好的镜像,类似我们之前做的镜像mytomcat
。
很简单,拿过来直接用就行。
下载镜像
运行镜像生成容器
docker run -it -v D:\dockertest\xuliu\build\tomcat\webapps\:/usr/local/tomcat/webapps -p 8080:8080 c43a65faae57
这里容器仍然挂载到D:\dockertest\xuliu\build\tomcat\webapps\
并指定端口映射。
进入容器
不要退出运行的容器,另外再打开一个powershell。
查看容器id
进入容器
测试
将sample.war移到宿主机目录:D:\dockertest\xuliu\build\tomcat\webapps\
,则该容器内:
此时浏览器可以访问了,部署完成了。