dockerfile可以允许我们自己创建镜像,通过编写里面的下载软件命令,执行docker build 即可生成镜像文件。

初尝dockerfile

新建一个目录test,然后进入这个目录,创建一个名为Dockerfile的文件,在里面写入以下内容:

FROM alpine:latest
MAINTAINER sbb
CMD echo "hello world"

然后执行下面命令就会生成docker镜像。

$ docker build -t hello-world .

执行docker run hello-world 就会输出hello world了。

可能会有童鞋会问上面写的是什么,下面会根据命令讲解的。

dockerfile命令

dockerfile的指令分为两种:构建指令和设置指令。

构建命令:用于构建镜像的时候执行的,不会在该镜像上的容器里执行。 设置命令:用于设image的属性,将会在运行的容器里执行。

FROM

指定基础image,其实大部分镜像都是基于另一个镜像的基础上去进行修改的,比如说我这个apt-get安装的nginx是基于ubuntu的(上面例子里的alpine是docker提供的最小镜像),这个命令需要放在最前面。

命令格式如下:

FROM 镜像名字:版本

MAINTAINER

构建命令,用于指定创建者是谁。

RUN

构建命令,RUN可以运行全部被基础镜像支持的命令,常用于搭建环境。

RUN apt-get update
RUN apt-get install -y nginx

CMD

设置命令,在docker容器启动时候执行的命令,多个CMD命令存在的话只会运行最后一个CMD命令,因此只需要写一个CMD命令即可。CMD命令有三种执行方式

# 方式一,运行一个可执行文件,并提供参数(like an exec, this is the preferred form)
CMD ["executable","param1","param2"]
# 方式二,利用”/bin/sh -c”去执行, (as a shell)
CMD command param1 param2
# 方式三,作为ENTRYPOINT的默认参数
CMD ["param1", "param2"]

在使用docker run imagename command新建并启动容器的时候,command会替换dockerfile里的CMD命令,如上面我们创建的docker镜像,如果后面输入了hello docker,则不会输出hello world了,本来dockerfile里面指定了输出hello world。

$ docker run hello_docker echo "hello docker"
hello docker
$ docker run hello_docker
hello world

ENTRYPOINT

设置命令,在docker容器启动时候执行的命令,一个dockerfile只能有一个ENTRYPOINT命令,有两种执行方式:

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

和CMD命令很相似,但是区别在于docker run imagename command的时候,command部分是作为参数传给ENTRYPOINT的。

USER

指定允许启动的用户,默认是root

EXPOSE

指定容器要暴露的端口,常用于一些需要通信的应用,如nginx,就会在dockerfile指定暴露80端口,或者在docker run时指定 --expose=1234,这两种方式作用相同,但是--expose可以接受区间范围的端口作为参数。

注意expose暴露的是容器的端口,如果外面主机需要通过端口连接到这个服务,需要进行一个映射,把容器的端口映射到主机的端口。

docker run -p 本地端口:暴露端口 镜像

最后附上一个简单创建nginx的dockerfile

FROM ubuntu
MAINTAINER sbb
RUN apt-get update
RUN apt-get install -y nginx
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
EXPOSE 80

docker学习系列(二):使用Dockerfile创建自己的镜像的更多相关文章

  1. Docker学习笔记之通过 Dockerfile 创建镜像

    0x00 概述 由于 Docker 镜像的结构优势,使它的占用空间远小于普通的虚拟机镜像,而这就大幅减少了 Docker 镜像在网络或者其他介质中转移所花费的时间,进而提高了我们进行迁移部署的效率.不 ...

  2. Docker学习笔记_使用Dockerfile创建flask的一个镜像

    一.实验环境 1.宿主机OS:Win10 64位 2 .虚拟机OS:Ubuntu18.04 64位    虚拟机名称:Ubuntu18VM1   虚拟机IP:192.168.8.25 3.账号:doc ...

  3. Docker学习(三): Dockerfile指令介绍

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  4. Docker学习(二): 镜像的使用与构建

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  5. Docker学习(六)——Dockerfile文件详解

    Docker学习(六)--Dockerfile文件详解 一.环境介绍 1.Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录 ...

  6. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  7. docker学习笔记18:Dockerfile 指令 VOLUME 介绍

    在介绍VOLUME指令之前,我们来看下如下场景需求: 1)容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上.一旦容器删除后,这些数 ...

  8. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  9. [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

    [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...

  10. RabbitMQ学习系列二-C#代码发送消息

    RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...

随机推荐

  1. 6E - 寒冰王座

    不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,只有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前. 死亡骑士:"我要买道具!" ...

  2. rsync 定时备份<crontab+backrsync.sh> 简陋版

    数据需要定时的备份至其它的目录中,但是备份之前检查检查一下是否有rsync正在运行,曾经因为数据过大,导致有很多rsync进程在跑,然后服务器有出现卡死的现象.最终写了一条bash,先检查一下是否有这 ...

  3. hadoop启动

    安装完hadoop集群之后,第一次启动之前必须初始化,之后就可以不用再初始化(注意:初始化操作只可以一次) hdfs namenode -format (hadoop namenode -format ...

  4. (转)Flex 布局教程:

    这个博客的内容比较新,多看看 http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html [语法篇] http://www.ruanyifeng. ...

  5. UnionFind问题总结

    UnionFind就是acm中常用的并查集... 并查集常用操作 另外补充一下STL常用操作 相关问题: 547. Friend Circles 纯裸题噢... class Solution { pu ...

  6. JQuery续

    一.表单属性选择器 :enabled :disabled :checked :selected <body> <form> <input type="check ...

  7. 引用数据类型 Scanner和 Random

    键盘录入Scanner 获取键盘录入的数据,对获取数据的具体操作进行了封装,只需要调用方法,即可得到键盘录入的数据 A:导包            import java.util.Scanner;  ...

  8. 单片机之PID算法

    说到PID算法,想必大部人并不陌生,PID算法在很多方面都有重要应用,比如电机的速度控制,恒温槽的温度控制,四轴飞行器的平衡控制等等,作为闭环控制系统中的一种重要算法,其优点和可实现性都成为人们的首选 ...

  9. Associative Containers

    Notes from C++ Primer Associative containers differ in fundamental respect from the sequential conta ...

  10. Go语言运算符

    目录 算术运算符 注意事项 赋值运算符 逻辑运算符 短路与和短路或 关系运算符 位运算符 其他运算符 运算符优先级 运算符用于在程序运行时执行数学或逻辑运算. Go 语言内置的运算符有:算术运算符.赋 ...