docker 基礎
docker 是為了統一環境、配置、依賴問題而誕生的方案。
歷史背景
為了統一環境、配置、依賴問題,曾經出現過虛擬機器方案,但虛擬機器方案有以下問題:
- 資源佔用多
- 操作步驟複雜
- 需要完整地執行一個作業系統
- 啟動慢
在虛擬機器方案上再做升級之後,出現這樣 linux 容器的概念,一種虛擬化技術,對程序進行隔離。
docker就是 linux 容器的封裝,提供操作 linux 容器的介面,還將容器狀態以版本(映象)的方式管理。
認識 docker
docker 是服務端/客戶端架構,通常服務端是一個服務程序,與客戶端執行在同一主機上,可使用如下命令檢視 docker 服務程序是否執行:
docker version
這個命令當然也可以檢視版本,docker 的版本資訊,如果無法檢視版本,則說明服務程序沒有執行。
docker 用途
- 一次性環境
- 彈性雲服務
- 微服務架構
映象與容器
映象(image)是指只讀層的重疊,就像程式碼版本一樣,可以被複制、分享,它是「環境的版本」,將應用程式和依賴打包在一起;
容器例項(container)是指一堆層的統一視角,與映象的區別在於最上面的「可讀寫層」,可對容器進行更改寫入,生成新的映象,而一個映象,也可以生成一個新的執行時容器。
另外,映象和容器本質上都是檔案,如果關閉容器,只是停止容器執行,檔案仍然存在,仍然佔據空間。
映象市場
hub.docker.com
docker 專門設立的映象市場,可以直接從映象市場上得到你想要的映象。
但是官方映象市場是外國伺服器,中國訪問非常緩慢,國內也有映象市場,是對官方映象市場的拷貝。
常用命令
-
docker search name
從市場搜尋映象 -
docker pull library/image
下載映象,如果是 docker 的官方映象,則可省略 library -
docker run image [command]
根據 image 執行一個容器例項, command 指執行該容器例項後,在容器內執行的命令
此命令有如下注意點:- 如果本地沒有該 image ,會自動從映象市場下載;
- 該命令執行結束後,會自動停止該容器,但對容器做的改動,不會丟失;
- 有些需要執行服務的容器,不會自動停止,比如ubuntu、nginx、apache等
- 如果在 docker run 後面加上 –it ,則可將當前 cli 視窗對映到容器的 cli 視窗,可實現與容器互動,如 docker run –it ubuntu bash
-
docker ps
獲得容器列表 -
docker commit id name
根據當前容器生成一個映象, id 為 container id -
docker inspect name
檢視容器資訊 -
docker push library/name
釋出映象到市場 -
docker image ls
列出映象列表 -
docker image rm name
刪除映象 -
docker kill containerID
終止執行中的容器 -
docker container ls
列出所有容器,同docker ps -
docker container ls –all
列出停止的容器 -
docekr container rm containerID
刪除容器檔案 -
docker container start ID
啟動已停止的容器 -
docker container stop ID
停止容器,與 kill 比起來,會先收尾,再關閉,而 kill 則直接關閉 -
docker container logs ID
檢視該容器的命令列輸出,如 run 時沒加 –it -
docker container exec –it ID bash
進入容器 shell -
docker container cp ID:/path/file
將容器內的檔案拷貝到本機 -
docker run –d
「–d」指容器啟動成功後,在後臺執行
建立 image
新建 .dockerignore
此檔案排除不需要打包進 image 的路徑及檔案,類似於 .gitignore 。
.git vendor
新建 Dockerfile
FROM node:8.4// 代表此映象繼承於官方的 node 8.4 映象 COPY . /app// 將當前 . 目錄的內容拷貝進容器的 /app 目錄,除 .dockerignore 指定的以外 WORKDIR /app// 指定接下來的工作目錄在 /app 下 RUN npm install// 在 /app 下執行 npm install 命令,安裝好的依賴也會被打包進映象中 EXPOSE 3000// 開放 3000 埠允許外部連線 CMD node demo/1.js// 在該此映象被生成容器執行後,自動執行此命令
Dockerfile 是一個文字檔案,用於配置 image ,docker 根據此檔案生成 image 檔案
生成映象
docker image build -t name:version
version 不指定時預設為 latest
執行容器
docker container run –p 8000:3000 –it bash
以該 image 生成容器例項並執行,並將本機的 8000 埠對映到容器的 3000 埠
CMD 與 RUN 的區別:
- RUN 可以有多個, CMD 只能有一個
- RUN 的執行結果會被打包進 image ,也就是在打包之前執行;CMD 則在 image 建立成功,且被生成容器執行後,才會在容器中執行
- 有 CMD 之後,docker run 的時候就不能加入 –it 和 bash了,否則會CMD 不會再執行
釋出 image 到市場
在 hub.docker.com 註冊賬號後,執行以下命令:
docker login docker image tag imagename username/library:version docker image push library/name:version
docker 編排工具
docker compose 是多個 docker 容器組成一個應用的關聯工具,docker-compose.yml 中寫好多個容器之間的聯絡