docker從入門到精(fang)通(qi)(一)

導語:一篇我自己的docker學習總結,重在基礎,如有錯誤,歡迎各種討論、建議、批評、指正。

1、docker是什么

docker是一種Linux容器(LXC,即linux container)引擎,它與傳統的虛擬化技術的區別在于容器本身不做硬件層級的虛擬化,而是一種操作系統級的虛擬化技術,通過Linux內核的一些特性(namespace、control group)實現容器與容器、容器與宿主機之間的隔離,它是一種半虛擬化技術。
docker的特點有:

  • 擁有獨立的根文件系統、存儲空間和網絡
  • 只能創建Linux容器
  • 極快的啟動速度與極低的運行開銷
  • 引擎運行的依賴環境非常簡單
  • 可將應用及其依賴環境一起打包到容器中

2、docker有什么

在docker官網上有這么幾款開源工具:

  • docker engine:基本的完整功能docker包,包含docker引擎和客戶端,適用于單臺主機
  • docker compose:一個用于一組不同功能容器的docker工具。例如用django搭建一個博客時,需要同時用到nginx容器、mysql容器、redis容器,可以使用docker compose進行統一編排
  • docker registry:私有docker鏡像倉庫搭建工具,docker中的每一個容器都是從鏡像建立的。
  • docker machine:一個幫助我們簡化部署docker引擎的工具,可以通過一條命令在各種架構中部署docker
  • docker swarm:一個docker機群的編排調度工具,類似工具還有google出品的kubernetes

docker由哪幾部分組成呢?

  • docker 引擎:即docker daemon,docker守護進程,它根據鏡像生成容器,運行容器。docker引擎有點像虛擬光驅,iso文件就是docker鏡像,而容器就是我們在資源管理器中看到的虛擬光驅加載的光盤
  • docker 客戶端:用來向daemon發送指令,這也說明docker是一個C/S架構程序
  • docker 鏡像:即docker image,容器產生的圖紙和材料。docker的容器鏡像是基于一種特殊的層式文件系統,這種方式便于鏡像的重復利用與容器回滾,更多信息可以看一下這篇文章還有這一篇
  • docker 倉庫:即docker registry,鏡像倉庫,有docker公司搭建的公有庫docker hub,由于速度的問題可以使用國內的一些公共庫比如daocloud或者自建私有庫,docker的倉庫概念與git、github相似
  • docker 容器:即docker container,docker所建立的虛擬化實例,類似傳統虛擬化里的虛擬機

3、docker怎么裝

安裝前的檢查

docker依賴條件極少,各平臺安裝包發行較為完善,安裝過程也非常簡單。安裝之前首先要檢查以下先決條件:

  • 安裝主機必須是64位CPU架構的機器
  • 操作系統內核為3.8或更高
  • 內核必須支持以下幾種存儲驅動之一(一篇深入探討存儲驅動的文章)
    • Device Mapper
    • AUFS
    • vfs
    • btrfs
    • ZFS(docker1.7中引入)
    • overlay1或2
      -通常默認驅動是Device Mapper或AUFS
  • 內核必須開啟cgroup、namespace功能

docker安裝

具體安裝ubuntu使用apt-get安裝docker-engine包,redhat/centos 6.X中需先添加epel源后使用yum安裝docker-io包。
P.S. Ubuntu中如果使用了UFW,需要修改/etc/default/ufw文件中的配置并重新加載:
DEFAULT_FORWARD_POLICY="ACCEPT"(默認是DROP)
$ sudo ufw reload

docker服務器啟動

redhat/centos 6.X中:
$ sudo service docker start
redhat/centos 7.X中:
$ sudo systemctl start docker

4、docker怎么玩

啟動docker服務器:docker daemon

要想創建運行容器,首先要運行docker守護進程,docker daemon命令在1.16版本開始被dockerd命令代替。以下是一些啟動docker守護進程時的可選參數:

$ dockerd --help

Usage:  dockerd COMMAND

A self-sufficient runtime for containers.

Options:
  -b, --bridge string            [指定守護進程使用的網橋接口,默認是docker0] Attach containers to a network bridge
  -D, --debug                    [啟用調試模式] Enable debug mode
  -g, --graph string             [設置守護進程運行時根目錄] Root of the Docker runtime (default "/var/lib/docker")
  -G, --group string             [設置unix socket的屬組] Group for the unix socket (default "docker")
  -H, --host list                [指定守護進程的通信接口,可以是一個unix socket、IP、域名] Daemon socket(s) to connect to (default [])
  -l, --log-level string         [設置日志等級] Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
  -p, --pidfile string           [指定守護進程PID文件地址] Path to use for daemon PID file (default "/var/run/docker.pid")
  -s, --storage-driver string    [設置存儲驅動] Storage driver to use
  -v, --version                  [查看docker版本] Print version information and quit

創建并運行一個容器

docker守護進程也啟動好了,不管別的,先運行一個容器嘗嘗:
docker run -i -t ubunt /bin/bash
稍等片刻,我們會發現shell發生了變化:

第一個容器
我們登陸到了ID為ed7751d079c3的容器中,一個基于官方ubuntu鏡像的容器已經擺在面前。可以像操作一個ubuntu虛擬機那樣折騰這個容器了。

那么這個命令運行過程中發生了什么?

  • docker在本地查找名為ubuntu的鏡像,沒找到
  • 由于未指明tag,docker將會從docker hub拉取ubuntu:latest這個鏡像,latest就是默認的tag,最新版
  • 然后我們經過漫長的等待(有可能)會看到幾行亂碼后面跟著Pull complete,鏡像就下載完了。這其中每一行實際上是鏡像的每一層,亂碼是每一層的ID,這一層又一層實際上從Dockerfile(用于創建鏡像的文件)生成的。Dockerfile怎么玩?以后再寫。。。
  • 鏡像有了docker開始創建容器,-i表示打開容器的STDIN,-t分配一個偽tty終端,然后運行bash shell

docker命令

docker從1.13開始對現有的40多個頂級命令進行組織整理,形成一組管理命令,讓用戶使用和理解命令更方便更容易。
現有管理命令如下:

  container   Manage containers(容器管理)
  image       Manage images(鏡像管理)
  network     Manage networks(docker內部網絡管理)
  node        Manage Swarm nodes(swarm節點管理)
  plugin      Manage plugins(插件管理)
  secret      Manage Docker secrets(密鑰管理)
  service     Manage services(docker 服務管理,負責
  讓運行在docker中的應用保持一個理想可用的狀態。此處理解不到位,待深入)
  stack       Manage Docker stacks(docker捆綁包管理,即docker compose創建的一組容器。此處理解不到位,待深入)
  swarm       Manage Swarm(Swarm集群管理)
  system      Manage Docker(docker服務器管理)
  volume      Manage volumes(卷管理)

管理命令展開

1.容器命令:docker container

該命令包括與docker容器相關的操作
docker container attach|commit|cp|create|diff|exec|export|inspect|kill|logs|ls| pause|port|prune|rename|restart|rm|run|start|stats|stop|top|unpause|update|wait
常用子命令如下:

  ls          列出容器
  logs        獲取容器日志
  inspect     顯示容器詳細信息
  diff        顯示容器變化(A-add 新增,C-change 改變,D-delete 刪除)
  stats       實時顯示容器的物理資源資源占用情況
  top         顯示容器中正在運行的進程
  port        列出容器與宿主機所有端口映射
  exec        在一個正在運行的容器中執行一條命令
  attach      連接至容器的stdout、stdin、stderr
  cp          在容器用宿主機之間復制文件
  create      從鏡像創建一個新容器
  run         新建一個容器并執行一條命令
  rm          刪除容器
  prune       刪除所有停止容器
  rename      重命名一個容器
  start       啟動容器
  stop        停止容器(發送SIGTERM后再發送SIGKILL)
  restart     重啟容器
  kill        強行停止容器(直接發送SIGKILL)
  pause       使用cgroup的freezer順序掛起/解掛容器中所有進程
  unpause     解除容器掛起
  update      更新容器自身的配置參數(如容器CPU、內存的分配參數等)
  commit      將容器的變化創建為一個新的鏡像(就是把在容器內執行的一些命令寫到一個新的鏡像層商)
  export      將容器導出為鏡像,生成一個tar包(export導出的鏡像會丟失鏡像層結構,無法回滾)
  wait        阻塞指定容器直到容器停止,并返回退出碼

2、鏡像命令:docker image

該命令包括與docker鏡像相關的操作
docker image build|history|import|inspect|load|ls|prune|pull|push|rm|save|tag
常用子命令如下:

  build       從Dockerfile創建一個鏡像
  history     顯示一個鏡像的創建歷史
  inspect     顯示鏡像詳細信息
  ls          列出本地鏡像
  prune       刪除所有沒有使用的鏡像
  pull        從倉庫拉去一個鏡像(默認是從docker hub)
  push        向倉庫上傳一個鏡像(默認是從docker hub)
  rm          刪除一個鏡像
  save        將鏡像導出,如果不指定文件,將直接輸出至STDOUT
  load        對應docker image save,將save導出的tar包導入成鏡像,或者從STDIN直接輸入
  import      對應docker container export,將export導出的tar包導入成鏡像
  tag         為鏡像添加TAG,便于鏡像管理

補充一個命令:
docker search [OPTIONS] TERM
該命令用于搜索倉庫中的鏡像(默認還是在docker hub中搜索)。

3、docker服務器命令:docker system

該命令包括整個docker的一些相關操作
docker system df|events|info|prune
常用子命令有:

  df          顯示本機docker占用的硬盤空間,包括鏡像、容器還有卷
  events      實時顯示docker服務器的事件
  info        顯示整個docker服務器信息,比如容器數量,鏡像數量等等等等
  prune       刪除所有沒有使用的數據,比如停止的容器,沒用到的鏡像等待

4、還有一些頂級命令。。。。

這個我也不知道是啥的東西已經被我寫成一個純粹的命令堆疊了。。。無所謂了。。。。當成是個命令查詢手冊吧。。。
docker login|logout|search
這三個命令沒有對應的管理命令子命令,其實就是docker倉庫的登陸、注銷、查詢(默認當然還是對docker hub的),其他的頂級命令都有對應的管理命令子命令。

剩下的管理命令子命令諸如volume、network、stack、service之類的怎么不介紹?看多了你也吐,寫多了我也惡心。當然最重要的是我還沒研究明白。以上這些對于docker最基本使用已經足夠了,可以折騰一會了。

下一期,我寫一下docker的一些簡單的使用場景,以及怎么寫dockerfile然后創建鏡像并運行容器。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容

  • Docker — 云時代的程序分發方式 要說最近一年云計算業界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,591評論 15 147
  • 一、Docker 簡介 Docker 兩個主要部件:Docker: 開源的容器虛擬化平臺Docker Hub: 用...
    R_X閱讀 4,405評論 0 27
  • 轉載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,524評論 0 120
  • 七八歲光景,最是調皮時。 一有假期,爸媽就要往鄉下送。城里人忙,管不住。城里太井然有序,怕惹事。 鄉下的橘子樹,春...
    麥克不姓麥閱讀 727評論 0 1
  • 所謂管理者并不只是那些主管、經理、被統稱為領導的高級管理人員,作為平凡人,只要是從事知識性工作,用行動和決策來提高...
    老牛痞閱讀 690評論 0 0