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—— 如何制作自己的镜像的主要内容,如果未能解决你的问题,请参考以下文章