Dockerfile应用容器化

应用容器化

容器是为应用而生!具体来说,容器能够简化应用的构建、部署和运行过程。

容器化步骤

完整的应用容器化过程主要分为以下几个步骤。

  1. 编写应用代码。
  2. 创建一个Dockerfile,其中包括当前应用的描述、依赖以及该如何运行这个应用。
  3. 对该Dockerfile执行docker image build命令。
  4. 等待Docker将应用程序构建到Docker镜像中。
image.png

Dockerfile文件分析

Dockerfile的两个用途

  1. 对当前应用的描述。
  2. 指导Docker完成应用的容器化(创建一个包含当前应用的镜像)。

编写准则:

  • 构建上下文:在Docker当中,包含应用文件的目录通常被称为构建上下文(Build Context)。通常将Dockerfile放到构建上下文的根目录下。
  • Dockerfile:开头字母是大写D,这里是一个单词。像“dockerfile”或者“Docker file”这种写法都是不允许的

文件分析

# Test web-app to use with Pluralsight courses and Docker Deep Dive book
# Linux x64
FROM alpine

LABEL maintainer="nigelpoulton@hotmail.com"

# Install Node and NPM
RUN apk add --update nodejs nodejs-npm

# Copy app to /src
COPY . /src

WORKDIR /src

# Install dependencies
RUN  npm install

EXPOSE 8080

ENTRYPOINT ["node", "./app.js"]

以alpine镜像作为当前镜像基础,指定维护者(maintainer)为“nigelpoultion@hotmail.com”,安装Node.js和NPM,将应用的代码复制到镜像当中,设置新的工作目录,安装依赖包,记录应用的网络端口,最后将app.js设置为默认运行的应用。

  • FROM:FROM指令指定的镜像,会作为当前镜像的一个基础镜像层,当前应用的剩余内容会作为新增镜像层添加到基础镜像层之上。
    image.png
  • LABLE:Dockerfile中通过标签(LABLE)方式指定了当前镜像的维护者为“nigelpoulton@hotmail. com”
  • RUN:RUN apk add --update nodejs nodejs-npm 指令使用alpine的apk包管理器将nodejs和nodejs-npm安装到当前镜像之中
    image.png
  • COPY:COPY. / src指令将应用相关文件从构建上下文复制到了当前镜像中
    image.png
  • WORKDIR:WORKDIR指令,为Dockerfile中尚未执行的指令设置工作目录。该目录与镜像相关,并且会作为元数据记录到镜像配置中,但不会创建新的镜像层。

  • RUN: RUN npm install指令会根据package.json中的配置信息,使用npm来安装当前应用的相关依赖包。npm命令会在前文设置的工作目录中执行,并且在镜像中新建镜像层来保存相应的依赖文件

    image.png

  • EXPOSE:当前应用需要通过TCP端口8080对外提供一个Web服务,所以在Dockerfile中通过EXPOSE 8080指令来完成相应端口的设置。这个配置信息会作为镜像的元数据被保存下来,并不会产生新的镜像层

  • ENTRYPOINT:ENTRYPOINT指令来指定当前镜像的入口程序。ENTRYPOINT指定的配置信息也是通过镜像元数据的形式保存下来,而不是新增镜像层

新增镜像层的指令包括FROMRUN以及COPY,而新增元数据的指令包括EXPOSEWORKDIRENV以及ENTERPOINT。关于如何区分命令是否会新建镜像层,一个基本的原则是,如果指令的作用是向镜像中增添新的文件或者程序,那么这条指令就会新建镜像层;如果只是告诉Docker如何完成构建或者如何运行应用程序,那么就只会增加镜像的元数据

命令

构建镜像

# 构建并生成一个名为web:latest的镜像
docker image build -t web:latest .
  • 命令最后的点(.)表示Docker在进行构建的时候,使用当前目录作为构建上下文,在执行命令前,读者要确认当前目录是应用根目录(包含Dockerfile和应用代码的目录)

查看构建

docker image history web:latest
  • 查看在构建镜像的过程中都执行了哪些指令,每行内容都对应了Dockerfile中的一条指令(顺序是自下而上)。CREATEBY这一列中还展示了当前行具体对应Dockerfile中的哪条指令,输出内容中,可以观察到哪些指令会新建镜像层(就是那些SIZE列对应的数值不为零的指令),虽然其他指令看上去跟这些新建镜像层的指令并无区别,但实际上它们只在镜像中新增了元数据信息。这些指令之所以看起来没有区别,是因为Docker对之前构建镜像层方式的兼容。
docker image inspect web:latest
  • 确认刚刚构建的镜像配置是否正确。这个命令会列出Dockerfile中设置的所有配置项,可以看到有几层镜像

推送构建到dockerHub

  1. 登录DockerHub
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: testerlp
Password:
Login Succeeded
  1. 为待推送镜像打上合适的标签

    • Registry(镜像仓库服务)
    • Repository(镜像仓库)
    • Tag(镜像标签)

    无须为RegistryTag指定值。如果没有为上述信息指定具体值的时候,Docker会默认Registry=docker.ioTag=latest。但是Docker并没有给Repository提供默认值,而是从被推送镜像中的REPOSITORY属性值获取

    查看待推送镜像信息

    docker images | grep alpine
    
    
    image.png

docker image ls命令。在该命令对应的输出内容中可以看到,镜像仓库的名称是alpine。这意味着执行docker image push命令,会尝试将镜像推送到docker.io/alpine:latest中。但是其实testerlp这个用户并没有alpine这个镜像仓库的访问权限,所以只能尝试推送到testerlp这个二级命名空间(Namespace)之下。因此需要使用testerlp这个ID,为当前镜像重新打一个标签。

image.png
  • 打tag

    docker image tag web:latest testerlp/alpine:latest
    

    格式是docker image tag <current-tag> <new-tag>,其作用是为指定的镜像添加一个额外的标签,并且不需要覆盖已经存在的标签

  • 打完标签后查看镜像信息

    docker images | grep alpine
    
image.png
  1. 推送镜像
    docker image push testerlp/alpine:latest
    
image.png

ps:虽然超时了~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342