开始使用Docker

安装Docker并运行Hello World容器

在安装好的环境中,运行现成的hello world容器
1
docker run --rm busybox echo "Hello world"
Copied!
--rm 可以让容器随着我们使用完毕会自动删除
1
# docker方式运行容器最简单语法
2
docker run <image>:<tag>
Copied!

创建一个简单应用

一个简单的http服务代码,nodejs语法
1
const http = require('http');
2
const os = require('os');
3
4
console.log("Kubia server starting...");
5
6
var handler = function(request, response) {
7
console.log("Received request from " + request.connection.remoteAddress);
8
response.writeHead(200);
9
response.end("You've hit " + os.hostname() + "\n");
10
};
11
12
var www = http.createServer(handler);
13
www.listen(8080);
14
Copied!
如果你本地有node环境,可以运行测试一下
1
node app.js
Copied!
上述的node命令可以使用下面的脚本安装
(后面不回再用到了,跳过这个运行测试也是可以的)
1
# 安装node环境
2
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
3
4
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
5
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
6
7
nvm install node
8
Copied!
在另外一个控制台 curl
1
$ curl http://localhost:8080/ 130
2
You've hit *这里显示你的机器名*
Copied!

构建与运行你的第一个应用

这个Dockerfile可以打包构建应用
1
FROM node:7
2
ADD app.js /app.js
3
ENTRYPOINT ["node", "app.js"]
Copied!
在同一目录运行,注意目录,其中kubia是应用名字
1
docker build -t <kubia可以起个名字> .
Copied!
如果大家共用一个docker环境,需要避免名字冲突,如镜像名字、容器名字
看到制作过程,根据网络情况拉取node环境有快慢,耐心
完成后,运行 docker images 能找到刚制作好的镜像,还挺大的是吧
运行一下容器镜像
1
docker run --name kubia-container -p 8080:8080 -d kubia
Copied!
如果不想制作可以使用课程已经制作好的镜像,对比一下
1
docker run --rm --name kubia-container -p 8080:8080 -d luksa/kubia
Copied!
注意这里可以前面提到的 --rm ,临时做实验销毁比较方便,后面使用--rm时不再赘述了
开另一个控制台,访问一下8080试试吧

探索运行容器的内部

容器有他内部的环境,进去看看
1
$ docker exec -it kubia-container bash
Copied!
登陆进了容器的bash环境,当然我们的node环境集成了bash环境,挨个运行以下日志,看看进程和目录
1
ps aux
2
ps aux | grep app.js
3
ls /
Copied!
可以知道容器就是把应用完整的环境封装起来运行了,和外部环境是独立的

练习常用的操作

临时停止容器
1
docker stop kubia-container
Copied!
不用了销毁容器
1
docker rm kubia-container
Copied!

规范镜像和仓库的管理

可以为我们的镜像打tag,并推送到仓库,如代码一样
1
docker tag kubia luksa/kubia
2
docker push luksa/kubia
Copied!
这里课件已经推送好了,后续大家可以直接使用,不用二遍事了:)

思考题

  • 请问docker构建镜像时那个文件叫什么名字?(扩展,可以换名字么?)
  • busybox这个镜像是做什么用的?
  • 临时测试一个容器,用完自动销毁使用什么参数?