Docker入門

寫在前面:

最近一年,自動化部署、分散式部署、集群等等概念非常的popular。今天,介紹一種可以實現自動化分散式集群的工具 - docker工具的入門。

一、簡介

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面 。

2013年容器服務提出,docker是基於Google推出的go語言實現的

Docker提出的目標是:通過對應用組件的封裝、分發、部署、運行等生命周期的管理,達到應用級別的一次封裝到處運行。

應用服務可以是:web應用、一套資料庫服務、甚至是一個操作系統編譯器等等。

1.1 相關概念的說明:

  • image name -- 鏡像的 名稱,可以通過 docker iamges 指令查看
  • iamge id -- 鏡像的 id,可以通過 docker images 指令查看
  • container name -- 容器的名稱,可以通過docker ps -a 指令查看
  • container id -- 容器的 id , 可以通過docker ps -a 指令查看

1.2 Docker容器的虛擬化優點:

環境隔離:可以運行 同一個應用 的不同版本

更快速的交付部署:保證運行環境的一致性

更高效的資源利用:docker容器中的應用能更快速的啟動

更易遷移擴展:docker容器中的應用應該是無狀態的應用

更簡單的更新管理:使用分層的機制進行更新管理,每次更新只需要更新對應的層級 即可


二、安裝docker:

Install Docker

2.1 查看docker 版本信息

docker version

Client:

Version: 17.06.2-ce

API version: 1.30

Go version: go1.8.3

Git commit: cec0b72

Built: Tue Sep 5 20:12:06 2017

OS/Arch: darwin/amd64

==================================================

Server:

Version: 17.06.2-ce

API version: 1.30 (minimum version 1.12)

Go version: go1.8.3

Git commit: cec0b72

Built: Tue Sep 5 19:59:19 2017

OS/Arch: linux/amd64

Experimental: true

docker是一個cs架構的程序,由 客戶端 負責 接收 服務端 的內容 進行展示


三、創建一個docker用戶組:(虛擬機中)

3.1 創建過程

1> 新建docker組

sudo groupadd docker

2> 將當前用戶添加到該用戶組

sudo usermod -aG docker liuding

3> 退出當前用戶,再次登陸

exit


四、docker中的核心概念

4.1 docker 鏡像

docker鏡像 是一個 只讀 的模版

docker鏡像 是分層管理的,有底層鏡像可以使用,基於底層鏡像修改之後出來的內容就是子鏡像(類似於git的commit)

docker鏡像 可以用來創建docker容器

4.2 docker 容器

docker 容器是由鏡像創建的實例,每一個容器都是相互隔離的(通過linux的cgroup 和 namespace)

當容器啟動時,創建一層 可寫層 作為最上層。

4.3 docker 倉庫

docker 倉庫是集中存放 鏡像文件 的場所,通過倉庫註冊伺服器進行註冊


五、創建一個可以分發的應用:

1> 創建模版文件

操作:在當前路徑下創建一個Dockerfile,用於存放 創建docker容器 相關的配置 和 說明

Dockerfile:# Usee an official Python runtime as a parent imageFROM python:2.7-slimCMD echo hello world

  • FROM -- 設定 運行的主環境

2> 利用模版文件創建鏡像

docker build -t="dockertest/friendlyhello"

  • -t -- 表示設定 路徑 與 產出目標

3> 上傳鏡像

註冊:

上傳鏡像前需要申請 docker hub 賬號,它用於管理docker鏡像文件,用於遠程創建和分發

命令行登陸:

docker login

上傳:

docker push [docker image name]

4> 下載鏡像

docker pull [origin docker image name]

5> 運行容器

docker run --name [container name] [docker image name]

6> 查看結果

六、docker 鏡像操作

6.1 獲取鏡像

docker pull [域名]/[namespace]/[repo]:[tag]

默認會選擇latest版本

如果在獲取鏡像的時候,沒有添加 域名 namespace等等內容,則默認從docker hub官方下載,例如:docker pull ubuntu

6.2 顯示鏡像列表

docker images

6.3 查看鏡像詳細信息

docker inspect [local docker image id]

查看鏡像詳細信息中的某個欄位的值

docker inspect -f {{.Os}} [local docker image id]

6.4 查找遠程倉庫中是否存在對應的鏡像

docker search [image]

例子:docker search nginx

6.5 為鏡像創建對應的tag

docker tag [image id] [image name]:[tag name]

例子:docker tag 345fg564feds ubuntu:test

6.6 刪除鏡像

docker rmi [image]:[tag]

例子:docker rmi ubuntu:test

注意:

如果有多個tag的情況下,此刪除操作 只 刪除對應的標籤,不會影響鏡像文件

直接刪除鏡像 docker rmi ubuntu:latest

當有鏡像創建的容器時,不能刪除對應的鏡像,需要先刪除容器再刪除鏡像

6.7 創建鏡像文件

6.7.1 基於已有鏡像的容器創建

docker commit -a [author name] -m [message] [container id] [new name]

例子:修改 ubuntu 容器,然後利用 這個容器 創建新的 鏡像

1> 從docker官網拉取ubuntu鏡像

docker pull ubuntu

2> 運行鏡像,創建docker容器,進入ubuntu的bash中

docker run -ti ubuntu bash

  • -ti -- 將ubuntu中的 標準輸出 ,綁定到當前的 bash 中,類似於ssh命令的效果,實現 終端 與 容器 的 交互模式
  • -t -- 讓docker分配一個偽終端並綁定到容器的標準輸入上
  • -i -- 讓容器的標準輸入保持打開

3> 在ubuntu鏡像中,新建一個文件test.txt,並在其中輸入"Hello World"

touch test.txtecho "Hello World" > test.txt

4> 退出鏡像

exit

5> 利用修改的容器創建鏡像:

docker commit -a [author name] -m [message] [container id] [new name]

例子:docker ps -a 查看container id

docker commit -a liuding -m "add a new image" 345fg564feds liuding/test

6> 查看鏡像列表

docker images

6.7.2 基於本地模版的導入

1> 遷出鏡像:

docker save -o [new name].tar [image id]

例子:docker save -o test.tar 345fg564feds

2> 載入鏡像:

docker load --input [image].tar 或者 docker load < [image].tar

例子:docker load input test.tar 或者 docker load < test.tar

3> 基於Dockerfile創建 (常用的創建方法)(見5)

4> 上傳鏡像:

docker push [域名]/[namespace]/[tag]

如果 不寫 域名 和 namespace 的話,默認上傳到 docker hub 官方


七、容器操作

Docker容器是非常輕量級別的

7.1 創建容器

docker create --name [new name] -ti [image name]

例子: docker create --name test_create -ti ubuntu

注意:

創建容器時,並 不 啟動,可以使用docker start 指令啟動它

docker run 等價於 先執行docker create 再執行 docker start命令

docker run 執行的過程:

  1. 檢查本地是否具有指定的鏡像,不存在則從公有倉庫下載
  2. 利用本地鏡像 創建 並 啟動 一個容器
  3. 分配一個文件系統,並在 只讀 的鏡像層外面掛載一層 讀寫層
  4. 從宿主機配置的網橋介面 橋接 一個虛擬介面 到容器中,通過ipconfig指令查看宿主機網卡信息,網卡信息中docker0項就是docker容器在啟動時,宿主機配置的網橋的虛擬介面
  5. 從地址池 配置 一個IP地址給容器,一般實現的方式是通過上一步驟中的虛擬介面,動態分配的虛擬ip地址,這個記錄寫在了/etc/hosts文件中
  6. 執行 用戶 指定的 應用程序
  7. 執行完畢後容器被終止

注意:

可以通過docker run -d 將容器放在後台執行,常見的有日誌的記錄程序等等

例子:docker run -d ubuntu /bin/sh -c "while true;do echo hello world ; sleep 1 ; done"

可以通過:

docker logs -f [docker NAMES] 查看輸出日誌

7.2 終止容器

docker stop [image id 或者 docker NAMES]

當容器中的應用程序終止時,容器會自動終止

7.3 進入容器

docker exec [options] [container id] [commond]

在 後台執行的 容器中,執行對應的命令

例如:

docker run -d --name test_ti ubuntu /bin/sh -c "while true;do echo hello world ; sleep 1 ; done"

docker exec -i -t test_ti bash

7.4 刪除容器

docker rm

刪除終止狀態下的容器:docker rm [container id] , 如果刪除正在運行的容器,則會報錯

強制刪除容器: docker rm -f [container id]

7.5 導出容器

docker export [container id]

例子:

docker run --name test_export -ti ubuntu bash

docker export test_export > export.tar

7.6 導入容器,生成鏡像

cat export.tar | docker import - liuding/test_export


八、倉庫操作

8.1 建立私有倉庫

8.2 倉庫加速服務

8.3 利用第三方管理平台管理私有倉庫

(下篇)


九、數據管理

9.1 數據卷:容器 和 宿主機共享 的目錄

9.1.1 數據卷是一個可供容器使用的特殊目錄 只會掛在到本地

  • 數據卷可以在容器之間共享和重用
  • 數據卷修改會立即生效
  • 數據卷的更新不會影響鏡像
  • 如果有容器使用數據卷,該卷會一直存在

docker run -d --name [container name] -it -v [local path]:[container path] [image name]

例如:docker run -d --name [container name] -it -v ${PWD}/webapp:/root/webapp ubuntu bash

  • -v -- 將當前路徑下的webapp路徑作為數據卷,掛在到本地,它對應的容器中的路徑是/root/webapp

9.1.2 默認掛載的數據卷的許可權為 rw(讀寫),如果要求 ro(只讀),則需要加上對應的ro參數:

docker run -d --name [container name] -it -v [local path]:[container path]:ro [image name]

例如:docker run -d --name app1 -it -v ${PWD}/webapp:/root/webapp:ro ubuntu bash

生產中的用途:(重點)

我們可以將實際生產中的mysql數據使用數據卷的方式 與 服務容器進行共享,當我們的服務容器 掛了的時候,可以保證數據不會丟失,只需要重新啟動容器,再將相應的mysql掛載回去即可。

9.2 數據卷容器:容器之間 共享的目錄

數據卷容器 用於用戶在容器間共享一些持續更新的數據,數據卷容器專門提供 數據卷 供 其他容器 掛載使用

1> 創建數據卷容器 db1

docker run -d --name db1 -v /dbdata -ti ubuntu bash

注意:

/dbdata 位於容器中

2> 創建容器db2,與db1共享dbdata數據

docker run -d --name db2 --volumes-from1 db1 -ti ubuntu bash

3> 在兩個容器中其一中修改dbdata數據,查看是否另一個容器是否同步

docker exec -ti db1 bashtouch /dbdata/file.txtexit

docker exec -ti db2 bashcd /dbdatals

查看是否存在

9.3 數據卷容器的刪除

如果刪除了一個掛載的容器,數據卷 並不會 在另一個容器中 被自動刪除

docker rm -f db1docker exec -ti db2 /dbdata

9.4 利用 數據卷 遷移 容器

利用數據卷容器 對 其中的數據卷 進行備份 、 恢復 ,以實現數據的遷移

9.4.1 備份:

docker run --volumes-from dbdata -v ${PWD}:/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata

利用 ubuntu 鏡像創建一個worker容器,使用--volumes-from dbdata參數讓worker容器掛載dbdata數據卷

使用${PWD}:backup參數來掛載本地目錄到worker容器的/backup目錄

worker啟動後,使用tar命令將/dbdata下的內容備份到容器內的/backup/backup.tar

9.4.2 執行備份:

docker run -d --name dbdata -v /dbdata -ti ubuntu bashdocker exec -ti dbdata bashtouch filea fileb filecexitdocker run --volumes-from dbdata -v ${PWD}:/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata

9.4.3 恢復:

創建一個帶有 數據卷 的容器 dbdata2

docker run -d --name dbdata2 -v /dbdata -ti ubuntu bash

然後創建另一個新的容器,掛載dbdata2的容器,並使用tar命令解壓備份文件到掛載的容器卷中

docker run --volumes-from dbdata2 -v ${PWD}:/backup ubuntu tar xvf /backup/backup.tar

參考鏈接:

Docker最佳實戰視頻教程-大講台-課程學習-百度傳課


推薦閱讀:

Docker的作用的主要作用是什麼?
docker在web開發中得使用流程是怎樣的?
Docker基本操作
數人云|淺論Prometheus容器監控優缺點,2.0版本哪項改進受關注?

TAG:Docker | 分散式系統 | Python |