- 前提条件
0.0 环境准备
0.1 安装docker
- 使用busybox镜像输出Hello World(命令行输出Hello World后结束)
docker run busybox echo "Hello World"
- 创建一个简单的Node.js应用
- 创建app.js文件
const http = require('http');
const os = require('os');
console.log("Kubia server starting...");
var handler = function(request, response) {
console.log("Received request from " + request.connection.remoteAddress);
response.writeHead(200);
response.end("You've hit " + os.hostname() + "\n");
};
var www = http.createServer(handler);
www.listen(8080);
- 为镜像创建Dockerfile(创建一个叫Dockerfile的文件,它包含了一系列构建镜像时会执行的指令,Dockerfile文件需要和app.js文件在同一目录)
FROM node:7
ADD app.js /app.js
ENTRYPOINT ["node", "app.js"]
- 构建容器镜像(每一行Dockerfile指令都会产生一个新层,也可以通过运行已有镜像容器手动构建镜像,优点是Dockerfile是自动化且可重复的)
docker build -t kubia .
- 列出本地存储的镜像
docker images
- 运行容器镜像(–name指定容器名,-d指定在后台运行,-p 8080:8080代表本机的8080被映射到容器的8080)
docker run --name kubia-container -p 8080:8080 -d kubia
- 访问应用(显示的hostname是容器的container ID),浏览器直接访问http://8.130.177.188:8080
- 列出所有运行中的容器(此处可以看到containerID)
docker ps
- 获取更多的容器信息(假设此containerID为:2d72684645cd)
docker inspect 2d72684645cd
- 在主机操作系统上查看容器内的进程
ps aux|grep app.js
- 探索运行容器的内部
- 在已有的容器内部运行shell(-i:确保标准输入流保持开放。-t:分配一个伪终端TTY)
docker exec -it kubia-container bash
- 查询当前系统所有进程(-a:显示所有进程(包括其他用户的进程)-u:用户以及其他详细信息 -x:显示没有控制终端的进程,正常只会查出来3个进程,一个node,一个bash,一个当前的ps指令)
ps aux
- 容器的文件系统也是独立的(只会展示容器内的文件,包括镜像内的所有文件,再加上容器运行时创建的任何文件,如可以看到app.js在根目录)
ls /
- 退出容器
exit
- 停止和删除容器
- 停止容器(停止后可以使用docker ps -a查询到运行中和已经停止的容器)
docker stop kubia-container
- 删除容器(所有内容会被删除且无法再次启动)
docker rm kubia-container
- 向镜像仓库推送镜像
- 在hub.docker.com创建账号
username:nuptaxin,pwd:******
- 使用附加标签标注镜像(使用docker images查看是否打tag成功了,kubia和nuptaxin/kubia是两个镜像,但是指向同一个id)
docker tag kubia nuptaxin/kubia
- 登录你的docker账号
docker login
- 向Docker Hub推送镜像
docker push nuptaxin/kubia
- 在不同机器上运行镜像(推送完成后,镜像便可以给任何人使用)
docker run --name kubia-container2 -p 8080:8080 -d nuptaxin/kubia
- 资源清理
docker stop kubia-container2