前言
上一边我们已经介绍如何安装和设置docker,本篇我们再参考官方手册继续深入学习docker镜像的创建和运行,官方文档见docker官方原文。
1. 介绍(Introduction)
现在我们已经设置环境,基于Docker Desktop,你现在可以开发容器应用。总的来说,开发流程如下:
- 通过创建Docker images,为你的应用每个组件创建和测试独立容器。
- 组合你的容器和支持设施成一个完整应用。
- 测试,分享和发布你的完整容器应用。
首先我们关注工作流程的步骤1:创建容器所需镜像,记住,一个Docker镜像包含你的容器进程将需运行的私有文件系统。你必须创建一个映像,它包含你的应用运行所需的资源。
容器化开发环境比传统的开发环境更容易设置,一旦你学会我们将讨论的如何创建映像。这是因为一个容器开发环境在Docker 映像中,会隔离应用所需要的所有依赖。你除了在你的仪器安装docker外,不需要安装任何东西。这样,你就可以轻松的为不同的系统开发应用,不需要更改开发仪器上的任何东西。
2. 设置(Set up)
我们用git从github上下载一个例程,命令如下:
git clone https://github.com/dockersamples/node-bulletin-board
cd node-bulletin-board/bulletin-board-app
node-bulletin-board工程是一个简单的公告板应用,使用Node.js编写,在这个例程中,可以想象是你编写的这个APP,而且你尝试把它容器化。
3. 使用Dockerfile定义容器(Define a container with Dockerfile)
我们先了解下bulletin board应用中的这个所谓的Dockerfile。Dockerfile描述了如何为一个容器组织私有文件系统,而且还包含描述容器如何基于此映像运行的元数据。bulletin board app的Dockerfile如下:
# Use the official image as a parent image
FROM node:current-slim
# Set the working directory
WORKDIR /usr/src/app
# Copy the file from your host to your current location
COPY package.json .
# Run the command inside your image filesystem
RUN npm install
# Inform Docker that the container is listening on the specified port at runtime.
EXPOSE 8080
# Run the specified command within the container.
CMD [ "npm", "start" ]
# Copy the rest of your app's source code from your host to your image filesystem.
COPY . .
写一个Dockerfile第一步就是容器化一个应用。你可以思考Docker file命令当成如何建立你的映像的手把手教程。这个主意有如下步骤:
- 从 “FROM”这个已有镜像 node:current-slim 。这是一个官方映像,由Node.js先驱编译并且经由docker验证,是一个高质量的映像,它包含Node.js长期支持解释器和基本的依赖。
- 使用 WORKDIR 来指定所有接下来的操作都是从镜像文件系统中的 目录 /usr/src/app 开始。
- COPY the file package.json 从你的主机 到镜像的当前目录(.),就是/usr/src/app/package.json。
- RUN 你镜像中的命令 npm install(它读取package.json 来决定你应用的依赖)。
- COPY 拷贝你主机上的剩下源码到你的镜像文件系统。
你可以看到这些基本上是你设置安装app到你主机的不周。但是,获取这些成一个dockerfile,可以使得你可以在一个可以移植,隔离的Docker映像中。
上面的编译镜像文件系统的步骤,但也有其他的行在Dockerfile.
CMD 标识符是第一例子来指定你精细的一些元数据,描述如何在容器运行这个镜像。它意思说这个支持这个镜像的容器进程支持npm start。
EXPOSE 8080 标识docker 容器运行时监听8080端口。
以上你所看到的是组织一个简单的Dockerfile 的好方方法; 总是以 FROM 命令开始,接着是创建你文件系统的步骤,已经包含任何书籍规格。还有更多的Dockerfile标识,详情请见Dockerfile reference。
4. 创建和测试你的镜像(Build and test your image)
现在既然你已经有一些源码和一个Dockfile,是时候来创建你自己的第一个镜像,并确保容器如我们期望的启动工作。
确认你已经位于目录: node-bulletin-board/bulletin-board-ap,我们来开始编译bulletin board 镜像,终端输入命令:
docker image build -t bulletinboard:1.0 .
你可以看到Docker执行Dockefile中的每条指令,创建你自己的镜像。如果成功,编译进程会提示 Successfully tagged bulletinboard:1.0
5. 运行你的镜像(Run your image as a container)
- 使用你的镜像启动一个容器
docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0
这有一些通用的标识:
–publish 要求将主机的端口8000映射到容器的9080端口。 容器拥有自己多了的私有端口组,如果你想从网络访问,你必须像这样进行映射。否则,防护墙规则会组织网络到达你的容器。
–detach: 要求你的容器运行在后头。
–name: 指定你的容器在随后命令的缩写,这里是bb。
同样注意到,你不能指定你容器运行的进程,你也不用这么做,因为你在创建Dockerfile时使用了CMD, 正因为如此,Docker会自动运行npm start当容器启动时。
2. 使用你的浏览器访问: localhost:8000. 你看以看到你的bulletin board application已上线运行。到此,你已经做了所有确保你容器工作所有事情; 现在你可以运行单元测试。
3. 一旦你满意你的bulletin board 容器工作正确,你可以删除它,使用:
docker container rm --force bb
6.总结
到此,你已经成功的编译一个镜像,执行一次简单应用的容器化,还确认你的应用在容器成功运行。下一步就是要在Docker Hub上分享你的镜像,这样他就可以从任何目标机上下载或运行。
7.我的公众号
关注我的公众号,分享嵌入开发,android开发,linux运维的原创文章。