从零开始Docker化你的Node.js应用
背景
给你一台新买的服务器(CentOS),相关账户及密码,一个基于Node.js开发的web应用源码包(zip),要求你在新机器上使用Docker的方式把应用部署起来。此时的你,并没有搞清楚什么是容器/镜像,也没记住几个相关的Linux命令,该怎么办?本文将帮助你摆脱困境
方案
流程
为达到最终目的,先来梳理一波流程:
-
把源码zip包上传至服务器
-
登录服务器
-
解压zip包
-
安装最新Docker
-
设置国内镜像加速器
-
编写Dockerfile
-
构建镜像
-
编写启动容器脚本
-
执行脚本,检查部署情况
下面将详细描述如何操作
文中服务器操作系统为CentOS 7,如果你的服务器不相符,操作细节可能会略有不同,需要另行查阅相关资料
rsync传输
假设:
-
服务器地址为
${ip}
-
帐户为
${user}
-
密码为
${pass}
-
源码包为
${zip}
-
zip包放到服务器的目录为
${path}
则在本机源码包同级目录下,使用scp
命令,把zip包传输至服务器的示例如下
rsync -avzP ./${zip} ${user}@${ip}:${path} # 后面会提示输入密码复制代码
ssh登录
承接上文,ssh登录服务器示例如下
ssh ${user}@${ip} # 后面会提示输入密码 # 第一次登录会提示保存ssh信息,输入yes即可复制代码
如果不想每次都输入地址/帐户/密码,可以写一个简单的自动登录脚本ssh.sh
# 创建文件 touch ssh.sh # 赋予脚本可执行权力 chmod +x ssh.sh复制代码
ssh.sh
内容如下,记得把${pass}
, ${user}
,${ip}
替换为真实数据
#!/usr/bin/expect set timeout 30 set password ${pass} spawn ssh ${user}@${ip} expect "*assword:" send "$password\r" interact复制代码
执行脚本即可登录服务器
./ssh.sh复制代码
unzip解压
如上所说,源码包名为${zip}
,解压命令如下
unzip ${zip}复制代码
附带一句, 如果要用命令生成zip包,假设源文件目录为dist
,要生成的zip包为dist.zip
, 其命令如下
zip -r dist.zip dist # 或简写为 zip -r dist dist复制代码
安装Docker-CE
CE意为Community Edition
, 即社区版,免费; 与之对应的是EE,Enterprise Edition
, 企业版,强调安全,付费使用。
-
卸载旧版本的Docker
如果新机器上没有docker,跳至下一步,直接安装Docker的依赖
sudo yum remove docker \ docker-common \ container-selinux \ docker-selinux \ docker-engine \ docker-engine-selinux 复制代码
-
安装Docker的依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2复制代码
-
安装Docker官方仓库
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo复制代码
-
更新仓库源
sudo yum makecache fast复制代码
-
从仓库安装Docker-CE
sudo yum install docker-ce复制代码
配置加速器
使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。
推荐使用DaoCloud的加速器
Dockerfile
所有环境配置已准备完毕,可以根据Node.js应用编写Dockerfile了
假设Node.js应用的启动命令为npm start
, 监听端口为${app_port}
-
创建Dockerfile
touch Dockerfile复制代码
Dockerfile
内容如下
# 可以指定依赖的node镜像的版本 node:<version>,如果不指定,就会是最新的 FROM node:8 # 创建工作目录,对应的是应用代码存放在容器内的路径 WORKDIR /usr/src/app # 把 package.json,package-lock.json(npm@5+) 或 yarn.lock 复制到工作目录(相对路径) COPY package.json *.lock . # 只安装dependencies依赖 # node镜像自带yarn RUN yarn --only=prod --registry=https://registry.npm.taobao.org # 把其他源文件复制到工作目录 COPY . . # 替换成应用实际的端口号 EXPOSE ${app_port} # 这里根据实际起动命令做修改 CMD [ "npm", "start" ]复制代码
-
补充.dockerignore
touch .dockerignore复制代码
.dockerignore
内容如下
node_modules npm-debug.log复制代码
构建镜像
写好Dockerfile
,就可以在Dockerfile所在目录构建镜像了。
命令如下。-t
是为了给镜像加个标签,这样方便使用docker images
命令时检索到
# ${your_name} 可以省略 # ${tag} 省略时为 latest docker build -t ${your_name}/${image_name}:${tag} . # 省略版本 docker build -t ${image_name} .复制代码
查看镜像
docker images # 示例输出 REPOSITORY TAG ID CREATED node 8 1934b0b038d1 5 days ago ${your_name}/${image_name} latest d64d3505b0d2 1 minute ago复制代码
启动容器脚本
touch start.sh chmod +x start.sh复制代码
start.sh
会根据镜像新建一个容器并启动,内容如下
#!/usr/bin/env bash container=${container_name} image=${image_name || image_id} docker run \ --rm \ -d \ -p ${host_port}:${app_port} \ --name $container \ $image复制代码
${host_port}
是外网访问部署好的应用时对应的端口
${app_port}
是容器内Node.js应用监听的端口
${image_name}
是前面构建出的镜像的名字,可用docker images
查看
${container_name}
是给容器赋予的名字,方便docker ps
命令时检索
--rm 容器退出后随之将其删除
-d 后台运行
-p 指定端口映射,前者是服务器器端口,也即外界访问你部署好的web应用的端口; 后者是Dockerfile
里EXPOSE
的端口
--name 指定容器名字
测试
访问刚刚启动的容器里的应用
curl -i localhost:${host_port} # 示例输出 HTTP/1.1 200 OK X-Powered-By: Express Content-Type: text/html; charset=utf-8 ...复制代码
恭喜,部署成功
常用命令
-
查看运行中的容器
docker ps # 或使用新命令 docker container ls # 示例输出 ID IMAGE COMMAND ... PORTS ecce33b30ebf ${your_name}/${image_name}:latest npm start ... 49160->8080复制代码
-
查看所有容器(包括已终止的)
docker ps -a # 或使用新命令 docker container ls -a复制代码
-
查看某容器内日志
docker logs -f ${container_id}复制代码
-
进入某容器,并有shell执行环境
# 进入容器 # -i表示:交互式操作,-t表示:终端 docker exec -it ${container_id} bash # 可通过输入 exit 退出 复制代码
-
停止容器
docker container stop ${container_id}复制代码
-
启动已终止的容器
docker container start ${container_id}复制代码
-
删除容器
docker container rm ${container_name || container_id}复制代码
-
查看镜像
docker images # 或使用新命令 docker image ls复制代码
-
删除镜像
docker image rm ${image_id}复制代码
FAQ
-
不会vi,不懂怎么在服务器编辑
Dockerfile
等文件,怎么办?
可以参考本文,把文件在本地创建好,再通过
scp
把创建的文件跟源码包一起上传到服务器
-
为什么使用yarn?
因为yarn的速度比npm更快,而docker里的node镜像自带了yarn, 正好鼓励大家使用yarn
-
如果项目有全局依赖,如bower,Dockerfile怎么写?
可以先安装其他全局依赖,再使用yarn安装,记得命令写在一个RUN指令里, 下面是部分示例
RUN yarn config set registry https://registry.npm.taobao.org \ && yarn global install bower \ && bower i --allow-root \ yarn复制代码
参考
原文发布时间:06月22日
原文作者:levy9527
本文来源掘金如需转载请紧急联系作者
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
阿里云Kubernetes Service Mesh实践进行时(7): 可观测性分析服务Kiali
概述 注意:在使用阿里云Kubernetes容器服务Istio 1.0的过程中,如果遇到类似CRD版本问题,请参考我们提供的问题分析。 我们会持续更新遇到的问题及其解决方法。 随着微服务、云和容器化架构的出现,构建系统的方式也随之改变,应用程序是分布式的,而且瞬息万变。底层的基础设施和网络服务愈加健壮,应用程序层需要跟上技术的发展步伐。因此,大多数的故障都将来自应用程序层或者是不同应用程序之间的复杂交互。 这种复杂性增加了把系统状态可视化的难度,可观测性的概念以及如何选择恰当的工具洞察也越来越受到社区的重视。简单来说,可以将可观测性视为监控的超集,即包括监控、预警/可视化、分布式系统跟踪、日志聚合和分析。 本系列文章已经通过一个官方示例演示了如何部署应用到上述Istio环境中,并演示了如何设置智能路由、分布式追踪以及Istio 的遥测数据
- 下一篇
最佳实践系列丨Docker EE 大规模部署指南(一)
本文首发自“Docker公司”公众号(ID:docker-cn)编译丨小东每周一、三、五 与您不见不散! 此参考架构将帮助您规划大规模 Docker 企业版部署。它涉及核心 Docker EE 平台、Universal Control Plane 以及 Docker Trusted Registry。请使用本指南来帮助确定 Docker EE 部署的硬件和基础架构规模,并确定针对您的具体工作负载的最佳配置。 您将学到的知识 对于 Docker EE、Universal Control Plane (UCP)和 Docker Trusted Registry (DTR),本指南涵盖了: 哪些应用场景参数很可能会影响规模要求; 基于实际测试的已知规模限制; 确保良好性能和未来增长余地的最佳实践; Docker EE 与 Docker Universal Control Plane 本节论述实现优化性能和增长潜力的基础 Docker EE 平台和 Universal Control Plane 配置。 管理节点的数量 对于生产集群,建议的管理节点数量是 3 个或 5 个。3 管理节点集群可以...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Windows10,CentOS7,CentOS8安装Nodejs环境