Docker 初體驗

引言

前段時間在Udacity上學習Hadoop, 視頻教程中提到了使用CDH(cloudera distribution for hadoop)來搭建實驗環境,我就到CDH官網試水,發現有一種使用Docker鏡像的方式,由於我機器資源有限,最終也沒能搭建起Hadoop實驗環境,不過從這個地方開始接觸了Docker的使用,發現一片新的天地,才體會到爲啥好多人都說Docker是DevOps神器了。

體驗Docker

這裏寫圖片描述

  • Docker Hub, 你可以在上面直接拉取其它人已經製作好的鏡像來運行。也可以註冊自己的帳號,push自己的鏡像上去。不過由於國外服務器速度問題,目前我還沒有成功推上去我的第一個鏡像(比較大點的)。

國內解決pull鏡像慢的問題

DaoCloud加速器配置:

申請DaoCloud帳號, 登錄並進入控制檯, 控制檯上方點擊進入加速器,進入配置加速器頁面,根據不同平臺自行選擇方案

我使用MacOS,所以如下圖:

這裏寫圖片描述

Docker Daemon程序中的設置如下圖所示:

這裏寫圖片描述

如此配置以後,你在國內可以避免龜速拉取鏡像的問題。此內業界良心。

國內解決push鏡像慢的問題

由於上傳鏡像到Docker Hub沒有什麼別的辦法,國內直接push的速度簡直無法容忍,雖然可以使用DaoCloud的鏡像倉庫功能,不過那個需要收費,這不符合我這窮屌的身份,所以,我們可以考慮本地導出鏡像文件,上傳到網盤,下載下來,再導入其它機器的本地Docker環境中即可。雖然有些麻煩,不過不收費啊!這個push的問題解決思路也有了。

我準備和git倉庫聯合一起使用就可以共享了,因爲我自己電腦上搭了個gogs服務, 而且家裏服務器開着花生殼DDNS服務,所以自己可以方便的來回傳送。

  • 這個是導出docker鏡像的方法:
docker save -o image_file_path  docker_local_image
  • 中間是你把導出的鏡像上傳到任意你覺得共享方便的位置,例如上傳網盤或者推到git倉庫中,方便共享。

  • 最後是導入docker鏡像文件到本地docker環境:

docker load --input image_file_path

大功告成,導入後可以使用docker images命令確認一下。

Docker 實際的應用 Docker 下創建Ubuntu16.04 下的swift語言學習環境

swift的官方鏡像已經在Docker Hub上能夠搜索到了,詳細的使用說明也在鏡像的詳情描述中,很方便學習和實驗。 不過重複造個小輪子的過程我還是想要體會一下。

假設你已經安裝了docker daemon,並已經後臺運行,而且在國內也已經配置好了DaoCloud的加速器,那麼在終端下使用命令拉下ubuntu的官方鏡像先,我們就是基於這個基礎鏡像來設定我們自己的開發環境的:

docker pull ubuntu

當然如果你想要查找鏡像時可以使用docker search ubuntu 命令,這個用法與apt-cache search [target]流程很相似。

鏡像拉取成功後就可以使用docker images列出當前我們拉取到本地的所有鏡像:

bogon:~ JokerAtBaoFeng$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
ubuntu                       latest              f49eec89601e        3 weeks ago         129 MB

此時的鏡像的角色相當於面向對象程序設計中的類一樣,需要實例化後使用,對象實例化過程對應的就是從docker鏡像文件創建一個容器的過程,如果把docker鏡像當作一個類的話,容器就相當於從類生成的一個對象,容器的任何改變不會影響到原始的docker鏡像,我們可以修改容器,並把修改後的容器保存爲另一個鏡像,這就是生成定製鏡像的思路。

那麼,我們以交互式控制檯方式創建並運行ubuntu的一個容器,並進入bash,其中-it意思是以交互式(interactive)終端(tty)的方式運行,--name=swift-ubuntu指定容器的名稱,/bin/bash是容器啓動後執行的命令,也就是進入bash控制檯:

docker run -it --name=swift-ubuntu ubuntu /bin/bash

運行成功後會進入:

root@708cefae82b7:/# 

默認是root用戶,這裏我們使用諸如apt-get命令時就不需要sudo了。

官方的鏡像是最小的,只有129M,我們首先要更新和升級系統到最新,加個-y參數,以使更新過程不中斷,不提示用戶確認是否安裝相應的包,默認用戶同意安裝:

apt-get update && apt-get upgrade -y

系統升級之後,我們就可以安裝swiftREPL環境了,這個可以參考官網安裝說明

安裝依賴

 apt-get install -y clang libicu-dev

這裏是安裝clang編譯器相關工具和運行swift REPL運行庫依賴。

下載swift編譯包swift-<VERSION>-<PLATFORM>.tar.gz
你可以直接在容器中使用wget下載,或者在PC上下載下來後再拷貝到容器中:

容器內下載

apt-get install wget -y && cd /opt/ && wget https://swift.org/builds/swift-3.0.2-release/ubuntu1604/swift-3.0.2-RELEASE/swift-3.0.2-RELEASE-ubuntu16.04.tar.gz

我們把文件下載到/opt/目錄下。

將PC上的文件拷貝到容器中

這裏的命令不是在容器窗口中運行,而是在宿主機的控制檯運行。

docker cp swift-3.0.2-RELEASE-ubuntu16.04.tar.gz  swift-ubuntu:/opt/

swift-ubuntu是之前創建運行容器時指定的容器名稱,我們把PC上的swift編譯包拷貝到容器的/opt/目錄下。

當然這個命令也可以把容器中指定目錄中的文件,拷貝到宿主機上,只要docker cp之後的兩個地址的位置對調一下就可以了。

準備就緒,開始配置swift REPL環境

/opt/目錄下新建一個目錄swift,並把剛纔下載的編譯包移進去,並解壓:

mkdir -p /opt/swift &&
mv /opt/swift-*-RELEASE-ubuntu*.tar.gz /opt/swift &&
cd /opt/swift &&
tar zxvf swift-*-RELEASE-ubuntu*.tar.gz 

製作swift目錄的符號鏈接,這樣版本更新時,只要重新生成對應的符號鏈接就可以輕鬆升級:

ln -s /opt/swift/swift-*-RELEASE-ubuntu*[0-9] /opt/swift/swift-current

下一步,進行添加用戶環境變量。配置到~/.bashrc並使生效,我們調用swift二進制文件就是在剛纔解壓後的目錄中的/usr/bin下面,只不過我們通過符號鏈接的方式進行訪問目錄:

echo "export PATH=/opt/swift/swift-current/usr/bin:${PATH}" >> ~/.bashrc && source ~/.bashrc

現在,你可以在容器中運行swift --version來確認環境變量是否配置成功,我的結果顯示如下:

root@708cefae82b7:/opt/swift# swift --version
Swift version 3.0.2 (swift-3.0.2-RELEASE)
Target: x86_64-unknown-linux-gnu

這就說明環境變量配置成功了。

但我們運行一個swfit命令會發現有一些依賴需要另外安裝,主要是libpython2.7.so.1.0

root@708cefae82b7:/opt/swift# swift
/opt/swift/swift-3.0.2-RELEASE-ubuntu16.04/usr/bin/lldb: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

安裝依賴:

root@708cefae82b7:/opt/swift# apt-get install -y libpython2.7

再運行:

root@708cefae82b7:/opt/swift# swift
/opt/swift/swift-3.0.2-RELEASE-ubuntu16.04/usr/bin/lldb: error while loading shared libraries: libxml2.so.2: cannot open shared object file: No such file or directory

發現還缺少libxml2.so.2,安裝之:

apt-get install -y libxml2

再運行,發現:

root@708cefae82b7:/opt/swift# swift
error: failed to launch REPL process: process launch failed: 'A' packet returned an error: 8

這是由於容器運行的默認特性不支持swift REPL導致的,初次遇到時,懷疑自己的配置有問題,不過參看了docker hub的官方說明,如下使用方式:

這裏寫圖片描述

所以我們先退出當前容器,把我們目前的容器生成一個新的鏡像,從新鏡像重新啓動,並使用官方docker image的運行參數:

退出當前容器

root@708cefae82b7:/opt/swift# exit
exit
查看容器狀態
joker@localhost:~ $ docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                     PORTS               NAMES
708cefae82b7        ubuntu                       "/bin/bash"              About an hour ago   Exited (0) 6 seconds ago                       swift-ubuntu

這時我們的容器已經成爲Exited狀態。

從容器生成docker鏡像

這很類似git的方式,相當於在基礎鏡像ubuntu的基礎上,變動一次,commit 就是在基礎鏡像上加一層變動層(layer),相當於git diff的輸出內容一樣,合併基礎鏡像和變動層就可以生成一個新的定製鏡像。

joker@localhost:~ $ docker commit swift-ubuntu yourhubname/swift-ubuntu
sha256:387fc3cb1d8e8c53ba15e1e343d9a4f71550780f2812d08c2eaaf264b8a9709d

查看生成的新鏡像

可以看到現在的鏡像就很大了,有1G+

joker@localhost:~ $ docker images
REPOSITORY                   TAG                           IMAGE ID            CREATED              SIZE
yourhubname/swift-ubuntu     latest                        387fc3cb1d8e        About a minute ago   1.17 GB
ubuntu                       latest                        f49eec89601e        5 weeks ago          129 MB

重新創建基於yourhubname/swift-ubuntu鏡像的新容器

運行時,添加了--cap-add sys_ptrace選項,這可能和調試打斷點需要系統權限有關,導致我們之前沒有成功啓動swift REPL環境,這個我沒有深究。

joker@localhost:~ $ docker run -it --cap-add sys_ptrace yourhubname/swift-ubuntu /bin/bash
root@24a26d4b854d:/# swift
Welcome to Swift version 3.0.2 (swift-3.0.2-RELEASE). Type :help for assistance.
  1>  

好了,出現這個就說明swift的REPL環境搭好了,這個類似於python的交互環境。退出swift REPL環境使用:quit命令。 ;-)

配置後的清理工作

退出了容器環境後使用docker ps -a發現有兩個容器,把之前那個舊容器刪掉。

joker@localhost:~ $ docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                      PORTS               NAMES
24a26d4b854d        yourhubname/swift-ubuntu     "/bin/bash"              11 minutes ago      Exited (0) 19 seconds ago                       happy_babbage
708cefae82b7        ubuntu                       "/bin/bash"              About an hour ago   Exited (0) 33 minutes ago                       swift-ubuntu

刪掉舊容器:

joker@localhost:~ $ docker rm swift-ubuntu
swift-ubuntu

現在你已經有了新鏡像yourhubname/swift-ubuntu,當然也可以把基礎鏡像ubuntu刪除掉了

joker@localhost:~ $ docker images
REPOSITORY                   TAG                           IMAGE ID            CREATED             SIZE
yourhubname/swift-ubuntu     latest                        387fc3cb1d8e        16 minutes ago      1.17 GB
ubuntu                       latest                        f49eec89601e        5 weeks ago         129 MB

刪掉基礎鏡像:

joker@localhost:~ $ docker rmi ubuntu
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:0c01b5105fc57b5eb8b7bb1d697b9dc5602022f69a0a33bf282b117e7a754a91

現在你就只有一個自己定製的鏡像了,不過再次運行時,不要再使用docker run -it --cap-add sys_ptrace yourhubname/swift-ubuntu /bin/bash,因爲它會創建新容器。因爲你已經運行過一次了,容器已經創建成功,就可以直接從容器啓動。如果你非要使用那條命令,加一個--rm選項,它會在創建新容器時,把已經存在的容器刪掉:

查看所有容器狀態:

joker@localhost:~ $ docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                     PORTS               NAMES
24a26d4b854d        yourhubname/swift-ubuntu     "/bin/bash"              16 minutes ago      Exited (0) 5 minutes ago                       happy_babbage

啓動已經生成的容器happy_babbage:

joker@localhost:~ $ docker start happy_babbage
happy_babbage

把容器掛接到交互終端,進入bash並打開swift REPL:

joker@localhost:~ $  docker exec -it happy_babbage /bin/bash
root@24a26d4b854d:/# swift
Welcome to Swift version 3.0.2 (swift-3.0.2-RELEASE). Type :help for assistance.
  1>  

終於完工了,吃個雞腿壓壓驚先。

後記

如果你對Linux下使用Swift編程感興趣,可以閱讀這部書Mastering Swift 3 - Linux,博主友情推薦。還有就是Docker的官方文檔也可以作爲鏡像拉下來,本地運行jekyll服務閱讀,有時網差時也可以這麼幹,用來進一步學習Docker:

joker@localhost:~ $ docker run -p80:4000 docs/docker.github.io
Docker docs are viewable at:
http://0.0.0.0:4000

然後你本地瀏覽器輸入http://localhost就可以閱讀Docker文檔了。

頁面很舒服,這居然可以用jekyll做到,現在回頭看看我的jekyll博客真的是像一坨屎一樣 -_-#

以上就是Docker 初體驗的全部內容,希望對您學習和使用swift編程開發有所幫助.

本博文曾因爲博主自己的傻B行爲被覆蓋編輯過一次,幸好有位少年拯救了在下,他提到了搜索引擎的網頁快照功能(雖然最終不是由此尋回丟失的博文,是別家網站的爬蟲把我博客爬走了-_-#),在此一併感謝之。

順便把他掛在牆上

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章