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 -ddocker-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=1yum 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或有不同。