制作属于自己的Docker镜像,一般有两种方式,第一种为commit方式,利用已有的镜像,运行后安装定制自己需要的环境,然后生成镜像;另一种就是build方式,通过编写Dockerfile命令脚本进行生成镜像。

方法2:docker build # 编写Dockerfile命令脚本文件自动化制作 image

使用Dockerfile是更推荐的方式,这样可以让使用者更清晰地看到这个镜像的制作细节,逻辑清晰,便于管理。

注意事项:

Dockerfile文件需放置在一个目录中,这个目录中有构建镜像的所有文件,可以创建子目录。
在Dockerfile文件中,"#“号开头表示注释,每行为"INSTRUCTION arguments”,习惯大写表示关键字(但并不区分大小写),后面小写表示值。
每个Dockerfile的第一行(注释行除外),必须使用"FROM"关键字。
当我们在docker build构建镜像时,会将我们的指定的上下文目录(即Dockerfile所在目录)打包传递给docker 引擎,而这个上下文中并非所有文件都会在Dockerfile中使用,这样就会使传送给docker引擎的目录过大,影响构建速度,所以可以在此目录中,定义.dockerignore文件,将不使用的文件文件名写入到该文件即可,且支持通配符。
最小化镜像的层数,Dockerfile中每一行命令就是一层,层数过多影响构建效率。
Dockerfile文件中命令从上往下逐行执行。

Dockerfile参数简介

指令 含义解释

FROM : FROM debian:stretch表示以debian:stretch作为基础镜像进行构建

MAINTAINER: 维护者信息
RUN : 可以看出RUN后面跟的其实就是一些shell命令,通过&&将这些脚本连接在了一行执行,这么做的原因是为了减少镜像的层数,每多一行RUN都会给镜像增加一层,所以这里选择将所有命令联结在一起执行以减少层数
ARG : 特地将这个指令放在RUN之后讲解,这个指令可以进行一些宏定义,比如我定义ENV JAVA_HOME=/opt/jdk,之后RUN后面的shell命令中的${JAVA_HOME}都会被/opt/jdk代替
ENV : 可以看出这个指令的作用是在shell中设置一些环境变量(其实就是export)
FROM…AS…: 这是Docker 17.05及以上版本新出来的指令,其实就是给这个阶段的镜像起个别名:FROM …(基础镜像) AS …(别名),在后面引用这个阶段的镜像时直接使用别名就可以了

COPY: 顾名思义,就是用来来回复制文件的,COPY . /root/workspace/agent表示将当前文件夹(.表示当前文件夹,即Dockerfile所在文件夹)的所以文件拷贝到容器的/root/workspace/agent文件夹中。通过–from参数也可以从前面阶段的镜像中拷贝文件过来,比 如–from=builder表示文件来源不是本地文件系统,而是之前的别名为builder的容器

WORKDIR: 在执行RUN后面的shell命令前会先cd进WORKDIR后面的目录

ENTRYPOINT: 这个参数表示镜像的“入口”,镜像打包完成之后,使用docker run命令运行这个镜像时,其实就是执行这个ENTRYPOINT后面的可执行文件(一般是一个shell脚本文件),也可以通过[“可执行文件”, “参数1”, “参数2”]这种方式来赋予可执行文件的执行参数, 这个“入口”执行的工作目录也是WORKDIR后面的那个目录

各命令详解

FROM

指定哪种镜像作为新镜像的基础镜像,如:

FROM ubuntu:14.04

MAINTAINER

指明该镜像的作者和其电子邮件,如:

MAINTAINER vector4wang "xxxxxxx@qq.com"

LABEL

给镜像添加信息。使用docker inspect可查看镜像的相关信息:

LABEL maintainer="1026825281@qq.com"
LABEL version="1.0"
LABEL description="雨下整夜,我的爱溢出就像雨水。"

RUN

在新镜像内部执行的命令,比如安装一些软件、配置一些基础环境,可使用\来换行,如:

RUN echo 'hello docker!' \> /usr/local/file.txt

也可以使用exec格式RUN [“executable”, “param1”, “param2”]的命令,如:

RUN ["apt-get","install","-y","nginx"]

要注意的是,executable是命令,后面的param是参数

COPY

将主机的文件复制到镜像内,如果目的位置不存在,Docker会自动创建所有需要的目录结构,但是它只是单纯的复制,并不会去做文件提取和解压工作。如:

COPY application.yml /etc/springboot/hello-service/src/resources

注意:需要复制的目录一定要放在Dockerfile文件的同级目录下
原因:

因为构建环境将会上传到Docker守护进程,而复制是在Docker守护进程中进行的。任何位于构建环境之外的东西都是不可用的。COPY指令的目的的位置则必须是容器内部的一个绝对路径。
---《THE DOCKER BOOK》

ADD

将主机的文件复制到镜像中,跟COPY一样,限制条件和使用方式都一样,如:

ADD application.yml /etc/springboot/hello-service/src/resources

但是ADD会对压缩文件(tar, gzip, bzip2, etc)做提取和解压操作。

Dockerfile中的COPY和ADD的区别

满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩。

Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中,都是在构建镜像的过程中完成的。COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。

EXPOSE

暴露镜像的端口供主机做映射,启动镜像时,使用-P参数来讲镜像端口与宿主机的随机端口做映射。使用方式(可指定多个):

EXPOSE 8080
EXPOSE 8081
...

WORKDIR

在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录。如:

WORKDIR /usr/local
WORKDIR webservice
RUN echo 'hello docker' > text.txt
...

最终会在/usr/local/webservice/目录下生成text.txt文件

ONBUILD

当一个包含ONBUILD命令的镜像被用作其他镜像的基础镜像时(比如用户的镜像需要从某为准备好的位置添加源代码,或者用户需要执行特定于构建镜像的环境的构建脚本),该命令就会执行。
如创建镜像image-A

FROM ubuntu
...
ONBUILD ADD . /var/www
...

然后创建镜像image-B,指定image-A为基础镜像,如

FROM image-A
...

然后在构建image-B的时候,日志上显示如下:

Step 0 : FROM image-A
# Execting 1 build triggers
Step onbuild-0 : ADD . /var/www
...

USER

指定该镜像以什么样的用户去执行,如:

USER mongo

VOLUME

用来向基于镜像创建的容器添加卷。比如你可以将mongodb镜像中存储数据的data文件指定为主机的某个文件。(容器内部建议不要存储任何数据)
如:

VOLUME /data/db /data/configdb

注意:VOLUME 主机目录 容器目录

CMD

容器启动时需要执行的命令,如:

CMD /bin/bash

同样可以使用exec语法,如:

CMD ["/bin/bash"]

当有多个CMD的时候,只有最后一个生效。

ENTRYPOINT

作用和用法和CMD一模一样

有个老铁总结了一个图我绝对很好:

制作步骤

创建存放Dockerfile的目录,后续操作将在这个目录下进行。

mkdir docker_demo
cd docker_demo

编写Dockerfile文件

touch mydockerfile
vim mydockerfile
FROM centos
MAINTAINER 1026825281@qq.comCOPY test1.txt /root/test1.txt
ADD test2.txt /root/test2.txt# 指定该镜像以什么样的用户去执行
USER nanlistCMD echo "success--------------ok"

build构建镜像

命令:docker build -f mydockerfile -t nanlist/mycentos:0.1 .
docker build 是docker创建镜像的命令
-f :根据条件过滤显示的内容
-t 是标识新建的镜像属于 jielun/的
ebox是仓库的名称
:v2 是tag
"."是用来指明 我们的使用的Dockerfile文件当前目录的

创建完成后,从镜像创建容器

创建容器命令:

docker run -it --name mycentos -v /home:/home  mycentos:0.1  bash

创建成功:
在这里插入图片描述

利用Dockerfile制作自己的Docker镜像相关推荐

  1. dockerfile安装yum_Docker镜像-基于DockerFile制作yum版nginx镜像

    Docker镜像-基于DockerFile制作yum版nginx镜像 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. DockerFile可以说是一种能被Docker程序解释的脚本, ...

  2. 破解elasticsearch(制作破解版docker镜像)

    破解elasticsearch(制作破解版docker镜像) 本文仅用于学习交流,要使用elasticsearch的付费功能,请通过正规渠道购买platinum(白金)版. 一.部署纯净版elasti ...

  3. 使用dockerfile制作定时执行任务镜像

    基于debian系统制作定时执行任务镜像.制作过程遇到几个难题: 1.怎么让docker运行时,crontab的服务是启动状态? 2.dockerfile的环境变量怎么传递给脚本使用? 3.怎样在cr ...

  4. 制作自己的docker镜像

    一.准备工作 准备一个用来制作镜像的容器.这里我们使用centos安装nginx的容器.容器的制作方法如下 拉取 CentOS7 镜像 1.docker images 当前镜像空  2.docker ...

  5. 制作canal-adapter的docker镜像

    说明: 因为我们的中间件都是使用docker进行管理的,但是canal官方就很奇怪,在https://hub.docker.com/search?q=canal里面提供了canal-server和ca ...

  6. 制作Jexus的Docker镜像

    1.从jexus官网下载最新版本的jexus,要是专业版的,解压到jexus目录下.default目录里面放的是网站文件. Dockerfile #base image FROM centos# MA ...

  7. 制作各种docker镜像

    做了一个星期的镜像,收货颇多,现在整理记录下来,当做工作笔记吧.把常用的几个镜像的Dockerfile分享下. 制作基础docker镜像 制作基础镜像网上有很多实例,可以参考下开源中国的这篇文章:ht ...

  8. Docker镜像、容器数据卷和Dockerfile

    Docker镜像 概述 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. UnionFS ...

  9. x86 下制作 ARM Docker 镜像,Docker Hub、Travis 自动构建 qemu-user-static

    一般情况下,Docker 的镜像都是在一个已有的镜像内,一步步运行给定的命令,从而生成一个新的镜像.这样的步骤在大多数人使用的 x86 架构计算机上都不是问题,由于架构互相兼容,一台计算机上生成的镜像 ...

  10. 分布式事务seate-server的docker镜像的制作与部署

    Seata 是一款开源的分布式事务解决方案,致力于提供高性能与简单易用的分布式事务服务,为用户提供了 AT.TCC.SAGA 和 XA 几种不同的事务模式.在 Seata 中主要有以下三种角色,其中 ...

最新文章

  1. 库克:苹果收取 30% 佣金很合理!
  2. Shell编程之matrix---装逼又炫酷
  3. python DbUtils 使用教程
  4. strspn php,php返回在字符串中包含 charlist 参数中指定的字符数目的函数strspn()
  5. springboot引入外部yml配置文件
  6. zabbix html使用c语言写的,zabbix 自定义LLD
  7. C++实现俄罗斯方块
  8. dijkstra 算法_路径规划算法总结
  9. 拓端tecdat|R语言广义线性模型索赔频率预测:过度分散、风险暴露数和树状图可视化
  10. 图纸管理软件保证图纸最新版本正确方法
  11. 小米的过去、现在和未来
  12. 2018CVPR:Non-local Neural Networks(自注意力机制捕获远程依赖)
  13. 分频器+计数器+数码管显示VHDL
  14. 今年职高计算机数学高考试题,湖南职高对口数学高考试卷
  15. html5霓虹效果代码,HTML5 canvas蜂巢式彩色霓虹背景效果
  16. 基于涂鸦智能开发的墨水屏座位管理器——2.嵌入式功能实现篇
  17. 智库大会 | 高端对话:智能科技推动管理学变革
  18. 网站建设在网络推广中有哪些作用和影响
  19. tiktok直播带货怎么搞? 具体操作步骤是什么?
  20. 【文献研究】班轮联盟下合作博弈的概念

热门文章

  1. 数据量再大也不怕!笔记本电脑也可以分析 100GB 数据
  2. eclipse安装教程_eclipse安装教程jdk
  3. 实战丨Web云开发项目—TodoList待办事项
  4. 目标级联分析法( Analytical Target Cascading , ATC )理论matlab程序
  5. 相信我,SDRAM真的不难(五)----读操作(页突发模式)
  6. 机器人之自动回归原点方法实现
  7. STM32F7--->SDRAM
  8. IOS学习笔记-加速度传感器(重力感应)-UIAccelerometer
  9. css float与学习骑自行车
  10. 如何从Mixamo下载人物模型的动画