Centos7 docker基础6-Dockerfile
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像
Dockerfile 由一行行命令语句组成,并且支持以#开头的注释
Dockerfile 一般分为四部分:
- 基础镜像信息
- 维护者信息
- 镜像操指令
- 容器启动执行指令
简单例子:
新建一个“simple_Dockerfile”目录,下面放Dockerfile文件与一个temp.tar.gz文件
[root@centos7 simple_Dockerfile]# ll
总用量 12
-rw-r--r-- 1 root root 1918 7月 1 18:30 11更换域名公告.html #这个temp.tar.gz的内容
-rw-r--r-- 1 root root 244 7月 22 08:55 Dockerfile
-rw-r--r-- 1 root root 1132 7月 22 08:55 temp.tar.gz
Dockerfile内容如下
FROM ubuntu
MAINTAINER vector4wang xxxx@qq.com
WORKDIR /usr/local/docker
ADD temp.tar.gz ./add/
COPY temp.tar.gz ./copy/
EXPOSE 22
RUN groupadd -r vector4wang && useradd -r -g vector4wang vector4wang
#USER 切换用户
USER vector4wang
ENTRYPOINT ["/bin/bash"]
开始构建: docker build -t docker/simple .
#-t docker/simple 设置tag
#. 最后一点表示当前目录
运行结果:
[root@centos7 simple_Dockerfile]# docker build -t docker/simple .
Sending build context to Docker daemon 7.68 kB
Step 1/9 : FROM ubuntu
---> 4c108a37151f
Step 2/9 : MAINTAINER vector4wang xxxx@qq.com
---> Using cache
---> 23b5384b6a7c
Step 3/9 : WORKDIR /usr/local/docker
---> Using cache
---> e5bf240e4584
Step 4/9 : ADD temp.tar.gz ./add/
---> 27a3a2c66608
Removing intermediate container e02486f557ab
Step 5/9 : COPY temp.tar.gz ./copy/
---> 09d9e65e06c1
Removing intermediate container 7642555ce325
Step 6/9 : EXPOSE 22
---> Running in f02fb012c2c6
---> 53aa5253d4f6
Removing intermediate container f02fb012c2c6
Step 7/9 : RUN groupadd -r vector4wang && useradd -r -g vector4wang vector4wang
---> Running in 0f80f819c4b0
---> 58b2f283140a
Removing intermediate container 0f80f819c4b0
Step 8/9 : USER vector4wang
---> Running in 9d740c1880ef
---> 79fa54b4a6ce
Removing intermediate container 9d740c1880ef
Step 9/9 : ENTRYPOINT /bin/bash
---> Running in 7bf38f7a0bdf
---> b4869dbea5b2
Removing intermediate container 7bf38f7a0bdf
Successfully built b4869dbea5b2
查看生成的镜像
[root@centos7 simple_Dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker/simple latest b4869dbea5b2 7 seconds ago 64.6 MB #这个是生成
<none> <none> ab9934bcdc0f 7 minutes ago 64.6 MB #感觉这个也是生成的
centos1 v1.0 f1420ae8ab97 2 days ago 202 MB
ubuntu 14.04 40446eeefc1a 2 days ago 215 MB
进容器中查看相应的操作是否成功
[root@centos7 simple_Dockerfile]# docker run -it b4869dbea5b2
vector4wang@3acb26c35c57:/usr/local/docker$ pwd
#当前操作确实为/usr/local/docker
/usr/local/docker
vector4wang@3acb26c35c57:/usr/local/docker$ ls
#自动生成了不存在的路径
add copy
vector4wang@3acb26c35c57:/usr/local/docker$ cd add/
vector4wang@3acb26c35c57:/usr/local/docker/add$ ls
#ADD 自动帮你解压的.tar.gz文件
'11'$'\346\233\264\346\215\242\345\237\237\345\220\215\345\205\254\345\221\212''.html'
vector4wang@3acb26c35c57:/usr/local/docker/add$ cd ../copy/
vector4wang@3acb26c35c57:/usr/local/docker/copy$ ls
#COPY 只是复制而己
temp.tar.gz
vector4wang@3acb26c35c57:/usr/local/docker/copy$ exit
exit
二、体验下使用docker build Dockerfile以阿里中间件大赛给的debian-jdk8镜像
Dockerfile文件如下:
FROM debian:stretch
ARG DEBIAN_FRONTEND=noninteractive
ARG JAVA_VERSION=8
ARG JAVA_UPDATE=172
ARG JAVA_BUILD=11
ARG JAVA_PACKAGE=jdk
ARG JAVA_HASH=a58eab1ec242421181065cdc37240b08
ENV LANG C.UTF-8
ENV JAVA_HOME=/opt/jdk
ENV PATH=${PATH}:${JAVA_HOME}/bin
RUN set -ex \
&& apt-get update \
&& apt-get -y install ca-certificates wget unzip \
&& wget -q --header "Cookie: oraclelicense=accept-securebackup-cookie" \
-O /tmp/java.tar.gz \
http://download.oracle.com/otn-pub/java/jdk/${JAVA_VERSION}u${JAVA_UPDATE}-b${JAVA_BUILD}/${JAVA_HASH}/${JAVA_PACKAGE}-${JAVA_VERSION}u${JAVA_UPDATE}-linux-x64.tar.gz \
&& CHECKSUM=$(wget -q -O - https://www.oracle.com/webfolder/s/digest/${JAVA_VERSION}u${JAVA_UPDATE}checksum.html | grep -E "${JAVA_PACKAGE}-${JAVA_VERSION}u${JAVA_UPDATE}-linux-x64\.tar\.gz" | grep -Eo '(sha256: )[^<]+' | cut -d: -f2 | xargs) \
&& echo "${CHECKSUM} /tmp/java.tar.gz" > /tmp/java.tar.gz.sha256 \
&& sha256sum -c /tmp/java.tar.gz.sha256 \
&& mkdir ${JAVA_HOME} \
&& tar -xzf /tmp/java.tar.gz -C ${JAVA_HOME} --strip-components=1 \
&& wget -q --header "Cookie: oraclelicense=accept-securebackup-cookie;" \
-O /tmp/jce_policy.zip \
http://download.oracle.com/otn-pub/java/jce/${JAVA_VERSION}/jce_policy-${JAVA_VERSION}.zip \
&& unzip -jo -d ${JAVA_HOME}/jre/lib/security /tmp/jce_policy.zip \
&& rm -rf ${JAVA_HOME}/jar/lib/security/README.txt \
/var/lib/apt/lists/* \
/tmp/* \
/root/.wget-hsts
新建一个空目录,假设就是~/debian-jdk8吧,cd进这个目录,新建一个Dockerfile,然后把上面的内容copy进去,然后执行下面的命令:
docker build -t debian-jdk8:v1.0 .
其中-t debian-jdk8:v1.0表示打包的镜像名为debian-jdk,tag为v1.0(前面说过,tag是可以任意命名的,不一定要是这种格式),注意命令的最后有一个.,这个表示打包的上下文(其实就是Dockerfile所在目录)是在当前目录,然后目录下的Dockerfile就会被编译执行。
[root@centos7 denbian-jdk8]# docker build -t debian-jdk8:v1.0 .
Sending build context to Docker daemon 3.072 kB
Step 1/11 : FROM debian:stretch
Trying to pull repository docker.io/library/debian ...
stretch: Pulling from docker.io/library/debian
a4d8138d0f6b: Pull complete
Digest: sha256:397b2157a9ea8d7f16c613aded70284292106e8b813fb1ed5de8a8785310a26a
Status: Downloaded newer image for docker.io/debian:stretch
---> 5a6d49d5e833
Step 2/11 : ARG DEBIAN_FRONTEND=noninteractive
---> Running in 3b695e63be44
---> cf75b9120562
Removing intermediate container 3b695e63be44
Step 3/11 : ARG JAVA_VERSION=8
---> Running in ffb25ed30a7b
---> cb294b73f54a
Removing intermediate container ffb25ed30a7b
Step 4/11 : ARG JAVA_UPDATE=172
---> Running in b02c932f307e
---> 3754d68d4615
Removing intermediate container b02c932f307e
Step 5/11 : ARG JAVA_BUILD=11
---> Running in d334c9c11b6d
---> 938457a64582
Removing intermediate container d334c9c11b6d
Step 6/11 : ARG JAVA_PACKAGE=jdk
---> Running in 0af0b1849907
---> 9636e9d4b039
Removing intermediate container 0af0b1849907
Step 7/11 : ARG JAVA_HASH=a58eab1ec242421181065cdc37240b08
---> Running in f5f26fc293e7
---> 2e8dbf64318a
Removing intermediate container f5f26fc293e7
Step 8/11 : ENV LANG C.UTF-8
---> Running in 32b46fc56ecc
---> ae275b3b5e84
Removing intermediate container 32b46fc56ecc
Step 9/11 : ENV JAVA_HOME /opt/jdk
---> Running in 79a42efd0802
---> 212b7ebcf149
Removing intermediate container 79a42efd0802
Step 10/11 : ENV PATH ${PATH}:${JAVA_HOME}/bin
---> Running in 6eaab787feac
---> c19adf77374c
Removing intermediate container 6eaab787feac
Step 11/11 : RUN set -ex && apt-get update && apt-get -y install ca-certificates wget unzip && wget -q --header "Cookie: oraclelicense=accept-securebackup-cookie" -O /tmp/java.tar.gz http://download.oracle.com/otn-pub/java/jdk/${JAVA_VERSION}u${JAVA_UPDATE}-b${JAVA_BUILD}/${JAVA_HASH}/${JAVA_PACKAGE}-${JAVA_VERSION}u${JAVA_UPDATE}-linux-x64.tar.gz && CHECKSUM=$(wget -q -O - https://www.oracle.com/webfolder/s/digest/${JAVA_VERSION}u${JAVA_UPDATE}checksum.html | grep -E "${JAVA_PACKAGE}-${JAVA_VERSION}u${JAVA_UPDATE}-linux-x64\.tar\.gz" | grep -Eo '(sha256: )[^<]+' | cut -d: -f2 | xargs) && echo "${CHECKSUM} /tmp/java.tar.gz" > /tmp/java.tar.gz.sha256 && sha256sum -c /tmp/java.tar.gz.sha256 && mkdir ${JAVA_HOME} && tar -xzf /tmp/java.tar.gz -C ${JAVA_HOME} --strip-components=1 && wget -q --header "Cookie: oraclelicense=accept-securebackup-cookie;" -O /tmp/jce_policy.zip http://download.oracle.com/otn-pub/java/jce/${JAVA_VERSION}/jce_policy-${JAVA_VERSION}.zip && unzip -jo -d ${JAVA_HOME}/jre/lib/security /tmp/jce_policy.zip && rm -rf ${JAVA_HOME}/jar/lib/security/README.txt /var/lib/apt/lists/* /tmp/* /root/.wget-hsts
---> Running in 87cc3bb1f8d5
+ apt-get update
Get:1 http://security-cdn.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Ign:2 http://cdn-fastly.deb.debian.org/debian stretch InRelease
Get:3 http://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Get:5 http://security-cdn.debian.org/debian-security stretch/updates/main amd64 Packages [499 kB]
Get:4 http://cdn-fastly.deb.debian.org/debian stretch Release [118 kB]
Get:6 http://cdn-fastly.deb.debian.org/debian stretch-updates/main amd64 Packages [27.4 kB]
Get:7 http://cdn-fastly.deb.debian.org/debian stretch Release.gpg [2434 B]
Get:8 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 Packages [7082 kB]
Fetched 7915 kB in 4min 4s (32.4 kB/s)
Reading package lists...
+ apt-get -y install ca-certificates wget unzip
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
libffi6 libgmp10 libgnutls30 libhogweed4 libidn2-0 libp11-kit0 libpsl5
libssl1.1 libtasn1-6 libunistring0 openssl publicsuffix
Suggested packages:
gnutls-bin zip
The following NEW packages will be installed:
ca-certificates libffi6 libgmp10 libgnutls30 libhogweed4 libidn2-0
libp11-kit0 libpsl5 libssl1.1 libtasn1-6 libunistring0 openssl publicsuffix
unzip wget
0 upgraded, 15 newly installed, 0 to remove and 1 not upgraded.
Need to get 5212 kB of archives.
After this operation, 14.4 MB of additional disk space will be used.
Get:1 http://security-cdn.debian.org/debian-security stretch/updates/main amd64 libssl1.1 amd64 1.1.0k-1~deb9u1 [1356 kB]
Get:3 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libgmp10 amd64 2:6.1.2+dfsg-1 [253 kB]
Get:4 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libhogweed4 amd64 3.3-1+b2 [136 kB]
Get:5 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libffi6 amd64 3.2.1-6 [20.4 kB]
Get:6 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libp11-kit0 amd64 0.23.3-2 [111 kB]
Get:7 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libtasn1-6 amd64 4.10-1.1+deb9u1 [50.6 kB]
Get:8 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libgnutls30 amd64 3.5.8-5+deb9u4 [896 kB]
Get:9 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libunistring0 amd64 0.9.6+really0.9.3-0.1 [279 kB]
Get:10 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libidn2-0 amd64 0.16-1+deb9u1 [60.7 kB]
Get:11 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libpsl5 amd64 0.17.0-3 [41.8 kB]
Get:12 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 wget amd64 1.18-5+deb9u3 [800 kB]
Get:13 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 ca-certificates all 20161130+nmu1+deb9u1 [182 kB]
Get:2 http://security-cdn.debian.org/debian-security stretch/updates/main amd64 openssl amd64 1.1.0k-1~deb9u1 [747 kB]
Get:14 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 unzip amd64 6.0-21+deb9u1 [170 kB]
Get:15 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 publicsuffix all 20190415.1030-0+deb9u1 [108 kB]
The command '/bin/sh -c set -ex && apt-get update && apt-get -y install ca-certificates wget unzip && wget -q --header "Cookie: oraclelicense=accept-securebackup-cookie" -O /tmp/java.tar.gz http://download.oracle.com/otn-pub/java/jdk/${JAVA_VERSION}u${JAVA_UPDATE}-b${JAVA_BUILD}/${JAVA_HASH}/${JAVA_PACKAGE}-${JAVA_VERSION}u${JAVA_UPDATE}-linux-x64.tar.gz && CHECKSUM=$(wget -q -O - https://www.oracle.com/webfolder/s/digest/${JAVA_VERSION}u${JAVA_UPDATE}checksum.html | grep -E "${JAVA_PACKAGE}-${JAVA_VERSION}u${JAVA_UPDATE}-linux-x64\.tar\.gz" | grep -Eo '(sha256: )[^<]+' | cut -d: -f2 | xargs) && echo "${CHECKSUM} /tmp/java.tar.gz" > /tmp/java.tar.gz.sha256 && sha256sum -c /tmp/java.tar.gz.sha256 && mkdir ${JAVA_HOME} && tar -xzf /tmp/java.tar.gz -C ${JAVA_HOME} --strip-components=1 && wget -q --header "Cookie: oraclelicense=accept-securebackup-cookie;" -O /tmp/jce_policy.zip http://download.oracle.com/otn-pub/java/jce/${JAVA_VERSION}/jce_policy-${JAVA_VERSION}.zip && unzip -jo -d ${JAVA_HOME}/jre/lib/security /tmp/jce_policy.zip && rm -rf ${JAVA_HOME}/jar/lib/security/README.txt /var/lib/apt/lists/* /tmp/* /root/.wget-hsts' returned a non-zero code: 137
[root@centos7 denbian-jdk8]#
执行完毕后运行docker images就会发现多了一个debian-jdk8镜像。
下面来解释一下Dockerfile的结构,那些字母全部大写的每行第一个单词都是Dockerfile的指令,可以看出这个Dockefile中包括的指令有FROM、ARG、ENV、RUN,下面的表格中我对其含义进行了解释:
指令 | 含义解释 |
---|---|
WORKDIR | 在构建时,指定镜像工作目录 |
EXPOSE | 暴露镜像的端口供主机做映像 |
COPY | 复制文件到容器 不做解压操作 |
ADD | 复制文件到容器 且做解压操作 ADD会对压缩文件(tar, gzip, bzip2, etc)做提取和解压操作。 |
USER | 指定该镜像以什么样的用户去执行 |
CMD | 容器启动时需要执行的命令 |
当有多个CMD的时候,只有最后一个生效。 会给docker run覆盖
ENTRYPOINT :容器启动时需要执行的命令 不会给docker run覆盖
FROM FROM debian:stretch表示以debian:stretch作为基础镜像进行构建
RUN 可以看出RUN后面跟的其实就是一些shell命令,通过&&将这些脚本连接在了一行执行,这么做的原因是为了减少镜像的层数,每多一行RUN都会给镜像增加一层,所以这里选择将所有命令联结在一起执行以减少层数
ARG 特地将这个指令放在RUN之后讲解,这个指令可以进行一些宏定义,比如我定义ENV JAVA_HOME=/opt/jdk,之后RUN后面的shell命令中的${JAVA_HOME}都会被/opt/jdk代替 ENV 可以看出这个指令的作用是在shell中设置一些环境变量(其实就是export) |
参考文献:https://blog.csdn.net/qq_33256688/article/details/80319673
教程参考于:http://www.bdkyr.com
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
文章标题:Centos7 docker基础6-Dockerfile
本文作者:wangzhirui
发布时间:2019-08-22, 19:44:58
最后更新:2025-02-27, 02:04:01
原始链接:https://wangzhirui.com/2019/08/22/Centos7-docker基础6-Dockerfile/转载请保留原文链接及作者。