Docker入門,看了不理解,你來錘我!!!

寫在前面

  • 這篇博客適合誰?
    • 對於Docker並不瞭解,只是有一點模糊的感覺,覺得Docker可以當成虛擬機用之類的
    • 只是下載了Docker軟件,對於怎麼配置,怎麼玩,第一步幹什麼,完全一無所知
    • 其二,我從對Docker只有及其模糊(真的是模糊,我除了知道Docker是跟虛擬系統有關其他啥都不知道),到現在起碼一問一不知(對應一問三不知)的狀態,大概花了8個小時。這期間全靠我從網絡上搜索到的資料。現在用我的話寫出來,我覺得對於跟我相同開始情況的小白用戶,能省不少時間,所以我要寫。
    • 其次,確實,現在Docker相關的文章真的太多了,那我為什麼還要寫呢?
  • 這篇文章主要是哪方面的Docker文章,純入門?
    • 你做了哪些工作?
    • 首先,我一直都很好奇Docker這個東西,但從來沒有機會去使用它。但是,這學期OS課的lab,純Linux系統編程,雖然使用雙系統或者虛擬機都是純小學生的難易程度了,也不麻煩,但我想,為什麼不用Docker呢?用雙系統或者虛擬機也太過小兒科!所以,我就這樣接觸了Docker
    • 那麼我使用Docker實現了什麼?在lab中,我們需要用到的是純終端下的gcc工具鏈還有vim等,那麼這就是我需要的全部軟件了!於是我在Docker中實現了「gcc+gdb+vim」環境,並push到了hub中。
    • 首先對於Docker的概念作出我的解釋,儘量通俗易懂
    • 接著針對我用Docker的目的,從最開始的軟件下載,到最後push一個自己的鏡像到hub,整個過程以白話的形式描述出來,降低入門門檻,節省你的學習時間
    • 很高興你問了我這個問題。本文主要:

入門Docker,你要下載什麼?註冊什麼?

Docker for mac,這個你肯定要下載:點我下載Docker for mac and Windows的社區免費版本(https://www.docker.com/products/docker-desktop)

註冊Docker官方賬號,你需要它,像github一樣你可以使用git把項目上傳到上面!

註冊一個Docker的官方賬號,有利而無害,相信我!點我註冊Docker Cloud官方賬號

Docker安裝好,賬號也註冊後,點擊桌面頂欄的Docker圖標,點擊sign in,登陸你的Docker賬號。

註冊DaoCloud賬號,獲取加速服務!

不可否認,有時直接從Docker官方往本地pull鏡像會十分緩慢。。。這時我們可以通過國內的Docker服務提供商免費獲取加速pull鏡像服務,阿里網易好像都有這種服務,我選擇的是DaoCloud:點我註冊DaoCloud賬號

註冊後登陸DaoCloud,找到這個按鈕:

Docker入門,看了不理解,你來錘我!!!

Docker加服務記得自行註冊!

Docker的理解:

Docker,可以說是一個終端命令行的虛擬機,但更準確的說法,其實應該是一個虛擬環境。比如,你想要在PC上無縫使用Linux麼?那麼虛擬機並不是你唯一的出路,你還有Docker!我更願意稱Docker為一個容器,當然這只是Docker的一個狹義解釋,Docker不止是一個容器,Docker包含3個重要概念:

  • 鏡像(Image)鏡像是靜態的、可以被用戶互相分享的文件。我們玩過雙系統和虛擬機的人都知道,首先你需要一個.iso鏡像,才能安裝系統。Docker中的鏡像也是這個東西,鏡像是靜態的,你不能對他操作,只能pull別人的鏡像或者push自己的鏡像。
  • 容器(Container)前面說過,鏡像是靜態不可操作的,只能被分享和下載,那什麼是能被操作的呢?就是容器裡!容器可以理解為鏡像的動態狀態,也就是我們虛擬機中系統裝好後的狀態,其實這麼說是不對的,容器最符合的描述應該是Linux的iso文件的Live CD模式,比如我們玩雙系統時都進入過Live CD模式,不安裝系統而直接進入系統,很神奇是吧,Docker的容器就是這個概念,只不過更加輕量更加迅速便捷。但是Live CD的害處就是你關機後作出的修改安裝的軟件全部gg,容器也是一樣,一旦被直接推出,之前安裝的gcc啊vim啊啥的就會全部gg掉。如果要保存修改,就需要將當前容器封裝成一個新的鏡像,這樣下次啟動這個新的鏡像後之前作出的修改還都在。
  • 倉庫(Repository)各位在前面看到我寫的pull和push什麼的,有沒有暈?不知道各位對於git熟悉不熟悉,Docker中的倉庫很像git的代碼倉庫,你可以pull自己之前push到自己倉庫的鏡像到本地,也可以pull別人push到公共倉庫的鏡像到自己本地。說白了就是百度雲盤,你可以上傳(push)自己做好環境的Docker上去,也可以下載(pull)自己雲端的鏡像到本地。同時,我們知道百度雲最大的特點就是分享(你懂的嘿嘿嘿),類比Docker,如果你得到百度雲分享鏈接(別人的鏡像名字、標籤和別人的用戶名),你還可以下載(pull)別人分享的鏡像到自己的本地,別人也可以下載(pull)你的鏡像,因為Docker倉庫都是公共的。當然,每個免費用戶有一個名額把自己的一個鏡像設為私有。

這些概念如果你,使用Github就超級好理解了

Docker入門,看了不理解,你來錘我!!!

實際操作下

查看Docker版本信息

<code>終端輸入:/<code>
<code>docker version/<code>

顯示的我的版本信息

<code> ~$ docker versionClient: Version:      17.06.2-ce API version:  1.30 Go version:   go1.8.3 Git commit:   cec0b72 Built:        Tue Sep  5 20:12:06 2017 OS/Arch:      darwin/amd64/<code>

當然如果你需要簡單的信息可以使用docker -v

如何Pull你的第一個鏡像?

Docker安裝好後是不會自帶鏡像的,你需要從倉庫自己pull一個鏡像下來,自己製作自己的鏡像也是一個道理,你可以通過在已有的鏡像基礎上生成自己的鏡像或者:隨便百度的如何創建自己Docker鏡像得到的教程

Docker鏡像官方好像只提供Linux

搜索ubuntu的Docker鏡像docker search ubuntu,或者你想要的任何一個版本號的linux:

<code>~$ docker search ubuntuNAME                               DESCRIPTION                                     STARS   OFFICIAL   AUTOMATEDubuntu                             Ubuntu is a Debian-based Linux operating s...   6636                [OK]dorowu/ubuntu-desktop-lxde-vnc     Ubuntu with openssh-server and NoVNC            131                 [OK]rastasheep/ubuntu-sshd             Dockerized SSH service, built on top of of...   105                 [OK]ansible/ubuntu14.04-ansible        Ubuntu 14.04 LTS with ansible                   86                  [OK]ubuntu-upstart                     Upstart is an event-based replacement for ...   80                  [OK]neurodebian                        NeuroDebian provides neuroscience research...   40                  [OK]ubuntu-debootstrap                 debootstrap --variant=minbase --components...   31                  [OK]/<code>

拉取官方最新版的ubuntu鏡像:docker pull ubuntu:latest,其中的latest是一個標籤(tag),表示是當前最新版本。你應該得到的信息,類似這樣的

<code>~$ docker pull ubuntu:latestTrying to pull repository docker.io/library/ubuntu ...latest: Pulling from docker.io/library/ubuntuaed158d74952: Pull complete773ae8273d14: Pull completed1d487w88782: Pull completecd3d6cd6c0cf: Pull complete8d73bu79120c: Pull completeDigest: sha256:35bc48a1ca97c3f74rhf378hj92hd82j29i4hf4hf84nf0dhnsid232de8d8Status: Downloaded newer image for docker.io/ubuntu:latest/<code>

你輸入的命令實際上相當於

<code>docker pull registry.hub.docker.com/ubuntu:latest/<code>

命令,即從註冊服務器registry.hub.docker.com中的名為ubuntu的倉庫中下載標籤為latest的鏡像。

由於我的lab統一要求,ubuntu需要14.04版本,所以我在hub裡面搜了搜,找到了一個用戶分享的14.04 64位純淨鏡像(base image),下面將他的鏡像扒下來

<code>~$ docker pull chug/ubuntu14.04x64/<code>
<code>這個用戶還有很多其他版本的ubuntu系統,12 13 14的32位64位都有,全是純淨鏡像。/<code>

查看你本地的鏡像倉庫!

把初始鏡像拉下來後,就可以啟動它了,不過,可以先使用docker images命令查看你自己的本地鏡像,我隨便找了個例子,你的也應該是類似這樣的:

<code>~$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEdocker.io/ubuntu    16.04               e4415b714b62        11 days ago         128.1 MBdocker.io/ubuntu    latest              e4415b714b62        11 days ago         128.1 MBdocker.io/ubuntu    12.04               aefa163f7a7e        11 days ago         103.5 MBdocker.io/centos    latest              0584b3d2cf6d        3 weeks ago         196.5 MB/<code>

在列出信息中,可以看到幾個字段信息:

來自於哪個倉庫,比如 ubuntu

鏡像的標記,比如 16.04

它的 ID 號(唯一),比如e4415b714b62

創建時間

鏡像大小

其中鏡像的 ID 唯一標識了鏡像,注意到 ubuntu:16.04 和 ubuntu:latest具有相同的鏡像 ID ,說明它們實際上是同一鏡像。TAG 信息用來標記來自同一個倉庫的不同鏡像。例如 ubuntu 倉庫中有多個鏡像,通過 TAG 信息來區分發行版本,例如10.04 、 12.04 、 12.10 、 13.04 、 14.04 等。例如可以使用docker run -t -i ubuntu:16.04 /bin/bash命令指定使用鏡像ubuntu:16.04來啟動一個容器。如果不指定具體的標記,則默認使用latest標記信息。

啟動鏡像並且安裝軟件

比如:

現在你已經有一個初始的鏡像了,注意這個裡面是什麼都沒有的,連vim都沒裝,是精簡到不能再精簡的鏡像了。

1.首先啟動它:

<code>~$ docker run -it chug/ubuntu14.04x64 /bin/bashroot@aa97ba3292ce:/#/<code>

-it 表示運行在交互模式,是-i -t的縮寫,也可以兩個連在一起寫-it是兩個參數:-i和-t。前者表示打開並保持stdout,後者表示分配一個終端(pseudo-tty)一般這個模式就是可以啟動bash,然後和容器有命令行的交互

可以看到我們終端的字頭變成root@aa97ba3292ce:/#了,這就意味著我們的鏡像已經創建了一個容器實例。現在我們可以對這個“ubuntu系統”進行操作了

比如安裝vim:

<code>root@aa97ba3292ce:/# apt-get install vimReading package lists... DoneBuilding dependency tree... DoneThe following extra packages will be installed:  file libexpat1 libffi6 libgpm2 libmagic1 libpython2.7 libpython2.7-minimal libpython2.7-stdlib libsqlite3-0 libssl1.0.0 mime-support vim-common vim-runtimeSuggested packages:  gpm ctags vim-doc vim-scriptsThe following NEW packages will be installed:  file libexpat1 libffi6 libgpm2 libmagic1 libpython2.7 libpython2.7-minimal libpython2.7-stdlib libsqlite3-0 libssl1.0.0 mime-support vim vim-common vim-runtime0 upgraded, 14 newly installed, 0 to remove and 0 not upgraded.Need to get 10.7 MB of archives.After this operation, 50.7 MB of additional disk space will be used.Do you want to continue? [Y/n]/<code>

看到我沒有用sudo,是因為本來就已經是超級用戶(root)狀態了,可以看#代表超級用戶$代表普通用戶這個是Linux的基礎知識不要忘了。

同理也可以更具自己的需求安裝更多的軟件。

想退出容器?很簡單!

如果使用exit,命令退出,則容器的狀態處於Exit,而不是後臺運行。

如果想讓容器一直運行,而不是停止,可以使用快捷鍵 ctrl+p或者 ctrl+q 退出。此時容器的狀態為Up。

查看當前正在運行的容器:

<code>~$ docker psCONTAINER ID     IMAGE        COMMAND      CREATED       STATUS       PORTS        NAMESaa97ba3292ce  chug/ubuntu14.04x64   "/bin/bash"    7 minutes ago  Up 7 minutes   relaxed_hoover/<code>

這裡我們可以看到當前有一個ID為aa97ba3292ce的容器

那麼如何控制它呢?

啟動、停止、重啟容器aa97ba3292ce的命令分別是:

<code>~$ docker start aa97ba3292ce~$ docker stop aa97ba3292ce~$ docker restart aa97ba3292ce/<code>

後臺啟動一個容器後,如果想進入到這個容器,可以使用attach命令:

<code>~$ docker attach aa97ba3292ce/<code>

軟件裝完,想保存環境?commit幫你!你這會是不是想起了git?commit -m“”?沒錯類似。

將容器轉化為一個鏡像,即執行commit操作,完成後可使用docker images查看

<code>root@aa97ba3292ce:/#exit //先退出容器~$ docker commit -m "ubuntu with vim" -a "sgy" aa97ba3292ce sgy/ubuntu:vim~$ docker imagesREPOSITORY                    TAG    IMAGE ID         CREATED             SIZEsgy/ubuntu                    vim    52166e4475ed     5 seconds ago       358.1 MBchug/ubuntu14.04x64           latest 0584b3d2cf6d     9 days ago/<code>

其中,-m指定說明信息;-a指定用戶信息;aa97ba3292ce代表容器的id;sgy/ubuntu:vim指定目標鏡像的用戶名、倉庫名和 tag 信息。我這裡都是為了瞎編的用戶名,我自己的用戶名也不是sgy。

你運行命令的時候使用自己註冊Docker時的用戶名。

此時Docker中就有了我們新建的鏡像sgy/ubuntu:vim,此鏡像和原有的ubuntu鏡像區別在於多了個vim工具。此時我們利用新鏡像創建的容器,本身就自帶vim了。

啟動新創建的鏡像,可以看到vim已經自帶了。




<code>~$ docker run -it sgy/ubuntu:vim /bin/bashroot@520afc596c51:/# vim --versionVIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr  4 2017 18:14:54)/<code>

利用exit退出容器。此時Docker引擎中就有了兩個容器,可使用docker ps -a查看。

如果你想要刪除鏡像?

如果想刪除容器或者鏡像,可以使用rm命令。

注意:刪除鏡像前必須先刪除以此鏡像為基礎的容器(哪怕是已經停止的容器),否則無法刪除該鏡像,會報錯Failed to remove image (e4415b714b62): Error response from daemon: conflict: unable to delete e4415b714b62 (cannot be forced) - image has dependent child images類似這種。

<code>~$ docker rm container_id~$ docker rmi image_id/<code>
<code>你要選擇刪除鏡像的ID/<code>

有的時候儘管刪除了全部容器,鏡像還是無法刪除,這時點擊mac頂欄中的docker logo,選擇restart,然後再試一次rmi,應該就沒問題了。

docker命令圖

Docker入門,看了不理解,你來錘我!!!

官網流傳一次配置到處使用,這個就相當於我們做系統,首先我們下載一個正版系統然後在裡面安裝上我們需要的程序,然後再把它刻錄成iso文件放在u盤上面,等電腦壞了再插上u盤做系統。

如何到處使用呢?“那我們把鏡像放在U盤(docker庫)上面”,那就push到hub上吧!

因為之前已經在Docker.app中登陸了Docker賬號,所以現在直接

<code>~$ docker push sgy/ubuntu:vim/<code>

就可以了!

下次到了機房,在ubuntu系統中安裝Docker,配置好加速器,啟動Docker,docker login登陸自己的賬號,然後直接~$ docker pull sgy/ubuntu:vim就可以把你push到hub的已經配置好的環境的鏡像給扒下來。做完實驗,再push上去就ok了!

方便大家記憶我這裡舉個例子docker就相當於給電腦做系統

下載系統-》裝應用軟件-》做成鏡像文件-》上傳到U盤-》需要的話隨時下載重裝系統

最後

Docker目前來說是一個軟件工程師必備的基礎技術,現在參加一些編程大賽都是要求參賽選手把自己的配置打包成一個docker文件與作品一起提交,保證作品的可運行,那麼在企業開發過程中我們也嘗試用docker k8s進行企業項目的部署應用,作為擴展內容的話還是希望大家瞭解完docker再瞭解下docker k8s,因為我所在的不論是電網,易車等上市公司世界20強企業都是使用docker k8s進行部署。


分享到:


相關文章: