上一篇,您已经完成了Docker Desktop安装,并启用了Kubernetes,接下来就可容器化部署应用程序了。通常,开发工作流包括如下几点:
1、首先创建Docker镜像,为应用程序的每个组件创建和测试单个容器。
2、将容器和所支持的基础设施组装成一个完整的应用程序,可以用Docker stack file或者Kubernetes的YAML来实现。
3、测试、共享和部署完整的容器化应用程序。
在本篇幅中,我们将集中于此工作流的步骤1:基于现有的容器来创建镜像。请记住,Docker镜像捕获了容器化进程将在其中运行的私有文件系统;我们需要创建一个镜像,其中正好包含我们的应用程序需要运行的内容。
容器化开发环境比传统开发环境更容易设置,一旦您学习了如何构建镜像,我们将在下面讨论。这是因为容器化的开发环境会将应用程序所需的所有依赖项隔离在Docker镜像中;除了Docker之外,不需要在开发计算机上安装任何东西(即开发环境的部署仅依赖于Docker镜像)。这样,您就可以轻松地为不同的堆栈开发应用程序,而无需更改开发机器上的任何环境。
配置
1、从GitHub克隆用于演示的示例项目。
git clone -b v1 https://github.com/docker-training/node-bulletin-board
cd node-bulletin-board/bulletin-board-app
这是一个简单的公告板应用程序,用node.js编写。在这个例子中,让我们假设是您编写了这个应用程序,现在正试图将其容器化部署起来,目录结构如图1.1所示。
图1.1
查看名字为Dockerfile的文件,Dockerfile文件描述了如何为容器组装私有的文件系统,并且还包含了一些描述如何基于此镜像运行容器的元数据。公告板应用程序Dockerfile如图1.2所示。
图1.2
容器化部署应用程序的第一步是编写Dockerfile。您可以把这些Dockerfile命令当作是一个创建镜象的步骤。这个步骤如下:
1、使用版本号6.11.5的镜像作为本次构建的基础镜像。6.11.5基础镜像是由node.js官方提供的镜像
2、指定镜像文件系统的工作目录为/usr/src/app,即每次登录基于该镜像创建的容器,目录会自动切换到/usr/src/app
3、将package.json文件复制到镜像的当前位置,即/usr/src/app/package.json
4、在镜像文件系统中运行npm install命令(它将读取package.json以确定应用程序的节点依赖关系,并安装它们)
5、将应用程序的其余源代码从主机复制到镜像中。
您可以看到,这些步骤与您在主机上设置和安装应用程序时可能采取的步骤大致相同,但使用Dockerfile允许我们在一个可移植、独立的Docker镜像(node.js官方镜像)再次构建。
上面的步骤为镜像构建了文件系统,但是Dockerfile中还有一行,CMD命令行。CMD ["要运行的程序","参数1","参数2"] 是告诉容器启动时要运行的命令或脚本,Dockerfile中命令告知此镜像要支持的容器化进程是npm start。
注意:Dockerfile只能有一条CMD命令,如果有多条,则执行最后一条。
一个Dockerfile始终是从FROM命令开始,上述是一个简单的Dockerfile文件,还有更多的Dockerfile指令,请参阅Dockerfile reference(https://docs.docker.com/engine/reference/builder/)。
构建镜像并测试
现在我们有了源代码和Dockerfile,是时候构建我们的第一个镜像了,并确保从该镜像启动的容器能按预期工作。
注意:本示例使用的是Linux容器。使用Docker Desktop的用户,右键单击系统托盘中的Docker徽标,确保您的环境正在运行Linux容器,若不是,请点击“Switch to Linux containers...",如图1.3所示,我当前演示环境使用的已是Linux容器。
图1.3
1、进入Powershell,并确保您当前目录是node-bulletin-board/bulletin-board-app,如图1.4所示,执行命令
# docker image build -t bulletinboard:1.0 .
图1.4
在构建最后会输出如下字样,表示构建镜像成功。
Successfully built 49f9b9fb7daf
Successfully tagged bulletinboard:1.0
上述命令表是创建一个名为bulletinboard的镜像(image),tag为1.0,如图1.5所示。
图1.5
2、基于bulletinboard镜像运行一个名为bb的容器并以后台方式运行,将容器内部端口8080,映射到宿主机的8000端口上。
# docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0
我们可以使用如下命令来查看run指命后可以跟哪些参数
# docker container run --help
我们登录到容器,查看到当前目录就是Dockerfile中设置的工作目录,如图1.6所示。
图1.6
3、通过http://localhost:8000来访问您的应用,您将看到如下界面,如图1.7所示,则表示应用容器化部署成功,接下来就是进行测试、构建、发布、分享等过程。
图1.7
4、删除一个容器,即表示该容器的生命周期结束。
# docker container rm --force bb
总结
完成上述操作后,我们已经能够对应用程序执行一个简单的容器化,并确认我们的应用程序在其容器中成功运行。下一步将是编写Kubernetes 的yaml文件,描述如何在Kubernetes上运行和管理容器。
另外,我们应该要加强练习使用Dockerfile构建镜像。