使用docker部署项目主要分为三步
1.创建nodejs项目
编写package.json为项目安装依赖所用
{
"name": "expressPro",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.16.3"
}
}
服务启动文件server.js
var express = require('express');
var app = express();
app.use(express.static('dist'));//表示dist目录下的为静态资源
var server = app.listen(3333, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
至此我们完成了nodejs项目开启一个简单web服务的功能
2.编写Dockerfile以及dockerignore
Dockerfile
#引用镜像
FROM node:8.9.4-alpine
#作者
MAINTAINER mkq
#执行命令,创建文件夹
RUN mkdir -p /usr/src/workPlace_express/expressPro
#将dist目录拷贝到镜像里
COPY ./dist /usr/src/workPlace_express/expressPro/dist/
COPY package.json /usr/src/workPlace_express/expressPro
COPY server.js /usr/src/workPlace_express/expressPro
#指定工作目录
WORKDIR /usr/src/workPlace_express/expressPro
#安装依赖及构建node应用
RUN npm install
#配置环境变量
ENV HOST 0.0.0.0
ENV PORT 3333
#定义程序默认端口
EXPOSE 3333
#运行程序命令
CMD ["node","server.js"]
dockerignore
# Logs
logs
*.log
npm-debug.log*
# Runtime data
pids
*.pid
*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules
jspm_packages
# Optional npm cache directory
.npm
# Optional REPL history
.node_repl_history
.idea
.node_modules
node_modules
.vscode
至此打包镜像准备工作完毕
3.打包镜像
在Dockerfile同级路径下执行如下命令构建镜像
# docker build -t docker_demo1 .
注意后面的.不能省略
不出意外的话我们就构建docker镜像成功了。然后可以使用如下命令查看已构建的镜像
docker images
镜像构建完成之后我们就可以通过镜像启动一个容器了,使用如下命令
docker run -d -p 9000:3333 docker_demo1
-d表示后台运行。-p表示指定端口映射,此例中是将宿主机器的9000端口映射到3333,3333端口也就是我们的Dockerfile对外暴露的接口。
然后我们可以使用如下命令查看已启动的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5512f616077d docker_demo “node server.js” 22 hours ago Up 22 hours 0.0.0.0:9000->3333/tcp reverent_driscoll
a76391d51230 docker_demo “node server.js” 22 hours ago Up 22 hours 0.0.0.0:3333->3333/tcp lucid_edison
至此已经用docker部署了一个node应用。我们便可以通过宿主主机的ip:9000访问到容器上3333端口上的服务了。
4.docker 常用命令
docker images [options "o">] [name]
-a 列出所有镜像(含过程镜像);
-f 过滤镜像,如: -f ['dangling=true'] 只列出满足
dangling=true 条件的镜像;
--no-trunc 可显示完整的镜像ID;
-q 仅列出镜像ID。
--tree 以树状结构列出镜像的所有提交历史。
2. docker ps
列出所有运行中容器。
-a 列出所有容器(含沉睡镜像);
--before="nginx" 列出在某一容器之前创建的容器,接受容器名称和ID作为参数;
--since="nginx" 列出在某一容器之后创建的容器,接受容器名称和ID作为参数;
-f [exited=<int>] 列出满足
exited=<int> 条件的容器;
-l 仅列出最新创建的一个容器;
--no-trunc 显示完整的容器ID;
-n=4 列出最近创建的4个容器;
-q 仅列出容器ID;
-s 显示容器大小。
3. docker rmi
docker rmi [options "o">] <image> "o">[image...]
docker rmi nginx:latest postgres:latest python:latest
从本地移除一个或多个指定的镜像。
-f 强行移除该镜像,即使其正被使用;
--no-prune 不移除该镜像的过程镜像,默认移除。
要删除全部image的话
docker rmi $(docker images -q)
4. docker rm
docker rm [options "o">] <container> "o">[container...]
docker rm nginx-01 nginx-02 db-01 db-02
sudo docker rm -l /webapp/redis
-f 强行移除该容器,即使其正在运行;
-l 移除容器间的网络连接,而非容器本身;
-v 移除与容器关联的空间。
docker rm $(docker ps -aq) :删除所有容器
docker stop [NAME]/[CONTAINER ID]:将容器退出。
docker kill [NAME]/[CONTAINER ID]:强制停止一个容器。