美文网首页docker
Docker学习(8) 应用的容器化

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

作者: August________ | 来源:发表于2019-10-27 15:38 被阅读0次

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指令,指定镜像已容器的方式启动后默认运行程序。

相关文章

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

    Docker学习(8) 应用的容器化 容器化:将应用整合到容器中并且运行起来的过程。 应用的容器化——简介 容器可...

  • .NET Core+MySql+Nginx 容器化部署

    .NET Core容器化@Docker.NET Core容器化之多容器应用部署@Docker-Compose.NE...

  • .NET Core容器化之多容器应用部署@Docker-Comp

    .NET Core容器化@Docker.NET Core容器化之多容器应用部署@Docker-Compose.NE...

  • docker

    Docker实践:python应用容器化docker挂载本地目录,实现文件共享Docker document

  • K8s介绍以及运行架构

    Kubernetes(k8s)是Google开源的容器集群管理系统。在Docker技术的基础上,为容器化的应用提供...

  • docker系列之入门篇

    0. 前言 docker是什么?docker是用GO语言开发的应用容器引擎,基于容器化,沙箱机制的应用部署技术。可...

  • 一、Docker介绍

    1、Docker容器不是虚拟机。使用Docker容器运行多个相互隔离的应用,Docker是内核级的虚拟化。 2、对...

  • 高阶测试开发必备技能: k8s入门

    现在稍微有点规模公司都是基于docker容器化部署技巧,K8s现在主流,应用最广的容器集群管理技术。 k8s全称k...

  • Docker的介绍

    Docker学习笔记 什么是容器 依托于linux内核的虚拟化技术 什么是Docker 能够把应用程序自动部署到容...

  • Docker 引擎概述

    Docker Engine 是一个开源的容器技术,被用来对你的应用进行容器化构建。 Docker Engine 实...

网友评论

    本文标题:Docker学习(8) 应用的容器化

    本文链接:https://www.haomeiwen.com/subject/kxtmvctx.html