零、應用背景
先看下面2個問題:
1. 單機多系統。如:windows上跑linux、VPS服務、PaSS服務。
windows上跑linux,一般用VM技術實現。
VPS提供商需要將一臺機器劃分成多個虛擬機,提供給用戶,例如將一臺8核16G的物理機器劃分成8個1核2G(實際上會比這個少)給8個用戶使用,目的是實現用戶應用隔離。
PaSS服務提供商同VPS。
問題關鍵:模擬操作系統、用戶應用分隔。
2. 應用發佈。
爲了減少bug出現,要儘量使開發環境和生產環境一樣。
比如開發環境採用的是centos6.5 + nginx1.10.2 + php 5.6 + mysql 5.5,那麼生產環境就要採取一樣的軟件環境。如果開發環境做了修改,生產環境最好做一樣的修改(主要指安裝插件,系統軟件版本升級)。
問題關鍵:環境同步
一、Docker和VM
VM可以很好的解決模擬操作系統、用戶應用分隔這兩個問題。
Docker可以比VM更好的解決這兩個問題 並且 解決環境同步問題。
相比VM,Docker是輕量級的,快速的。
二、Docker的鏡像和容器
Docker如何實現VM的功能?使用靜態鏡像 + 一個動態讀寫層
從docker的使用方法來看,例如我們想在docker中運行nginx服務。
我們兩個思路:
1. 先pull一個centos鏡像,再在該鏡像上裝一個nginx。
2. 直接pull裝好nginx的鏡像
鏡像是容器的運行環境
如果我們採取思路1,pull下一個centos鏡像
# docker pull centos
docker的鏡像由name:tag組成,上面的命令等價於下載最新的centos
# docker pull centos:latest
如果想下載centos6.8,則可以運行
# docker pull centos:6.8
使用run命令運行一個鏡像:
# docker run -it centos /bin/bash
該命令會用centos這個鏡像去創建一個容器,相當於在VM裏面用鏡像創建了一個虛擬機,通過docker ps -a可以看到所有容器。
細心的朋友會發現系統提示符變了,這是因爲-it參數,使得容器內部的shell輸入輸出和當前主機掛鉤了,叫做attach。在容器內部的所有操作只在容器內有效,不會影響宿主主機,也不會影響鏡像,因爲所有的操作都會作用在讀寫層上。
如果下次要使用怎麼辦?可以用docker ps -a找到這個容器的id,使用docker start CONTAINER_ID 運行這個容器,當然上次安裝的nginx還在。
如果把這個容器當做開發環境,部署的時候可以採取非常簡單的方法,將這個容器發佈成鏡像即可,在生產環境中導入這個鏡像,即可實現環境同步。
docker commit命令可以將容器發佈成鏡像,可以理解爲 讀寫層的文件和鏡像的文件合併成一個新的鏡像。