docker基础操作与进阶 - 搭建基于pm2的node环境

1、为什么要使用docker

最近遇到一台机器需要部署两个不同版本node的情况,首先就想起了docker,想必还有其他类似环境问题的情况,需要进行项目隔离,而docker正是用来解决这个问题的。

docker的优势就在于环境隔离,相当于可以在一台机器上切割成若干个子机器,而各个子机器之前互不影响,另外docker搭建的项目迁移很方便,不用重复搭建复杂的环境。

2、什么是docker

Docker 是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

通俗点说,linux机器可以比作一键比较大的船,而docker可以制造若干个集装箱,而这些集装箱都是封闭的,每个集装箱里面都可以装不同的东西。延伸到项目中就是,docker可以制作若干个镜像,而每个镜像中都可以有不同的node、redis、mysql版本等。这样我们就不需要有若干个服务器来兼容这些情况。

3、docker基础知识

镜像:可以把镜像理解成iso文件,众所周知虚拟机可以把iso文件制作成windows系统,镜像就是生成容器的前提,可以根据DockeFile制作而成

容器:容器就类似于集装箱,docker基于镜像可以生成容器,一般容器就是我们服务的环境了,一般node的容器会集成node版本+pm2

4、搭建docker镜像

搭建docker环境需要依赖Dockerfile文件生成镜像,Dockerfile文件会注入node、pm2等环境配置。

步骤:

编写Dockerfile文件 → 创建镜像 → 推送远程镜像仓库

Dockerfile常用命令:

指令说明
FROM指明当前的镜像基于哪个镜像构建
LABEL标记镜像信息,添加元数据
ARG定义构建镜像过程中使用的变量
ENV指定环境变量
VOLUME创建一个数据卷挂载点
USER指定运行容器时的用户名或 UID
WORKDIR配置工作目录
EXPOSE容器运行时的端口,默认是TCP
ADD从本地或URL添加文件或压缩包到镜像中,并自动解压
COPY拷贝文件或目录到镜像中
ONBUILD创建子镜像时指定自动执行的操作指令
STOPSIGNAL指定退出的信号值
HEALTHCHECK配置启动容器如何进行健康检查
SHELL指定默认 shell 类型
RUN构建镜像时运行的指定命令
CMD运行容器时默认执行的命令,如果有多个CMD质量,最后一个生效。
ENTRYPOINT指定镜像的默认入口命

 

 Dockerfile文件内容

# 基础node镜像,以14.15.0的node镜像为基础搭建其他内容
# 基础镜像可以是本地镜像也可以是远程仓库镜像,例:a.com/common/node:14.15.0
FROM node:14.15.0
LABEL author="zuggs"
LABEL email="zuggs@qq.com"

# RUN命令可以执行命令,安装pm2及pm2-lograte
RUN npm install pm2 -g

RUN pm2 install pm2-logrotate \
  && pm2 set pm2-logrotate:max_size 10G \
  && pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH \
  && pm2 set pm2-logrotate:workerInterval 60 \
  && pm2 set pm2-logrotate:rotateInterval "0 * * * *"

# 运行容器时默认执行命令,建议从外面配置,因为每个项目的pm2脚本可能不一样
# WORKDIR /usr/local/etc/nginx/www/project
# CMD pm2-runtime pm2.json

基于Dockerfile打包镜像

# Dockerfile是上面的配置文件,node_pm2是镜像名称,14.15.0是镜像版本,.代表在当前目录打包
docker build -f Dockerfile -t node_pm2:14.15.0 .

执行情况: 

镜像打包完成就可以直接推送到远程仓库了,这样在其他机器就可以直接拉到镜像了

dockerhub: https://hub.docker.com/

推送指令(前提需要登录,docker login ...):

# 在项目中标记镜像,node_pm2是本地镜像名称,docker..node_pm2是远程tag名称,14.15.0是版本号
docker tag node_pm2:14.15.0 docker.zuggs.com/common/node_pm2:14.15.0
# 推送远程
docker push docker.zuggs.com/common/node_pm2:14.15.0

 5、启动docker镜像

前面已经手动打包好所需的node镜像了,我们只需要在服务器拉取所需要的镜像就好

拉取镜像(不拉取也行,可以在执行时直接选远程镜像,这样在会先拉取镜像):

docker pull docker.zuggs.com/common/node_pm2:14.15.0

基于本地or远程镜像启动容器

docker run -d --name demo_server \
  --log-opt max-size=10m --net=host \
  -v /usr/local/etc/nginx/www/project:/usr/local/etc/nginx/www/project \
  docker.zuggs.com/common/node_pm2:14.15.0 sh -c \
  'cd /usr/local/etc/nginx/www/project && pm2-runtime start pm2.json'

docker run 常用参数介绍,全部可参考docker官网run配置

-d 后台运行容器
--name 容器名称
--log-opt 设置日志文件大小和数量配置,可选max-size和max-file
--net 容器网络选项
  host:容器使用宿主机的IP和端口,--net=host
  container:容器和一个指定的容器共享IP、端口,--net=container:NAME_or_ID
  none:该模式关闭了容器的网络功能,--net=node
  bridge:默认值,此模式会为每一个容器分配、设置IP等,--net=bridge
-v 目录映射,这个容器就可以访问到该目录,宿主机路径:容器挂载路径
-p 端口映射,选择host模式就不需要做端口映射了,本地端口:容器端口
sh -c 容器启动后执行的脚本,Dockerfile未写CMD配置的可以在这里配置

 6、docker常用指令

# 搜索镜像
docker search IMAGE_NAME

# 拉取镜像
docker pull IMAGE_NAME

# 构建镜像
docker build -t tag_name:tag_version .

# 标记镜像
docker tag tag_name:tag_version remote_image:remote_version

# 推送镜像到远程
docker push remote_image:remote_version

# 查看所有本地镜像
docker images

# 删除镜像
docker rmi IMAGE_ID

# 查看所有容器,-a是所有容器,默认只查看运行中容器
docker ps -a

# 运行容器
docker run [options]

# 停止容器
docker stop CONTAINER_NAME | CONTAINER_ID

# 启动容器
docker start CONTAINER_NAME | CONTAINER_ID

# 重启容器
docker restart CONTAINER_NAME | CONTAINER_ID

# 在容器中运行后台任务
docker exec CONATAINER_NAME | CONTAINER_ID [COMMAND]

# 查看容器详细信息
docker inspect CONTAINER_ID | CONTAINER_NAME

# 删除容器
docker rm CONTAINER_ID

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值