第五天:与容器互动
这是从adventofdocker.com转发的内容
嘿!恭喜你坚持到第五天。今天我们继续从第4天开始的Go应用程序,并让它更有趣。我们将从运行一个简单的HTTP服务器开始,然后看看我们如何与它互动!
先来快速回顾一下,昨天我们创建了一个Dockerfile如下所示:
FROM golang
COPY . .
RUN go build -o main main.go
CMD ["./main"]
全屏模式 / 退出全屏
main.go 文件看起来像这样。
package main
import "fmt"
func main() {
fmt.Println("你好,世界!")
}
切换到全屏模式 退出全屏
如果你昨天还没搞定它,请新建一个文件夹,然后把文件放进去吧!
打印 "Hello World" 当然有点无聊,所以我们添加一个简单的 HTTP 服务器让我们的应用程序有趣一点。
为此目的,我们将修改我们的 main.go 文件,使其如下所示:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello World!") // 这将在你请求 / 时作为响应输出
})
fmt.Println("监听 8080 端口")
http.ListenAndServe(":8080", nil) // 这将启动 HTTP 服务器(阻塞操作),并监听 8080 端口
}
(点击全屏) (退出全屏)
在这里,我们基本上只是创建了一个路由(/
),当有人访问根路径时,它会显示'Hello World!'。HTTP服务器将在8080端口上监听。如果你愿意尝试,可以尝试添加更多路由,更改端口或修改消息。
你还可以用昨天的那个Dockerfile来制作镜像,就像我们昨天做的一样。
运行以下命令来构建名为hello-world-go的Docker镜像。
$ docker build -t hello-world-go .
全屏 退出全屏
然后像昨天一样运行它。
运行`docker run hello-world-go`命令。这会运行一个名为`hello-world-go`的示例程序。
全屏 退出全屏
如果你现在打开浏览器并导航到 http://localhost:8080
,你应该会看到"Hello, World!",对不对?
嗯,其实也不是……
查看图片
这是因为 Docker 容器默认与主机隔离。这意味着在容器中监听的端口默认无法从主机访问。你需要明确告诉 Docker 想要暴露哪个端口。为此,先按 CTRL+C
停止容器运行,然后修改运行命令:
$ docker run -p 8080:8080 hello-world-go
(用Docker运行hello-world-go镜像,把容器的8080端口映射到主机的8080端口)
进入全屏 退出全屏
这会将容器的8080端口映射到主机的8080端口。现在导航到 http://localhost:8080
,你应该会在浏览器中看到如下内容:“Hello, World!”。
点击看图片
太棒了!我觉得现在是玩一下端口的好时机。在你的 main.go
文件里改改端口号,看看会有什么反应。
小贴士:如果你看到了别人写的Dockerfile,你经常会看到一个EXPOSE
指令。实际上,EXPOSE
指令并不会将端口暴露给宿主机,它基本上只是文档,用来在编写Dockerfile的开发者或维护者和使用它的用户之间沟通信息。关于它
FROM golang
# 使用golang作为基础镜像
COPY . .
# 从当前目录复制所有文件到镜像中
RUN go build -o main main.go
# 编译main.go文件到可执行文件main
EXPOSE 8080
# 暴露容器上的8080端口
CMD ["./main"]
# 设置容器启动时运行的命令为./main
切换到全屏,退出全屏
与运行中的容器进行交互我想给你介绍三个操作容器的有用命令:比如 docker ps
,docker stats
和 docker exec
。
在开发过程中,同时运行多个容器是常有的事。你可能有一个容器用于API,一个用于前端,还有一个用于数据库。如果你想了解当前正在运行的内容?
这时候你可以用 docker ps
来查看。docker ps
可以列出当前正在运行的容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
27a27b6343a7 http-server "./main" 6分钟之前 运行了6分钟 0.0.0.0:8080->8080/tcp funny_galois
全屏,退出全屏
这里你可以看到名为funny_galois
的容器正在运行http-server
镜像,并监听8080端口。这非常有用,对吧?
如果输出为空,那可能是因为你的容器已经停止了运行。你可以通过docker ps -a
命令列出所有曾经运行过的容器。
有时候你想更深入了解容器的资源使用情况。docker stats
就能帮到你。docker stats
可以帮你查看容器的资源使用情况:
$ docker stats
容器 ID 名称 CPU% 内存使用量 / 上限 内存占比 网络流量 磁盘输入输出 进程数
27a27b6343a7 funny_galois 0.00% 4.914MiB / 7.661GiB 0.06% 4.59 KB / 846 B 0B / 0B 6
切换到全屏 / 退出全屏
在这里你可以看到我们的funny_galois
容器只用了0.00%的CPU,4.914MiB的内存(这是总限制7.661GiB的0.06%)。它完成了4.59kB的网络I/O和0B的块I/O,并且有6个进程在运行。这对于调试超级有用!
最后,我想展示给你如何与运行中的容器互动。如果你想在容器里随便看看,打开一个 shell,或者安装一些包呢?通常这不被推荐(因为容器应该是短暂的且不保存状态),但这对于调试很有帮助。要实现这一点,我们可以使用 docker exec
命令。
$ docker exec -it funny_galois bash
切换到全屏,退出全屏
funny_galois
是我们容器的名字,你可以使用上面的 docker ps
命令来获取你的容器名称。-it
参数用于将你的终端连接到容器,以便你可以使用它。bash
命令会打开容器中的 shell。运行这个命令后,你就会进入容器里,从这里你可以浏览文件系统,安装软件,进行各种操作等。例如,你可能只想用 ls
看看当前目录里有什么。
运行命令:docker exec -ti funny_galois bash
启动bash shell环境
输出如下:
root@27a27b6343a7:/go# ls
列出的文件有:
文件包括:Dockerfile, bin, main, main.go, src
全屏模式,退出全屏
我建议你试试这个,在容器里探索一下。添加文件,安装包。玩得尽兴!然后停止容器,再启动一次,看看文件还在不在。为什么不见了?
那就是明天内容的预告,我们将回顾一下层是什么,为什么容器是短暂的,这对我们来说意味着什么 :)
祝你编程愉快,加油!🚀
乔纳斯 (Jonas)
共同学习,写下你的评论
评论加载中...
作者其他优质文章