軟件開發最大的難題之一就是環境配置的問題。如今用戶環境紛亂複雜,而且因爲開源社區的進一步推廣和許多開源項目不停地迭代更新,項目可能會有愈來愈多的依賴以及愈來愈難管理的依賴版本,如何保證編寫的程序能不僅是在「個人電腦上能運行」(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 Containers,縮寫 LXC)。
Linux 容器不是模擬一個完整的操做系統,而是對進程進行隔離。或者說,在正常進程的外面套了一個保護層。對於容器裏面的進程來講,它接觸到的各類資源都是虛擬的,從而實現與底層系統的隔離。
因爲容器是進程級別的,相比虛擬機有不少優點。
1. 啓動快
容器裏面的應用,直接就是底層系統的一個進程,而不是虛擬機內部的進程。因此,啓動容器至關於啓動本機的一個進程,而不是啓動一個操做系統,速度就快不少。
2. 資源佔用少
容器只佔用須要的資源,不佔用那些沒有用到的資源;虛擬機因爲是完整的操做系統,不可避免要佔用全部資源。另外,多個容器能夠共享資源,虛擬機都是獨享資源。
3. 體積小
容器只要包含用到的組件便可,而虛擬機是整個操做系統的打包,因此容器文件比虛擬機文件要小不少。
總之,容器有點像輕量級的虛擬機,可以提供虛擬化的環境,可是成本開銷小得多。
Enterprise Container Platform for High-Velocity Innovation
Securely build, share and run any application, anywhere譯:
企業高速容器平臺
在任何地方安全的建造、分享、運行你的應用程序
官方對 Docker 的定義是一個容器平臺。簡單來講,Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。開發人員能夠利用 Docker 來消除協做編碼時 「在個人電腦上能夠正常工做」 的問題。
Docker 將應用程序與該程序的依賴,打包在一個文件裏面。運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器裏運行,就好像在真實的物理機上運行同樣。有了 Docker,就不用擔憂環境問題。
整體來講,Docker 的接口至關簡單,用戶能夠方便地建立和使用容器,把本身的應用放入容器。容器還能夠進行版本管理、複製、分享、修改,就像管理普通的代碼同樣。
Docker 是一個爲開發者和運維者去開發、發佈和在容器中運行應用的平臺。使用 Linux 容器來部署應用程序被稱爲容器化。 容器不是新的概念,它的優點在於很容易發佈一個應用。
容器化變得很是的流行,由於容器化具備如下的優勢:
容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘可能小。傳統虛擬機方式運行 10 個不一樣的應用就要起 10 個虛擬機,而Docker 只須要啓動 10 個隔離的應用便可。
具體說來,Docker 在以下幾個方面具備較大的優點。
1. 更快速的交付和部署
對開發和運維(devop)人員來講,最但願的就是一次建立或配置,能夠在任意地方正常運行。
開發者可使用一個標準的鏡像來構建一套開發容器,開發完成以後,運維人員能夠直接使用這個容器來部署代碼。 Docker 能夠快速建立容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其餘成員更容易理解應用程序是如何建立和工做的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。
2. 更高效的虛擬化
Docker 容器的運行不須要額外的 hypervisor 支持,它是內核級的虛擬化,所以能夠實現更高的性能和效率。
3. 更輕鬆的遷移和擴展
Docker 容器幾乎能夠在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。 這種兼容性可讓用戶把一個應用程序從一個平臺直接遷移到另一個。
4. 更簡單的管理
使用 Docker,只須要小小的修改,就能夠替代以往大量的更新工做。全部的修改都以增量的方式被分發和更新,從而實現自動化而且高效的管理。
容器和虛擬機對資源的隔離和分配有相同的優點,但不一樣的是容器虛擬化操做系統而不是硬件,這使得容器更加的方便和高效。
一個容器是在 Linux 服務本地運行,並和其餘的容器共享主機的內核。它運行在一個獨立的進程中,相對於其餘可執行的進程(好比虛擬機)來講,容器的內存佔用空間更小,更加的輕量化。
相比之下,虛擬機(VM)運行一個完整的「客戶」操做系統,經過虛擬機管理程序虛擬訪問主機資源。 通常來講,虛擬機提供的環境比大多數應用程序須要的資源更多。
因爲 Docker 輕量、資源佔用少,使得 Docker 能夠輕易的應用到構建標準化的應用中。但 Docker 目前還不夠完善,好比隔離效果不如 VM,共享宿主機操做系統的一些基礎庫等;網絡配置功能相對簡單,主要以橋接方式爲主;查看日誌也不夠方便靈活。
Docker 的主要用途,目前有三大類。
1. 提供一次性的環境。好比,本地測試他人的軟件、持續集成的時候提供單元測試和構建的環境。
2. 提供彈性的雲服務。由於 Docker 容器能夠隨開隨關,很適合動態擴容和縮容。
3. 組建微服務架構。經過多個容器,一臺機器能夠跑多個服務,所以在本機就能夠模擬出微服務架構。
下面這張圖很是的經典,很形象地展現了,什麼是容器,什麼是鏡像,什麼是倉庫,以及三者之間的聯繫。
接下來咱們來解釋一下這張圖。如今咱們要造一間廚房,在造以前咱們首先要乾的一件事,就是先列舉出咱們造廚房須要的東西。咱們可能須要一個通了水電煤的房子以及一些必需的廚房用具諸如鍋碗瓢勺、煤氣竈、冰箱、水槽等等這些東西。如今咱們知道須要了什麼東西以後,咱們就去找這些東西。首先咱們先去京東購買一些廚房用具,這些用具就比如咱們的Docker鏡像,咱們廚房的用具到了以後得找個地方把它們放在,不可能隨處丟吧,否則後面用的時候就找不到它了,那麼咱們Docker鏡像也是這樣,須要一個Docker倉庫去存儲這些鏡像。如今咱們有了這些廚房用具以後就能夠作飯了嗎?答案固然是不能,沒水沒電沒火啊!這時候咱們得把廚房用具給裝到一個通了水電煤的房子才行,那麼Docker鏡像也是這樣,單純的Docker鏡像是不能用的,它得裝到Docker容器中通了水電煤才能使用。等咱們裝好了廚房用具以後咱們就能夠開始作飯,那麼咱們的Docker鏡像裝到Docker容器以後,咱們應用就能夠跑起來了。
Docker是CS架構,主要有兩個概念:
瞭解了Docker的組成,再來了解一下Docker的三個主要概念:
鏡像就至關於打包好的版本,鏡像啓動以後運行在容器中,倉庫就是裝存儲鏡像的地方。
安裝過程都大同小異,這裏就不細說了,詳細的能夠參考這裏:https://www.runoob.com/docker/macos-docker-install.html
惟一須要注意的就是因爲國內網絡問題,須要給 Docker 鏡像加個速(詳細的能夠戳上面連接,最後有...)
首先,運行下面的命令,將 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]
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