当前位置: 首页 > 编程日记 > 正文

docker-dockerfile

  • docker文件存储驱动
  • dockerfile镜像构建
  • 指令
  • 示例

dockekr镜像是只读的,对容器修改的内容,一旦容器退出,所有的内容将会丢失。镜像是分层的,最上的一层为读写层(写时复制和用时分配)

  • 文件系统存储驱动:

    • AUFS:UnionFS,Another UFS, Alternative UFS, Adanced UFS
      UnionFS:把不同的物理位置的目录合并到同一个目录中。
    • Device mapper:类似AUFS
      Linux 2.6内核引入的最重要的技术之一,用于在内核中支持逻辑卷管理的通用设备映射机制;
    • Mapped Device
      Mapping Table
      Target Device:源设备
    • overlayFS:Overlay是Linux内核3.18后支持的,也是一种Union FS,和AUFS的多层不同的是Overlay只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层
  • Docker Images:镜像的构建方法:
    docker commit:不建议使用,不知道构建过程,“黑盒子”
    Dockerfile:文本文件,镜像文件构建脚本;
  • Dockerfile
    由一些系列用于基础镜像构建新的镜像文件的专用指令序列组成。指令:选定基础镜像、安装必要程序、、复制配置文件和数据文件、自动运行的服务以及要暴露的端口等
    语法:指令行、注释行、空白行
    指令行:由指令及指令参数构成,指令其字符不区分大小写,约定俗成,使用全大写;
    注释行:#号开头,必须单独位于一行中
    空白行:忽略

  • 例如简单运行一个Web服务
    FROM centos:latest
    #基础镜像centos最新版本来自dockerhub官方
    ADD CentOS7-Base-163.repo /etc/yum.repos.d/Centos.repo
    #把本地的yum配置文件复制到构建容器的yum仓库
    RUN yum makecache fast && yum install nginx -y && yum clean all
    #安装Nginx并清除缓存
    EXPOSE 80
    #暴露80端口
    CMD ["nginx","-g","daemon off;"]
    #运行nginx于前台,在镜像构建完成后才会执行
  • 指令:

    • FROM指令:必须是第一条非注释行,用于指定用到的基础镜像,一般使用构建好的官方镜像,也可以自己构建
      语法:
      FROM <IMAGE>[:<TAG>]
      FROM <IMAGE>[:<TAG>]@<DIGEST> #校验码防止异常
      FROM busybox:latest 、FROM centos:7

    • MAINTAINER:用于提供信息,如提供构建者相关信息,建议紧跟FROM指令后,非必须指令
      语法:
      MAINTAIN <author‘ detail>
      MAINTAINER maintainer xuetong <xuetong@linux.com>

    • COPY:用于从docker宿主机复制文件到所要创建的镜像文件系统中,源文件的元数据会保留
      语法:
      COPY [--chown=<user>:<group>] <src>... <dest> #空格隔开多个源文件,要复制的源文件或目录,支持使用通配符
      COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]:(文件名中有空白字符时使用此种格式)
      例如:
      COPY flanneld.service /etc/systemd/system/flanneld.service
      COPY *.conf /etc/httpd/conf.d/
      <src>由于构建过程将本地dockerfile和相关文件发送至server端构建,路径需使用上下文目录,源文件不能使用类似“../some_dir/some_file”类的路径;
      <dest> 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录

    • ADD :类似COPY指令,但更高级用法,额外还支持复制TAR文件,以及URL路径下载
      语法:
      ADD [--chown=<user>:<group>] <src>... <dest>
      ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
      例如:
      ADD haproxy.cfg /etc/haproxy/haproxy.cfg
      ADD http://www.magedu.com/download/nginx/conf/nginx.conf /etc/nginx/ #文件权限为600
      ADD epel.repo.tar.gz /etc/yum.repos.d/ #会自动解压
      如果使用copy:COPY epel.repo.tar.gz /etc/yum.repos.d/ RUN cd /etc/yum.repos.d/ && tar xf epel.repo.tar.gz

    • ENV:设置环境变量,可以被当前Dockerfile文件中其他指令使用,调用格式为:$Var_name/${Var_name},相当于在本地执行export USER_HOME="/root"
      语法:
      ENV <KEY> <VALUE> #一次只能设置一个
      ENV <key>=<value> ... #可以设置多个变量 ,中有空白字符,要使用\字符进行转义或加引号;换行 \
      ENV name="xiao qin"

    • USER: Dockerfile文件中的任何RUN/CMD/ENTRYPOINT指令指定的程序时的用户名或UID
      语法:
      USER <uid>|<username>

    • WORKDIR: 用于指定当前镜像的工作目录,可以多次使用
      语法:
      WORKDIR <DIR-PATH>
      WORKDIR /etc/sysconfig/network-scripts
      WORKDIR $STATEPATH #变量名ENV中定义

    • VOLUME:用于目标镜像文件中创建一个挂载点目录,用于挂载主机上的卷
      语法:
      VOLUME <mountpoint>
      VOLUME ["<path1>", "<path2>"...]

    • EXPOSE:用于为容器指定要暴露的端口;当使用-大P时可以把默认端口映射至主机
      语法:
      EXPOSE <port>[/<protocol>] [<port>[/<protocol>]] ... #<protocol>为tcp或udp二者之一,默认为tcp;
      例如:
      EXPOSE 11211/tcp 11211/udp 80

    • RUN:用于指定docker build过程中要运行的命令,而不是docker run 此dockerfile构建成的镜像时运行;
      语法:
      RUN <command> #shell来执行命令
      RUN ["<executeable>", "<param1>", "<param2>", ...] #不会启动shell,不支持通配符、命令替换

    • CMD:似于RUN指令,用于运行程序;但二者运行的时间点不同;CMD在docker run时运行,而非docker build;
      CMD指令的首要目的在于为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束;不过,CMD指令指定的程序可被docker run命令行参数中指定要运行的程序所覆盖。
      语法:
      CMD ["executable","param1","param2"] #使用exec执行,推荐的方式
      CMD command param1 param2 #在/bin/sh中执行,提供给需要交互的应用
      CMD ["param1","param2"] #提供给ENTRYPOINT的默认参数
      注意:如果dockerfile中存在多个CMD指令,仅最后一个生效;

    • ENTRYPOINT:似于CMD指令,但其不会被docker run的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序;可以使用该指令做一些初始化操作,写成脚本,若要让CMD指令继续往下走,可以在脚本中添加:exec "$@",否则后面指令不会执行
      语法:
      ENTRYPOINT ["executable","param1","param2"]
      ENTRYPOINT command param1 param2 (shell中执行)

    • jq工具:用来解析json格式 yum install jq
      docker inspect web | jq .[]."Mounts" #查看web的挂载json信息

  • dockerfile最佳实践
    镜像尽可能减少分层、基础镜像尽可能小,如Ubuntu、Debian、alpine(常用于构建二进制包类)
    对多行参数排序
    避免安装不必要的包

  • 示例:

参考资料:
http://dockone.io/article/1513
https://hub.docker.com/explore/

转载于:https://blog.51cto.com/12580678/2335489

相关文章:

proc/[pid]/maps 文件解释

proc/[pid]/maps 文件解释 查看进程的虚拟地址空间是如何使用的。 该文件有6列&#xff0c;分别为&#xff1a; 地址&#xff1a;库在进程里地址范围 权限&#xff1a;虚拟内存的权限&#xff0c;r读&#xff0c;w写,x,s共享,p私有&#xff1b; 偏移量&#xff1a;库在进程里…

【ACM】UVa 1339

【题目】&#xff1a;给定两个长度相同且不超过100的字符串&#xff0c;判断是否能把其中一个字符串的各个字母重排&#xff0c;然后对26个字母做一一映射&#xff0c;使得两个字符串相同。输入两个字符串&#xff0c;输出“YES”或者“NO”。 【分析】&#xff1a;既然字母可…

springBoot PUT请求接收不了参数的解决办法

2019独角兽企业重金招聘Python工程师标准>>> 做项目的时候&#xff0c;想把接口写标准点&#xff0c;于是在更新内容的时候采用put提交内容&#xff0c;但是提交内容时总是获取不到参数&#xff0c;总是选择参数为null。 首先贴出我的put的方法控制器的代码 和之前的…

七牛云内容审核服务被选为「上海首批人工智能创新产品」

近日&#xff0c;上海人工智能应用场景建设实施计划正式发布&#xff0c;这是全国首次面向人工智能应用场景需求的征集计划。上海 10 大人工智能应用场景、19 个具体点位需求和 60 个人工智能创新产品集中首发&#xff0c;其中&#xff0c;上海七牛信息技术有限公司&#xff08…

linux动态库命名规则

说道“动态库版本兼容”&#xff0c;很多人头脑中首先蹦出的就是“Dll Hell”。啊&#xff0c;这曾经让人头疼的难题。时至今日&#xff0c;这个难题已经很好地解决了。 在进一步讨论之前来思考一个问题&#xff1a;Linux下为什么没有让人头痛的“DllHell”&#xff1f; 回答…

如何在同一系统里同时启动多个Tomcat

需要在同一系统里启动多个tomcat,应该怎么处理? tomcat是个服务程序&#xff0c;需要占用几个通讯端口&#xff0c;所以默认情况是不能启动多个tomcat,如果要启动多个tomcat,需要修改配置文件&#xff0c;通过在配置文件设置不同的通讯端口就可以做到.文件 %TOMCAT_HOME%/conf…

【ACM】Uva 455

【题目】&#xff1a;如果一个字符串可以由某个长度为k的字符串重复多次得到&#xff0c;则称该串以k为周期。输入一个长度不超过80的字符串&#xff0c;输出其最小正周期。 注意以下几点&#xff1a; 1、它的最小正周期一定可以被它的长度整除。 2第一个大循环下 i 可以等于…

前端自动化构建工具webpack (二)之css和插件加载总结

1. webpack只识别js文件&#xff0c;其他文件都需要转换成js文件。所有文件都是模块; 2. css解析 css需要css-loader ---》style-loader -----》less-loader less文件还需要less-loader &#xff08;注意书写顺序&#xff09; 3. plugins&#xff1a;他是一个数组&#…

使用command对象操作数据库

1.Command对象查询数据库 protected void Button1_Click(object sender, EventArgs e){//读取web.config节点配置string strcon ConfigurationManager.ConnectionStrings["testjm"].ConnectionString;//实例化sqlConnection对象SqlConnection con new SqlConnectio…

浅析C语言之uint8_t / uint16_t / uint32_t /uint64_t

一、C语言基本数据类型回顾 在C语言中有6种基本数据类型&#xff1a;short、int、long、float、double、char 1、数值类型 1&#xff09;整型&#xff1a;short、int、long 2&#xff09;浮点型&#xff1a;float、double 2、字符类型&#xff1a;char 二、typedef回顾 …

【ACM】UVa 489 刽子手游戏(自顶向下)

【题目】 Hangman Judge是一个猜英文单字的小游戏&#xff08;在电子字典中常会看到&#xff09;&#xff0c;游戏规则如下&#xff1a; 1、答案单字写在纸上&#xff08;每个字元一张纸&#xff09;&#xff0c;并且被盖起来&#xff0c;玩家每次猜一个英文字元&#xff08;le…

ssh远程执行多个命令

shell远程执行&#xff1a; 经常需要远程到其他节点上执行一些shell命令&#xff0c;如果分别ssh到每台主机上再去执行很麻烦&#xff0c;因此能有个集中管理的方式就好了。一下介绍两种shell命令远程执行的方法。 前提条件&#xff1a; 配置ssh免密码登陆 对于简单的命令&am…

【ACM】魔方矩阵

输出魔方矩阵 1、将1放在第一行中间一列&#xff1b; 2、从2开始直到nn止各数依次按下列规则存放&#xff1b;每一个数存放的行比前一个数的行数减1&#xff0c;列数加1&#xff1b; 3、如果上一个数的行数为1&#xff0c;则下一个数的行数为n&#xff08;指最下一行&#x…

iOS 秒数转换成时间,时,分,秒

//转换成时分秒 - (NSString *)timeFormatted:(int)totalSeconds{ int seconds totalSeconds % 60; int minutes (totalSeconds / 60) % 60; int hours totalSeconds / 3600; return [NSString stringWithFormat:"%02d:%02d:%02d",hours, minutes,…

charles和Fiddler感觉哪个更好用

1.fiddler还可以抓HTTPS的包&#xff0c;解析出来都可以2.charles更直观&#xff0c;可能是我先用charles的缘故。charles遍历一个站点&#xff0c;可以右键另存&#xff0c;保存全站文件资源。扒站首选&#xff0c; charles也可以抓https&#xff0c;我改游戏也是抓的https包

systemd用法

一、开机启动 对于那些支持 Systemd 的软件&#xff0c;安装的时候&#xff0c;会自动在/usr/lib/systemd/system目录添加一个配置文件。 如果你想让该软件开机启动&#xff0c;就执行下面的命令&#xff08;以httpd.service为例&#xff09;。 $ sudo systemctl enable http…

C#实现php的hash_hmac函数

from:http://blog.csdn.net/ciaos/article/details/12618487 PHP代码示例如下<?php $res1 hash_hmac("sha1","signatureString", "secret");echo $res1."\n";//ee1b654aa861c41fd5813dc365ef106c9801f8f6echo base64_encode($res…

【ACM】杭电OJ 2015

注意输出格式&#xff01;&#xff01;&#xff01;&#xff01; #include <iostream> #include <cstring> using namespace std; int main () {int m,n,i,sum,flag;while(cin>>n>>m){sum0;flag0;for(i1;i<n;i){sum(2*i);flag;if(flagm){sum/m;cou…

AGC002[BCDEF]题解

F是计数于是就做&#xff08;kan ti jie&#xff09;了 B - Box and Ball 模拟一下 每个盒子开一个d表示有的球数 可能存在红球的打个标记 传递一下就行了 #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define inf 2002…

物联网11种通信协议

今天的网络通信技术也是日新月异&#xff0c;有众所周知的WIFI、Bluetooth、Zigbee、2G、3G、4G蜂窝网络&#xff0c;也有新兴的LiFi、AirGig、量子通信等&#xff0c;更有物联网产业爆发前夜&#xff0c;市场衍生出来的一些比较有前景的通信技术&#xff0c;如以窄带物联网NB&…

php 数组的使用

2019独角兽企业重金招聘Python工程师标准>>> 一、字符串和对象&#xff0c;数组之间的相互转换 public function index(){$product array();$product["name"] "apple";$product["price"] 6000;$products array();$products[] $pr…

【ACM】图像旋转

逆时针 //图像旋转 #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int main () {int a[105][105];int m,n,i,j;while(scanf("%d%d",&n,&m)!EOF)//n行m列 {for(i0;i<n;i…

do一下来了一个redux

导语 一开看redux的时候还是比较蒙的&#xff0c;感觉比较绕&#xff0c;但是又好像是那么回事&#xff0c;接触一个新概念的时候可能都是如此&#xff0c;多去接触就熟悉了&#xff0c;今天就来分享下redux的三大核心为什么就能如此神奇的施展魔法&#xff0c;干撸完源码&…

JavaMail API 概述

JavaMail API提供了一种与平台无关和协议独立的框架来构建邮件和消息应用程序。 JavaMail API提供了一组抽象类定义构成一个邮件系统的对象。它是阅读&#xff0c;撰写和发送电子信息的可选包&#xff08;标准扩展&#xff09;。 JavaMail 规定&#xff0c;用于构造一个接口&am…

利用c语言结构体和union实现类似c++的public,private的实现

最近在看strongswan源代码&#xff0c;看到strongswan的代码框架很有意思&#xff0c;用C语言实现类的思想。当我们编写完一个模块&#xff0c;我们需要提供的是H的文件给其他模块使用&#xff0c;我们希望H文件中就只能包含一些公有函数&#xff0c;和一些类型的申明&#xff…

【ACM】连续出现的字符

【描述】给定一个字符串&#xff0c;在字符串中找到第一个连续出现k次的字符 【输入】第一行包含一个正整数k&#xff0c;表示至少需要连续出现的次数。1<k<1000。第二行包含需要查找的字符串。字符串的长度在1到1000之间&#xff0c;且不包含任何空白字符。 【输出】若…

Django使用数据库(Mariadb/Mysql)

Django默认使用SQLite作为数据库&#xff0c;配置文件在settings.py 让我们来看一下 """ Django settings for test1 project.Generated by django-admin startproject using Django 2.1.4.For more information on this file, see https://docs.djangoproject.…

I2C和SPI总线优缺点对比

IIC vs SPI现今&#xff0c;在低端数字通信应用领域&#xff0c;我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是这两种通信协议非常适合近距离低速芯片间通信。Philips&#xff08;for IIC&#xff09;和Motorola&#xff08…

查看CentOS的网络带宽出口

检查维护系统的时候&#xff0c;经常会要查看服务器的网络端口是多大的&#xff0c;所以需要用到Linux的一个命令。 如何查看CentOS的网络带宽出口多大&#xff1f;可以用下面的命令来查看。 # ethtool eth0 前面是命令&#xff0c;后面跟的是设备名&#xff0c;如果对外连接的…

【ACM】删数问题(待更)

【描述】键盘输入一个正整数N&#xff0c;去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S寻找一种方案使得剩下的数字组成的新数最小。&#xff08;N不超过240位&#xff0c;N>S&#xff09; 【输入】两行&#xff0c;第一行&#xf…