目录

1.DockerFile介绍

2.DockerFile指令

3.实战:构建自己的centos

4. RUN,CMD和ENTRYPOINT的区别 

5. 实战:制作Tomcat镜像并发布镜像


1.DockerFile介绍

dockerfile是用来构建dokcer镜像的文件!命令参数脚本!

 docker build命令用于从Dockerfile构建镜像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。

 

构建步骤
1、编写一个dockerfile 文件
2、docker build构建成为一个镜像
3、docker run运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库!)

基础知识
1、每个保留关键字(指令)都是尽量是大写字母
2、执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!

 dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!

Docker镜像逐渐成为企业交付的标准,必须要掌握!I

步骤:

DockerFile :构建文件,定义了一切的步骤,源代码

Dockerlmages :通过DockerFile构建生成的镜像,最终发布和运行的产品

!Docker容器︰容器就是镜像运行起来提供服务器

2.DockerFile指令

指令说明
FROM指定基础镜像
MAINTAINER镜像是谁写的,姓名+邮箱
RUN镜像构建的时候需要运行的命令
ADD将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
WORKDIR镜像的工作目录
VOLUME挂载的目录
EXPOSE暴露端口配置
CMD指定这个容器启动的时候要运行的命令(只有最后一个会生效,可被替代)
EMTRYPOINT指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令,触发指令
COPY功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
ENV构建的时候设置环境变量


3.实战:构建自己的centos

下面通过编写Dockerfile文件来制作Centos镜像,并在官方镜像的基础上添加vim和net-tools工具。首先在/home/dockfile 目录下新建文件mydockerfile-centos。然后使用上述指令编写该文件。

第一步:编写dockerfile文件

FROM centos:7                            #基础镜像         
MAINTAINER WJC<1164213208@qq.com>        #维护者信息

ENV MYPATH /usr/local                    #环境变量目录 k-v
WORKDIR $MYPATH                          #工作目录  用$取k

RUN yum -y install vim                   #执行构建命令  安装vim
RUN yum -y install net-tools             #执行构建命令  安装net-tools

EXPOSE 80                                #暴露端口 80

CMD echo $MYPATH                         #输出构建信息 mypath
CMD echo "---end---"                     #输出信息
CMD /bin/bash                            #进入/bin/bash命令行

第二部:构建镜像文件

构建镜像命令:docker build -f dockerfile文件路径 -t 镜像名[:版本号] .(这里有个小点.)

上面命令中,-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。

docer build -f mydockerfile-centos -t mycentos:0.1 .

 

这里可以看到我们创建的镜像,SIZE大了很多比原生的

 

启动镜像 

 

 另外,我们通过docker history 镜像id命令来查看镜像的构建步骤

4. RUN,CMD和ENTRYPOINT的区别 

RUN命令与CMD命令的区别在哪里?

简单说,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。

注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。

CMD和ENTRYPOINT的区别在哪里?

CMD :指定容器启动的时候要运行的命令,只有最后一个会生效

ENTRYPOINT :指定容器启动的时候要运行的命令,命令可以追加
 

首先是使用CMD指令

[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# cat dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest:1.0 .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : CMD ["ls","-a"]
 ---> Running in 6d4d0112322f
Removing intermediate container 6d4d0112322f
 ---> b6ec5224d2ac
Successfully built b6ec5224d2ac
Successfully tagged cmdtest:1.0
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# docker run cmdtest:1.0
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#由于使用的是 CMD指令,命令无追加,-l取代了原本的ls -a,而-l命令不存在所以报错。
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# docker run cmdtest:1.0 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

 

可以看到追加命令-l 出现了报错。

下面使用ENTRYPOINT来构建一个镜像

#1.修改dockerfile文件
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# cat dockerfile-cmd-test
FROM centos
ENTRYPOINT ["ls","-a"]
#2.构建镜像
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest:2.0 .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in 61389c0c1967
Removing intermediate container 61389c0c1967
 ---> ac7b7e83ff88
Successfully built ac7b7e83ff88
Successfully tagged cmdtest:2.0
#3.运行镜像
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# docker run cmdtest:2.0
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#4.追加镜像再次运行
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# docker run cmdtest:2.0 -l
total 56
drwxr-xr-x   1 root root 4096 Jan  1 03:55 .
drwxr-xr-x   1 root root 4096 Jan  1 03:55 ..
-rwxr-xr-x   1 root root    0 Jan  1 03:55 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root  340 Jan  1 03:55 dev
drwxr-xr-x   1 root root 4096 Jan  1 03:55 etc
drwxr-xr-x   2 root root 4096 Nov  3 15:22 home
lrwxrwxrwx   1 root root    7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3 15:22 lib64 -> usr/lib64
drwx------   2 root root 4096 Dec  4 17:37 lost+found
drwxr-xr-x   2 root root 4096 Nov  3 15:22 media
drwxr-xr-x   2 root root 4096 Nov  3 15:22 mnt
drwxr-xr-x   2 root root 4096 Nov  3 15:22 opt
dr-xr-xr-x 106 root root    0 Jan  1 03:55 proc
dr-xr-x---   2 root root 4096 Dec  4 17:37 root
drwxr-xr-x  11 root root 4096 Dec  4 17:37 run
lrwxrwxrwx   1 root root    8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3 15:22 srv
dr-xr-xr-x  13 root root    0 Dec 29 15:41 sys
drwxrwxrwt   7 root root 4096 Dec  4 17:37 tmp
drwxr-xr-x  12 root root 4096 Dec  4 17:37 usr
drwxr-xr-x  20 root root 4096 Dec  4 17:37 var

以后我们就可以识别,如果他用的原生命令去追加说明用的CMD,如果用的 - 来追加说明用的ENTRYPOINT。了解即可

5. 实战:制作Tomcat镜像并发布镜像

1.准备环境

tomcat和jdk压缩包,创建一个txt,创建一个Dockerfile目录 

 

2.编写dockerfile文件,文件名使用官方命名:Dockerfile ,build的时候会默认寻找当前目录下的文件,不需要使用-f参数指定

FROM centos:7
MAINTAINER ethan<1164213208@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u333-linux-x64.tar.gz /usr/local/           #add命令会自动解压,解压到/usr/local/
ADD apache-tomcat-9.0.64.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_333
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.64
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.64
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.64/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.64/logs/catalina.out

3.docker build构建成为一个镜像

docker build -t diytomcat:1.0 .

 

4.启动生成的镜像,构建Tomcat容器

这里设置了数据卷,宿主机的/home/wjc/build/tomcat/test对应该容器的/usr/local/apache-tomcat-9.0.64/webapps/test。这样关于test项目的修复只需要在宿主机上修改就可以了,不需要进入到容器中修改。

docker run -d -p 9090:8080 --name diytomcat -v /home/wjc/build/tomcat/test:/usr/local/apache-tomcat-9.0.64/webapps/test -v /home/wjc/build/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.64/logs diytomcat:1.0

挂载成功! 

进入到容器中

测试去外网访问

 

都是可以成功了。

5.在本地发布项目

因为我们进行了挂载,所以我们可以直接在宿主机发布项目了,操作如下,进入挂载的test目录

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>

 

5.1发布镜像到DockerHub

1.登录https://hub.docker.com/ DockerHub官网进行注册

2.进行登录,docker login -u 用户名

 3.使用docker push命令推送镜像到DockerHub上的仓库

[root@iZwz99sm8v95sckz8bd2c4Z test]# docker tag 0975df661526 1164213208/diytomcat:1.0
[root@iZwz99sm8v95sckz8bd2c4Z test]# docker images
REPOSITORY                TAG       IMAGE ID       CREATED             SIZE
diytomcat                 1.0       0975df661526   About an hour ago   688MB
ethanhuang824/diytomcat   1.0       0975df661526   About an hour ago   688MB
cmdtest                   2.0       ac7b7e83ff88   6 hours ago         209MB
cmdtest                   1.0       b6ec5224d2ac   6 hours ago         209MB
ethan/centos              1.0       1df90e6fd790   2 days ago          209MB
mytomcat                  1.0       f189aac861de   3 days ago          653MB
mysql                     5.7       f07dfa83b528   10 days ago         448MB
tomcat                    latest    feba8d001e3f   2 weeks ago         649MB
nginx                     latest    ae2feff98a0c   2 weeks ago         133MB
centos                    latest    300e315adb2f   3 weeks ago         209MB
elasticsearch             7.6.2     f29a1ee41030   9 months ago        791MB
[root@iZwz99sm8v95sckz8bd2c4Z test]# docker push 1164213208/diytomcat:1.0

因为push的时候,镜像名前面需要加上用户名(1164213208是我的用户名。如果用户名不是当前登录用户则会拒绝push请求),所以需要使用命令docker tag 镜像名 新的镜像名复制出一份镜像重新打个Tag。

5.2 发布镜像到阿里云容器服务

1.登录阿里云,找到容器镜像服务

2.创建命名空间

3.与上面DockerHub的操作类似,按官方提供的操作指南操作即可。 

参考文章:Dockerfile详解与镜像发布_Code0cean的博客-CSDN博客

视频:【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐