Docker螺男,系統(tǒng)影分身之術(shù)

目錄

  1. Docker安裝
    1.1. Windows
    1.2. Ubuntu
  2. Docker容器的使用
    2.1. 啟動一個新的容器
    2.2. 掛起運行的程序
    2.3. 重啟被掛起的程序
    2.4. 終止容器運行
    2.5. 重新運行已有容器
  3. Docker資源的管理
    3.1. 管理鏡像資源
    3.2. 管理容器資源
    3.3. 管理網(wǎng)絡資源
    3.4. 創(chuàng)建自己的鏡像
  4. References

在我電腦上沒問題跋滤怼谓媒!

It works on my machine

如果你看懂了上面這句話迫筑,說明我們是同道中人。寫程序有四種痛:

  1. 起早摸黑寫好了代碼搂妻,在自己的電腦上運行的好好欲主,但是到了另一臺電腦上各種問題層出不窮逝嚎,軟件越復雜依賴越多补君,頭就越大挽铁;
  2. 想干一件大事叽掘,辛歷盡千辛萬苦配置好了環(huán)境,換了電腦又要從頭再來盖腕±A校或者某天無意對電腦做了小小的改動哭廉,環(huán)境崩了;
  3. 想研究個新技術(shù)或者學個新技能增淹,僅僅是搭建環(huán)境已經(jīng)竭盡全力乌企,你還不能確定有沒有遺漏加酵;
  4. 頭發(fā)越來越少。

幸運的是冗澈,除了第四點亚亲,前三點已經(jīng)有了解決方案捌归,它就是Docker —— 容器化技術(shù)惜索。它可以通過容器來構(gòu)建、運行和分發(fā)應用程序猎物。借用Java的口號就是:一次配置霸奕,到處運行质帅。

或許你會問煤惩,既然已經(jīng)有了虛擬機魄揉,為什么還要搞出個容器洛退?容器化其實就是一種虛擬化技術(shù)杰标,與傳統(tǒng)虛擬機相比腔剂,它有著輕量、獨立绪爸、可伸縮奠货、可移植以及靈活等特點仇味。容器直接運行于內(nèi)核之上丹墨,多個容器共用系統(tǒng)的內(nèi)核嬉愧,直接通過內(nèi)核獲取系統(tǒng)資源没酣,用多少取多少裕便;而虛擬機則通過一個管理程序來獲取宿主系統(tǒng)的資源偿衰,運行在其上的程序有著自己的內(nèi)核下翎,就算你跑的是個Hello World,它也占用這很大一塊資源胆萧。拿吃飯打個比方跌穗,容器是按點的菜收錢:你點多少菜付多少錢瞻离;虛擬機是按人頭收錢,只要你人在那鹤耍,就算你只喝了一口水也照樣收你這么多錢。它的區(qū)別如圖1所示喊衫。

Fig 1 Container vs VM

當然族购,我不止一次說過寝杖,工具是不分優(yōu)劣的瑟幕。某種特定場合下只盹,某個工具更合適殖卑,僅此而已孵稽「匾保“殺雞焉用牛刀”睦袖,說的也不是那種刀比另一種刀更好馅笙。這篇文章的主要目的是介紹Docker的用法厉亏。

0. Docker簡介

Docker引擎由客戶端(Client)爱只、守護進程(Daemon)和注冊表(Register)三部分組成,如圖2所示疯暑。用戶通過客戶端發(fā)送命令來管理Docker的資源妇拯,包括鏡像越锈、容器膘滨、網(wǎng)絡等(鏡像和容器的關(guān)系就類似于程序和進程的誒關(guān)系)吏祸;守護進程接收客戶端以及API發(fā)過來命令來操縱容器贡翘,從而實現(xiàn)鏡像、容器泛鸟、網(wǎng)絡等資源的管理北滥;而注冊表就是一個倉庫闸翅,放著各種各樣的鏡像坚冀。因此记某,使用Docker主要就是使用Docker客戶端命令。

Fig 2 Docker's architecture

Docker客戶端的命令壳猜,可以大致分為三部分统扳,每個部分又可以接著細分:

  1. Docker安裝闪幽;
  2. Docker容器的使用;
  3. Docker資源的管理;

1. Docker安裝

安裝原本說是沒有什么好說的腕够,但是由于在Windows 10上Docker和VirtualBox不能共存帚湘,因此還是簡單介紹介紹下甚淡。

1.1. Windows

  1. 首先贯卦,在Windows下撵割,首先要打開Hyper-V選項,打開方式為:【控制面板】=>【程序】=>【程序和功能】=>【啟用或關(guān)閉Windows功能】羹与,然后勾選Hyper-V及其子選項纵搁;
Fig 3 Windows configuration
  1. 接下來,就直接到官網(wǎng)下載安裝Windows版本即可菲语。

值得注意的是,Docker和VirtualBox不能共存眼耀,因此你只能二選一哮伟。安裝了Docker后,回頭你再想用VirtualBox可能會遇到VT-x is not available (VERR_VMX_NO_VMX)這個錯誤池凄,解決方法如下:

  1. 以管理員身份打開命令提示符肿仑;
  2. 輸入bcdedit回車尤慰,你看到的應該看到hypervisorlaunchtype的值是auto雷蹂;
  3. 輸入bcdedit /set hypervisorlaunchtype off并回車匪煌;
  4. 重啟電腦。

1.2. Ubuntu

在Ubuntu下安裝Docker霜医,依次輸入以下命令即可:

# Commands for install docker on Ubuntu,if command fail, consult [https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
 
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
 
# x86_64 / amd64
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
 
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
 
# Test
sudo docker run hello-world

2. Docker容器的使用

Docker使用可分為以下三個部分:

  1. 啟動新容器;
  2. 掛起一個容器达舒;
  3. 重啟被掛起的容器巩搏;
  4. 停止容器贯底;
  5. 重新啟動已有容器

這里只列舉一些常用的,以及一般場景下夠用的命令笙什。

2.1. 啟動一個新的容器

啟動一個新容器的命令為docker run,常用命令大致如下:

docker run -it -v <host dir>:<container dir> -w/<container dir> --name <your container name> --rm <your docker image name>

-it表示啟動一個交互式的容器统屈,也就是你可以在命令行輸入命令進行交互;
-v將本地目錄和容器中的一個目錄做映射腕扶,這樣在容器中就能直接訪問該目錄下的內(nèi)容半抱;
-w指定容器啟動后的工作目錄代虾;
--name用于個這個容器分配一個名字,方便表明該容器的目的以及后續(xù)管理江掩;
--rm表示當容器退出后自動刪除环形。
例如:

docker run -it -v `pwd`/docker:/workspace -w/workspace --name ubuntu:16.04 ubuntu:16.04

上面命令中通過ubuntu:16.04這個鏡像創(chuàng)建了一個名叫ubuntu:16.04的容器可交互的抬吟。使用docker run的時候火本,如果本地沒有指定的鏡像,Docker會嘗試從遠程注冊表(倉庫)中尋找茫陆,找到后拉炔局选(pull)到本地再創(chuàng)建。

2.2. 掛起運行的程序

docker pause CONTAINER [CONTAINER...]

2.3. 重啟被掛起的程序

docker unpause CONTAINER [CONTAINER...]

2.4. 終止容器運行

如果是交互式的容器喜最,直接輸入exit便退出了容器返顺。如果是非交互式的容器,通過以下命令:

docker stop <container id or name>

有時候容器運行了很久振乏,我都不記得容器名字和ID了,怎么辦舟陆?可以通過以下命令獲取所有容器信息:

docker container ls -a

2.5. 重新運行已有容器

# -i , optional, starting interactive
docker start -i <container id or name>

3. Docker資源的管理

Docker的鏡像和容器的關(guān)系秦躯,就類似于程序和進程的關(guān)系踱承。鏡像是一個只讀文件茎活,它里面包含了如何創(chuàng)建一個容器的指令和模板载荔;而容器就是一個鏡像的實例丘损。鏡像和容器都是Docker引擎管理的重要資源煌珊,此外吏饿,還有網(wǎng)絡資源蔬浙、集群資源猪落、插件和磁盤資源等。這里只介紹簡單使用場景下常用的一些管理命令:

  1. 管理鏡像資源畴博;
  2. 管理容器資源笨忌;
  3. 管理網(wǎng)絡資源;
  4. 創(chuàng)建自己的鏡像俱病。

其實管理Docker資源的命令和我們一般使用的Linux命令很類似官疲,基本命令構(gòu)成為docker <resources type> <linux/git command>袱结。<resources type>可以是imagecontainer途凫、network等垢夹,而<linux/git command>則可以是ls果元、rm阅畴、commit等。例如:

# list local images
docker image ls -a
# remove local images
docker image rm <image id/name>
docker container ls -a 
docker container rm <container id>

實際使用過程中昵仅,也可以類似Linux中man COMMAD去查看某個命令用法一樣,可以使用直接使用`docker <resources type>查看具體命令的用法,例如:

$ docker network

Usage:  docker network COMMAND

Manage Docker networks

Options:
      --help   Print usage

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.

3.1. 管理鏡像資源

  1. 遠程鏡像搜索分蓖;
  2. 拉取鏡像到本地蒸甜;
  3. 本地鏡像查看辉巡;
  4. 本地鏡像移除咕痛。

我們使用Docker的時候,首先,可以向看看本地有沒有我們想要的鏡像:

docker images # or docker image ls -a

如果本地沒有,可以使用以下命令搜索注冊表上有沒有我們想要的:

docker search [OPTIONS] TERM
# 例如:docker search ubuntu

搜索出來所有可用的鏡像后選擇自己想要的,拉取到本地:

docer pull <image name>
# 例如:docker pull ubuntu:16.04

其實,當我們直接使用docker run的時候撬呢,docker run就是首先執(zhí)行上面三步晨另。

當有些鏡像我們不再需要了路翻,我們可以刪除

docker image rm <image id/name>

3.2. 管理容器資源

與鏡像資源類似,對容器的管理也是類似的:

  1. 查看已有容器厌小;
  2. 刪除已有容器癣蟋;
  3. 查看某個容器詳細信息幔欧;
  4. 容器的創(chuàng)建恒序、暫停屠缭、重新運行等铐殃。

查看容器:

docker container ls -a

通過列出的容器域帐,可以獲取到容器的ID或者名字许饿,進而可以刪除容器:

docker container rm <container id/name>

或者筒愚,查看容器的詳細信息:

docker container inspect <container id/name>

而對于容器的創(chuàng)建、重啟等操作前面已經(jīng)介紹過了含懊。

3.3. 管理網(wǎng)絡資源

網(wǎng)絡資源,其實就是專門給容器使用虛擬網(wǎng)絡設(shè)備呼胚。默認情況下會有個一個名字是brigde的路由器,所有容器如果未經(jīng)指定都會鏈接到上面饭宾,組成一個局域網(wǎng)。對網(wǎng)絡資源的管理可以使用以下命令:
查看已有的網(wǎng)絡資源:

docker network ls

查看某個網(wǎng)絡資源的詳細信息:

docker network inspect <network id/name>

網(wǎng)絡資源的創(chuàng)建和刪除:

docker network create
docket network rm <network id/name>

網(wǎng)絡的鏈接和斷開:

docker network connect <network> <container>
docker network disconnect <network> <container>

3.4. 創(chuàng)建自己的鏡像

Docker相比于虛擬機的優(yōu)勢净嘀,主要就是它能夠很輕易的分享宵膨,或者說轉(zhuǎn)移已經(jīng)配置好的環(huán)境,并且體積相對于整個虛擬可以小很多练慕。這個是怎么實現(xiàn)的呢哪工?主要有兩種方法:

  1. 將已有容器打包成鏡像茴她,然后推到遠程倉庫;
  2. 在已有的鏡像基礎(chǔ)上粟按,通過Dockerfile中的命令創(chuàng)建一個新的鏡像矾利。

從已有容器打包可以使用以下命令:

docker container commit --author <author name> -m <new image description> <container id/name> <image name>

例如什荣,我運行了一個Ubuntu16.04的容器,并為它配置了adb(Android Debug Bridge)環(huán)境紫谷。為了能在別的機器上使用Ubuntu16.04的時候可以不用再配置adb,我將它打包成了一個新的鏡像格嘁,命令和結(jié)果顯示如下:

zhou@zhou:~$ docker container commit --author SunnyZhou -m 'Add adb' dbc7bdb56f2a ubuntu_with_adb:16.04
sha256:de247093e26e4e91eb4470d14067cdde094bddb46c063964ff254967282de113
zhou@zhou:~$ docker images
REPOSITORY                                     TAG                 IMAGE ID            CREATED             SIZE
ubuntu_with_adb                                16.04               de247093e26e        11 seconds ago      128MB
ubuntu                                         16.04               77be327e4b63        2 months ago        124MB

第二種方法是通過Dockerfile來創(chuàng)建新的容器,一個簡單的例子是,還是創(chuàng)建一個帶adb的Ubuntu16.04:
首先編寫Dockerfile(完整的Dockerfile命令參看文末參考文檔):

FROM ubuntu:16.04                                                           
COPY platform-tools/adb /sbin/adb

然后使用docker build來創(chuàng)建:

zhou@zhou:~/docker$ vi Dockerfilezhou@zhou:~/docker$ docker build . --tag ubuntu-adb:16.04Sending build context to Docker daemon  26.95MB
Step 1/2 : FROM ubuntu:16.04
 ---> 77be327e4b63
Step 2/2 : COPY platform-tools/adb /sbin/adb
 ---> 1a5e2b476d20
Successfully built 1a5e2b476d20
Successfully tagged ubuntu-adb:16.04

這篇文章知識Docker的一篇概覽,也是我日常使用Docker最多的命令。完整的命令請參看參考文檔欣孤。

本文首發(fā)于個人微信公眾號TensorBoy,微信掃描上方二維碼或者微信搜索TensorBoy并關(guān)注段只,及時獲取最新文章腮猖。C++ | Python | 推理引擎 | AI框架源碼,有一起玩耍的么赞枕?

References

[1] https://docs.docker.com/engine/reference/commandline/docker/
[2] https://docs.docker.com/get-started/overview/
[3] https://docs.docker.com/docker-for-windows/install/
[4] https://docs.docker.com/engine/reference/builder/#usage
[5] https://github.com/docker/labs

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澈缺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子炕婶,更是在濱河造成了極大的恐慌姐赡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柠掂,死亡現(xiàn)場離奇詭異项滑,居然都是意外死亡,警方通過查閱死者的電腦和手機涯贞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門杖们,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肩狂,你說我怎么就攤上這事摘完。” “怎么了傻谁?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵孝治,是天一觀的道長。 經(jīng)常有香客問我审磁,道長谈飒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任态蒂,我火速辦了婚禮杭措,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钾恢。我一直安慰自己手素,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布瘩蚪。 她就那樣靜靜地躺著泉懦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疹瘦。 梳的紋絲不亂的頭發(fā)上崩哩,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼邓嘹。 笑死酣栈,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的汹押。 我是一名探鬼主播钉嘹,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鲸阻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缨睡,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鸟悴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奖年,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體细诸,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年陋守,在試婚紗的時候發(fā)現(xiàn)自己被綠了震贵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡水评,死狀恐怖猩系,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情中燥,我是刑警寧澤寇甸,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站疗涉,受9級特大地震影響拿霉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咱扣,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一绽淘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闹伪,春花似錦沪铭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至硼补,卻和暖如春驮肉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背已骇。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工离钝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留票编,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓卵渴,卻偏偏與公主長得像慧域,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浪读,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • docker常用命令原理圖概覽: 按照docker官網(wǎng)上的說法昔榴,docker的文件系統(tǒng)分為兩層:bootfs和ro...
    燕京博士閱讀 2,964評論 2 32
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,750評論 1 21
  • 一互订、Docker容器概述 1、docker中的容器技術(shù)演進 lxc --> libcontainer --> ru...
    任總閱讀 3,925評論 0 26
  • 特別說明: 本人平時混跡于 B 站痘拆,不咋回復這里的評論仰禽,有問題可以到 B 站視頻評論區(qū)留言找我視頻地址: http...
    擼帝閱讀 867評論 1 3
  • 持續(xù)整整一年的奮斗,沒有一刻敢停歇纺蛆,沒有一刻敢松懈吐葵,那種大腦用光用盡的感覺讓我痛苦不堪,同時又感到無比的愜意桥氏,努力...
    千夜凡塵閱讀 168評論 0 0