Docker:部署Node.js项目
Dockerfile:
FROM node:6.2
# Author
MAINTAINER wizzer "wizzer@qq.com"
ENV PORT 1337
RUN apt-get update && apt-get install -y \
imagemagick \
--no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN mkdir -p /node/nodeshop
WORKDIR /node/nodeshop
RUN npm config set registry https://registry.npm.taobao.org
RUN npm i node-gyp -g
RUN npm i pm2 -g
ADD api /node/nodeshop/api
ADD assets /node/nodeshop/assets
ADD config /node/nodeshop/config
ADD tasks /node/nodeshop/tasks
ADD views /node/nodeshop/views
ADD app.js /node/nodeshop
ADD Gruntfile.js /node/nodeshop
ADD package.json /node/nodeshop
RUN npm i
EXPOSE ${PORT}
ENV LANG C.UTF-8
ENV TZ "Asia/Shanghai"
VOLUME ["/node/nodeshop/cert", "/node/nodeshop/upload", "/node/nodeshop/backup"]
CMD [ "pm2", "start", "--no-daemon", "app.js" ]
docker-compose.yml:
redis:
image: redis
db:
image: mariadb:5.5
environment:
"MYSQL_ROOT_PASSWORD": "xxxxxx"
"MYSQL_DATABASE": "db123"
command: "mysqld --character-set-server=utf8"
ports:
- "127.0.0.1:3306:3306"
volumes:
- "/node/nodeshop/db:/var/lib/mysql"
web:
image: wizzer/nodeshop
links:
- redis
- db
environment:
"MYSQL_HOST": "db"
"MYSQL_USER": "root"
"MYSQL_PASSWORD": "xxxxxx"
"MYSQL_DATABASE": "db123"
"MYSQL_LIMIT": 150
"REDIS_HOST": "redis"
"REDIS_PASS": ""
"LOG_LEVEL": "verbose"
"PORT": 1337
"NODE_ENV": "development"
command: "pm2 start /node/nodeshop/app.js --no-daemon"
ports:
- "1337:1337"
volumes:
- "/node/nodeshop/cert:/node/nodeshop/cert"
- "/node/nodeshop/upload:/node/nodeshop/upload"
- "/node/nodeshop/backup:/node/nodeshop/backup"
说明: 1、把数据库端口3306映射到127.0.0.1:3306 是为了还原数据库,web映射端口不绑定IP这样外网可以访问,通过nginx代理出去. 2、volumes将数据文件、数据库文件使用容器外文件夹,这样重启后不丢失数据.
…
1、打包最新image docker build -t wizzer/nodeshop .
. 为当前文件夹,通过Dockerfile打包 wizzer/nodeshop:v1.0 用户名/项目:版本号
docker images 列出所有镜像 docker rmi ID 删除某个镜像 docker ps -a 列出所有容器 docker rm ID 删除某个容器 2、Centos安装Docker-engine 1.7.1版本(windows安装docker-toolbox即可)
vi /etc/yum.repos.d/docker.repo
[dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/6/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg
yum search docker yum install docker-engine.x86_64 service docker start 启动docker服务 chkconfig docker on 设置为开启启动
3、Centos安装docker-compose 1.1.0版本(windows安装docker-toolbox即可)
curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
ps:第一行命令复制会少符号,到 https://github.com/docker/compose/releases/ 复制命令。
4、迁移镜像 docker ps -a 列出容器快照 docker export ID > nodeshop.tar 将容器快照导出 cat /node/nodeshop.tar | docker import – wizzer/nodeshop 加载容器快照
5、创建运行目录 分别创建4个文件夹【必须】 /node/nodeshop/cert 将证书文件拷贝进去 /node/nodeshop/upload 附件上传文件夹 /node/nodeshop/backup 数据库备份文件夹 /node/nodeshop/db 数据库文件夹 将Dockfile 、 docker-compose.yml 拷贝到 /node/nodeshop 目录
6、启动项目
cd /node/nodeshop docker-compose up -d docker-compose ps 列出正在运行的服务 docker-compose stop 停止服务 docker ps -a 列出所有容器状态 docker rm ID 删除容器
若要修改环境变量,可以修改 /node/nodeshop/docker-compose.yml 文件内容
7、安装mariadb客户端(用于连接数据库)
cd /etc/yum.repos.d/ vi MariaDB.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/5.5/centos6-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 yum install MariaDB-client
MariaDB-server 不需要安装
8、还原数据
mysql -h 127.0.0.1 -u root -p 密码 show databases; use nodeshop; source /node/nodeshop/db.sql; show tables; exit;
9、重启docker容器
docker-compose stop docker-compose start
10、进入容器执行命令,比如测试网络情况
docker ps -a docler exec -it ID /bin/bash ping 192.168.1.11 exit
如果网络不通,可能需要关闭防火墙,然后重启docker服务:
service docker restart
11、容器开机自启动
vi /etc/rc.d/rc.local /usr/local/bin/docker-compose -f /node/sunshop/docker-compose.yml up -d
注意:如果是centos7 则需要执行 chmod +x /etc/rc.d/rc.local 添加执行权限.
本教程适用于Centos6.x版本,7或有不同。