5-Dockerfile文件
5-Dockerfile文件
先练习一个例子:
创建
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 程序的入口
构建
docker build -t vincent/redis:latest .
关键字
FROM
FROM scratch # 制作base image
FROM centos # 使用base image
FROM ubuntu:14.04
尽量使用官方发布的image作为base image,原因很简单,为了安全!
LABEL
LABEL maintainer="jeffmanword@gmail.com" LABEL version="1.0" LABEL description="This is description."
定义image的meta data,描述这个镜像的信息
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请使用反斜线换行!WORKDIR
WORKDIR /root
WORKDIR /test # 如果没有test文件夹将会自动创建 WORKDIR demo RUN pwd # 输出结果应该是/test/demo
设定当前工作目录的,类似
cd
命令。在使用的时候注意尽量不要用RUN cd,而是使用WORKDIR,并且路径尽量使用绝对路径,避免出错。ADD 和 COPY
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。
ENV
ENV MYSQL_VERSION 5.6 # 设置环境变量 RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \&& rm -rf /var/lib/apt/lists/* # 引用环境变量
尽量使用ENV,可以简化Dockerfile,并增加可维护性(避免写死)。
EXPOSE
EXPOSE 1080 443
EXPOSE 用来暴露端口,EXPOSE 只是声明运行容器时提供的服务端口,这仅仅是一个声明,在运行容器的时候并不会因为这个声明就会开启端口服务,你依旧需要使用 -P 或者 -p 参数映射端口。在 Dockerfile 中写这样的端口声明有助于使用者理解这个镜像开放哪些服务端口,以便配置映射。
VOLUME
VOLUME /data
CMD 和 ENTRYPOINT
- 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镜像
编写 一个 简单 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
创建Dockerfile
FROM scratch ADD hello / CMD ["/hello"]
创建镜像
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
创建容器
docker run --rm 144.202.112.240:5000/hello-word
–rm 为 退出的时候自动删除容器
5-Dockerfile文件相关推荐
- CRMEB Dockerfile文件
有很多人想用docker部署crmeb项目,很多想要crmeb dockerfile文件,今天给大家分享一下,欢迎大家体验 FROM phpdockerio/php:7.4-fpm AS crmeb_ ...
- [Linux] 编写Dockerfile文件自动构建镜像
Dockerfile是一个文本文件,按顺序包含构建给定镜像所需的所有命令 Docker通过读取Dockerfile中的指令自动构建图像 . Dockerfile遵循特定的格式和指令集,您可以在Dock ...
- docker 部署Python项目 以及dockerfile文件的编写
Dockerfile文件详解:https://www.cnblogs.com/panwenbin-logs/p/8007348.html Docker的基本使用(部署python项目): https: ...
- dockerfile如何运行镜像内的脚本_第七章 Dockerfile文件解析(一)
七 Dockerfile文件解析-1 7.1 定义:Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本 7.2 Dockerfile内容基础知识: 1.每条保留字指令 ...
- Dockerfile文件中CMD指令与ENTRYPOINT指令的区别
[Docker那些事]系列文章 Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT指令的区别 构建Docker镜像指南,含实战 ...
- Dockerfile文件详解
一.Dockerfile 1.什么是 Dockerfile Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 2.Dockerfile的作用 安装do ...
- Dockerfile文件解释
一.先来看一个简单的 Dockerfile #这个Dockerfile作用是打一个python3项目环境 FROM python:3-alpine WORKDIR /app ADD . /app RU ...
- Linux制作python的AWS-KCL的基础镜像,Dockerfile文件
1.新建一个空目录kclimage 2.Java官方下载: jdk-8u191-linux-x64.tar.gz 到 kclimage目录 3.下载amazon-kinesis-client-pyth ...
- Docker_03_彻底搞懂Dockerfile文件
文章目录 一.前言 二.Dockerfile基本命令 2.1 FROM (导入基础镜像,几乎是必须的,就像是java程序中的import导入) 2.2 RUN (在镜像内部执行一些命令,类似java程 ...
- 使用Dockerfile文件构建镜像
使用Dockerfile文件构建镜像 目录 使用Dockerfile文件构建镜像 一 . Dockerfile 简介 二 .使用Dockerfile文件构建镜像(案例实现) (1)拉取镜像,查看镜像信 ...
最新文章
- 数据库设计的10个最佳实践
- 2016-2017 ACM-ICPC CHINA-Final(EC-final) 题解(10 / 12)
- php 发送smtp邮件
- dotNET:怎样处理程序中的异常(实战篇)?
- PWN-PRACTICE-BUUCTF-9
- 鸿蒙还是不是安卓,华为捐赠鸿蒙核心架构!是否形成“三足鼎立”?
- var和function谁先优先执行_变量var声明和函数function声明优先级
- 【Hadoop】Hadoop SocketChannelImpl UnresolvedAddressException
- python贴吧-Python爬虫——抓取贴吧帖子
- 个人信息保护法应加速制定
- 基于“机器学习”的智能聊天机器人---python实现(1)
- docker修改已部署容器的配置文件
- 最怕你不甘平庸,却又不去行动!
- Android 6.0 更新包与已安装应用的签名不一致
- vs2017python如何打包exe_VS2017项目程序打包成.msi或者.exe
- java费诺编码_费诺编码的分析与实现.doc
- 图解Python语法
- 生物信息学——fasts格式文件合并
- golang实现一个带Web界面的五险一金计算器
- 什么手机用android系统,什么手机用android1。0 系统
热门文章
- java 牛生小牛_例题:大牛生小牛的问题解决方法
- 武汉大学计算机学院的李明,李明副研究员
- Python chr / ord 函数区别和使用 - Python零基础入门教程
- BugkuCTF-MISC题猫片
- 五年一贯制专转本计算机网络真题,金陵科技学院2017年五年一贯制专转本考试大纲(计算机网络基础)...
- php sql查询两个表语句,sql多表查询语句与方法
- arcgis的python接口_arcgis-Python的ArcGIS API-Esri Screenshots
- java序列化的方法_【Java常见序列化与反序列方法总结】
- pythoncount函数怎么用_python中count函数简单的实例讲解
- java入职华为,通过这9个Java面试题,就可以入职华为啦