Docker—— 如何制作自己的镜像

Posted 玛丽莲茼蒿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker—— 如何制作自己的镜像相关的知识,希望对你有一定的参考价值。

需求:

自己写了一个小程序,如何带着环境打包成一个镜像,然后发布给别人run起来呢?

以前程序员需要交付一个jar包或者war包,但是现在公司的交付标准都是docker镜像

一、步骤 

1. 编写Dockerfile脚本

2. docker build 构建

3. docker run 运行

4.(可选)docker push 发布(dockerhub 、阿里云镜像仓库)

二、Dockerfile

Dockerfile是什么?和Makefile差不多。

1. 指令都是大写字母

2. 从上到下执行

3. “#”表示注释

4. 每一条指令都会创建并提交一个新的镜像层。所以Dockerfile中一定要惜字如金,能写到一行的指令,一定要写到一行,否则会造成镜像臃肿。

5. Dockerfile中提到所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录。

6. Dockerfile中相对路径默认都是Dockerfile所在的目录

常用指令

FROM                 : 基础镜像。这个镜像基于哪个镜像。dockerHub里99%的镜像都是FROM scratch

MAINTAINER    :作者信息。姓名+邮箱

RUN                  :镜像build时需要运行的命令。

可以理解为在FROM 基础镜像之上想要运行什么命令得到一个新镜像。拿下文的例子来说,我FROM centos,但是centos这个基础镜像没有vim命令,那我就在这个centos镜像的命令行里执行安装vim的命令,如此需求的命令就用RUN来写。

CMD                    :指定容器启动run时要运行的命令,只有最后一个会生效。会被run命令行传来的命令替代。

                             java -jar xx.jar命令一般会写在CMD或者ENTRYPOINT里。    

CMD的RUN的不同:

  • RUN 是在 docker build 时运行。
  • CMD 是在docker run 时运行。

ENTRYPOINT     :和CMD一样,指定容器启动时要运行的命令。不会被命令行传来的替代,而是追加在后面执行。

ADD                   :  把宿主机文件拷贝到镜像中。

ADD <src 宿主机路径> <des 镜像/容器内部路径>

# <src 宿主机路径> 为 *.jar  表示上下文路径(如下文所述,最好设置成dockerfile所在的目录下)的所有jar包
                  本身是一个目录的时候,会把目录下所有文件复制到镜像中,而目录本身不会复制
# <des 镜像/容器内部路径> 一般写成目录的形式
                  为 /root/test 表示拷贝到/root/test目录下,如果不存在会自动创建

# ADD . . :<src>默认是上下文路径,<des>默认是镜像的工作目录WORKDIR

COPY                   :类似ADD,将宿主机的文件拷贝到镜像中(同样需求下,官方推荐使用 COPY

WORKDIR         : 指明镜像默认的工作目录。

VOLUME            : 挂载到宿主机的哪个目录。代替 run -v命令 (run这个镜像的时候就不用写了,因为已经设置好了)

EXPOSE             : 暴露端口。代替 run -p命令

ONBUILD             :

ENV                      :设置镜像的环境变量。替代run -e命令。

问题:使用DockerFile制作镜像和使用commit提交一个镜像有什么区别呢?

三、 实战 —— 构建自己的centos

从dockerhub上拉取的centos只具备最基本的命令,不支持"ifconfig"、"vim"等命令。所以我们要做的就是把官方的centos镜像作为基础镜像,构建支持"ipconfig"、"vim"的centos镜像。

1. dockerfile编写

 

2. build构建

注意,一般要切换到dockerfile所在目录下执行build命令。

最后一个“.”的含义很重要!它是上下文路径,默认上下文路径就是 Dockerfile 所在的位置,指镜像构建时,需要打包上传到Docker server 引擎的目录

解释:Dockerfile中的COPY、ADD指令需要把宿主机文件拷贝到镜像中,这些指令是由docker-server去执行的。由于 docker 的运行模式是 C/S。我们本机是 C,docker-server引擎是 S。实际的构建过程是在 docker-server 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。build结束后,docker-server会将其自动清理。

理解不了没关系,只需要记住,把镜像要用到的文件(比如jar包、war包)和dockerfile放在同一个目录下,在执行docker build前切换到这个目录下,build命令的最后跟着一个“.”就行了。写ADD、COPY命令时,<src>也可以只写一个“.”就行了。

PS: 当时用cmake的时候,我们不就是直接背过了build文件夹和CMakeList.txt的位置关系,然后闭眼敲cmake命令的吗!

 docker images命令可以查看到我们构建好的镜像

3. run 运行

四、实战 —— 构建jar包的镜像

说明:在VMware虚拟机中安装docker,然后进行如下操作

1. 登录root用户,在/root目录下新建文件夹myDocker:/root/myDocker

2. 通过网易邮箱把Chat.jar包发送给虚拟机,下载到/root/myDocker路径下。

3. 测试程序是否可以跑起来。

如上图,运行很正常,说明网络等各方面没问题,如果待会运行不成功一定不是jar包的问题。 

4. 在/root/myDocker路径下新建Dockerfile文件,编辑内容如下:

以上是关于Docker—— 如何制作自己的镜像的主要内容,如果未能解决你的问题,请参考以下文章

Docker—— 如何制作自己的镜像

怎么在服务器上制作docker镜像

玩转开源制作Docker镜像

openstack怎么制作centos7的镜像

Docker制作Ubuntu的Python环境镜像

docker怎么安装自己的镜像文件