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 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