背景
给你一台新买的服务器(CentOS),相关账户及密码,一个基于Node.js开发的web应用源码包(zip),要求你在新机器上使用Docker的方式把应用部署起来。此时的你,并没有搞清楚什么是容器/镜像,也没记住几个相关的Linux命令,该怎么办?本文将帮助你摆脱困境
方案
流程
为达到最终目的,先来梳理一波流程:
- 把源码zip包上传至服务器
- 登录服务器
- 解压zip包
- 安装最新Docker
- 设置国内镜像加速器
- 编写Dockerfile
- 构建镜像
- 编写启动容器脚本
- 执行脚本,检查部署情况
下面将详细描述如何操作
文中服务器操作系统为CentOS 7,如果你的服务器不相符,操作细节可能会略有不同,需要另行查阅相关资料
rsync传输
假设:
- 服务器地址为
${ip}
- 帐户为
${user}
- 密码为
${pass}
- 源码包为
${zip}
- zip包放到服务器的目录为
${path}
则在本机源码包同级目录下,使用scp
命令,把zip包传输至服务器的示例如下
1 | rsync -avzP ./${zip} ${user}@${ip}:${path} |
ssh登录
承接上文,ssh登录服务器示例如下
1 | ssh ${user}@${ip} |
如果不想每次都输入地址/帐户/密码,可以写一个简单的自动登录脚本ssh.sh
1 | # 创建文件 |
ssh.sh
内容如下,记得把${pass}
, ${user}
,${ip}
替换为真实数据
1 |
|
执行脚本即可登录服务器😄
1 | ./ssh.sh |
unzip解压
如上所说,源码包名为${zip}
,解压命令如下
1 | unzip ${zip} |
附带一句, 如果要用命令生成zip包,假设源文件目录为dist
,要生成的zip包为dist.zip
, 其命令如下
1 | zip -r dist.zip dist |
安装Docker-CE
CE意为Community Edition
, 即社区版,免费; 与之对应的是EE,Enterprise Edition
, 企业版,强调安全,付费使用。
- 卸载旧版本的Docker
如果新机器上没有docker,跳至下一步,直接安装Docker的依赖
1 | sudo yum remove docker \ |
- 安装Docker的依赖
1 | sudo yum install -y yum-utils device-mapper-persistent-data lvm2 |
- 安装Docker官方仓库
1 | sudo yum-config-manager \ |
- 更新仓库源
1 | sudo yum makecache fast |
- 从仓库安装Docker-CE
1 | sudo yum install docker-ce |
配置加速器
使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。
推荐使用DaoCloud的加速器
Dockerfile
所有环境配置已准备完毕,可以根据Node.js应用编写Dockerfile了
假设Node.js应用的启动命令为npm start
, 监听端口为${app_port}
- 创建Dockerfile
1 | touch Dockerfile |
Dockerfile
内容如下
1 | # 可以指定依赖的node镜像的版本 node:<version>,如果不指定,就会是最新的 |
- 补充.dockerignore
1 | touch .dockerignore |
.dockerignore
内容如下
1 | node_modules |
构建镜像
写好Dockerfile
,就可以在Dockerfile所在目录构建镜像了。
命令如下。-t
是为了给镜像加个标签,这样方便使用docker images
命令时检索到
1 | # ${your_name} 可以省略 |
查看镜像
1 | docker images |
启动容器脚本
1 | touch start.sh |
start.sh
会根据镜像新建一个容器并启动,内容如下
1 |
|
${host_port}
是外网访问部署好的应用时对应的端口
${app_port}
是容器内Node.js应用监听的端口
${image_name}
是前面构建出的镜像的名字,可用docker images
查看
${container_name}
是给容器赋予的名字,方便docker ps
命令时检索
–rm 容器退出后随之将其删除
-d 后台运行
-p 指定端口映射,前者是服务器器端口,也即外界访问你部署好的web应用的端口; 后者是Dockerfile
里EXPOSE
的端口
–name 指定容器名字
测试
访问刚刚启动的容器里的应用
1 | curl -i localhost:${host_port} |
恭喜,部署成功👏
常用命令
- 查看运行中的容器
1 | docker ps |
- 查看所有容器(包括已终止的)
1 | docker ps -a |
- 查看某容器内日志
1 | docker logs -f ${container_id} |
- 进入某容器,并有shell执行环境
1 | # 进入容器 |
- 停止容器
1 | docker container stop ${container_id} |
- 启动已终止的容器
1 | docker container start ${container_id} |
- 删除容器
1 | docker container rm ${container_name || container_id} |
- 查看镜像
1 | docker images |
- 删除镜像
1 | docker image rm ${image_id} |
FAQ
- 不会vi,不懂怎么在服务器编辑
Dockerfile
等文件,怎么办?
可以参考本文,把文件在本地创建好,再通过
scp
把创建的文件跟源码包一起上传到服务器
- 为什么使用yarn?
因为yarn的速度比npm更快,而docker里的node镜像自带了yarn, 正好鼓励大家使用yarn
- 如果项目有全局依赖,如bower,Dockerfile怎么写?
可以先安装其他全局依赖,再使用yarn安装,记得命令写在一个RUN指令里, 下面是部分示例
1 | RUN yarn config set registry https://registry.npm.taobao.org \ |