为了账号安全,请及时绑定邮箱和手机立即绑定

第五天:与容器互动

这是从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 psdocker statsdocker 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)

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消