Docker File介绍

DockerFile是用来构建Docker镜像的文件,DockerFile的本质就是一个命令参数脚本

构建步骤

1、编写一个DockerFile文件

2、docker build构建称为一个镜像

3、docker run运行镜像

4、docker push发布镜像

查看官方写centos的DockerFile

image-20211209195235444.png

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、每一个指令都会创建提交一个新的镜像层

image-20211209195942821.png

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开始创建

image-20220102120902365.png

创建一个自己的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的压缩包

image-20220907164816348.png

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                      

image-20220907171210625.png

启动容器

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

访问测试

image-20220907172356089.png

发布项目

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)测试访问主机

image-20220907201920535.png