KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA

02 · 第一个容器 — keel 龙骨

上一章你跑的 hello-world 只是打印一句话。这一章跑一个真正的服务, 并且用浏览器打开它——这是你第一次看见"容器到底在干什么"。

上一章你跑的 hello-world 只是打印一句话。这一章跑一个真正的服务,
并且用浏览器打开它——这是你第一次看见"容器到底在干什么"。

一、跑起来

docker run -d --name web -p 8080:80 nginx

敲完之后会输出一长串十六进制字符,类似:

8f3c1b2a9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a

⚠️ 未实测:本机 daemon 未运行。以下所有输出版块都按标准形状写成,请以你屏幕上的为准。

那一串字符是这个容器的编号(后面会用到它的前几位)。记住这一点就够了:
docker run 成功之后,会把这个容器的 id 打给你。

二、这一行的每一段在做什么

这是本课最重要的一段。把命令行拆开看:

片段 名字 它在做什么
docker run 跑起来 从一个镜像启动一个容器
-d detached,后台运行 不占用你的终端。不加它,你会被"钉"在日志界面里,按 Ctrl+C 容器就停了
--name web 给容器起名 不起名的话 Docker 会随机分配一个;起了名后面就能用 web 指代,不用记那串 id
-p 8080:80 端口映射 把你电脑的 8080 端口,接到容器里的 80 端口
nginx 镜像名 跑的是哪个镜像。本机没有就先去下载

-p 这一段值得单独说,因为它最容易看错方向:

-p 8080:80
   ↑     ↑
 你的电脑  容器里面

冒号左边是你自己的机器,右边是容器。 nginx 这个程序在容器里监听的是 80 端口,
而你电脑上并没有 80 端口在监听——-p 做的就是"在中间架一段线"。
所以你在浏览器里要访问的是 localhost:8080,不是 localhost:80。
(写成 -p 80:80 也可以,但 80 是常用端口,容易被本机别的程序占着,所以这里用 8080。)

三、看到结果

浏览器打开:

http://localhost:8080

你会看到 nginx 的欢迎页——一句 Welcome to nginx!。

这一页是从容器里出来的。 你的电脑上并没有安装 nginx,也没有任何 nginx 进程在跑;
是那段端口映射把请求递进了容器。

四、看它、停它、删它

docker ps

列出正在运行的容器。你会看到一行,NAMES 那一列是 web,
PORTS 那一列会有 0.0.0.0:8080->80/tcp 这样的字样——
读法就是刚才那张图:左边的 8080 是你机器,右边的 80 是容器。

docker logs web

看这个容器打印出来的日志。nginx 会把每个进来的请求记一行。
你可以先在浏览器刷新几次,再敲这条命令——刷新几次就会多几行。
这是你以后排查问题的第一件工具。

docker stop web
docker rm web

顺序不能反:先停,再删。直接 docker rm 一个运行中的容器会报错。

再回到浏览器刷新,网页就打不开了——这正是"容器已经没了"的样子。

五、它不是什么

翻回头看这一行命令,纠正一个几乎所有人都会有的第一印象:

你不是"在自己的电脑上装了一个 nginx"。

这条区别很有用:镜像留在本地,容器随用随删。 这也是为什么别人给你一条
docker run 命令,你就能在他描述的环境里跑起来一模一样的东西——
要带走的是镜像,不是"在我机器上是好的"。

读完你能做什么

下一步:现在你跑的都是别人做好的镜像。下一章把自己写的一个小程序装进去——
那就是你自己在做镜像了。

进入 keel 阅读