【Docker自定制镜像之Dockerfile】
镜像的定制,就是定制每一层所添加的配置、文件,如果可以把每一层修改、安装、构建、操作的命令都写入到一个脚本中,用脚本来构建、定制镜像,这个脚本就是Dockerfile
Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容就是没每一层应当如何构建的.
Dockerfile ---------⬇️
FROM
指定基于哪个镜像文件来构建新的镜像,尽量使用官方的bash image
示例:
FROM 镜像名/镜像ID[:tag]
LABEL
容器元消息,帮助信息,Metadata,类似于代码注释
示例:
LABEL version="1.0" 版本标示
LABEL maintainer="name @163.com" 声明制作人
RUN
创建镜像时执行的命令
WORKDIR
切换工作目录
COPY
把本机的文件添加到容器中
示例:
COPY flask_web.py /app/ 把本机的flask_web.py文件复制到容器中的/app目录下,会自动创建/app目录
ADD
除了COPY的功能外还有解压功能,应优先使用COPY命令
ENV
设置环境变量,尽可能的使用ENV来设置环境变量,以增加可维护性
示例:
ENV MYSQL_VERSION 5.6 设置一个MySQL常量
RUN yum install -y mysql-server="${MYSQL_VERSION}" 调用MySQL常量
CMD
设置容器启动后默认执行的命令和参数
⚠️如果定义多个CMD,则只有最后一个会执行
⚠️如果 docker run 时指定了其它命令(例如:/bin/bash、python flask_web.py),则CMD命令会被忽略
EXPOSE
网络设置
示例:
EXPOST 8080 暴露容器的8080端口
VOLUME
存储设置
ENTRYPOINT
设置容器启动时运行的命令
让容器以应用程序或服务的形式运行,不会被忽略,一定会执行
关于Shell格式和Exec格式
对于相对的命令,Shell格式与Exec格式的对比如下.
Shell格式RUN yum -y install vim
CMD echo "Hello Docker"
ENTRYPOINT echo "Hello Docker"
Exec格式
RUN ["apt-get", "install", "-y", "vim"]
CMD ["/bin/echo", "Hello Docker"]
ENTRYPOINT["/bin/echo","Hello Docker"]
需要注意的是:
通过Shell格式运行的命令可以读取设置的变量,而Exec格式则不可以读取,Exec格式仅仅是执行一个命令.
下面将使用Dockerfile来制作一个Flask Web服务
首先,准备一个用于调用Flask web服务的脚本:"""flask_web.py文件代码如下"""
from flask import Flask
app=Flask(__name__)
@app.route('/')
def run():
return 'is ok'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080) # 我们这里使用的是8080端口
然后,开始写Dockerfile:
# 指定基于哪个基础镜像来构建
FROM python:2.7 # 制作人
LABEL maintainer='zyk 137326237@qq.com' # 安装flask第三方库
RUN easy_install flask # 将本机的flask_web.py文件复制到容器的/app目录下,会自动生成/app目录
COPY flask_web.py /app/ # 进入/app目录
WORKDIR /app # 暴露容器的8080端口
EXPOSE 8080 # 设置容器启动后默认执行的命令和参数,以Exec格式执行,注意:要用双引号
CMD ["python", "flask_web.py"]
最后,制作镜像:
# ⚠️ Dockerfile与flask_web.py文件在同级目录
[root@fedora docker]# ls
Dockerfile flask_web.py # 开始制作镜像
[root@fedora docker]# docker build -t zyk/flask .
制作完成后,查看镜像并启动:
# 查一下镜像ID
[root@fedora docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zyk/flask latest c4e156f3222a 50 seconds ago 911 MB # 启动镜像
[root@fedora docker]# docker run -d -p 9000:8080 c4e156f3222a
好了,打开浏览器访问测试:
【Docker自定制镜像之Dockerfile】的更多相关文章
- docker自定制镜像
概述 很多情况下我们需要自定制镜像,如果自定制过程中需要下载配置很多包,而且这些包之间还有依赖关系,那么如果我们手动去操作的话就会很麻烦,正确的做法是把操作的命令封装到一个文件里,然后直接执行这个文件 ...
- Docker学习笔记三 Dockerfile 指令 定制镜像
本文地址:https://www.cnblogs.com/veinyin/p/10412079.html 镜像是分层存储的,每一层都是独立存在的,修改当前层并不会修改其依赖的上一层,删除某一层也只是 ...
- Docker Dockerfile 定制镜像(转)
转自: https://yeasy.gitbooks.io/docker_practice/ 及 https://blog.csdn.net/wo18237095579/article/details ...
- Docker 学习笔记(二):Dockerfile 定制镜像
镜像的定制实际上就是定制每一层所添加的配置.文件. 如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么之前提及的无法重复的问题.镜像构建透明性的问题.体积 ...
- Docker Dockerfile 定制镜像
使用 Dockerfile 定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么无法重复的问题 ...
- 用前端姿势玩docker【二】dockerfile定制镜像初体验
前言 书接上文,关于dockerfile指令的api在此处不做赘述,在此只是记录下注意事项: '示坑以埋之'. 配置指令 FROM dockerfile必须以此开头 一个dockerfile可执行添加 ...
- Docker用Dockerfile定制镜像
用Dockerfile定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那之前提示的无法重复的问题 ...
- Docker - 定制镜像
Dockerfile Docker Hub拥有大量高质的官方镜像:可直接使用的服务类镜像.语言应用镜像.基础操作系统镜像等,满足绝大部分需求. 此外,可以通过定制镜像的方式来满足实际使用中的特定需求. ...
- Docker入门之--定制镜像
1. 首先定制一个Web 服务器为例 1.1 启动镜像 执行下面命令 docker run --name webserver -d -p 80:80 nginx 1.2 查看容器和镜像状态 然后执行下 ...
随机推荐
- GBK编码具体解析(附GBK码位分布图)
1.GBK码位分布图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA= ...
- Dubbo分布式服务框架入门(附project)
要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比方我想开发一个网上商城项目.这个网上商城呢,比較复杂.分为pc端web管理后台.微信端销售公众号,那么我们分成四个项目,pc端站点,微 ...
- ckeidtor编辑器添加图片上传功能
1.ckeditor默认没有上传图片功能,只能通过Url显示图片,图下图 2.首先说明,ckeditor是有上传功能的,只是隐藏了,需要通过配置让它显示 找到ckeditor/plugins/imag ...
- [学习笔记]BS架构与CS架构
整理自:http://www.iteye.com/problems/102411 前两天面试的时候被问到这个问题,没有回答上来因此在这里学习整理一下. B/S架构 B/S架构的全称为Browser/S ...
- 项目中访问controller报错:HTTP Status 500 - Servlet.init() for servlet spring threw exception
直接访问controller路径http://localhost:8080/index报错: HTTP Status 500 - Servlet.init() for servlet spring t ...
- 日志文件支持unicode字符的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 开发的程序兼容多字节字符集和unicode字符集,最近发现一个问题,在unicode字符集下输出的日志文件是乱码的.显 ...
- sql的系统关键字的概述
create proc proc_B as SELECT * FROM [ZkbTest].[dbo].[T_ZKB] exec sp_helptext proc_B select * from sy ...
- windows, fast-rcnn CPU版本的安装配置
一:安装准备 1:caffe的安装配置,本人用的是happynear大神的caffe版本,具体链接https://github.com/happynear/caffe-windows,编译时需要用到p ...
- 一篇文章教会你理解Scrapy网络爬虫框架的工作原理和数据采集过程
今天小编给大家详细的讲解一下Scrapy爬虫框架,希望对大家的学习有帮助. 1.Scrapy爬虫框架 Scrapy是一个使用Python编程语言编写的爬虫框架,任何人都可以根据自己的需求进行修改,并且 ...
- 测试cnblog文章内部JS
添加几个按钮 行内js 写法: <button onclick="javascript:alert('行内js')">行内js</button> 注意:al ...
