需求
在Docker中运行一个Nodejs项目,连接Mongo数据库进行数据操作,并启动RockMongo容器
思路
- 使用容器连接(link)方法,Mongo容器与WebApp容器连接
- 数据库连接语句要通过容器别名构建!!!
- 宿主机只需监听Web端口即可
- Rockmongo用于图形化界面管理数据库
前期准备
- 服务器上已有nodejs环境并可运行,根目录在/usr/local/node
- 项目中的数据库连接语句改成数据库容器别名,实例化Mongo容器时--name casebasedb,mongoose连接语句改为
var store = new SessionStore({url: 'mongodb://containerdb/session',interval: 1440});
mongoose.connect('mongodb://containerdb:27017/casebasedb', {useMongoClient: true,});
拉取镜像
$ sudo docker pull node
$ sudo docker pull mongo
$ sudo docker pull pataquets/rockmongo
构建Web镜像
编写Dockerfile
$ vim /***/Dockerfile
Dockerfile内容
FROM node:latest # 基于node镜像
COPY . /***/casebase # 项目源文件目录
COPY . /usr/local/node # 直接拖进去的node环境
WORKDIR /***/casebase # nodejs运行目录
RUN npm install # 重新安装下依赖包
EXPOSE 8001 # 暴露端口8001
CMD ["node", "app.js"] # 执行命令
根据Dockerfile新建镜像,命令结尾的 . 是指示Dockerfile文件在当前目录下
$ sudo docker build -t hugh/casebase .
实例化容器
- -p映射到当前8001端口;
- --link语句连接数据库 [数据库容器名]:[容器别名]
- 当连接成功后在web容器中可以直接ping到[容器别名containerdb]作为主机标识,所以一定要将数据库连接语句中的主机改成[容器别名]!!!
$ sudo docker run -d --name casebasedb mongo
$ sudo docker run --name casebaseapp -d -p 8001:8001 --link casebasedb:containerdb hugh/casebase
$ sudo docker run --name rockapp -d -p 8003:80 --link casebasedb:containerdb pataquets/rockmongo
验证容器
查看容器情况
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e2ab928a683 dh/casebase:17.09.16.1 "node app.js" 14 minutes ago Up 14 minutes 0.0.0.0:8001->8001/tcp casebaseapp
66e6ba5f5873 mongo "docker-entrypoint..." 17 minutes ago Up 17 minutes 27017/tcp casebasedb
查看端口监听情况
$ sudo netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::8001 :::* LISTEN 32211/docker-proxy
访问宿主机ip:8001,此时已可以访问web项目了