前言

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

有了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. linux 空文件 sed 不能写入数据
  2. MySQL 到PostgreSQL 的数据迁移工具
  3. 比紫书优化,14行代码AC——例题 5-7 丑数(Ugly Numbers,UVa 136)——解题报告
  4. Servlet和JSP之间的区别
  5. 使用github托管代码以及github一些最常用的命令
  6. 读《财务自由之路》教会我的道理
  7. Windows远程文件拷贝openEuler--WinSCP
  8. android 循环弹幕,Android中如何动态获取弹幕内容
  9. Java运算符(Operator)之 算数运算符(ArithmeticOperator)
  10. Spring中控制反转IoC理论推导
  11. Linux 命令(82)—— chgrp 命令
  12. C++析构函数为什么要为虚函数?
  13. 极域电子教室卸载、忘记密码解决方案
  14. 浏览器 Cookie 的使用
  15. php漂浮广告代码,js 居中漂浮广告_广告代码
  16. 计算机青年教师基本功大赛,北京高校第九届青年教师基本功比赛纪实
  17. 输入法的新时代:搜狗、讯飞、百度鏖战智能语音
  18. CNAS 认证机构认可规范文件清单
  19. 桌面计算机回收站打不开,b8,教您电脑回收站打不开怎么解决
  20. React中文文档之Thinking in React

热门文章

  1. 教你如何使用帝国CMS采集有放网站!
  2. Typora 免费版下载/主题下载
  3. 共享社会经济途径SSP
  4. cocos2dx掼蛋_cocos2dx游戏开发——别踩白块学习笔记(一)——Block类
  5. 分享9款漂亮的浪漫情侣网站模板
  6. [转]C# Open Source
  7. 东南亚男装电商市场如何做出差异化?
  8. Django框架全面速览
  9. 使用360安全卫士修复网络带来的坑
  10. 这样问 bug,怪不得没人回你... | 程序员该有的提问技巧