使用 Docker 鏡像構建 GO 語言環境

1. 安裝 Docker

我當前使用的系統環境是 CentOS7 ,安裝 Docker 使用的命令是 yum install docker*。至於其它系統,能夠到百度查找其對應的安裝方式。linux

2. 配置 Docker 鏡像倉庫的地址

目前來講,直接訪問 Docker 官網的 DockerHub 會比較慢, 不過幸虧如今國內出現了一些 DockerHub 的加速網站。 下面使用 ustc 加速器。golang

修改文件 /etc/docker/daemon.json,將其內容修改成docker

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

配置完成後,重啓 Docker 服務:systemctl restart dockerjson

這樣就可使用 https://docker.mirrors.ustc.edu.cn 加速器了。bash

若是 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 ,說明是官方的,因此理論上應該是更可信的。 因此咱們就選擇使用第一個了。ui

執行命令 docker pull docker.io/golang 來下載 golang 的官方鏡像吧。spa

$ 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

 


 

同步發表:https://www.fengbohello.top/archives/go-env-docker

相關文章
相關標籤/搜索