时间: 2019-10-02阅读: 190标签: DockerHello World
两天前小希和大家分享了《用容器定义 Java 虚拟化部署》,估计有些小伙伴早已按耐不住着急的心情了吧。今天希云就和大家分享在容器里部署 Java 应用的实战案例。
首先获取ngnix镜像(默认的是最新版)
Dockerfiles
docker pull nginx
Dockerfile 包含了一系列指令,告诉容器如何去构建一个镜像,它指定了镜像的基点,以及配置镜像的每个细节。以下是一个 Dockerfile 示例,是 CentOS 镜像的 Dockerfile 。
先来编写一个最简单的Dockerfile,一个Dockerfile修改该Nginx镜像的首页
代码清单 1. CentOS Dockerfile
Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节。
sh FROM scratch
1、新建文件夹/ngnix,在该目录下新建一个名为Dockerfile的文件,在里面增加如下内容:
MAINTAINER The CentOS Project <cloud-ops@centos.org> - ami_creator
#从本地的镜像仓库里拉取ngxin的docker镜像 FROM nginx #修改ngxin的docker镜像的首页内容RUN echo ‘Hello World‘ /usr/share/nginx/html/index.html
ADD centos-7-20150616_1752-docker.tar.xz /
2、在Dockerfile所在路径执行以下命令构建我们自己的ngxin镜像,构建完可用docker images命令查看
Volumes for systemd
docker build -t nginx:rogn.
VOLUME ["/run", "/tmp"]
其中,-t指定镜像名字,命令最后的点(.)表示Dockerfile文件所在路径
Environment for systemd
3、执行以下命令,即可使用该镜像启动一个 Docker容器
ENV container=docker
docker run -d -p 92:80 nginx:rogn
For systemd usage this changes to /usr/sbin/init
4、访问localhost:92就能看到"Hello World"
Keeping it as /bin/bash for compatibility with previous
一个网页
CMD ["/bin/bash"]
首先,获取源码:地址
大部分内容是注释,主要有四句命令:
在前面的基础上,修改Dockerfile,源码的文件结构如下,
``
将文件逐一COPY到/usr/share/nginx/html 文件夹下。
FROM scratch
:所有 Dockerfile
都要从一个基础镜像继承,在这个例子中,CentOS 镜像是继承于" scratch
"镜像,这个镜像是所有镜像的根。这个配置是固定的,表明了这个是容器的根镜像之一。
#从本地的镜像仓库里拉取ngxin的docker镜像FROM nginx #修改ngxin的docker镜像的首页内容#RUN echo ‘This is Rogn Nginx!!!‘ /usr/share/nginx/html/index.html COPY index.html /usr/share/nginx/html/index.html COPY home.html /usr/share/nginx/html/home.html COPY navigation.html /usr/share/nginx/html/navigation.html COPY css /usr/share/nginx/html/cssCOPY font /usr/share/nginx/html/fontCOPY images /usr/share/nginx/html/imagesCOPY js /usr/share/nginx/html/js
MAINTAINER ...
:MAINTAINER
指令指明了镜像的所有者,这个例子中所有者是
CentOS Project。
保存,重新构建镜像,启动容器(如果前面的未停止需先停止再启动)。
ADD centos...tar.xz
:ADD
指令告诉容器把指定文件上传到镜像中,如果文件是压缩过的,会把它解压到指定路径。这个例子中,容器会上传一个
CentOS 操作系统的 Gzip 包,并解压到系统的根目录。
CMD ["/bin/bash"]
:最后,CMD
指令告诉容器要执行什么命令,这个例子中,最后会进入
Bourne Again Shell (bash) 终端。
这个架构未必如你想象中那么简单,但我们接下来会慢慢学习它,其实它是非常有逻辑的。上边已经提过所有
Dockerfile 的根是 scratch
,接下来指定的是 debian:jessie
镜像,这个官方镜像是基于标准镜像构建的,容器不需要重复发明轮子,每次都创建一个新镜像了,只要基于一个稳定的镜像来继续构建新镜像即可,在这个例子中,
debian:jessie
是一个官方 Debian Linux 镜像,就像上边的 CentOS
一样,它只有三行指令。
代码清单 2. debian:jessie Dockerfile
sh FROM scratch
ADD rootfs.tar.xz /
CMD ["/bin/bash"]
在上图中我们还见到有安装两个额外的镜像,CURL 和 Source Code
Management,镜像buildpack-deps:jessie-curl
的Dockerfile 如清单 3 所示。
代码清单 3. buildpack-deps:jessie-curl Dockerfile
sh FROM debian:jessie
RUN apt-get update && apt-get install -y --no-install-recommends
ca-certificates
curl
wget
&& rm -rf /var/lib/apt/lists/*
这个 Dockerfile 中使用 apt-get
去安装 curl
和wget
,使这个镜像能从其他服务器下载软件。RUN
指令让Docker在运行的实例中执行具体的命令,这个例子中,它会更新所有库
(apt-get update
),然后执行 apt-get install
去安装 curl
和wget
。
buildpack-deps:jessie-scp
的 Dockerfile 如清单 4 所示。
代码清单 4. buildpack-deps:jessie-scp Dockerfile
sh FROM buildpack-deps:jessie-curl
RUN apt-get update && apt-get install -y --no-install-recommends
bzr
git
mercurial
openssh-client
subversion
10bet,&& rm -rf /var/lib/apt/lists/*
这个Dockerfile会安装源码管理工具,例如 Git,Mercurial,和 Subversion。
Java 的Dockerfile会更加复杂些,如清单 5 所示。
代码清单 5. Java Dockerfile
sh FROM buildpack-deps:jessie-scm
A few problems with compiling Java from source:
Oracle. Licensing prevents us from redistributing the official JDK.
Compiling OpenJDK also requires the JDK to be installed, and it gets
really hairy.
RUN apt-get update && apt-get install -y unzip && rm -rf /var/lib/apt/lists/*
RUN echo 'deb http://httpredir.debian.org/debian jessie-backports main' > /etc/apt/sources.list.d/jessie-backports.list
Default to UTF-8 file.encoding
ENV LANG C.UTF-8
ENV JAVA_VERSION 8u66
ENV JAVA_DEBIAN_VERSION 8u66-b01-1~bpo8+1
see https://bugs.debian.org/775775
and https://github.com/docker-libr ... 46872
ENV CA_CERTIFICATES_JAVA_VERSION 20140324
RUN set -x
&& apt-get update
&& apt-get install -y
openjdk-8-jdk="$JAVA_DEBIAN_VERSION"
ca-certificates-java="$CA_CERTIFICATES_JAVA_VERSION"
&& rm -rf /var/lib/apt/lists/*
see CA_CERTIFICATES_JAVA_VERSION notes above
RUN /var/lib/dpkg/info/ca-certificates-java.postinst configure
If you're reading this and have any feedback on how this image could be
improved, please open an issue or a pull request so we can discuss it!
简单来说,这个 Dockerfile 使用了安全参数去执行
apt-get install -y openjdk-8-jdk
去下载安装 Java,而 ENV
指令配置系统的环境变量。
最后,清单 6 是 Tomcat 的Dockerfile
代码清单 6. Tomcat Dockerfile
sh FROM java:7-jre
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME
see https://www.apache.org/dist/tomcat/tomcat-8/KEYS
RUN gpg --keyserver pool.sks-keyservers.net --recv-keys
05AB33110949707C93A279E3D3EFE6B686867BA6
07E48665A34DCAFAE522E5E6266191C37C037D42
47309207D818FFD8DCD3F83F1931D684307A10A5
541FBE7D8F78B25E055DDEE13C370389288584E7
61B832AC2F1C5A90F0F9B00A1C506407564C17A3
79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED
9BA44C2621385CB966EBA586F72C284D731FABEE
A27677289986DB50844682F8ACB77FC2E86E29AC
A9C5DF4D22E99998D9875A5110C01C5A2F6059E7
DCFD35E0BF8CA7344752DE8B6FB21E8933C60243
F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE
F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23
ENV TOMCAT_MAJOR 8
ENV TOMCAT_VERSION 8.0.26
ENV TOMCAT_TGZ_URL https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz
RUN set -x
&& curl -fSL "$TOMCAT_TGZ_URL" -o tomcat.tar.gz
&& curl -fSL "$TOMCAT_TGZ_URL.asc" -o tomcat.tar.gz.asc
&& gpg --verify tomcat.tar.gz.asc
&& tar -xvf tomcat.tar.gz --strip-components=1
&& rm bin/*.bat
&& rm tomcat.tar.gz*
EXPOSE 8080
CMD ["catalina.sh", "run"]
严格来说,Tomcat使用了Java
7的父级Dockerfile(默认的最新Java版本是8)。这个Dockerfile设置了CATALINA_HOME
和PATH
环境变量,然后用mkdir
命令新建了CATALINA_HOME
目录,WORKDIR
指令把当前工作路径更改为CATALINA_HOME
,然后RUN
指令执行了同一行中一系列的命令:
下载Tomcat压缩包。
下载文件校验码。
验证下载的文件正确。
解压Tomcat压缩包。
删除所有批处理文件(我们是在Linux上运行)。
删除压缩包文件。
把这些命令写在同一行,对应容器来说就是一条命令,最后容器会把执行的结果缓存起来,容器有个策略是检测镜像何时需要重建,以及验证构建过程中的指令是否正确。当一条指令会使镜像更改,容器会把每个步的结果缓存起来,容器能把最上一个正确指令产生的镜像启动起来。
EXPOSE
指令会让容器启动一个容器时暴露指定的端口,正如之前我们启动时那样,我们需要告诉容器哪个物理端口会被映射到容器上(-p
参数),EXPOSE
的作用就是这个定义容器端口。最后 Dockerfile 使用
catalina.sh 脚本启动 Tomcat。
简单回顾
用 Dockerfile 从头开始构建 Tomcat 是一个漫长的过程,我们总结一下目前为止的步骤:
安装 Debian Linux。
安装 curl 和 wget。
安装源码管理工具。
下载并安装 Java。
下载并安装Tomcat。
暴露容器实例的 8080 端口。
用 catalina.sh 启动 Tomcat。
本文由10bet发布于Web前端,转载请注明出处:Docker部署ngnix静态网站10bet
关键词: