Docker學習筆記

原文地址:LoveDev

Docker相對于傳統(tǒng)意義上的虛擬機最大的區(qū)別就在于傳統(tǒng)虛擬機是虛擬出一套硬件后砾赔,再在上面運行一個完整的操作系統(tǒng)鼻忠,再把需要運行的應用裝在操作系統(tǒng)中運行拣宏。Docker在宿主的內(nèi)核中運行應用進程,沒有自己的內(nèi)核袍暴,沒有虛擬硬件煎谍,比起傳統(tǒng)虛擬機更加輕快攘蔽。

Docker基本概念

  • 鏡像:操作系統(tǒng)
  • 容器:容器是獨立運行的一個或一組應用,以及它們的運行態(tài)環(huán)境呐粘,鏡像和容器的關(guān)系就像是面向?qū)ο?/strong>中的實例
  • 倉庫:鏡像需要存儲和分發(fā)满俗,倉庫用來存儲鏡像

Docker Registry

一個Docker Registry中可以包含多個倉庫

Docker Hub

最常使用的 Registry 公開服務是官方的 Docker Hub,這也是默認的 Registry事哭。

Docker Registry 公開服務

國內(nèi)訪問Registry 公開服務會有些慢(原因你懂得)漫雷,國內(nèi)云服務商提供了針對 Docker Hub 的鏡像服務(Registry Mirror)迁沫,這些鏡像服務被稱為加速器税弃,常見的有 阿里云加速器绒极、DaoCloud 加速器靈雀云加速器等谤辜。

配置如下:


國內(nèi)也有一些云服務商提供類似于 Docker Hub 的公開服務。比如 時速云鏡像倉庫价捧、網(wǎng)易云鏡像服務丑念、DaoCloud 鏡像市場阿里云鏡像庫等结蟋。

鏡像

獲取鏡像

$ docker pull [選項][Docker Registry地址]<倉庫名>:<標簽>
例如:$ docker pull ubuntu
  • Docker Registry地址:地址的格式一般是 <域名/IP>[:端口號]
    脯倚,默認地址是 Docker Hub。
  • 倉庫名:如之前所說嵌屎,這里的倉庫名是兩段式名稱推正,既 <用戶名>/<軟件名>
    。對于 Docker Hub宝惰,如果不給出用戶名植榕,則默認為 library
    ,也就是官方鏡像尼夺。

運行鏡像

有個鏡像就可以以這個鏡像運行一個容器尊残,以上面ubuntu為例運行一個容器。

$ docker run -it --rm ubuntu bash
  • docker run :就是運行容器的命令
  • -it :其實是兩個參數(shù)淤堵,-i:交互式操作寝衫,-t :終端
  • --rm :容器退出后隨之將其刪除
  • ubuntu :用 ubuntu 鏡像為基礎(chǔ)來啟動容器
  • bash:放在鏡像名后的是命令拐邪,這里我們希望有個交互式 Shell慰毅,因此用的是 bash
$ docker run -d -p 22 -p 80:8080 ubuntu/kevin /usr/sbin/sshd -D
  • -d :容器后臺運行
  • -p :指定端口設置
  • -p 80:8080 :端口映射,省略80表示把容器端口8080映射到一個動態(tài)端口
  • /usr/sbin/sshd :啟動 ssh 服務
  • -D :容器長時間運行

注:exit:退出容器

列出鏡像

列出下載的鏡像用docker images命令庙睡。

列表中的鏡像體積綜合并非實際硬盤消耗事富,由于 Docker 鏡像是多層存儲結(jié)構(gòu)技俐,并且可以繼承、復用统台,因此不同鏡像可能會因為使用相同的基礎(chǔ)鏡像雕擂,從而擁有共同的層。

虛懸鏡像

鏡像既沒有倉庫名贱勃,也沒有標簽井赌,均為 <none>。此類鏡像為虛懸鏡像(dangling image) 贵扰,下面命令專門顯示此類鏡像

$ docker images -f dangling=true

這類鏡像已經(jīng)失去了存在的價值仇穗,可以隨意刪除,刪除命令如下

$ docker rmi $(docker images -q -f dangling=true)

中間層鏡像

為了加速鏡像構(gòu)建戚绕、重復利用資源纹坐,Docker 會利用 中間層鏡像。所以在使用一段時間后舞丛,可能會看到一些依賴的中間層鏡像耘子。默認的 docker images 列表中只會顯示頂層鏡像,如果希望顯示包括中間層鏡像在內(nèi)的所有鏡像的話球切,需要加 -a 參數(shù)谷誓。

$ docker images -a

列出部分鏡像

根據(jù)倉庫名列出鏡像

$ docker image ubuntu

根據(jù)倉庫名和標簽

$ docker images ubunut:16.04

除此以外,docker images 還支持強大的過濾器參數(shù) --filter吨凑,或者簡寫 -f捍歪。希望看到在nginx之后建立的鏡像,可以用下面的命令

$ docker images -f since=nginx

希望看到nginx之前建立的鏡像鸵钝,since換成before

保存鏡像

可用下面命令保存鏡像

$ docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
例如:docker commit -m "commit message" CONTAINER kevinlovedev/tomcat
  • -m:保存commit信息

刪除鏡像

可用下面命令刪除鏡像

$ docker rmi [OPTIONS] IMAGE [IMAGE...]

容器

啟動

所需主要命令為docker run

$ sudo docker run --name kevin -i -t ubuntu /bin/bash
  • --name:為容器指定名稱
  • -i :保證容器中STDIN是開啟的
  • -t :為創(chuàng)建的容器分配一個偽tty終端糙臼,這樣容器才能提供一個交互式shell

docker start命令直接將一個已經(jīng)終止的容器啟動運行

后臺運行

更多的時候,需要讓 Docker在后臺運行而不是直接把執(zhí)行命令的結(jié)果輸出在當前宿主機下蒋伦。此時弓摘,可以通過添加 -d 參數(shù)來實現(xiàn)。

獲取容器的輸出信息痕届,可以通過 docker logs 命令韧献。

啟動并進入

大多數(shù)情況,我們需要啟動并且直接進入到容器里面研叫。

$ docker run -it 容器名 bash

終止

可用 docker stop [OPTIONS] CONTAINER [CONTAINER...] 來終止一個運行中的容器锤窑。

注:此命令后面是CONTAINER ID或者NAME參數(shù),可用docker ps查看

此外嚷炉,當Docker容器中指定的應用終結(jié)時渊啰,容器也自動終止。 例如對于上一章節(jié)中只啟動了一個終端的容器,用戶通過 exit 命令或 Ctrl+d 來退出終端時绘证,所創(chuàng)建的容器立刻終止隧膏。

終止狀態(tài)的容器可以用 docker ps -a 命令看到。

$ docker rm $(docker ps -qa --no-trunc --filter "status=exited")    # 刪除所有已退出容器

進入容器

在使用 -d 參數(shù)時嚷那,容器啟動后會進入后臺胞枕。 某些時候需要進入容器進行操作

可用docker attach [OPTIONS] CONTAINER命令進入

導出容器

可用 docker export 命令。

$ docker export ubuntu:kevin > latest.tar

導入容器

可用 docker improt 命令魏宽。

注:用戶既可以使用 docker load 來導入鏡像存儲文件到本地鏡像庫腐泻,也可以使用 docker import 來導入一個容器快照到本地鏡像庫。這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當時的快照狀態(tài))队询,而鏡像存儲文件將保存完整記錄派桩,體積也要大。此外蚌斩,從容器快照文件導入時可以重新指定標簽等元數(shù)據(jù)信息铆惑。

刪除容器

可用 docker rm 來刪除一個處于終止狀態(tài)的容器

docker ps -a 命令可以查看所有已經(jīng)創(chuàng)建的包括終止狀態(tài)的容器,如果數(shù)量太多要一個個刪除可能會很麻煩凳寺,用 docker rm $(docker ps -a -q) 可以全部清理掉鸭津。

倉庫

倉庫(Repository)是集中存放鏡像的地方彤侍。

搜索

用戶無需登錄即可通過 docker search 命令來查找官方倉庫中的鏡像肠缨,并利用 docker pull 命令來將它下載到本地。

另外盏阶,查找的時候通過 -s N 參數(shù)可以指定僅顯示評價為 N 星以上的鏡像(已經(jīng)過時晒奕,不推薦使用),最新版本使用

--filter過濾查找名斟。

利用下面命令下載到本地

$ sudo docker pull centos

數(shù)據(jù)管理

容器中管理數(shù)據(jù)主要有兩種方式:

  • 數(shù)據(jù)卷(Data volumes)
  • 數(shù)據(jù)卷容器(Data volume containers)

數(shù)據(jù)卷

數(shù)據(jù)卷是一個可供一個或多個容器使用的特殊目錄脑慧,它繞過 UFS,可以提供很多有用的特性:

  • 數(shù)據(jù)卷可以在容器之間共享和重用
  • 對數(shù)據(jù)卷的修改會立馬生效
  • 對數(shù)據(jù)卷的更新砰盐,不會影響鏡像
  • 數(shù)據(jù)卷默認會一直存在闷袒,即使容器被刪除

注意:數(shù)據(jù)卷的使用,類似于 Linux 下對目錄或文件進行 mount岩梳,鏡像中的被指定為掛載點的目錄中的文件會隱藏掉囊骤,能顯示看的是掛載的數(shù)據(jù)卷。

容器和主機之間拷貝數(shù)據(jù)

拷貝容器文件到主機

$ docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

例如:docker cp CONTAINER:/usr/local/tomcat/webapps/ROOT/index.html index.html

拷貝主機文件到容器

$ docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

例如:docker cp index.html CONTAINER:/usr/local/tomcat/webapps/ROOT/index.html

Docker Machine

Docker Machine 是一個 docker 管理工具冀值,主要解決兩個問題:

  • docker 只能運行在 Linux 上
  • docker 只能管理運行本機的 docker 鏡像

由于之前配置了 使用Docker Machine管理阿里云ECS 也物,Docker Machine使用一直不成功,報錯信息如下:

Error setting machine configuration from flags provided: --engine-install-url cannot be used with the virtualbox driver, use --virtualbox-boot2docker-url instead

原因在于配置了阿里的一些參數(shù)列疗,其中包括了MACHINE_DOCKER_INSTALL_URL滑蚯,這個是報錯的主要原因,查了半天的資料終于爬出坑了

Push本地鏡像到DockerHub

首先鏡像名稱格式需要是DockerHubName/RepositoryName,例如kevinlovedev/tomcat告材,可用docker commit命令保存鏡像坤次,/前面是DockerHub昵稱,/后面是DockerHub倉庫名斥赋。

保存鏡像成功之后浙踢,需要用docker login命令登陸到DockerHub。

最后用docker push命令提交本地鏡像到DockerHub倉庫灿渴。

Dockerfile

MAINTAINER:設置該鏡像的作者洛波。語法如下:

MAINTAINER kevin "kevinlovemail@gmail.com"

build

使用了 docker build 命令進行鏡像構(gòu)建。其格式為:

$ docker build -t ubuntu:kevin .

-t 指定了最終鏡像的名稱 ubuntu:kevin

常見問題

無法刪除一

Error response from daemon: conflict: unable to delete e4b9e4f71238 (must be forced) - image is being used by stopped container 1e359ad4363d

該容器是終止狀態(tài)骚露,需要將此容器從終止狀態(tài)刪除蹬挤,然后再刪除鏡像

$ docker rm 1e359ad4363d    # 刪除終止容器
$ docker rmi e4b9e4f71238   # 刪除鏡像

無法刪除二

Error response from daemon: conflict: unable to delete 1dc4f730b414 (cannot be forced) - image has dependent child images

先刪除依賴,如果 IMAGE ID 相同的話棘幸,根據(jù) TAG 刪除

$ docker rm REPOSITORY:TAG    # 根據(jù)TAG刪除容器

語法錯誤

Error response from daemon: Unknown instruction: RUNCMD

can't initialize iptables

can't initialize iptables table `filter': Permission denied (you must be root)

啟動容器時加入?yún)?shù) --privileged=true

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焰扳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子误续,更是在濱河造成了極大的恐慌吨悍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹋嵌,死亡現(xiàn)場離奇詭異育瓜,居然都是意外死亡,警方通過查閱死者的電腦和手機栽烂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門躏仇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腺办,你說我怎么就攤上這事焰手。” “怎么了怀喉?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵书妻,是天一觀的道長。 經(jīng)常有香客問我躬拢,道長躲履,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任估灿,我火速辦了婚禮崇呵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馅袁。我一直安慰自己域慷,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著犹褒,像睡著了一般抵窒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叠骑,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天李皇,我揣著相機與錄音,去河邊找鬼宙枷。 笑死掉房,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的慰丛。 我是一名探鬼主播卓囚,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诅病!你這毒婦竟也來了哪亿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贤笆,失蹤者是張志新(化名)和其女友劉穎蝇棉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芥永,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡篡殷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恤左。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贴唇。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖飞袋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情链患,我是刑警寧澤巧鸭,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站麻捻,受9級特大地震影響纲仍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贸毕,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一郑叠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧明棍,春花似錦乡革、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘁傀。三九已至,卻和暖如春视粮,著一層夾襖步出監(jiān)牢的瞬間细办,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工蕾殴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笑撞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓钓觉,卻偏偏與公主長得像娃殖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子议谷,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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

  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一炉爆、Docker 簡介 Docke...
    極客圈閱讀 10,499評論 0 120
  • Docker — 云時代的程序分發(fā)方式 要說最近一年云計算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,532評論 15 147
  • 簡介 容器與管理程序虛擬化有所不同卧晓,管理程序虛擬化通過中間層將一臺或多臺獨立的機器虛擬運行于物理硬件之上芬首,而容器則...
    Gundy_閱讀 353評論 0 4
  • 劉旭和劉枍
    老四肆閱讀 243評論 0 0
  • * 陽春三月,天庭上別有一番盛景逼裆。 五六位仙婢成群地飄進蟠桃園郁稍,輕薄的紗裙在微風的帶動下與腳下裊裊升起的云霧混為一...
    一盎司糖漿不太甜閱讀 893評論 1 8