5-Dockerfile文件

先练习一个例子:

  1. 创建 Dockerfile 文件

    FROM ubuntu:14.04
    LABEL maintainer="vincent <jeffmanword@gmail.com>"
    RUN apt-get update && apt-get install -y redis-server
    EXPOSE 6397
    ENTRYPOINT [ "/usr/bin/redis-server" ]
    
    • FROM 是 我们选择的 base 基础镜像
    • LABEL 为 我们需要的标识,比如作者是谁
    • RUN 是我们 执行的命令,必须使用连接符
    • EXPOSE 暴漏的端口
    • ENTRYPOINT 程序的入口
  2. 构建

docker build -t vincent/redis:latest .

关键字

  1. FROM

    FROM scratch             # 制作base image
    
    FROM centos              # 使用base image
    
    FROM ubuntu:14.04
    

    尽量使用官方发布的image作为base image,原因很简单,为了安全!

  2. LABEL

    LABEL maintainer="jeffmanword@gmail.com"
    LABEL version="1.0"
    LABEL description="This is description."
    

    定义image的meta data,描述这个镜像的信息

  3. RUN

    RUN yum update && yum install -y vim \python-dev     # 反斜线换行RUN apt-get update && apt-get install -y perl \pwgen --no-install-recommends && rm -rf \/var/lib/apt/lists/*  # 注意清理cacheRUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'
    

    使用 && 的原因是因为,每一次RUN都会增加一层(类似commit),如果使用 && 连接,将只有一层。
    总结: 为了无用分层,为了美观,合并多条命令为一条,如果复杂的RUN请使用反斜线换行!

  4. WORKDIR

    WORKDIR /root
    
    WORKDIR /test    # 如果没有test文件夹将会自动创建
    WORKDIR demo
    RUN pwd          # 输出结果应该是/test/demo
    

    设定当前工作目录的,类似 cd 命令。在使用的时候注意尽量不要用RUN cd,而是使用WORKDIR,并且路径尽量使用绝对路径,避免出错。

  5. ADDCOPY

    ADD hello /
    
    ADD test.tar.gz /  # 添加到根目录并解压,这是与COPY的区别
    
    WORKDIR /root
    ADD hello test/    # 添加到 /root/test/hello
    
    WORKDIR /root
    COPY hello test/   # /root/test/hello
    

    大部分情况下,COPY优先于ADD,ADD除了COPY外还有额外功能(如解压),添加远程文件请使用curl或者wget。

  6. ENV

    ENV MYSQL_VERSION 5.6   # 设置环境变量
    RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \&& rm -rf /var/lib/apt/lists/*   # 引用环境变量
    

    尽量使用ENV,可以简化Dockerfile,并增加可维护性(避免写死)。

  7. EXPOSE

    EXPOSE 1080 443
    

    EXPOSE 用来暴露端口,EXPOSE 只是声明运行容器时提供的服务端口,这仅仅是一个声明,在运行容器的时候并不会因为这个声明就会开启端口服务,你依旧需要使用 -P 或者 -p 参数映射端口。在 Dockerfile 中写这样的端口声明有助于使用者理解这个镜像开放哪些服务端口,以便配置映射。

  8. VOLUME

    VOLUME /data
    
  9. CMDENTRYPOINT

    • shell方式
    RUN apt-get install -y vim
    CMD echo "hello word"
    ENTRYPOINT echo "hello docker"
    
    RUN ["apt-get", "install", "-y", "vim"]
    CMD ["/bin/echo", "hello word"]
    ENTRYPOINT ["/bin/echo", "hello docker"]
    
    • exec 方式
    FROM ubuntu:16.04
    WORKDIR /
    CMD ["ls"]
    
    FROM ubuntu:16.04
    WORKDIR /
    ENTRYPOINT ["ls"]
    

    CMD 和 ENTRYPOINT 是容器启动命令。这两条命令的区别是ENTRYPOINT 可以让我们把容器当成一条指令运行。CMD 命令为 docker 容器启动时默认执行的命令,如果 docker run 指定了其他命令,CMD将会被忽略。

    分别将上面exec的两个例子构建成镜像

    docker build -t ubuntu-cmd .
    docker build -t ubuntu-entry .
    
    $: docker run --rm ubuntu-cmd -l
    docker: Error response from daemon: OCI runtime create failed:
    container_linux.go:344: starting container process caused
    "exec: \"-l\": executable file not found in $PATH": unknown.
    
    $: docker run --rm ubuntu-entry -l
    total 4
    drwxr-xr-x.   2 root root 4096 Jan 22 19:22 bin
    drwxr-xr-x.   2 root root    6 Apr 12  2016 boot
    drwxr-xr-x.   5 root root  340 Feb 10 09:44 dev
    drwxr-xr-x.   1 root root   66 Feb 10 09:44 etc
    drwxr-xr-x.   2 root root    6 Apr 12  2016 home
    drwxr-xr-x.   8 root root   96 Sep 13  2015 lib
    ...
    

制作一个hello word镜像

  1. 编写 一个 简单 c 程序

    hello.c

    #include<stdio.h>int main()
    {printf("hello docker\n");
    }
    

    编译成二进制

    sudo yum install gcc glibc-static
    gcc -static hello.c -o hello
    

    测试是否正常

    [vagrant@10 hello-word]$ ./hello
    hello docker
    
  2. 创建Dockerfile

    FROM scratch
    ADD hello /
    CMD ["/hello"]
    
  3. 创建镜像

    docker build -t 144.202.112.240:5000/hello-word .
    

    输出结果

    Sending build context to Docker daemon  7.472MB
    Step 1/3 : FROM scratch--->
    Step 2/3 : ADD hello /---> Using cache---> 8d2cefe8cbf3
    Step 3/3 : CMD ["/hello"]---> Using cache---> bb6f23084c78
    Successfully built bb6f23084c78
    Successfully tagged 144.202.112.240:5000/hello-word:latest
    

    检查是否构建成功

    [vagrant@10 hello-word]$ docker image ls
    REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
    144.202.112.240:5000/hello-word   latest              bb6f23084c78        23 hours ago        857kB
    
  4. 创建容器

    docker run --rm 144.202.112.240:5000/hello-word 

    –rm 为 退出的时候自动删除容器

5-Dockerfile文件相关推荐

  1. CRMEB Dockerfile文件

    有很多人想用docker部署crmeb项目,很多想要crmeb dockerfile文件,今天给大家分享一下,欢迎大家体验 FROM phpdockerio/php:7.4-fpm AS crmeb_ ...

  2. [Linux] 编写Dockerfile文件自动构建镜像

    Dockerfile是一个文本文件,按顺序包含构建给定镜像所需的所有命令 Docker通过读取Dockerfile中的指令自动构建图像 . Dockerfile遵循特定的格式和指令集,您可以在Dock ...

  3. docker 部署Python项目 以及dockerfile文件的编写

    Dockerfile文件详解:https://www.cnblogs.com/panwenbin-logs/p/8007348.html Docker的基本使用(部署python项目): https: ...

  4. dockerfile如何运行镜像内的脚本_第七章 Dockerfile文件解析(一)

    七 Dockerfile文件解析-1 7.1 定义:Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本 7.2 Dockerfile内容基础知识: 1.每条保留字指令 ...

  5. Dockerfile文件中CMD指令与ENTRYPOINT指令的区别

    [Docker那些事]系列文章 Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT指令的区别 构建Docker镜像指南,含实战 ...

  6. Dockerfile文件详解

    一.Dockerfile 1.什么是 Dockerfile Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 2.Dockerfile的作用 安装do ...

  7. Dockerfile文件解释

    一.先来看一个简单的 Dockerfile #这个Dockerfile作用是打一个python3项目环境 FROM python:3-alpine WORKDIR /app ADD . /app RU ...

  8. Linux制作python的AWS-KCL的基础镜像,Dockerfile文件

    1.新建一个空目录kclimage 2.Java官方下载: jdk-8u191-linux-x64.tar.gz 到 kclimage目录 3.下载amazon-kinesis-client-pyth ...

  9. Docker_03_彻底搞懂Dockerfile文件

    文章目录 一.前言 二.Dockerfile基本命令 2.1 FROM (导入基础镜像,几乎是必须的,就像是java程序中的import导入) 2.2 RUN (在镜像内部执行一些命令,类似java程 ...

  10. 使用Dockerfile文件构建镜像

    使用Dockerfile文件构建镜像 目录 使用Dockerfile文件构建镜像 一 . Dockerfile 简介 二 .使用Dockerfile文件构建镜像(案例实现) (1)拉取镜像,查看镜像信 ...

最新文章

  1. 数据库设计的10个最佳实践
  2. 2016-2017 ACM-ICPC CHINA-Final(EC-final) 题解(10 / 12)
  3. php 发送smtp邮件
  4. dotNET:怎样处理程序中的异常(实战篇)?
  5. PWN-PRACTICE-BUUCTF-9
  6. 鸿蒙还是不是安卓,华为捐赠鸿蒙核心架构!是否形成“三足鼎立”?
  7. var和function谁先优先执行_变量var声明和函数function声明优先级
  8. 【Hadoop】Hadoop SocketChannelImpl UnresolvedAddressException
  9. python贴吧-Python爬虫——抓取贴吧帖子
  10. 个人信息保护法应加速制定
  11. 基于“机器学习”的智能聊天机器人---python实现(1)
  12. docker修改已部署容器的配置文件
  13. 最怕你不甘平庸,却又不去行动!
  14. Android 6.0 更新包与已安装应用的签名不一致
  15. vs2017python如何打包exe_VS2017项目程序打包成.msi或者.exe
  16. java费诺编码_费诺编码的分析与实现.doc
  17. 图解Python语法
  18. 生物信息学——fasts格式文件合并
  19. golang实现一个带Web界面的五险一金计算器
  20. 什么手机用android系统,什么手机用android1。0 系统

热门文章

  1. java 牛生小牛_例题:大牛生小牛的问题解决方法
  2. 武汉大学计算机学院的李明,李明副研究员
  3. Python chr / ord 函数区别和使用 - Python零基础入门教程
  4. BugkuCTF-MISC题猫片
  5. 五年一贯制专转本计算机网络真题,金陵科技学院2017年五年一贯制专转本考试大纲(计算机网络基础)...
  6. php sql查询两个表语句,sql多表查询语句与方法
  7. arcgis的python接口_arcgis-Python的ArcGIS API-Esri Screenshots
  8. java序列化的方法_【Java常见序列化与反序列方法总结】
  9. pythoncount函数怎么用_python中count函数简单的实例讲解
  10. java入职华为,通过这9个Java面试题,就可以入职华为啦