使用 Docker 镜像构建 GO 语言环境
1. 安装 Docker
我当前使用的系统环境是 CentOS7 ,安装 Docker 使用的命令是 yum install docker*。至于其它系统,可以到百度查找其对应的安装方式。
2. 配置 Docker 镜像仓库的地址
目前来说,直接访问 Docker 官网的 DockerHub 会比较慢, 不过幸好现在国内出现了一些 DockerHub 的加速网站。 下面使用 ustc 加速器。
修改文件 /etc/docker/daemon.json,将其内容修改为
{
"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 镜像的信息了。
$ 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
: 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 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
drwxrwxrwx. root root Jan : code
drwxrwxrwx. root root Jan : 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
同步发表:https://www.fengbohello.top/archives/go-env-docker
使用 Docker 镜像构建 GO 语言环境的更多相关文章
- 【云计算】Docker 镜像如何设置语言环境?bash: warning: setlocale: LC_ALL: cannot change locale (en_US)
解决方案: # set default language environment RUN locale-gen en_US.UTF- \ && dpkg-reconfigure loc ...
- Docker 镜像针对不同语言的精简策略
导航: 这里分为几个部分. 相关转载云原生:米开朗基杨 1.Docker减小镜像体积 2.Docker镜像针对不同语言的精简策略 对于刚接触容器的人来说,他们很容易被自己制作的 Docker 镜像体积 ...
- Docker镜像构建(五)
Docker 镜像介绍 Docker镜像构建分为两种,一种是手动构建,另一种是Dockerfile(自动构建) 手动构建docker镜像 案例:我们基于centos镜像进行构建,制作自己的nginx镜 ...
- 龙芯GO!龙芯平台上构建Go语言环境指南
龙芯软件生态系列——龙芯GO!龙芯平台上构建Go语言环境指南2016-07-05 龙芯中科1初识Go语言Go语言是Google公司于2009年正式推出的一款开源的编程语言,是由Robert Gries ...
- 4、Docker 镜像构建
Docker 镜像构建 构建分为两种 手动构建 自动构建dockerfile 手动构建 首先启动一个Centos 容器,然后在容器中安装一个nginx [root@node ~]# docker ru ...
- PyCharm使用之利用Docker镜像搭建Python开发环境
在我们平时使用PyCharm的过程中,一般都是连接本地的Python环境进行开发,但是如果是离线的环境呢?这样就不好搭建Python开发环境,因为第三方模块的依赖复杂,不好通过离线安装包的方式安装 ...
- Docker镜像构建原理解析(不装docker也能构建镜像)
在devops流程里面 构建镜像是一个非常重要的过程,一般构建镜像是写dockerfile文件然后通过docker client来构建的image. docker client 会先检查本地有没有im ...
- Docker-通过docker-maven-plugin插件实现docker镜像构建并自动发布到远程docker服务器
我们知道,docker能实现应用打包隔离,实现快速部署和迁移.如果我们开发应用使用了spring cloud + spring boot架构,那么,通过docker-maven-plugin实现快速构 ...
- Docker镜像构建的两种方式(六)--技术流ken
镜像构建介绍 在什么情况下我们需要自己构建镜像那? (1)当我们找不到现有的镜像,比如自己开发的应用程序 (2)需要在镜像中加入特定的功能 docker构建镜像有两种方式:docker commit命 ...
随机推荐
- thinkphp5 Request请求类
获取请求类的几种方式: 1.助手函数(严格不算ba ) input('post.name'): 2.$request=\think\Request::instance(); 3.控制器中必须继承Con ...
- ATcoder Big Array
Problem Statement There is an empty array. The following N operations will be performed to insert in ...
- 在ArchLinux中安装MySQL
最近前端学习用到数据库的知识.鉴于MySQL被甲骨文收购的情况,我从MariaDB开始学习.操作系统Manjaro 17.1, 数据库版本MariaDB 10.1. 1. 安装MariaDb和其客户端 ...
- Redis自学笔记:3.6入门-有序集合类型
3.6有序集合类型 3.6.1介绍 在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得 分数最高(最低)的前N个元素,可以获得指定范围内的元素等 有序集合中每个元素不同,但它们的分数却可以 ...
- [JOI2017/2018]美術展
[JOI2017/2018]美術展 题目大意: 有\(n(n\le5\times10^5)\)个物品,每个物品有两个属性:尺寸\(A_i\)和收益\(B_i\).从中选取一个子集,总收益为\(\sum ...
- PhotoshopCC 2017安装破解 + cuterman
之前安装了PhotoshopCC 2017版本的软件,但是绿色版的(安装简介.使用方便).但是在随着Adobe公司对设计的不断追求和工具的不断更新,更加强大.更加优秀的设计插件和工具不断出新,最近朋友 ...
- BZOJ2872 : 优莱卡
$A$类数据:直接输出$B[l]$,$O(n+m)$.$B$类数据:ST表求区间最小值,$O(n\log n+m)$.$C$类数据:可持久线段树求区间$k$小值,$O((n+m)\log n)$.剩下 ...
- Android AsyncTask将讲解
原型:AsyncTask<Params, Progress, Result> Params 表示传入参数类型 Progress表示处理参数类型 Result表示返回类型 new Async ...
- Java 适配器模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能 ...
- js写滚动的文字
页面中的文字,逐个显示在页面:由于电脑的配置较低,录制的视频相对来说比较卡顿 思路: 用一个定时器将预制的文字通过字符串截取.substring(0, i)方法不断的赋给要显示的区域,i在定时器里面迭 ...