利用dockerfile定制镜像
利用dockerfile定制镜像
- 镜像的定制就是定制每一层所添加的配置、文件。如果可以吧每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile。
- Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
- #指定一个基础镜像
- FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
- FROM centos #使用base image
- FROM ubuntu:14.04 #带有tag的base image
- LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
- LABEL maintainer=“yc_uuu@163.com"
- #对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
- RUN yum update && yum install -y vim \
- Python-dev #反斜线换行
- RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”
- WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
- WORKDIR /test #如果没有就自动创建
- WORKDIR demo #再进入demo文件夹
- RUN pwd #打印结果应该是/test/demo
- #ADD是添加文件,从物理机本地,添加到容器空间内
- ADD and COPY
- ADD hello / #把本地文件添加到镜像中,把本地的hello可执行文件拷贝到镜像的/目录
- ADD test.tar.gz /tmp #将物理环境下的test添加到容器tmp目录并解压,但是建议使用copy
- WORKDIR /root
- ADD hello test/ #进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径
- COPY hello test/ #等同于上述ADD效果
- ADD与COPY
- - 优先使用COPY命令
- -ADD除了COPY功能还有解压功能
- 添加远程文件/目录使用curl或wget
- ENV #环境变量,尽可能使用ENV增加可维护性
- ENV MYSQL_VERSION 5.6 #设置一个mysql常量
- RUN yum install -y mysql-server=“${MYSQL_VERSION}”
- VOLUME and EXPOSE
- 存储和网络
- RUN and CMD and ENTRYPOINT
- RUN:执行命令并创建新的Image Layer
- CMD:设置容器启动后默认执行的命令和参数
- ENTRYPOINT:设置容器启动时运行的命令
- Shell格式和Exec格式
- RUN yum install -y 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格式去运行命令,会读取$name指令,而exec格式是仅仅的执行一个命令,而不是shell指令
- cat Dockerfile
- FROM centos
- ENV name Docker
- ENTRYPOINT [“/bin/echo”,”hello $name”]#这个仅仅是执行echo命令,读取不了shell变量
- ENTRYPOINT [“/bin/bash”,”-c”,”echo hello $name"]
- CMD
- 容器启动时默认执行的命令
- 如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略
- 如果定义多个CMD,只有最后一个执行
- ENTRYPOINT
- 让容器以应用程序或服务形式运行
- 不会被忽略,一定会执行
- 最佳实践:写一个shell脚本作为entrypoint
- COPY docker-entrypoint.sh /usr/local/bin
- ENTRYPOINT [“docker-entrypoint.sh]
- EXPOSE 27017
- CMD [“mongod”]
- [root@master home]# more Dockerfile
- FROm centos
- ENV name Docker
- #CMD ["/bin/bash","-c","echo hello $name"]
- ENTRYPOINT ["/bin/bash","-c","echo hello $name”]
打包flask程序与dockerfile
环境准备
- [root@localhost ~]# cd /opt/
- [root@localhost opt]# mkdir mydocker
- [root@localhost opt]# cd mydocker/
- [root@localhost mydocker]# touch myflask.py
- [root@localhost mydocker]# vim myflask.py
写入一下内容
- #coding:utf8
- from flask import Flask
- app=Flask(__name__)
- @app.route('/')
- def hello():
- return "hello docker"
- if __name__=="__main__":
- app.run(host='0.0.0.0',port=8080)
准备构建dockerfile,用于生成镜像
拷贝本地的yum仓库到容器内部空间
- [root@localhost mydocker]# cp /etc/yum.repos.d/CentOS-Base.repo .
- [root@localhost mydocker]# cp /etc/yum.repos.d/epel.repo .
- [root@localhost mydocker]# ll
- 总用量 12
- -rw-r--r--. 1 root root 2523 3月 14 19:29 CentOS-Base.repo
- -rw-r--r--. 1 root root 664 3月 14 19:30 epel.repo
- -rw-r--r--. 1 root root 176 3月 14 19:19 myflask.py
创建Dockerfile文件,必须大写的D开头
- [root@localhost mydocker]# touch Dockerfile
写入内容
- FROM centos #指定一个基础镜像
- COPY CentOS-Base.repo /etc/yum.repos.d/ #拷贝本地的yum仓库,到容器空间内
- COPY epel.repo /etc/yum.repos.d/
- RUN yum clean all #清除yum缓存
- RUN yum install python-setuptools -y
- RUN easy_install flask #linux默认使用python2,想要使用python3使用RUN 执行命令安装
- COPY myflask.py /opt/
- WORKDIR /opt
- EXPOSE 8080 #暴露容器的8080端口,供给物理机去映射访问,myflask.py 设置的端口
- CMD ["python","myflask.py"] #cmd代表执行命令
- [root@localhost mydocker]# ls
- CentOS-Base.repo Dockerfile epel.repo myflask.py
构建镜像
确保文件在同一目录
- [root@localhost mydocker]# ll
- 总用量 16
- -rw-r--r--. 1 root root 2523 3月 14 19:29 CentOS-Base.repo
- -rw-r--r--. 1 root root 281 3月 14 20:47 Dockerfile
- -rw-r--r--. 1 root root 664 3月 14 19:30 epel.repo
- -rw-r--r--. 1 root root 176 3月 14 19:19 myflask.py
- [root@localhost mydocker]# docker build .
- 会去执行当前目录中的Dockerfile文件
- 构建了一个ID为a7f439ad8953 的镜像
- ---> a7f439ad8953
- Successfully built a7f439ad8953
- [root@localhost mydocker]# docker tag a7f myflask
- [root@localhost mydocker]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- myflask latest a7f439ad8953 3 minutes ago 346MB
运行镜像,生成容器实例
- [root@localhost mydocker]# docker run -p 8080:8080 -d a7f
- e6e1721be1c346f05c8913c2efed6bb3f3564f97ff6b2e64caad18d64c6a5e32
- [root@localhost mydocker]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- e6e1721be1c3 a7f "python myflask.py" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp thirsty_swanson
查看容器的映射状态
- [root@localhost mydocker]# docker port e6e
- 8080/tcp -> 0.0.0.0:8080
访问windows
- http://192.168.11.174:8080/
利用dockerfile定制镜像的更多相关文章
- 利用 Dockerfile 定制镜像
镜像的定制实际上就是定制每一层所添加的配置.文件. 如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像, 那么之前提及的无法重复的问题.镜像构建透明性的问题.体 ...
- Docker 学习笔记(二):Dockerfile 定制镜像
镜像的定制实际上就是定制每一层所添加的配置.文件. 如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么之前提及的无法重复的问题.镜像构建透明性的问题.体积 ...
- Dockerfile定制镜像
一.Dockerfile是什么? 镜像定制实质就是定制每一层所添加的配置.文件. Dockerfile就是一个脚本来构建和定制镜像,把每一层的修改.安装.构建.操作都写入脚本.以此来解决体积.镜像构建 ...
- 微服务架构 ------ Dockerfile定制镜像
Docker容器不仅仅是运行原生的容器,而是把我们的具体的项目能够布置到容器上面去,这就是Docker定制镜像需要做的事情. Docker容器 = new Docker镜像 镜像相当于类,容器相当 ...
- Docker Dockerfile 定制镜像
使用 Dockerfile 定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么无法重复的问题 ...
- Docker用Dockerfile定制镜像
用Dockerfile定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那之前提示的无法重复的问题 ...
- docker学习笔记6:利用dockerfile创建镜像介绍(生成简单web服务器镜像)
本文介绍如何利用dockerfile来创建镜像.下面介绍具体的操作过程: 一.创建构建环境 操作示例如下: xxx@ubuntu:~$ pwd /home/xxx xxx@ubuntu:~$ mkdi ...
- Docker Dockerfile 定制镜像(转)
转自: https://yeasy.gitbooks.io/docker_practice/ 及 https://blog.csdn.net/wo18237095579/article/details ...
- 使用Dockerfile定制镜像
Dockerfile是一个文本文件,其中包含额一条一条的指令,每一条指令构建一层,因此每一条指令的作用就是描述这一层应当如何的构建. 以构建nginx镜像为例,使用Dockerfile构建的步骤如下: ...
随机推荐
- n个随机变量中第k小值的期望
Problem 有\(n\)个相互独立的取值在\([0,1]\)的随机变量,问其中第\(k\)小的变量期望是多少? Solution 之前pkuwc的神仙找我换友链,让我受宠若惊.. 我今天突然翻到他 ...
- MySQL中adddate学习
-- 修改时间:ADDDATE(date,INTERVAL expr unit) -- 含义:date时间,expr 表达式值,unit表达式对应的时间单位 -- unit : SECOND,MINU ...
- Ex 5_28 Alice想要举办一个舞会..._第十次作业
根据总人数建立顶点数量为总人数的无向图,顶点之间有边相连表示两个人相互认识,没有边则表示不认识.对于每一个顶点v,设d(v)表示顶点的度,若d(v)<5,即v认识的人数少于5,则不邀请v,若d( ...
- 解执行maven项目出现 SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. error
最近再弄maven项目,运行起来没有问题,但是Console控制台会报错,比如说如下的问题异常提示: 由此我们可以看出,报出错误的地方主要是slf4j的jar包,而故障码中“Failed to loa ...
- php工厂模式的实例
* 单例模式:用于创建单一类型的唯一实例对象 * 工厂模式:用于创建多种类型的多个实例对象 //声明形状类 class Shape { //声明静态方法create,根据容器形状不同,创建不同图形类的 ...
- JQuery中jsCharts图表插件(十)
一:1.jsCharts图表插件 注意:从官方下来的例子都没指定页面编码,在这种情况下,浏览器就会使用默认设置中文编码:GB2312,GBK等:导致无法执行. 请在html代码中的<head&g ...
- poj 2349 求MST中第S大的权值
题目大意: 有一些炮台,如果这个炮台有卫星接收器,那么任意两个有卫星接收器的炮台可以通信,不受距离限制:否者,两个炮台之间只能通过对讲机通信,这是受距离限制的.要买一种对讲机,用在需要的炮台上,要求所 ...
- SpringBatch 错误积累
1.如果nextStep在该JOB中还没有配置,也就是说nextStep还不存在的情况下,就会报错 <end on="EIXT WITH IMBALANCE" /> & ...
- free -m图解
- Mysql 双主架构配置从复制
引用自:https://blog.csdn.net/deeplearnings/article/details/78398526 https://www.cnblogs.com/ygqygq2/p/6 ...