声明:非原创,仅供学习使用!
原文地址:https://www.cnblogs.com/li-peng/p/5827104.html
目录
一、前言
Docker 是由 Go 语言编写的,一个快速部署的轻量级虚拟技术项目,允许开发人员将自己的程序和运行环境一起打包,制作成一个 Docker 的 Image(镜像),部署到服务器上,用户只需要下载这个 Image 就可以运行程序,免去每次都需要安装各种依赖和环境的麻烦,还能够做到应用程序之间的隔离。
安装 Docker:https://blog.csdn.net/jinking01/article/details/82490688
注意,为了开放权限,建议使用 root(超级用户):
sudo -i
二、实现准备
先创建一个简单的 Node.js Web app,来构建一个 Image。然后基于这个 Image 运行一个 Container(容器),从而实现快速部署。Image 与 Container 的关系:https://blog.csdn.net/taifei/article/details/82697312
由于网络的原因,Node.js 镜像从国内的镜像库下载,而不是 Docker Hub。
先从国内的镜像网站上 pull 下 nodejs 镜像:
docker pull hub.c.163.com/nce2/nodejs:0.12.2
下载完后查看我们的镜像,找到 Image Repository,等会会用到:
docker images
三、创建 Node.js 程序
之后所有文件的位置都在 ~ 下,也可以都放在自定义目录下。
创建 package.json,并写入相关信息和依赖:
vim package.json
{
"name": "webtest",
"version": "1.0.0",
"description": "Node.js on Docker",
"author": "lpxxn",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.13.3"
}
}
创建 server.js:
vim server.js
写一个最简单的 Web,这个 Web 基于 express 框架,返回 Hello word。注意,我们监听的是 8888 端口:
'use strict';
var express = require('express');
var PORT = 8888;
var app = express();
app.get('/', function (req, res) {
res.send('Hello world\n');
});
app.listen(PORT);
console.log('Running on http://localhost:' + PORT);
四、创建 Dockerfile
创建 Dockerfile 文件,这个文件是创建镜像所必需的文件:
vim Dockerfile
Docker 会依照 Dockerfile 的内容来构建一个镜像。先给出完整的代码,再一行一行的给出解释:
FROM hub.c.163.com/nce2/nodejs:0.12.2
# Create app directory
RUN mkdir -p /home/Service
WORKDIR /home/Service
# Bundle app source
COPY . /home/Service
RUN npm install
EXPOSE 8888
CMD [ "npm", "start" ]
我们来一句一句的解释:
1、
FROM hub.c.163.com/nce2/nodejs:0.12.2
FROM 是构建镜像的基础源镜像,hub.c.163.com/nce2/nodejs:0.12.2 是镜像的名称,也就是我们一开始从国内服务器上拉下来的那个 Image。如果本地没有,会自己 pull 镜像。
2、
# Create app directory
RUN mkdir -p /home/Service
WORKDIR /home/Service
第一句 RUN 用于在 Image 里创建一个文件夹,将来用于保存我们的代码。
第二句 WORKDIR 是将我们创建的文件夹做为工作目录。
3、
# Bundle app source
COPY . /home/Service
RUN npm install
第一句的 COPY 是把本机当前目录下的所有文件拷贝到 Image 的 /home/Service 文件夹下。
第二句的 RUN 使用 npm 安装我们的 App 所需要的所有依赖。
4、
EXPOSE 8888
由于我们的 Web app 监听的是 8888 端口,把这个端口暴露给主机,这样就能从外部访问 Web 了。
5、
CMD [ "npm", "start" ]
运行 npm start 命令,这个命令会运行 node service.js 来启动我们的 Web app。
五、构建 Image
在 Dockerfile 文件所在的目录下运行下面的命令来构建一个 Image:
docker build -t mynodeapp .
别忘了最后的的那个点,mynodeapp 是 Image 的名称:
...
出现上面两个 Successfully 表示成功。
构建完后查看一下我们的镜像:
docker images
六、运行镜像
docker run -d -p 8888:8888 52e3321d5b71
-d 表明 Container 会在后台运行,-p 表示端口映射,把本机的 8888 端口映射到 Container 的 8888 端口,这样外网就能通过本机的 8888 端口访问我们的 Web了。
52e3321d5b71 是我们 Image 的 ID。
通过 docker ps 查看我们刚运行的 Container 的 ID:
8d4bddb59017 就是我们的 Container ID。查看 logs(日志):
如果你想到 Container 里,可以执行下面的命令,进入到里边后就可以像操作普通的 Linux 一样。如果想退出可执行 exit 命令:
docker exec -i -t 8d4bddb59017 /bin/bash
七、测试
我们先通过 curl 看能不能访问我们的 Web:
curl -i localhost:8888
也可以通过浏览器来看一下,注意,如果虚拟机带的动就用内部的火狐,否则用主机的浏览器。
ifconfig 查看 IP 地址:
在主机浏览器输入 192.168.220.155:8888:
成功!
八、总结
这个教程到此就结束了,希望这篇文章能帮助到你。如果有什么问题或者疑问可以留言交流。