【Docker】Dockerfile构建镜像与命令详解
前言
传统方式部署集群,你需要在每台机器搭建环境,配置各种中间件,这样不但效率低下,而且很难保证环境的一致性,而且配置如果有改动,需要挨个机器修改。
有了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构建镜像与命令详解相关推荐
- docker exec执行多个命令详解
2019独角兽企业重金招聘Python工程师标准>>> docker exec执行多个命令详解 2018年04月23日 22:46:24 阅读数:6928 标签: dockercon ...
- dockerfile构建镜像的命令_编写Dockerfile的最佳实践
虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以进行版本控制,但是很多人构建镜像的时候,都有一种冲动--把可能用到的东西都打包到镜像中.这种不正当的 Dockerfile 使用也会 ...
- linux的备份命令详解,docker备份linux系统的命令详解
tar备份系统 sudo tar cvpzf backup.tgz --exclude=/proc --exclude=/mnt --exclude=/sys --exclude=/backup.tg ...
- 【一篇文章搞懂】dockerfile构建镜像的命令
一.Java基础 1.java中有哪些基本类型? 2.java为什么能够跨平台运行? 3.String是基本数据类型吗?我可不可以写个类继承于String? 4.谈谈&和&&的 ...
- Docker 从Dockerfile 构建镜像 :build 命令的用法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Dockerfile 创建完成后,可以使用 docker build 命令根据 Dockerfile ...
- Dockerfile构建镜像最佳实践
参考文章:Dockerfile构建镜像最佳实践 在前文Dockefile及命令详解中我们已经学习了如何通过Dockerfile构建镜像以及命令的详细说明,但是在生产环境或项目使用时如何构建出一个尽可能 ...
- Docker(三):Dockerfile 命令详解
上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dockerfile 的使用,这篇文章我们来继续了解 Dockerfile ,学习 Dockerfile 各种命令的使用. Dock ...
- docker build命令详解_Docker镜像与容器常用命令图文详解
一.系统命令 #查看docker版本 docker version #查看docker的系统信息,包含镜像容器的数量 docker info #查看docker的所有命令 docker --help ...
- docker常用命令详解
docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...
最新文章
- linux 空文件 sed 不能写入数据
- MySQL 到PostgreSQL 的数据迁移工具
- 比紫书优化,14行代码AC——例题 5-7 丑数(Ugly Numbers,UVa 136)——解题报告
- Servlet和JSP之间的区别
- 使用github托管代码以及github一些最常用的命令
- 读《财务自由之路》教会我的道理
- Windows远程文件拷贝openEuler--WinSCP
- android 循环弹幕,Android中如何动态获取弹幕内容
- Java运算符(Operator)之 算数运算符(ArithmeticOperator)
- Spring中控制反转IoC理论推导
- Linux 命令(82)—— chgrp 命令
- C++析构函数为什么要为虚函数?
- 极域电子教室卸载、忘记密码解决方案
- 浏览器 Cookie 的使用
- php漂浮广告代码,js 居中漂浮广告_广告代码
- 计算机青年教师基本功大赛,北京高校第九届青年教师基本功比赛纪实
- 输入法的新时代:搜狗、讯飞、百度鏖战智能语音
- CNAS 认证机构认可规范文件清单
- 桌面计算机回收站打不开,b8,教您电脑回收站打不开怎么解决
- React中文文档之Thinking in React