初始化Dockerfile假设我们的项目叫express,在express项目中创建并编辑Dockerfile:$vimDockerfileFROMnode:latestRUNmkdir-p/home/www/expressWORKDIR/home/www/expressCOPY./home/www/expressRUNnpminstallEXPOSE3000ENTRYPOINT["npm","run"]CMD["start"]该文件包含以下命令:FROMnode:latest-指定使用最新版本的节点基础映像RUNmkdir-p/home/www/express-在容器中创建/home/www/express目录WORKDIR/home/www/express-将容器中的工作目录设置为/home/www/expressCOPY。/home/www/express-设置宿主机当前目录复制内容到镜像/home/www/express目录RUNnpminstall-npminstall安装应用需要的npm包EXPOSE3000-打开容器的3000端口对外ENTRYPOINT["npm","run"]-容器启动后执行的命令。不能被dockerrun提供的参数覆盖CMD["start"]-容器启动时,执行的命令可以被dockerrun提供的参数覆盖。构建镜像编写完Dockerfile后,可以使用dockerbuild命令构建镜像:$sudodockerbuild-ttest/express。我们传递了-t参数并将图像命名为test/express。构建过程类如下:SendingbuildcontexttoDockerdaemon29.7kBStep1/8:FROMregistry.src.followme.com:5000/node:v1--->c99c549e8227Step2/8:RUNmkdir-p/home/www/express-app--->Runningin8be9a90629b0--->b9f584851225Removingintermediatecontainer8be9a90629b0Step3/8:WORKDIR/home/www/express-app--->5072c31f9dd9Removingintermediatecontainere9dbf4ce3d8bStep4/8:COPY./home/www/express-app--->a4d1725f15edRemovingintermediatecontainer30aa49765015Step5/8:RUNyarn--->Runninginf181c243deaayarninstallv1.3.2[1/4]解析包...[2/4]获取包...[3/4]链接依赖项...[4/4]构建新包...在9.46秒内完成。--->d390931d73e6Removingintermediatecontainerf181c243deaaStep6/8:EXPOSE3000--->Runningin94101ab38864--->43199a8a5a90Removingintermediatecontainer94101ab38864Step7/8:ENTRYPOINTnpmrun--->Runningin80b1318962cf--->6b203c50e855Removingintermediatecontainer80b1318962cfStep8/8:CMDstart--->Runningina9909e537f59--->d56eae48377cRemovingintermediatecontainera9909e537f59Successfullybuiltd56eae48377c容器镜像构建完成后,可以通过构建的容器运行Dockerexpress应用程序来创建/运行一个使用tets/express镜像的容器:$sudodockerrun-d--nameexperss-app-p3000:3000test/express在上面的操作中,我们通过test/express镜像运行容器,并将容器命名为experss-应用程序。为了运行容器,我们还指定了-d参数,这使得容器在后台运行。-p参数将宿主机的3000端口映射到容器的3000端口。运行完容器后,可以通过dockerps命令看到正在运行的容器。此时可以通过localhost:3000访问服务。
