Docker学习(8) 应用的容器化

Docker学习(8) 应用的容器化

  • 容器化:将应用整合到容器中并且运行起来的过程。

应用的容器化——简介

  • 容器可以简化应用的构建、部署和运行
  • 应用容器化的步骤
  1. 编写应用代码
  2. 创建一个Dockerfile,其中包括对应用的描述和依赖以及如何运行依赖。
  3. 对Dockerfile执行docker image build 命令。
  4. 等待docker将应用程序部署到docker镜像中

应用容器化——详解

单体应用容器化

  • 将简单的单个节点Node.js Web应用容器化。
  • 具体步骤如下:
  1. 获取应用代码
  2. 分析Dockerfile
  3. 构建应用应用镜像
  4. 运行该应用
  5. 测试应用
  6. 容器应用化细节
  7. 生产环境中多阶段构建
  8. 最近实践

获取应用代码

  • 创建一个名为psweb 的文件夹
lhf@lhf-virtual-machine:~/docker/psweb-master$ ls -l
总用量 28
-rw-rw-r-- 1 lhf lhf  341 10月 23 23:11 app.js
-rw-rw-r-- 1 lhf lhf  216 10月 23 23:11 circle.yml
-rw-rw-r-- 1 lhf lhf  338 10月 23 23:11 Dockerfile
-rw-rw-r-- 1 lhf lhf  421 10月 23 23:11 package.json
-rw-rw-r-- 1 lhf lhf  370 10月 23 23:11 README.md
drwxrwxr-x 2 lhf lhf 4096 10月 23 23:11 test
drwxrwxr-x 2 lhf lhf 4096 10月 23 23:11 views
  • 该目录包含应用的代码,以及包含界面和单元测试的子目录。

分析Dockerfile

  • 在Docker中,包含应用文件的目录被称为构建上下文。将Dockerfile放在构建上下文的根目录下
  • 查看Dockerfile
lhf@lhf-virtual-machine:~/docker/psweb-master$ cat Dockerfile 
# 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


  • Dockerfile的用途:
    1. 对当前应用的描述
    2. 指定docker完成应用的容器化
  • 具体分析每一步的具体作用
FROM alpine
  • FROM指令指定镜像,作为当前镜像的一个基础镜像层
LABEL maintainer="nigelpoulton@hotmail.com"
  • 通过标签LABEL 指定当前镜像的维护者
RUN apk add --update nodejs nodejs-npm
  • 使用alpine的apk包管理器将nodejs 和nodejs-npm安装到当前镜像当中。
  • RUN指令会在FROM指定的alpine基础镜像之上,新建一个镜像层来存储安装内容。
COPY . /src
  • 将相关文件从构建上下文当中复制到当前镜像当中。
  • 并新建一个镜像来存储。
WORKDIR /src
  • WORKDIR指令没dockerfile尚未执行的指令设置安装目录。
RUN npm install
  • 根据packeage.json中的配置文件,使用npm来安装应用的相关依赖
  • 在镜像中新建镜像层来保存依赖文件。
EXPOSE 8080
  • EXPOSE 8080指令来完成相应端口设置,这个配置信息会作为镜像的元数据被保存下来
ENTRYPOINT ["node", "./app.js"]
  • ENTRYPOINT 指令来指定当前镜像的入口程序。

容器化当前应用/构建具体的镜像

  • 生产一个名为web:latest的镜像
lhf@lhf-virtual-machine:~/docker/psweb-master$ docker image build -t web:latest .
Sending build context to Docker daemon  10.24kB
Step 1/8 : FROM alpine
 ---> 965ea09ff2eb
Step 2/8 : LABEL maintainer="nigelpoulton@hotmail.com"
 ---> Running in dbeaf3fc9a29
Removing intermediate container dbeaf3fc9a29
 ---> 8f89a8028659
Step 3/8 : RUN apk add --update nodejs nodejs-npm
 ---> Running in 5f223f358f2b
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
(1/8) Installing ca-certificates (20190108-r0)
(2/8) Installing c-ares (1.15.0-r0)
(3/8) Installing libgcc (8.3.0-r0)
(4/8) Installing http-parser (2.9.2-r0)
(5/8) Installing libstdc++ (8.3.0-r0)
(6/8) Installing libuv (1.29.1-r0)
(7/8) Installing nodejs (10.16.3-r0)
(8/8) Installing npm (10.16.3-r0)
Executing busybox-1.30.1-r2.trigger
Executing ca-certificates-20190108-r0.trigger
OK: 59 MiB in 22 packages
Removing intermediate container 5f223f358f2b
 ---> 717eea061e67
Step 4/8 : COPY . /src
 ---> be52499f2ad8
Step 5/8 : WORKDIR /src
 ---> Running in 9773587f150e
Removing intermediate container 9773587f150e
 ---> 9ec49b1b00b7
Step 6/8 : RUN  npm install
 ---> Running in 30f2281b50d9
npm WARN deprecated superagent@3.8.3: Please note that v5.0.1+ of superagent removes User-Agent header by default, therefore you may need to add it yourself (e.g. GitHub blocks requests without a User-Agent header).  This notice will go away with v5.0.2+ once it is released.
npm WARN deprecated json3@3.3.2: Please use the native JSON object instead of JSON 3

> core-js@2.6.10 postinstall /src/node_modules/core-js
> node postinstall || echo "ignore"

Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon: 
> https://opencollective.com/core-js 
> https://www.patreon.com/zloirock 

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)

npm notice created a lockfile as package-lock.json. You should commit this file.
added 163 packages from 460 contributors and audited 262 packages in 12.855s
found 5 vulnerabilities (2 low, 2 moderate, 1 critical)
  run `npm audit fix` to fix them, or `npm audit` for details
Removing intermediate container 30f2281b50d9
 ---> bc36c1226008
Step 7/8 : EXPOSE 8080
 ---> Running in 1c3b6c00bc53
Removing intermediate container 1c3b6c00bc53
 ---> 3520f6d7fa42
Step 8/8 : ENTRYPOINT ["node", "./app.js"]
 ---> Running in 579d7cd7499c
Removing intermediate container 579d7cd7499c
 ---> 983497a6f68f
Successfully built 983497a6f68f
Successfully tagged web:latest
  • 命令中最后的 . 表示docker在进行构建的时候,使用当前目录作为构建的上下文。

  • 查看构建的web镜像

lhf@lhf-virtual-machine:~/docker/psweb-master$ docker image ls
REPOSITORY                           TAG                 IMAGE ID            CREATED              SIZE
web                                  latest              983497a6f68f        About a minute ago   71.4MB
alpine                               latest              965ea09ff2eb        5 days ago           5.55MB
ubuntu                               latest              cf0f3ca922e0        8 days ago           64.2MB
nigelpoulton/pluralsight-docker-ci   latest              07e574331ce3        4 years ago          557MB

推送镜像到仓库

  • 才创建一个镜像之后,可以将该镜像保存到镜像仓库存储当中。

  • 登录docker hub

lhf@lhf-virtual-machine:~/docker/psweb-master$ docker login
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: lhfdocker
Password: 

Login Succeeded

  • docker 在镜像推送中需要三个信息
    • Registry(镜像仓库服务)
    • Repository(镜像仓库)
    • Tag(镜像标签)
  • docker默认将Registry=docker.os、Tag=latest,Repositiry没有默认值
  • 为镜像重新打标签
lhf@lhf-virtual-machine:~/docker/psweb-master$ docker image tag web:latest lhfdocker/web:latest
lhf@lhf-virtual-machine:~/docker/psweb-master$ docker image ls
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
web                                  latest              983497a6f68f        17 minutes ago      71.4MB
lhfdocker/web                        latest              983497a6f68f        17 minutes ago      71.4MB
alpine                               latest              965ea09ff2eb        5 days ago          5.55MB
ubuntu                               latest              cf0f3ca922e0        8 days ago          64.2MB
nigelpoulton/pluralsight-docker-ci   latest              07e574331ce3        4 years ago         557MB
  • 将镜像推送到docker hub上
lhf@lhf-virtual-machine:~/docker/psweb-master$ docker image push lhfdocker/web:latest
The push refers to repository [docker.io/lhfdocker/web]
682d0d0165f0: Pushed 
c49e4ca7e0e1: Pushed 
5bffe4c78afd: Pushed 
77cae8ab23bf: Mounted from library/alpine 
latest: digest: sha256:6bbab65900a19963b1611db15aa11ddacb1ff03803b716e11372adf23c74c6c5 size: 1159
  • 查看docker hub 网站
8.png

运行程序应用

  • 基于镜像web启动一个名为c1的容器
lhf@lhf-virtual-machine:~/docker/psweb-master$ docker container run -d --name c1 -p 80:8080 lhfdocker/web:latest
eefa35f2eba5d28ec3776cdd525629f3fd99594cddc87be17458c674ef84c268
lhf@lhf-virtual-machine:~/docker/psweb-master$ docker container  ls
CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS              PORTS                  NAMES
eefa35f2eba5        lhfdocker/web:latest   "node ./app.js"     7 seconds ago       Up 6 seconds        0.0.0.0:80->8080/tcp   c1

  • APP测试


    9.png

详述

  • 在Dockerfile中:

    • 新增镜像的指令包括:FROM、RUN、COPY
    • 新增元数据的指令:EXPOSE 、 WORKDIR 、 ENV 、 ENTERPOINT
  • 查看镜像构建过程执行了那些指令

lhf@lhf-virtual-machine:~/docker/psweb-master$ docker image history lhfdocker/web:latest
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
983497a6f68f        35 minutes ago      /bin/sh -c #(nop)  ENTRYPOINT ["node" "./app…   0B                  
3520f6d7fa42        35 minutes ago      /bin/sh -c #(nop)  EXPOSE 8080                  0B                  
bc36c1226008        35 minutes ago      /bin/sh -c npm install                          20.6MB              
9ec49b1b00b7        36 minutes ago      /bin/sh -c #(nop) WORKDIR /src                  0B                  
be52499f2ad8        36 minutes ago      /bin/sh -c #(nop) COPY dir:8abfedb4af4f697c8…   2.29kB              
717eea061e67        36 minutes ago      /bin/sh -c apk add --update nodejs nodejs-npm   45.3MB              
8f89a8028659        36 minutes ago      /bin/sh -c #(nop)  LABEL maintainer=nigelpou…   0B                  
965ea09ff2eb        5 days ago          /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                  
<missing>           5 days ago          /bin/sh -c #(nop) ADD file:fe1f09249227e2da2…   5.55MB 
  • 查看镜像的构建详情
lhf@lhf-virtual-machine:~/docker/psweb-master$ docker image inspect lhfdocker/web:latest
。。。。。。。
<snip>
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:77cae8ab23bf486355d1b3191259705374f4a11d483b24964d2f729dd8c076a0",
                "sha256:5bffe4c78afdb55eb39eb33c8956498ce3a18aa500747ece811e2afbf9c7a59f",
                "sha256:c49e4ca7e0e188876dc450dffc3087fd188988bedc41236243fd7354e3d9de34",
                "sha256:682d0d0165f04005b9475623c79dea3606ee42d7307bbd33b35d72db91fe09d8"
            ]
        },
        "Metadata": {
            "LastTagTime": "2019-10-27T15:05:46.793024217+08:00"
        }
    }

容器应用化的——命令

  • docker image build :读取Dockerfile文件,将应用程序容器化
    • 使用-t参数文件镜像打标签
    • 使用-f参数指定任意路径下的Dockerfile
  • Dockerfile中FROM指令,指定构建镜像的一个基础层
  • Dockerfile中RUN指令,在镜像中执行命令,创建新的镜像层
  • Dockerfile中COPY指令,将文件作为新的层添加到镜像中
  • Dockerfile中EXPOSR指令,记录应用所使用的的网络端口
  • Dockerfile中ENTRYPOINT指令,指定镜像已容器的方式启动后默认运行程序。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容