前言
以前部署项目时候总会遇到本地环境和线上环境不一致产生排查困难的问题。在使用window系统的电脑开发学习时,但想要学习linux系统的一些操作或者项目的部署时,还需要一台服务器或者一个虚拟机,而Docker不仅部署方便而且更安全,Docker容器是个比较轻量的,占用资源少,成本低等等众多优势。所以,Docker 势必是程序员必会的一个工具之一。
以下通过使用Docker部署Node服务来加深学习
Docker部署Node服务
创建Node项目,构建一个index.js文件
const Koa = require('koa'); const app = new Koa(); app.use(async ctx => { ctx.body = 'Hello Jasen Docker'; }); const port = 8004; app.listen(port); console.log(`http://localhost:${port}`);
AI 代码解读添加Dockerfile, Docker通过读取
Dockerfile
中的指令自动生成镜像- vscode 安装docker插件
- 按F1 输入:Docker:add Docker Files into Workspace,然后根据相应的选项进入选择,enter 确认
Dockfile文件中常用指令:
- FROM 基础镜像
- MAINTAINER 维护者信息
- ENV 设置环境变量
- RUN 构建镜像时要执行的命令
- ADD/COPY 文件添加到容器中
- WORKDIR ==cd ,工作目录
- VOLUME 指定持久化目录
- EXPOSE 指定与外界交互的端口
- CMD:运行命令,容器启动时调用
- 构建镜像:进入 Dockerfile 所在项目当前目录下,执行以下命令:
docker build -t node-proj .
创建一个该镜像的容器:运行命令:
docker run -d [--name [name]] [-p [对外端口]:[对内端口]] [业务镜像名]
- -d : 容器后台执行;--name: 容器名称;-p:端口映射;业务镜像名:image Id 或 仓库REPOSITORY
执行完毕后,通过在浏览器中访问: http://localhost:8004 可以正常在页面显示“ Hello Jasen Docker ”,整个过程成功了。
Docker Compose管理服务
本地项目更新时,镜像怎么更新?
一开始我使用的方式是,先停止容器运行再删除容器,删除镜像,重新 build 然后再重新执行 run。整个操作过于繁琐,如果我有多容器时,更加时增加了工作量。
通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
docker-compose配置文件:
version: '3.4'
services:
dockerNode:
container_name: docker_web
image: dockerproj
build:
context: .
dockerfile: ./Dockerfile
environment:
NODE_ENV: production
depends_on:
- redis
- db
ports:
- 8004:8004
redis:
image: redis
db:
image: postgres
AI 代码解读
执行docker-compose命令,可以对配置的服务创建并启动
docker-compose stop
docker-compose up -d --build
AI 代码解读
其中,depends_on 是用于设置依赖关系。
- docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
- docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
- docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。