使用 Docker 镜像构建 GO 语言环境

简介:

1. 安装 Docker

我当前使用的系统环境是 CentOS7 ,安装 Docker 使用的命令是 yum install docker*。至于其它系统,可以到百度查找其对应的安装方式。

2. 配置 Docker 镜像仓库的地址

目前来说,直接访问 Docker 官网的 DockerHub 会比较慢, 不过幸好现在国内出现了一些 DockerHub 的加速网站。 下面使用 ustc 加速器。

修改文件 /etc/docker/daemon.json,将其内容修改为

1
2
3
{
     "registry-mirrors" : [ "https://docker.mirrors.ustc.edu.cn" ]
}

配置完成后,重启 Docker 服务:systemctl restart docker

这样就可以使用 https://docker.mirrors.ustc.edu.cn 加速器了。

如果 ustc 的加速器速度不够快,还可以尝试一下其它的加速器,具体请参考这里 Docker 镜像加速器

3. 下载 golang 的 Docker 镜像

现在就可以下载 golang 的 Docker 镜像了。

在命令行执行命令 docker search golang 就可以查询 golang 镜像的信息了。

1
2
3
4
5
6
$ docker search golang
INDEX       NAME                              DESCRIPTION         STARS     OFFICIAL   AUTOMATED
docker.io   docker.io /golang                   Go (golang) is...   1649      [OK]      
docker.io   docker.io /circleci/golang          Go (golang) is...   8                   
docker.io   docker.io /resin/artik710-golang    Go (golang) is...   1                   
docker.io   docker.io /resin/artik10-golang     Go (golang) is...   0

可以看到,在查询结果中排名第一的,STARS 数量最多, 并且 OFFICIAL 选项下面是 OK ,说明是官方的,所以理论上应该是更可信的。 所以我们就选择使用第一个了。

执行命令 docker pull docker.io/golang 来下载 golang 的官方镜像吧。

复制代码
$ docker pull docker.io/golang

[root@fengbo golang]$ docker pull docker.io/golang
Using default tag: latest
Trying to pull repository docker.io/library/golang ... 
latest: Pulling from docker.io/library/golang
723254a2c089: Extracting [===============================>     ] 40.83 MB/45.12 MB
abe15a44e12f: Download complete 
409a28e3cc3d: Download complete 
503166935590: Download complete 
abe52c89597f: Download complete 
ce145c5cf4da: Downloading [===============>                     ] 31.36 MB/104.3 MB
96e333289084: Download complete 
39cd5f38ffb8: Download complete 
39cd5f38ffb8: Pulling fs layer 
复制代码

下载好了之后,查看一下镜像的信息 docker images golang

复制代码
[root@fengbo golang]$ docker images golang
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/golang    latest              138bd936fa29        4 weeks ago         733.3 MB
复制代码

 

4. 使用 golang 镜像

执行命令 docker run -it --rm golang bash ,测试一下刚刚下载的 golang 镜像

[root@fengbo golang]$ docker run -it --rm golang bash
root@9e46b1255f4b:/go# go version
go version go1.9.2 linux/amd64

可以看到,最新的是 1.9.2 版本的。

查看进到容器后的默认目录

root@9e46b1255f4b:/go# pwd
/go

看来是在 /go 目录下面。

不过因为我们在创建容器的时候加了 --rm 参数,所以当我们执行 exit 命令退出容器的时候,这个临时容器会被删除。

那我们如何使用这个 golang 的镜像来工作呢?

5. golang 的 Docker 镜像的一种使用方式

首先,如果我们把文件直接写在 Docker 容器里面的话,那么数据是无法持久化的。 即使可以使用 docker cp 命令这样的方式把我们的文件复制到容器内部, 或者把文件从容器中复制出来,但是在操作的时候仍会有很多不方便的地方。

而且,在 golang 的镜像中进行 build 操作的时候,程序依赖的第三方包, 会被下载到容器的 /go 目录下面。如果每次容器都删除, 或者每次创建新的容器的时候,都需要从网络上拉取一次第三方包。 如果网速快的话还好,否则时间浪费的有点儿严重。

所以,我们要把主机的目录映射到容器中,这样就可以把文件进行持久化了。

我们可以使用 docker 命令的 -v 参数,把主机的目录映射到容器中。 不过只使用 -v 参数的话,在容器内部操作目录会有权限限制, 所以还需要增加 --privileged 参数给容器放权。

复制代码
[root@fengbo golang]$ pwd        # 查看当前所在的目录
/root/golang
[root@fengbo golang]$ ls -l      # 查看当前目录下的子目录和文件等
total 0
drwxrwxrwx. 2 root root 6 Jan 10 01:19 code
drwxrwxrwx. 2 root root 6 Jan 10 01:20 go
[root@fengbo golang]$ docker run \    # 执行 docker 命令,创建一个新的容器并运行这个容器
> -it \                               # 使用交互模式
> --rm \                              # 当退出这个容器时,系统自动删除这个容器
> -v /root/golang/go:/go \            # 把主机的目录 '/root/golang/go' 映射为容器内的目录 '/go'
> -v /root/golang/code:/code \        # 把主机的目录 '/root/golang/code' 映射为容器内的目录 '/code'
> --privileged \                      # 给这个容器超级权限,否则无法操作上面映射进去的两个目录
> docker.io/golang \                  # 基于镜像 'docker.io/golang' 创建容器
> bash                                # 在容器内执行命令 'bash'
> root@fe6be9f3b22d:/go#              # 已经进入容器了
复制代码

我们可以在容器的目录 /go 和目录 /code 里面创建一些文件, 然后返回主机查看。

复制代码
root@bb2942f33960:/go# echo "hello" > /go/h.txt     # 在容器内,创建文件 '/go/h.txt' 并写入数据
root@bb2942f33960:/go# echo "world" > /code/w.txt   # 在容器内,创建文件 '/code/w.txt' 并写入数据
root@bb2942f33960:/go# exit                         # 退出容器
exit
[root@fengbo golang]# find                          # 已经回到主机了。在主机的 '/root/golang' 目录下查看文件
.
./code
./code/w.txt                                        # 可以看到文件 'w.txt'
./go
./go/h.txt                                          # 以及文件 'h.txt'
[root@fengbo golang]# cat go/h.txt 
hello
[root@fengbo golang]# cat code/w.txt 
world
复制代码

使用上面的方法,每次创建了容器,都会把主机上指定的目录映射到容器中,修改的数据也会反映到主机上。

6. 方便以后查阅和直接使用,完整命令如下


开启容器

docker run -it --rm -v /root/golang/go:/go -v /root/golang/code:/code --privileged docker.io/golang bash

 


本文转自郝峰波博客园博客,原文链接:http://www.cnblogs.com/fengbohello/p/8259904.html,如需转载请自行联系原作者

相关文章
|
监控 Java Go
无感改造,完美监控:Docker 多阶段构建 Go 应用无侵入观测
本文将介绍一种基于 Docker 多阶段构建的无侵入 Golang 应用观测方法,通过此方法用户无需对 Golang 应用源代码或者编译指令做任何改造,即可零成本为 Golang 应用注入可观测能力。
815 85
|
NoSQL Go API
MCP 官方开源 Registry 注册服务:基于 Go 和 MongoDB 构建
作为 `registry` 项目的贡献者,我很高兴能参与这个社区驱动的开源项目,也期待它不断发展壮大。本文将对 `registry` 服务进行介绍,为项目的推广尽一份绵薄之力。
495 3
MCP 官方开源 Registry 注册服务:基于 Go 和 MongoDB 构建
|
监控 安全 Go
使用Go语言构建网络IP层安全防护
在Go语言中构建网络IP层安全防护是一项需求明确的任务,考虑到高性能、并发和跨平台的优势,Go是构建此类安全系统的合适选择。通过紧密遵循上述步骤并结合最佳实践,可以构建一个强大的网络防护系统,以保障数字环境的安全完整。
355 12
|
Shell Go 开发工具
【环境】Rocky8使用gvm配置Go多版本管理的微服务开发环境(go-zero)
通过本文的介绍,我们详细讲解了如何在Rocky8上使用gvm来管理多个Go版本,并配置go-zero框架的开发环境。通过gvm的灵活管理,开发者可以轻松切换不同的Go版本,以适应不同项目的需求。同时,go-zero框架的使用进一步提升了微服务开发的效率和质量。希望本文能帮助开发者构建高效的Go语言开发环境,提高项目开发的灵活性和稳定性。
623 63
|
存储 中间件 网络安全
在Go中构建应用级IP防火墙机制
使用Go构建应用级别的IP防火墙机制不仅能够为你的应用程序增加一层额外的安全性,还能够通过自定义中间件的方式让你有更多控制力,来决定哪些客户端可以或不可以访问你的服务。
419 8
|
Java Shell Maven
【Azure Container App】构建Java应用镜像时候遇无法编译错误:ERROR [build 10/10] RUN ./mvnw.cmd dependency:go-offline -B -Dproduction package
在部署Java应用到Azure Container App时,构建镜像过程中出现错误:“./mvnw.cmd: No such file or directory”。尽管项目根目录包含mvnw和mvnw.cmd文件,但依然报错。问题出现在Dockerfile构建阶段执行`./mvnw dependency:go-offline`命令时,系统提示找不到可执行文件。经过排查,确认是mvnw文件内容异常所致。最终通过重新生成mvnw文件解决该问题,镜像成功构建。
826 1
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
人工智能 搜索推荐 程序员
用 Go 语言轻松构建 MCP 客户端与服务器
本文介绍了如何使用 mcp-go 构建一个完整的 MCP 应用,包括服务端和客户端两部分。 - 服务端支持注册工具(Tool)、资源(Resource)和提示词(Prompt),并可通过 stdio 或 sse 模式对外提供服务; - 客户端通过 stdio 连接服务器,支持初始化、列出服务内容、调用远程工具等操作。
3429 5
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
1153 6

热门文章

最新文章