
0x06 DockerFile
Docker File介绍
DockerFile是用来构建Docker镜像的文件,DockerFile的本质就是一个命令参数脚本
构建步骤
1、编写一个DockerFile文件
2、docker build构建称为一个镜像
3、docker run运行镜像
4、docker push发布镜像
查看官方写centos的DockerFile
FROM scratch
ADD centos-8-x86_64.tar.xz
LABEL org.label-schema.schema-version="1.0" org.label-schema.name="CentOS Base Image" org.label-schema.vendor="CentOS" org.label-schema.license="GPLv2" org.label-schema.build-date="20210915"
CMD ["/bin/bash"]
Docker File的构建过程
基础知识
1、每个保留关键字(指令)都必须是大写字母
2、指令是从上至下执行的
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层
Docker File:构建文件,定义了创建一个镜像的一切步骤
Docker Images:通过Docker File构建生成的镜像,最终发布和运行的产品
Docker 容器:容器就是镜像运行起来提供服务的
Docker File 指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,通用标准:姓名+邮箱
RUN # Docker镜像构建的时候需要运行的命令
ADD # 将主机构建环境(上下文)目录中的文件和目录、以及一个URL标记的文件 拷贝到镜像中
WORKDIR # 镜像的工作目录
VOLUME # 挂载卷
EXPOSR # 暴露端口配置
CMD # 指定这个容器启动的时候需要执行的命令,只有最后一个会生效,切会被替代
ENTRYPOINT # 指定这个容器启动时需要执行的命令,可以追加命令
ONBUILD # 当构建一个被继承的Docker File的时候,就会运行ONBUILD指令
COPY # 类似于ADD命令,用于将文件拷贝到镜像中
ENV # 构建的时候设置环境变量
实战演练
Docker Hub上99%的镜像都从scratch开始创建
创建一个自己的CentOS
# 基于CentOS镜像添加vim和nettools工具
# 1、编写DockerFile文件
FROM centos
MAINTAINER JacobWang<jacobwang507@gmail.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
# 2、通过DockerFile构建镜像
Complete!
Removing intermediate container e0582cad132e
---> fed5a4f444bc
Step 7/10 : EXPOSE 80
---> Running in 39411ad5c54e
Removing intermediate container 39411ad5c54e
---> f141da3b480c
Step 8/10 : CMD echo $MYPATH
---> Running in c3020f7567da
Removing intermediate container c3020f7567da
---> 9cb465767c07
Step 9/10 : CMD echo "---end---"
---> Running in 779572bca33d
Removing intermediate container 779572bca33d
---> eee3c93cac12
Step 10/10 : CMD /bin/bash
---> Running in 895f6200f41e
Removing intermediate container 895f6200f41e
---> b9486737e901
Successfully built b9486737e901
Successfully tagged mycentos:0.1
# 3、运行这个容器
[root@localhost DockerFile]# docker run -it mycentos:0.1 /bin/bash
[root@28a6790a83df local]# pwd
/usr/local
# 4、查看镜像的创建过程
[root@localhost DockerFile]# docker history b9486737e901
IMAGE CREATED CREATED BY SIZE COMMENT
b9486737e901 5 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
eee3c93cac12 5 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
9cb465767c07 5 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
f141da3b480c 5 hours ago /bin/sh -c #(nop) EXPOSE 80 0B
fed5a4f444bc 5 hours ago /bin/sh -c yum -y install net-tools 28.4MB
2d48df42d5be 5 hours ago /bin/sh -c yum -y install vim 66.3MB
ec0e37bd6cb3 5 hours ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
8570c472fc9f 5 hours ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
b3f8afcd4a25 5 hours ago /bin/sh -c #(nop) MAINTAINER JacobWang<jaco… 0B
5d0da3dc9764 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB
CMD 和 ENTRYPOINT 的区别
CMD # 指定这个容器启动的时候需要执行的命令,只有最后一个会生效,切会被替代
ENTRYPOINT # 指定这个容器启动时需要执行的命令,可以追加命令
测试CMD
测试ENTRYPOINT
1、编写DockerFile文件
FROM centos
ENTRYPOINT ["ls", "-a"]
2、构建镜像
[root@localhost DockerFile]# docker build -f DockerFile_ENTRYPOINT_test -t centos_entrypoint_test .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : ENTRYPOINT ["ls", "-a"]
---> Running in ba8dcefd1a87
Removing intermediate container ba8dcefd1a87
---> 1043f4390d4e
Successfully built 1043f4390d4e
Successfully tagged centos_entrypoint_test:latest
3、创建并启动容器测试追加命令
[root@localhost DockerFile]# docker run 1043f4390d4e
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@localhost DockerFile]# docker run 1043f4390d4e -l
total 0
drwxr-xr-x. 1 root root 6 Jan 2 10:27 .
drwxr-xr-x. 1 root root 6 Jan 2 10:27 ..
-rwxr-xr-x. 1 root root 0 Jan 2 10:27 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Jan 2 10:27 dev
drwxr-xr-x. 1 root root 66 Jan 2 10:27 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Sep 15 14:17 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 165 root root 0 Jan 2 10:27 proc
dr-xr-x---. 2 root root 162 Sep 15 14:17 root
drwxr-xr-x. 11 root root 163 Sep 15 14:17 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Dec 26 04:32 sys
drwxrwxrwt. 7 root root 171 Sep 15 14:17 tmp
drwxr-xr-x. 12 root root 144 Sep 15 14:17 usr
drwxr-xr-x. 20 root root 262 Sep 15 14:17 var
实战:tomcat
1、准备Tomcat和JDK的压缩包
2、编写DockerFile
FROM centos
MAINTAINER JacobWang<995609409@qq.com>
COPY README.txt /usr/local/
ADD jdk-8u341-linux-aarch64.tar.gz /usr/local/
ADD apache-tomcat-9.0.65.tar.gz /usr/local
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_341
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.65
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.65
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.65/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.65/bin/logs/catalina.out
构建镜像
wangshuai@wangshuaideMacBook-Pro tomcat % docker build -t ntomcat .
[+] Building 0.4s (10/10) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 949B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 482B 0.0s
=> [1/5] FROM docker.io/library/centos 0.0s
=> CACHED [2/5] COPY README.txt /usr/local/ 0.0s
=> CACHED [3/5] ADD jdk-8u341-linux-aarch64.tar.gz /usr/local/ 0.0s
=> CACHED [4/5] ADD apache-tomcat-9.0.65.tar.gz /usr/local 0.0s
=> [5/5] WORKDIR /usr/local 0.0s
=> exporting to image 0.3s
=> => exporting layers 0.3s
=> => writing image sha256:f41931ad98b69c9cebcf79699b2b175fe9a0993835c9aea1b4f7934c1100fba3 0.0s
=> => naming to docker.io/library/ntomcat
启动容器
wangshuai@wangshuaideMacBook-Pro tomcat % docker run -d -p 9090:8080 --name ntomcat -v /Users/wangshuai/Documents/学习/Docker/DockerFile/tomcat/test/:/usr/local/apache-tomcat-9.0.65/webapps/test -v /Users/wangshuai/Documents/学习/Docker/DockerFile/tomcat/tomcatlogs:/url/local/apache-tomcat-9.0.65/logs ntomcat
1656c771680838408b161e05a212e67391415d37425c539e68639d3dddc81fa0
wangshuai@wangshuaideMacBook-Pro tomcat % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1656c7716808 ntomcat "/bin/sh -c '/usr/lo…" 4 seconds ago Up 3 seconds 0.0.0.0:9090->8080/tcp ntomcat
5d2d8972c853 centos "/bin/bash" 5 hours ago Up 5 hours vigilant_chandrasekhar
访问测试
发布项目
1)在宿主机的test目录下创建一个`index.html`
wangshuai@wangshuaideMacBook-Pro test % pwd
/Users/wangshuai/Documents/学习/Docker/DockerFile/tomcat/test
wangshuai@wangshuaideMacBook-Pro test % ls
index.html
wangshuai@wangshuaideMacBook-Pro test % cat index.html
<html>
<h1>Hello,World!</h1>
</html>
wangshuai@wangshuaideMacBook-Pro test %
2)测试访问主机
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 JacobWang
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果