利用dockerfile定制镜像

  1. 镜像的定制就是定制每一层所添加的配置、文件。如果可以吧每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile
  2. Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
  1. #指定一个基础镜像
  2. FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
  3. FROM centos #使用base image
  4. FROM ubuntu:14.04 #带有tag的base image
  5.  
  6. LABEL version=“1.0 #容器元信息,帮助信息,Metadata,类似于代码注释
  7. LABEL maintainer=“yc_uuu@163.com"
  8.  
  9. #对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
  10. RUN yum update && yum install -y vim \
  11. Python-dev #反斜线换行
  12. RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME
  13.  
  14. WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
  15. WORKDIR /test #如果没有就自动创建
  16. WORKDIR demo #再进入demo文件夹
  17. RUN pwd #打印结果应该是/test/demo
  18.  
  19. #ADD是添加文件,从物理机本地,添加到容器空间内
  20. ADD and COPY
  21. ADD hello / #把本地文件添加到镜像中,把本地的hello可执行文件拷贝到镜像的/目录
  22. ADD test.tar.gz /tmp #将物理环境下的test添加到容器tmp目录并解压,但是建议使用copy
  23.  
  24. WORKDIR /root
  25. ADD hello test/ #进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径
  26. COPY hello test/ #等同于上述ADD效果
  27.  
  28. ADDCOPY
  29. - 优先使用COPY命令
  30. -ADD除了COPY功能还有解压功能
  31. 添加远程文件/目录使用curlwget
  32.  
  33. ENV #环境变量,尽可能使用ENV增加可维护性
  34. ENV MYSQL_VERSION 5.6 #设置一个mysql常量
  35. RUN yum install -y mysql-server=“${MYSQL_VERSION}”
  36.  
  37. VOLUME and EXPOSE
  38. 存储和网络
  39.  
  40. RUN and CMD and ENTRYPOINT
  41. RUN:执行命令并创建新的Image Layer
  42. CMD:设置容器启动后默认执行的命令和参数
  43. ENTRYPOINT:设置容器启动时运行的命令
  44.  
  45. Shell格式和Exec格式
  46. RUN yum install -y vim
  47. CMD echo hello docker
  48. ENTRYPOINT echo hello docker
  49.  
  50. Exec格式
  51. RUN [“apt-get”,”install”,”-y”,”vim”]
  52. CMD [“/bin/echo”,”hello docker”]
  53. ENTRYPOINT [“/bin/echo”,”hello docker”]
  54.  
  55. 通过shell格式去运行命令,会读取$name指令,而exec格式是仅仅的执行一个命令,而不是shell指令
  56. cat Dockerfile
  57. FROM centos
  58. ENV name Docker
  59. ENTRYPOINT [“/bin/echo”,”hello $name”]#这个仅仅是执行echo命令,读取不了shell变量
  60. ENTRYPOINT [“/bin/bash”,”-c”,”echo hello $name"]
  61.  
  62. CMD
  63. 容器启动时默认执行的命令
  64. 如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略
  65. 如果定义多个CMD,只有最后一个执行
  66.  
  67. ENTRYPOINT
  68. 让容器以应用程序或服务形式运行
  69. 不会被忽略,一定会执行
  70. 最佳实践:写一个shell脚本作为entrypoint
  71. COPY docker-entrypoint.sh /usr/local/bin
  72. ENTRYPOINT [“docker-entrypoint.sh]
  73. EXPOSE 27017
  74. CMD [“mongod”]
  75.  
  76. [root@master home]# more Dockerfile
  77. FROm centos
  78. ENV name Docker
  79. #CMD ["/bin/bash","-c","echo hello $name"]
  80. ENTRYPOINT ["/bin/bash","-c","echo hello $name”]

打包flask程序与dockerfile

环境准备

  1. [root@localhost ~]# cd /opt/
  2. [root@localhost opt]# mkdir mydocker
  3. [root@localhost opt]# cd mydocker/
  4. [root@localhost mydocker]# touch myflask.py
  5. [root@localhost mydocker]# vim myflask.py

写入一下内容

  1. #coding:utf8
  2. from flask import Flask
  3. app=Flask(__name__)
  4. @app.route('/')
  5. def hello():
  6. return "hello docker"
  7. if __name__=="__main__":
  8. app.run(host='0.0.0.0',port=8080)

准备构建dockerfile,用于生成镜像

拷贝本地的yum仓库到容器内部空间

  1. [root@localhost mydocker]# cp /etc/yum.repos.d/CentOS-Base.repo .
  2. [root@localhost mydocker]# cp /etc/yum.repos.d/epel.repo .
  3. [root@localhost mydocker]# ll
  4. 总用量 12
  5. -rw-r--r--. 1 root root 2523 3 14 19:29 CentOS-Base.repo
  6. -rw-r--r--. 1 root root 664 3 14 19:30 epel.repo
  7. -rw-r--r--. 1 root root 176 3 14 19:19 myflask.py

创建Dockerfile文件,必须大写的D开头

  1. [root@localhost mydocker]# touch Dockerfile

写入内容

  1. FROM centos #指定一个基础镜像
  2. COPY CentOS-Base.repo /etc/yum.repos.d/ #拷贝本地的yum仓库,到容器空间内
  3. COPY epel.repo /etc/yum.repos.d/
  4. RUN yum clean all #清除yum缓存
  5. RUN yum install python-setuptools -y
  6. RUN easy_install flask #linux默认使用python2,想要使用python3使用RUN 执行命令安装
  7. COPY myflask.py /opt/
  8. WORKDIR /opt
  9. EXPOSE 8080 #暴露容器的8080端口,供给物理机去映射访问,myflask.py 设置的端口
  10. CMD ["python","myflask.py"] #cmd代表执行命令
  1. [root@localhost mydocker]# ls
  2. CentOS-Base.repo Dockerfile epel.repo myflask.py

构建镜像

确保文件在同一目录

  1. [root@localhost mydocker]# ll
  2. 总用量 16
  3. -rw-r--r--. 1 root root 2523 3 14 19:29 CentOS-Base.repo
  4. -rw-r--r--. 1 root root 281 3 14 20:47 Dockerfile
  5. -rw-r--r--. 1 root root 664 3 14 19:30 epel.repo
  6. -rw-r--r--. 1 root root 176 3 14 19:19 myflask.py
  1. [root@localhost mydocker]# docker build .
  2. 会去执行当前目录中的Dockerfile文件
  1. 构建了一个IDa7f439ad8953 的镜像
  2. ---> a7f439ad8953
  3. Successfully built a7f439ad8953
  1. [root@localhost mydocker]# docker tag a7f myflask
  2. [root@localhost mydocker]# docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. myflask latest a7f439ad8953 3 minutes ago 346MB

运行镜像,生成容器实例

  1. [root@localhost mydocker]# docker run -p 8080:8080 -d a7f
  2. e6e1721be1c346f05c8913c2efed6bb3f3564f97ff6b2e64caad18d64c6a5e32
  3. [root@localhost mydocker]# docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. e6e1721be1c3 a7f "python myflask.py" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp thirsty_swanson

查看容器的映射状态

  1. [root@localhost mydocker]# docker port e6e
  2. 8080/tcp -> 0.0.0.0:8080

访问windows

  1. http://192.168.11.174:8080/

利用dockerfile定制镜像的更多相关文章

  1. 利用 Dockerfile 定制镜像

    镜像的定制实际上就是定制每一层所添加的配置.文件. 如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像, 那么之前提及的无法重复的问题.镜像构建透明性的问题.体 ...

  2. Docker 学习笔记(二):Dockerfile 定制镜像

    镜像的定制实际上就是定制每一层所添加的配置.文件. 如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么之前提及的无法重复的问题.镜像构建透明性的问题.体积 ...

  3. Dockerfile定制镜像

    一.Dockerfile是什么? 镜像定制实质就是定制每一层所添加的配置.文件. Dockerfile就是一个脚本来构建和定制镜像,把每一层的修改.安装.构建.操作都写入脚本.以此来解决体积.镜像构建 ...

  4. 微服务架构 ------ Dockerfile定制镜像

    Docker容器不仅仅是运行原生的容器,而是把我们的具体的项目能够布置到容器上面去,这就是Docker定制镜像需要做的事情.  Docker容器 = new Docker镜像  镜像相当于类,容器相当 ...

  5. Docker Dockerfile 定制镜像

    使用 Dockerfile 定制镜像  镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么无法重复的问题 ...

  6. Docker用Dockerfile定制镜像

    用Dockerfile定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那之前提示的无法重复的问题 ...

  7. docker学习笔记6:利用dockerfile创建镜像介绍(生成简单web服务器镜像)

    本文介绍如何利用dockerfile来创建镜像.下面介绍具体的操作过程: 一.创建构建环境 操作示例如下: xxx@ubuntu:~$ pwd /home/xxx xxx@ubuntu:~$ mkdi ...

  8. Docker Dockerfile 定制镜像(转)

    转自: https://yeasy.gitbooks.io/docker_practice/ 及 https://blog.csdn.net/wo18237095579/article/details ...

  9. 使用Dockerfile定制镜像

    Dockerfile是一个文本文件,其中包含额一条一条的指令,每一条指令构建一层,因此每一条指令的作用就是描述这一层应当如何的构建. 以构建nginx镜像为例,使用Dockerfile构建的步骤如下: ...

随机推荐

  1. n个随机变量中第k小值的期望

    Problem 有\(n\)个相互独立的取值在\([0,1]\)的随机变量,问其中第\(k\)小的变量期望是多少? Solution 之前pkuwc的神仙找我换友链,让我受宠若惊.. 我今天突然翻到他 ...

  2. MySQL中adddate学习

    -- 修改时间:ADDDATE(date,INTERVAL expr unit) -- 含义:date时间,expr 表达式值,unit表达式对应的时间单位 -- unit : SECOND,MINU ...

  3. Ex 5_28 Alice想要举办一个舞会..._第十次作业

    根据总人数建立顶点数量为总人数的无向图,顶点之间有边相连表示两个人相互认识,没有边则表示不认识.对于每一个顶点v,设d(v)表示顶点的度,若d(v)<5,即v认识的人数少于5,则不邀请v,若d( ...

  4. 解执行maven项目出现 SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. error

    最近再弄maven项目,运行起来没有问题,但是Console控制台会报错,比如说如下的问题异常提示: 由此我们可以看出,报出错误的地方主要是slf4j的jar包,而故障码中“Failed to loa ...

  5. php工厂模式的实例

    * 单例模式:用于创建单一类型的唯一实例对象 * 工厂模式:用于创建多种类型的多个实例对象 //声明形状类 class Shape { //声明静态方法create,根据容器形状不同,创建不同图形类的 ...

  6. JQuery中jsCharts图表插件(十)

    一:1.jsCharts图表插件 注意:从官方下来的例子都没指定页面编码,在这种情况下,浏览器就会使用默认设置中文编码:GB2312,GBK等:导致无法执行. 请在html代码中的<head&g ...

  7. poj 2349 求MST中第S大的权值

    题目大意: 有一些炮台,如果这个炮台有卫星接收器,那么任意两个有卫星接收器的炮台可以通信,不受距离限制:否者,两个炮台之间只能通过对讲机通信,这是受距离限制的.要买一种对讲机,用在需要的炮台上,要求所 ...

  8. SpringBatch 错误积累

    1.如果nextStep在该JOB中还没有配置,也就是说nextStep还不存在的情况下,就会报错 <end on="EIXT WITH IMBALANCE" /> & ...

  9. free -m图解

  10. Mysql 双主架构配置从复制

    引用自:https://blog.csdn.net/deeplearnings/article/details/78398526 https://www.cnblogs.com/ygqygq2/p/6 ...