Docker 入门实践
1.1. Dockerfile文件编写
在项目中新建Dockerfile文件,写入如下内容:
FROM node:8.12.0-alpine
ENV NODE_ENV production
WORKDIR /usr/src/app
# 复制 package.json,如果依赖包不发生变化,当前npm模块会有镜像缓存
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
# 安装 app 依赖
RUN npm install --production --silent --registry=https://registry.npm.taobao.org
COPY ./src ./src
EXPOSE 2368
CMD npm start
命令含义:
- FROM 指定nodejs版本号,-alpine表示精简版本,可以减小Docker Image的体积
- COPY 复制当前目录到 image 文件的指定目录
- WORKDIR 指定工作路径
- RUN 在指定工作目录,执行命令
- EXPOSE 暴露容器端口,允许外部连接
- CMD 容器启动后执行命令,与 RUN 命令区别,Dockerfile可以包含多个RUN命令,CMD只能有一个
1.2. Docker Image 构建
在Dockerfile 文件之后,使用 docker build 命令构建 image 文件:
docker build -t node-server ./
之后使用 docker image ls 就可以看到构建好的 image 文件了。
1.3. Dockerfile Container (容器)运行
docker run --rm -it -p 2368:2368 node-server
执行上述命令,即可启动容器,访问本地 127.0.0.1:2368 即可获取内容。
1.4. Docker Compose
实际应用场景中,我们可能还会 用到 nginx 做负载和静态资源转发,然后会为 nginx 再写一个Dockerfile。
当然将nginx和刚才的node server混合到一个Dockerfile也是可以的,但建议还是将 nginx node 还有数据库等等做拆分,然后使用docker compose来对Docker 容器进行整合。
使用 docker compose 时,主要是编写 docker-compose.yml 构建文件。
version: '2.1'
networks:
server:
services:
# node 服务配置
node-server:
build: ./node-server
environment:
NODE_ENV: production
networks:
- server
ports:
- "2368:2368"
# nginx 服务配置
nginx:
build: ./nginx
depends_on:
- node-server
networks:
- server
volumes:
# Dockerfile中不支持这种挂载方式
# 挂载www目录
- ./nginx/www:/var/www/demo
# 挂载nginx log目录
- ./nginx/log:/var/log/nginx
ports:
- "80:80"
命令解释:
-
version 指定yml文件的版本号
-
services 指定服务
-
build 指定 dockerfile 所在目录
-
environment 指定环境变量
-
depends_on 指定依赖,解决容器先后启动的问题
-
networks 指定容器连接的网络
-
volumes 挂载机器目录,到容器中
-
ports 指定机器端口和容器端口绑定
之后在docker-compose.yml运行下列命令即可:
docker-compose stop #停止容器
docker-compose rm #删除容器
docker-compose build #重新建立
docker-compose up -d #启动运行 加-d 表示后台运行
如果文件内容修改后,需重新 stop、rm、build,防止直接 up 启动时使用上次缓存。
最后附上 已经 写好的 pm2 + node + nginx 的一个示例 。
参考文档: