瞭解【Docker】從這裏開始

1、環境配置的難題


軟件開發最大的難題之一就是環境配置的問題。如今用戶環境紛亂複雜,而且因爲開源社區的進一步推廣和許多開源項目不停地迭代更新,項目可能會有愈來愈多的依賴以及愈來愈難管理的依賴版本,如何保證編寫的程序能不僅是在「個人電腦上能運行」(It works on my machine)成了一個複雜麻煩的事情。html

因而就有人提出:能不能從根本上解決問題,讓軟件能夠自帶環境安裝?也就是說,安裝的時候,把原始環境如出一轍地複製過來。linux

虛擬機

虛擬機(virtual machine)就是一種自帶環境安裝的解決方案。它能夠在一個操做系統裏面運行另外一個操做系統,好比在 Windows 系統裏運行一個 Linux 的操做系統。git

應用程序對虛擬機是毫無感知的,由於虛擬機看上去跟真實的操做系統如出一轍,並且對於底層的系統來講,虛擬機就是一個普通文件,不須要了就刪除,對其餘部分毫無影響。github

雖然用戶能夠經過虛擬機還原軟件的原始環境。可是,該方案有如下的幾個缺點:docker

1. 資源佔用多shell

虛擬機會獨佔一部分本屬於操做系統的內存和硬盤空間。它運行的時候,其餘程序就不能使用這些資源了。哪怕你想在虛擬機裏面使用的應用程序它實際只會佔用 1MB 的內存,虛擬機仍然須要幾百 MB 的內存才能運行。macos

2. 冗餘步驟多ubuntu

虛擬機是完整的操做系統,一些系統層面上的操做步驟,每每沒法調過,好比用戶登陸。segmentfault

3. 啓動慢api

啓動操做系統須要多久,啓動虛擬機就須要多久。可能要等幾分鐘,才能讓應用程序真正的運行起來。

Linux 容器

因爲虛擬機存在上述的這些缺點,Linux 提出了另外一種虛擬機化技術:Linux 容器(Linux Containers,縮寫 LXC)。

Linux 容器不是模擬一個完整的操做系統,而是對進程進行隔離。或者說,在正常進程的外面套了一個保護層。對於容器裏面的進程來講,它接觸到的各類資源都是虛擬的,從而實現與底層系統的隔離。

因爲容器是進程級別的,相比虛擬機有不少優點。

1. 啓動快

容器裏面的應用,直接就是底層系統的一個進程,而不是虛擬機內部的進程。因此,啓動容器至關於啓動本機的一個進程,而不是啓動一個操做系統,速度就快不少。

2. 資源佔用少

容器只佔用須要的資源,不佔用那些沒有用到的資源;虛擬機因爲是完整的操做系統,不可避免要佔用全部資源。另外,多個容器能夠共享資源,虛擬機都是獨享資源。

3. 體積小

容器只要包含用到的組件便可,而虛擬機是整個操做系統的打包,因此容器文件比虛擬機文件要小不少。

總之,容器有點像輕量級的虛擬機,可以提供虛擬化的環境,可是成本開銷小得多。

2、什麼是 Docker?


Enterprise Container Platform for High-Velocity Innovation
Securely build, share and run any application, anywhere

譯:
企業高速容器平臺
在任何地方安全的建造、分享、運行你的應用程序

官方對 Docker 的定義是一個容器平臺。簡單來講,Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。開發人員能夠利用 Docker 來消除協做編碼時 「在個人電腦上能夠正常工做」 的問題。

Docker 將應用程序與該程序的依賴,打包在一個文件裏面。運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器裏運行,就好像在真實的物理機上運行同樣。有了 Docker,就不用擔憂環境問題。

整體來講,Docker 的接口至關簡單,用戶能夠方便地建立和使用容器,把本身的應用放入容器。容器還能夠進行版本管理、複製、分享、修改,就像管理普通的代碼同樣。

爲何要使用 Docker?

Docker 是一個爲開發者和運維者去開發、發佈和在容器中運行應用的平臺。使用 Linux 容器來部署應用程序被稱爲容器化。 容器不是新的概念,它的優點在於很容易發佈一個應用。

容器化變得很是的流行,由於容器化具備如下的優勢:

  • 靈活:即便最複雜的應用也可以被容器化。
  • 輕量:容器最大化利用和分享主機的內核。
  • 可互換:你能夠即時部署更新和升級應用。
  • 便捷:你能夠在本地構建應用,並部署到容器雲,並在任何地方運行。
  • 可擴展:你能夠增長和自動分發容器的個數。
  • 可堆疊:您能夠垂直堆疊服務並即時堆疊服務。

容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘可能小。傳統虛擬機方式運行 10 個不一樣的應用就要起 10 個虛擬機,而Docker 只須要啓動 10 個隔離的應用便可。

具體說來,Docker 在以下幾個方面具備較大的優點。

1. 更快速的交付和部署

對開發和運維(devop)人員來講,最但願的就是一次建立或配置,能夠在任意地方正常運行。

開發者可使用一個標準的鏡像來構建一套開發容器,開發完成以後,運維人員能夠直接使用這個容器來部署代碼。 Docker 能夠快速建立容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其餘成員更容易理解應用程序是如何建立和工做的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。

2. 更高效的虛擬化

Docker 容器的運行不須要額外的 hypervisor 支持,它是內核級的虛擬化,所以能夠實現更高的性能和效率。

3. 更輕鬆的遷移和擴展

Docker 容器幾乎能夠在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。 這種兼容性可讓用戶把一個應用程序從一個平臺直接遷移到另一個。

4. 更簡單的管理

使用 Docker,只須要小小的修改,就能夠替代以往大量的更新工做。全部的修改都以增量的方式被分發和更新,從而實現自動化而且高效的管理。

Docker VS VM

容器和虛擬機對資源的隔離和分配有相同的優點,但不一樣的是容器虛擬化操做系統而不是硬件,這使得容器更加的方便和高效。

一個容器是在 Linux 服務本地運行,並和其餘的容器共享主機的內核。它運行在一個獨立的進程中,相對於其餘可執行的進程(好比虛擬機)來講,容器的內存佔用空間更小,更加的輕量化。

相比之下,虛擬機(VM)運行一個完整的「客戶」操做系統,經過虛擬機管理程序虛擬訪問主機資源。 通常來講,虛擬機提供的環境比大多數應用程序須要的資源更多。

因爲 Docker 輕量、資源佔用少,使得 Docker 能夠輕易的應用到構建標準化的應用中。但 Docker 目前還不夠完善,好比隔離效果不如 VM,共享宿主機操做系統的一些基礎庫等;網絡配置功能相對簡單,主要以橋接方式爲主;查看日誌也不夠方便靈活。

Docker 的用途

Docker 的主要用途,目前有三大類。

1. 提供一次性的環境。好比,本地測試他人的軟件、持續集成的時候提供單元測試和構建的環境。

2. 提供彈性的雲服務。由於 Docker 容器能夠隨開隨關,很適合動態擴容和縮容。

3. 組建微服務架構。經過多個容器,一臺機器能夠跑多個服務,所以在本機就能夠模擬出微服務架構。

3、Docker 基本概念


下面這張圖很是的經典,很形象地展現了,什麼是容器,什麼是鏡像,什麼是倉庫,以及三者之間的聯繫。

接下來咱們來解釋一下這張圖。如今咱們要造一間廚房,在造以前咱們首先要乾的一件事,就是先列舉出咱們造廚房須要的東西。咱們可能須要一個通了水電煤的房子以及一些必需的廚房用具諸如鍋碗瓢勺、煤氣竈、冰箱、水槽等等這些東西。如今咱們知道須要了什麼東西以後,咱們就去找這些東西。首先咱們先去京東購買一些廚房用具,這些用具就比如咱們的Docker鏡像,咱們廚房的用具到了以後得找個地方把它們放在,不可能隨處丟吧,否則後面用的時候就找不到它了,那麼咱們Docker鏡像也是這樣,須要一個Docker倉庫去存儲這些鏡像。如今咱們有了這些廚房用具以後就能夠作飯了嗎?答案固然是不能,沒水沒電沒火啊!這時候咱們得把廚房用具給裝到一個通了水電煤的房子才行,那麼Docker鏡像也是這樣,單純的Docker鏡像是不能用的,它得裝到Docker容器中通了水電煤才能使用。等咱們裝好了廚房用具以後咱們就能夠開始作飯,那麼咱們的Docker鏡像裝到Docker容器以後,咱們應用就能夠跑起來了。

概念詳解

Docker是CS架構,主要有兩個概念:

  • Docker daemon: 運行在宿主機上,Docker守護進程,用戶經過Docker client(Docker命令)與Docker daemon交互
  • Docker client: Docker 命令行工具,是用戶使用Docker的主要方式,Docker client與Docker daemon通訊並將結果返回給用戶,Docker client也能夠經過socket或者RESTful api訪問遠程的Docker daemon

瞭解了Docker的組成,再來了解一下Docker的三個主要概念:

  • Docker image: 鏡像是隻讀的,鏡像中包含有須要運行的文件。鏡像用來建立container,一個鏡像能夠運行多個container;鏡像能夠經過Dockerfile建立,也能夠從Docker hub/registry上下載。
  • Docker container: 容器是Docker的運行組件,啓動一個鏡像就是一個容器,容器是一個隔離環境,多個容器之間不會相互影響,保證容器中的程序運行在一個相對安全的環境中。
  • Docker hub/registry: 共享和管理Docker鏡像,用戶能夠上傳或者下載上面的鏡像,官方地址爲https://registry.hub.docker.com/,也能夠搭建本身私有的Docker registry。

鏡像就至關於打包好的版本,鏡像啓動以後運行在容器中,倉庫就是裝存儲鏡像的地方。

4、Docker 安裝


安裝過程都大同小異,這裏就不細說了,詳細的能夠參考這裏:https://www.runoob.com/docker/macos-docker-install.html

惟一須要注意的就是因爲國內網絡問題,須要給 Docker 鏡像加個速(詳細的能夠戳上面連接,最後有...)

5、Docker Hello World


首先,運行下面的命令,將 image 文件從倉庫抓取到本地。

$ docker image pull library/hello-world

上面代碼中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在倉庫裏面的位置,其中library是 image 文件所在的組,hello-world是 image 文件的名字。

因爲 Docker 官方提供的 image 文件,都放在library組裏面,因此它的是默認組,能夠省略。所以,上面的命令能夠寫成下面這樣。

$ docker image pull hello-world

抓取成功之後,就能夠在本機看到這個 image 文件了。

$ docker image ls

如今,運行這個 image 文件

$ docker container run hello-world

docker container run 命令會從 image 文件,生成一個正在運行的容器實例。

注意,docker container run 命令具備自動抓取 image 文件的功能。若是發現本地沒有指定的 image 文件,就會從倉庫自動抓取。所以,前面的 docker image pull 命令並非必需的步驟。

若是運行成功,你會在屏幕上讀到下面的輸出。

$ docker container run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

... ...

輸出這段提示之後,hello world 就會中止運行,容器自動終止。

有些容器不會自動終止,由於提供的是服務。好比,安裝運行 Ubuntu 的 image,就能夠在命令行體驗 Ubuntu 系統。

$ docker container run -it ubuntu bash

對於那些不會自動終止的容器,必須使用docker container kill 命令手動終止。

$ docker container kill [containID]

6、經常使用命令


  • 殺死全部正在運行的容器
    docker kill $(docker ps -a -q)
  • 刪除全部已經中止的容器
    docker rm $(docker ps -a -q)
  • 刪除全部鏡像
    docker rmi $(docker images -q)
  • 關閉容器
    docker stop CONTAINER ID或者NAMES
  • 從新啓動關閉的容器
    docker start CONTAINER ID或者NAMES
  • 移除本地容器
    docker rm CONTAINER ID或者NAMES
  • 查看本地容器
    docker ps //查看正在運行的容器
    docker ps -a //查看全部容器
  • 查看本地鏡像
    docker images
  • 建立鏡像
    docker build -t name:tag Dockerfile路徑
  • 修改本地鏡像標記
    docker tag IMAGE ID name:tag
    docker rmi name:tag
  • 刪除本地鏡像
    docker rmi name:tag或者IMAGE ID
  • 進入容器
    docker exec -it IMAGE ID或者NAMES /bin/bash
  • 獲取鏡像中心的鏡像
    docker pull name:tag
  • 獲取容器的端口映射配置
    docker port CONTAINER ID或者NAMES

# 參考資料

1. Docker入門教程(阮一峯) - http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
2. Docker(一):Docker入門教程(純潔的微笑) - https://www.cnblogs.com/ityouknow/p/8520296.html
3. Docker教程(菜鳥教程) - https://www.runoob.com/docker/docker-tutorial.html
4. - Docker入門,看這篇就夠了 - https://segmentfault.com/a/1190000009544565#articleHeader6
5. 官方文檔 - https://www.docker.com


按照慣例黏一個尾巴:

歡迎轉載,轉載請註明出處!
簡書ID:@我沒有三顆心臟
github:wmyskxz 歡迎關注公衆微信號:wmyskxz 分享本身的學習 & 學習資料 & 生活 想要交流的朋友也能夠加qq羣:3382693

相關文章
相關標籤/搜索