1. 程式人生 > >入門Docker,你要下載什麼?註冊什麼?

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

 

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

Docker.app你肯定是要下載的!

Docker for mac,這個你肯定要下載:點我下載Docker for mac的社群免費版本 https://hub.docker.com/editions/community/docker-ce-desktop-mac

 

註冊Docker官方賬號,你需要它!

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

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

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

 

此步驟有VPN工具的可以無視掉,本人藍等專業版已經無視,下載很快。

 

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

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

 

 

接著,按照它的步驟,為自己新增Docker加速服務

 

到此準備工作結束,進入下一部分!

要想入門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倉庫都是公共的。當然,每個免費使用者有一個名額把自己的一個映象設為私有,也就是禁止被分享給別人,類比百度雲上你自己儲存的而沒有被生成分享連結的小姐姐。
接下來來張高大上的概念圖

 

 

接下來就是實戰了!開啟你的iTerm2!terminal  就是終端命令列工具,這個不影響

檢視Docker版本資訊

終端輸入:
docker version

顯示的我的版本資訊

~$ docker version
Client:
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

不過我一般不需要那麼多資訊,所以一直用的是docker -v命令

是時候pull你的第一個映象下來的!

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

Docker映象官方好像只提供Linux,這個很容易想,windows和mac是要交錢的吧大概?

搜尋ubuntu的Docker映象docker search ubuntu,這個如果你想要什麼centos,直接改就行,不區分寫法,我的返回結果:

~$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu 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]

 

此處我提示以下錯誤,如果提示賬戶密碼錯誤  

Error response from daemon: Get https://registry-1.docker.io/v2/: unauthorized: incorrect username or password

 

~$ docker login  

此處登入賬戶為你註冊時的唯一使用者名稱像我baitongtong不是郵箱

輸入密碼login成功


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

~$ docker pull ubuntu:latest
Trying to pull repository docker.io/library/ubuntu ...
latest: Pulling from docker.io/library/ubuntu
aed158d74952: Pull complete
773ae8273d14: Pull complete
d1d487w88782: Pull complete
cd3d6cd6c0cf: Pull complete
8d73bu79120c: Pull complete
Digest: sha256:35bc48a1ca97c3f74rhf378hj92hd82j29i4hf4hf84nf0dhnsid232de8d8
Status: Downloaded newer image for docker.io/ubuntu:latest

你輸入的命令實際上相當於docker pull registry.hub.docker.com/ubuntu:latest命令,即從註冊伺服器registry.hub.docker.com中的名為ubuntu的倉庫中下載標籤為latest的映象。

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

~$ docker pull chug/ubuntu14.04x64

這個使用者還有很多其他版本的ubuntu系統,12 13 14的32位64位都有,全是純淨映象。

檢視你本地的映象倉庫!

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

~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu 16.04 e4415b714b62 11 days ago 128.1 MB
docker.io/ubuntu latest e4415b714b62 11 days ago 128.1 MB
docker.io/ubuntu 12.04 aefa163f7a7e 11 days ago 103.5 MB
docker.io/centos latest 0584b3d2cf6d 3 weeks ago 196.5 MB

從網上一個教程中找到以下說法,比我說的好,那就看這個吧!

在列出資訊中,可以看到幾個欄位資訊:
來自於哪個倉庫,比如 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標記資訊。
啟動你的映象並盡情安裝軟體吧!

以下內容均以我自己pull下來的chug的初始映象為例:

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

首先啟動它:

~$ docker run -it chug/ubuntu14.04x64 /bin/bash
[email protected]:/#

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

可以看到我們終端的字頭變成[email protected]:/#了,這就意味著我們的映象已經建立了一個容器例項。現在我們可以對這個“ubuntu系統”進行操作了

比如安裝vim:

[email protected]:/# apt-get install vim
Reading package lists... Done
Building dependency tree... Done
The 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-runtime
Suggested packages:
gpm ctags vim-doc vim-scripts
The 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-runtime
0 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]

看到我沒有用sudo,是因為本來就已經是超級使用者(root)狀態了。

同理按照我自己的需求,我安裝了gcc和gdb

想退出容器?很簡單!

如果使用exit,命令退出,則容器的狀態處於Exit,而不是後臺執行。如果想讓容器一直執行,而不是停止,可以使用快捷鍵 ctrl+p ctrl+q 退出,此時容器的狀態為Up。

檢視當前正在執行的容器:

~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa97ba3292ce chug/ubuntu14.04x64 "/bin/bash" 7 minutes ago Up 7 minutes relaxed_hoover

看到當前有一個ID為aa97ba3292ce的容器(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)

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

~$ docker start aa97ba3292ce
~$ docker stop aa97ba3292ce
~$ docker restart aa97ba3292ce

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

~$ docker attach aa97ba3292ce

軟體裝完,想儲存環境?commit幫你!

將容器轉化為一個映象,即執行commit操作,完成後可使用docker images檢視

[email protected]:/#exit //先退出容器
~$ docker commit -m "ubuntu with vim" -a "sgy" aa97ba3292ce sgy/ubuntu:vim
~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sgy/ubuntu vim 52166e4475ed 5 seconds ago 358.1 MB
chug/ubuntu14.04x64 latest 0584b3d2cf6d 9 days ago 196.5 MB

其中,-m指定說明資訊;-a指定使用者資訊;aa97ba3292ce代表容器的id;sgy/ubuntu:vim指定目標映象的使用者名稱、倉庫名和 tag 資訊。我這裡都是為了部落格瞎編的使用者名稱,我自己的使用者名稱也不是sgy,你執行命令的時候使用自己註冊Docker時的使用者名稱。

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

啟動新建立的映象,可以看到vim已經自帶了。

~$ docker run -it sgy/ubuntu:vim /bin/bash
[email protected]:/# vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr 4 2017 18:14:54)
...
//omitted by sgy(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
...

利用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類似這種。

~$ docker rm container_id
~$ docker rmi image_id

有的時候儘管刪除了全部容器,映象還是無法刪除,這時點選mac頂欄中的docker logo,選擇restart,然後再試一次rmi,應該就沒問題了。(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)

附上一張高大上的Docker命令圖

 

 

一次配置,到處使用?那就push到hub上吧!

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

~$ docker push sgy/ubuntu:vim

就可以了!

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

Docker中安裝gcc、gdb時遇到的問題

add-apt-repository: command not found

14.04系統解決辦法:

apt-get install software-properties-common

older版本的系統:

apt-get install python-software-properties

Docker中使用gdb無法進入斷點,無法除錯

加上--privileged引數

~$ docker run -it --privileged sgy/ubuntu:vim /bin/bash

結語

到此本文就結束了,我說得很清楚,這只是一篇入門教程,可以讓你從“一問三不知”到達“一問一不知”的狀態,再高層次?那就靠自己了!