Docker是一个工具,简化团队间应用开发环境。应用被打包在一个容器中,让开发者在开发,测试和部署的时候具有更好的体验。这个容器是由Docker 镜像创建的,所有的依赖和运行时信息都在里面运行。
最近这些年,开发者已经拥抱这些方式了。因为他们不用再被安装各种依赖困扰了。
这一章,我们将会讨论一些具体的步骤,开Dokcer化我们的Node应用。我们不会去解释什么是Docker,会讲一下为什么我们需要它。
预备知识
- 熟悉Node和NPM
- Docker的基础知识
- 已经安装了Docker 并且有一个 Docker Hub 账号
如果你还没有安装Dockler,可以去Docker的官网上,按照步骤操作一下。有些概念可能你还不懂,可以百度一下,不复杂的。
步骤1 —安装一个Node(Express) 服务
我们将使用Express,我们用脚手架快速生成一个应用结构。 安装generator
$ npm install -g express-generator
生成一个应用结构
$ express --no-view nodeDockerApp
切换到文件目录,你可以重命名你的应用。本例中,我们命名为‘nodeDockerApp’,文件目录大概长这样:
.
├── app.js
├── bin
│ └── www
├── package.json
├── public
│ ├── images
│ ├── javascripts
│ └── stylesheets
│ └── style.css
├── routes
│ ├── index.js
│ └── users.js
然后移除public和bin目录,聚焦于我们的服务端内容:
$ rm -r public bin
然后,在app.js中创建服务:
const express = require('express');
const logger = require('morgan');
const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
const port = 5000;
const app = express();
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.listen(port, function () {
console.log('App listening on port 5000!');
});
module.exports = app;
package.json文件中加入这些依赖和脚本:
{
"name": "nodedockerapp",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
},
"dependencies": {
"debug": "~2.6.9",
"express": "~4.16.1",
"morgan": "~1.9.1"
},
"devDependencies": {
"nodemon": "^2.0.7"
}
}
然后,定义路由文件,在routes/users.js文件中贴入下面的代码:
const express = require('express');
const router = express.Router();
/* GET users listing. */
router.get('/', function (req, res, next) {
const data = {
name: 'Victor Jonah',
job: 'Technical Author',
};
res.status(200).send(data);
});
/* Add user to the list. */
router.post('/', function (req, res, next) {
const { name, job } = req.post();
const data = {
name,
job
}
res.status(200).send(data);
});
module.exports = router;
所有依赖和服务器文件都到位了,我们启动了
启动应用:
npm run dev
我们会看到这些:
在终端中运行 :
curl http://localhost:5000/users
将会看到下面的内容:
步骤2 — Docker化你的应用
此时我们已经运行了应用,然后我们创建一个Dockerfile,去建立我们的Docker镜像。
开始之前,我们必须要执行一些步骤。 第一步依然是创建Dockerfile,它是一个蓝图,在我们执行时候依次提供Docker镜像。
在终端中执行:
touch Dockerfile
然后,在Dockerfile中添加以下结构:
FROM node:14
# Create app directory
RUN mkdir -p /usr/src/nodedockerapp
WORKDIR /usr/src/nodedockerapp
# Install dependencies
COPY package.json /usr/src/nodedockerapp
RUN npm install
# Push in app source
COPY . /usr/src/nodedockerapp
CMD [ "/bin/bash" ]
这就够了。我们来按行解释一下:
FROM node:14
这里,我们告诉Docker从Dockerhub中拉取镜像,这个镜像包含了所有的应用代码和工具。镜像运行之后,变成了一个容器。 第一行,创建了一个文件容器目录,第二行让它变成我们的工作目录。这意味着容器只有在这个目录工作。
COPY package.json /usr/src/nodedockerapp
RUN npm install
这两行就比较好懂了,把package.json拷贝到我们的工作目录,然后安装所有的依赖
# Push in app source
COPY . /usr/src/nodedockerapp
把主目录(所有文件)拷贝到容器目录中。 步骤三 — 忽略容器中的文件
容器中有些文件是不必要的,所以可以忽略他们,我们使用.dockerignore
.git node_modules
很像.gitignore文件
步骤4 — 构建镜像
最后一步就是构建和运行镜像,这样就获得了容器。
在有Dockerfile文件的主目录里,我们执行:
docker build -t nodedockerapp .
你可以列出你构建的所有可用的dokcer镜像:
docker images
:
我们运行镜像,来生成容器。同时,还需要映射一下本机的服务端口和DOcker的端口,这样我们在docker中运行服务器,也能进行连接。
运行:
docker run -it -p 5000:5000 nodedockerapp
这样我们的服务就运行在容器中,端口是5000,该端口与我们本地的机器连接
测试一下我们的端口:
可以看到应用在容器中运行良好
有时候我们有多个容器在应用中运行,就需要 docker-compose
它会协助我们管理所有的容器,让其表现得就像是只有一个容器。