DockerFile

DockerFile介绍

我们写好一个项目以后,以前发布是打包成一个jar,或者是一个war包,但是现在有Docker以后,我们只需要把我们项目,写成一个DockerFile镜像交给别人,或者上传到远程仓库直接使用pull就可以直接运行

构建步骤:

  1. 编写 DockerFile
  2. build DockerFile
  3. 运行

DockerFile的编写

基础知识:
1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行
3、# 表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交
流程:
1、docker从基础镜像运行一个容器
2、执行一条指令并对容器做出修改
3、执行类似 docker commit 的操作提交一个新的镜像层
4、Docker再基于刚提交的镜像运行一个新容器
5、执行dockerfile中的下一条指令直到所有指令都执行完成!
说明:
从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。
DockerFile 是软件的原材料 (代码)
Docker 镜像则是软件的交付品 (.apk)
Docker 容器则是软件的运行状态 (客户下载安装执行)
DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可!

DockerFile 关键字

image-20201130205308510

实战:写一个centos

1
2
3
4
5
6
7
8
9
10
FROM centos7
MAINTAINER saxon<2433027822@qq.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

这里有一个BUG centos 8的无法联网,无法使用 RUN yum -y insatll vim等命令

1
docker build -f Dockfile -t saxon_centos:1.0 .

我们一定要在最后面加上一个==.==,不然会报错

由于是我们自己写的镜像,所以在运行是我们要带上版本号,这样才会让我们的容器精准找到镜像

运行:

1
[root@iZwz94khotag1q066igytrZ docker_file_test]# docker run -it saxon_centos:1.0

结果:

image-20201130221936971

我们发现,我们一进入就会在我们配置的那个地方

关于CMD和ENTRYPOINT的区别

我们之前说过,两个命令都是指定一个容器启动时要运行的命令
CMD:Dockerfile 中可以有多个CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数
替换!
ENTRYPOINT: docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合

例如:

1
2
3
4
5
# 1、构建dockerfile
[root@kuangshen home]# vim dockerfile-cmd-test
[root@kuangshen home]# cat dockerfile-cmd-test
FROM centos
CMD [ "ls", "-a" ]
1
2
3
4
# 问题:我们可以看到可执行文件找不到的报错,executable file not found。
# 之前我们说过,跟在镜像名后面的是 command,运行时会替换 CMD 的默认值。
# 因此这里的 -l 替换了原来的 CMD,而不是添加在原来的 ls -a 后面。而 -l 根本不是命令,所以自然找不到。
# 那么如果我们希望加入 -l 这参数,我们就必须重新完整的输入这个命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 1、构建dockerfile
[root@kuangshen home]# vim dockerfile-entrypoint-test
[root@kuangshen home]# cat dockerfile-entrypoint-test
FROM centos
ENTRYPOINT [ "ls", "-a" ]
# 2、build 镜像
[root@kuangshen home]# docker build -f dockerfile-entrypoint-test -t
entrypointtest .
Sending build context to Docker daemon 23.04kB
Step 1/2 : FROM centos
---> 470671670cac
Step 2/2 : ENTRYPOINT [ "ls", "-a" ]
---> Running in bac4ae055630
Removing intermediate container bac4ae055630
---> ae07199f9144
Successfully built ae07199f9144
Successfully tagged entrypointtest:latest
# 3、执行
[root@kuangshen home]# docker run ae07199f9144
.dockerenv
bin
dev
etc
home
lib
lib64
......
# 4、测试-l参数,发现可以直接使用,这里就是一种追加,我们可以明显的知道 CMD 和
ENTRYPOINT 的区别了
[root@kuangshen home]# docker run entrypointtest -l

如果使用的是我们的ENTRYPOINT那么在我们的使用容器服务的时候吗,我们后面加的命令会自动补充在后面,不会像原来的cmd需要我们自己写全,不然就无法使用;

实战:部署一个tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
FROM centos:7
MAINTAINER saxon<2433027822@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH

ADD jdk-9.0.4_linux-x64_bin.tar.gz /usr/local
ADD apache-tomcat-9.0.38.tar.gz /usr/local
#配置Java
ENV JAVA_HOME /usr/local/jdk-9.0.4
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#配置tomcat

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.38
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.38
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.38/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.38/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.38/bin/startup.sh

RUN yum -y install vim

使用下面的命令运行我们的镜像:

1
docker run -it -d -p 3333:8080 saxon_centos:1.0 /bin/bash

没有实现挂载,如果你想要实现挂载,你可以加上-v,这样你就可以在宿主机上面定向修改应用代码;这样可以简便开发;

image-20201130230920098

上传自己的镜像到远程服务器

Docker HUB
1
2
3
4
#第一步,登录
docker login -u username -p password
#第二步,上传
....
阿里云

官网上直接有步骤按照那个来就可以了;