前言

传统方式部署集群,你需要在每台机器搭建环境,配置各种中间件,这样不但效率低下,而且很难保证环境的一致性,而且配置如果有改动,需要挨个机器修改。

有了Docker,上述问题都能解决。但是官方镜像大多时候并不能满足需求,因此需要自己构建适用于应用的镜像。构建镜像可以以交互式方式启动并进入容器,对容器修改后退出容器并通过commit命令提交一个新的镜像,但是这种方式构建的镜像不利于后期维护。我们通常是通过编辑Dockerfile,再通过build命令来构建镜像,后面只需要看Dockerfile,镜像信息便一目了然。

有了镜像如何部署集群?

  • 第一种方式:(集群无法连接外网的情况下)可以把构建好的镜像,通过save命令把镜像文件保存下来,通过外部介质拷贝到机器上面,再通过load命令加载
  • 第二种方式:把打包好的镜像,push到DockerHub,直接在集群的结点拉取镜像即可,也是最简单的方式

正文


1. 什么是Docker镜像

安装过操作系统的同学,应该对这个概念比较熟悉。我们安装操作系统,通常是把镜像文件刻录到U盘,然后可以在多个机器上安装操作系统。有了Docker镜像,我们也可以在不同机器上启动容器,这是两者的相似之处。

Docker与虚拟机也非常相似,它们最重要的区别就是虚拟机是基于硬件的,而Docker容器是基于内核的

1.1. Docker的文件系统层

Docker镜像结构类似于Linux的虚拟化栈,可以看到第一层(栈底)为Linux内核,接着是引导文件系统。第二层是基础镜像,它可以是某种系统(Centos,Ubuntu等)。基于基础镜像,进而可以构建出更多的镜像,第三层,第四层等。但是对外只暴露栈顶的文件系统

1.2. 写时复制

镜像层的文件系统都是只读的,启动容器时,会把最外层镜像复制到读写层(writeable container),容器便在这个栈区域运行,提交新的镜像也相当于压栈的过程


2. 使用Dockerfile构建镜像

以下示例,我会基于Centos的基础镜像,构建出一个集成了nginx的镜像

前置条件

  • 机器上安装有Docker环境
  • 创建一个文件夹(用于构建镜像),创建Dockerfile文件(名字必须为Dockerfile)

2.1. 拉取Centos镜像

docker pull centos   //这里我拉取默认版本,也可以指定需要的系统以及版本号
docker images        //查看获取的镜像

2.2. 编辑Dockerfile

Dockerfile内容

  • FROM:基于某个镜像
  • MAINTAINER:作者,以及作者的信息
  • RUN:相当于在容器中执行命令(后面有详细说明)
  • EXPOSE:对外的端口(如果启动容器不指定 -p参数,容器会把自己的80端口,随机映射到宿主机的某个端口),启动命令指定-p端口,会覆盖EXPOSE的作用
FROM centos
MAINTAINER zcl "pianozcl@gmail.com"
RUN yum install -y nginx
RUN echo "I am in your container" >/usr/share/nginx/html/index.html
EXPOSE 80

2.3. 使用build命令构建

**注意后面的(点)’.’**用于指定Dockerfile位置,我的在当前文件夹下所以是点,也可以替换成远程的git仓库,前提是该仓库根目录下有Dockerfile

docker build -t="pianozcl/test_nginx:v1" .                //格式为"镜像仓库/镜像名词:版本"

执行完以上命令会执行Dockerfile中的指令,最后构建生成如下新镜像

2.4. 启动容器

  • -p: 端口映射(宿主机端口:容器端口)
  • nginx -g “daemon off;” :nginx启动参数,nginx默认以守护进程方式启动,指定该参数改为nginx在前台运行,这样docker容器才能感知到nginx进程,没有该参数容器将会立即关闭。注意;别漏了
docker run -d -p 80:80 --name nginx_test pianozcl/test_nginx:v1 nginx -g "daemon off;"  //启动

docker ps -l 可以查看到当前启动的容器,以及端口映射

打开浏览器可以看到我们在dockerfile中写入的信息


3. Dockerfile指令

3.1 CMD

CMD和RUN类似,后面跟着需要执行的指令。不同的是RUN作用于构建镜像过程,而CMD是容器启动时指定的命令

docker run -i -t pianozcl/centos /bin/bash
//以上命令等同于以下---------------------------------------
在Dockerfile中写入CMD ["/bin/bash"]
然后启动容器执行docker run -i -t pianozcl/centos
  • Dockerfile只能指定一条CMD命令,如果有多条也只会执行最后一条
  • docker run命令如果指定了命令,会覆盖Dockerfile中的CMD命令

3.2. ENTRYPOINT

ENTRYPOINT和CMD同样时之行命令的参数,区别是CMD会被docker run命令参数覆盖,而ENTRYPOINT会接收docker run命令的参数,并能结合使用

例如:
Dockerfile中的命令为: ENTRYPOINT ["nginx"]
启动命令为:                       docker run -t -i pianozcl/test_nginx -g "daemon off;"
//以上操作相当于以下命令-----------------------------------------
docker run -t -i pianozcl/test_nginx nginx -g "daemon off;"

ENTRYPOINT还可以结合CMD使用

  • 当docker run没有指定命令参数,ENTRYPOINT会结合CMD起作用
  • 指定的话,ENTRYPOINT会结合命令行参数起作用,覆盖CMD作用
如果Dockerfile命令为:
ENTRYPOINT ["nginx"]
CMD ["-h"]
---------------------------------------------
docker run -t -i pianozcl/test_nginx
相当于
docker run -t -i pianozcl/test_nginx nginx -h
---------------------------------------------
docker run -t -i pianozcl/test_nginx -g "daemon off;"
相当于
docker run -t -i pianozcl/test_nginx nginx -g "daemon off;"

3.3. WORKDIR

RUN和ENTRYPOINT执行时候的工作目录,例如如下Dockerfile

WORKDIR /home/test1
RUN bundle install              //第二条命令作用在test1目录下
WORKDIR /home/test2
ENTRYPOINT [ "rackup" ]       //第四条命令作用在test2目录下

也可以在docker run启动通过-w参数覆盖Dockerfile指定的目录

sudo docker run -ti -w /var/log ubuntu pwd /var/log

3.4. ENV

配置环境变量,就像指定了命令所在目录的前缀

Dockerfile
ENV JAVA_HOME /home/mybin
-----------------------------------------
RUN test.sh
相当于
RUN /home/mybin/test.sh

3.5. ADD & COPY

两者都是将当前构建环境上的文件,打包复制打包进镜像中,区别是ADD复制过程中,如果是会对原本的压缩文件进行提取解压操作,COPY则是原封不动的复制

COPY app.jar /opt/application/app.jar            //把当前目录jar文件复制到容器的application目录下

【Docker】Dockerfile构建镜像与命令详解相关推荐

  1. docker exec执行多个命令详解

    2019独角兽企业重金招聘Python工程师标准>>> docker exec执行多个命令详解 2018年04月23日 22:46:24 阅读数:6928 标签: dockercon ...

  2. dockerfile构建镜像的命令_编写Dockerfile的最佳实践

    虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以进行版本控制,但是很多人构建镜像的时候,都有一种冲动--把可能用到的东西都打包到镜像中.这种不正当的 Dockerfile 使用也会 ...

  3. linux的备份命令详解,docker备份linux系统的命令详解

    tar备份系统 sudo tar cvpzf backup.tgz --exclude=/proc --exclude=/mnt --exclude=/sys --exclude=/backup.tg ...

  4. 【一篇文章搞懂】dockerfile构建镜像的命令

    一.Java基础 1.java中有哪些基本类型? 2.java为什么能够跨平台运行? 3.String是基本数据类型吗?我可不可以写个类继承于String? 4.谈谈&和&&的 ...

  5. Docker 从Dockerfile 构建镜像 :build 命令的用法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Dockerfile 创建完成后,可以使用 docker build 命令根据 Dockerfile ...

  6. Dockerfile构建镜像最佳实践

    参考文章:Dockerfile构建镜像最佳实践 在前文Dockefile及命令详解中我们已经学习了如何通过Dockerfile构建镜像以及命令的详细说明,但是在生产环境或项目使用时如何构建出一个尽可能 ...

  7. Docker(三):Dockerfile 命令详解

    上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dockerfile 的使用,这篇文章我们来继续了解 Dockerfile ,学习 Dockerfile 各种命令的使用. Dock ...

  8. docker build命令详解_Docker镜像与容器常用命令图文详解

    一.系统命令 #查看docker版本 docker version #查看docker的系统信息,包含镜像容器的数量 docker info #查看docker的所有命令 docker --help ...

  9. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

最新文章

  1. C++ Primer Plus学习:第十章
  2. 全球及中国食品色素行业供应前景与发展趋势研究报告2022版
  3. u盘重置后计算机不显示了,u盘不显示盘符怎么办
  4. apache 和 nginx 301重定向配置方法
  5. 一段顺序颠倒能读通的文字_钓鱼也有逻辑顺序,总是钓不到鱼的原因就在这里...
  6. 数据库重建索引 计划任务
  7. 手把手教你如何利用Kickstart自动安装虚拟机
  8. 李宏毅机器学习 1.Machine Learning_introduction
  9. 数据驱动编程之表驱动法
  10. 区分指针数组和数组指针
  11. AutoRunner简介
  12. 【LInux入门手册】目录结构 常用指令与操作 vim与tmux
  13. html 怎么让背景图铺满整个页面
  14. 图像处理(十一)高斯差分算法(边缘检测)
  15. 一年降本 40%:基于云服务的技术成本精细化运营策略
  16. 小米9卡刷Android 11开发版并安装系统证书抓包
  17. Python三维地址建模教程【Gempy】
  18. 关于编写“AUTORUN.inf”一点心得!!!
  19. HDMI 1.4 协议
  20. Axure 9 元件学习——中继器原理/中继器添加、删除行

热门文章

  1. 前端词汇G、H、I、J、L、M
  2. FaceTime 即将推出降噪功能,但您现在就可以使用
  3. 【高效编码】关于IDEA调试的点点滴滴都在此文了。领导看了都说好!!!!
  4. 【houdini hom】俄罗斯方块
  5. js 正则中 replace() 使用
  6. Java写的main方法小游戏
  7. 博客园美化(3)博客园鼠标点击特效代码
  8. 第三章 烂尾楼吃早餐
  9. 20169月17-25日---身体,革命的本钱
  10. python定时器的用法