簡介
docker(容器技術)是實現虛擬化技術的一種方案,通過利用linux中命名空間,控制組和聯合文件系統這個三個主要技術,來實現應用程序空間的隔離.通過對應用程序運行環境的封裝來生成鏡像并部署來實現跨平臺,一定程度上加快了服務交付的整體流程.這篇文章主要介紹docker的一些基本概念來對容器技術有個簡單的認識.
docker與傳統的虛擬機方案的對比
- 傳統的虛擬機技術主要通過虛擬機監控器實現虛擬操作系統和宿主操作系統之間的交互.docker通過操作系統提供的能力實現了應用程序之前的隔離,減少了語言轉換的過程,因此在啟動速度和運行效率上更勝一籌.
- 容器技術更加偏向于程序的移植和依賴的打包而虛擬機技術則是側重于完全的虛擬出一個另一個虛擬環境.
- docker能提供更快的交付過程.通過合理的對宿主操作系統資源的劃分,能有效地提高系統的資源利用率.
核心技術介紹
namespace(隔離)
通過NameSpace技術可以修改容器的視圖.
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);
復制代碼
在linux中可以通過系統調用clone來創建新的進程,當第三個參數flags指定CLONE_NEWNS就會在新的namespace下啟動新進程.
在上面的例子中系統本身有已經運行的很多進程,通過運行鏡像并且執行bin/sh進程可以進入容器的交互界面.在容器中只能看到root進程和ps進程.這樣通過namespace技術就實現了不同進程間的隔離.
Control Groups(限制)
namespace創建的進程與其他進程之前對主機的資源是競爭關系的.Linux Control Group技術就是限制進程組能夠使用資源上限的一種技術.通過對容器使用資源的上線進行設置能有效地使用主機的資源和防止資源的過渡占用.
Union File System
聯合文件系統可以同時掛載不同的實際文件或者目錄到同一目錄.Docker基于聯合文件系統提出AUFS(Advanced Union File System).AUFS通過將更新掛載到老的文件之上,來實現文件的保存修改.(空間的減少).
docker核心概念介紹
鏡像
鏡像是封裝了虛擬環境的運行內容的文件包,docker通過利用AUFS實現了增量的鏡像結構.
容器
容器是隔離的虛擬環境,里面運行著docker鏡像.容器有以下的幾種狀態:
狀態 | 含義 |
---|---|
Created | 容器已經被創建資源已經就緒,應用程序未運行 |
Running | 容器中的應用容器處于運行中 |
Paused | 容器暫停 |
Stopped | 容器停止 |
Deleted | 容器被刪除,占有的資源以及資源的的管理信息已經被刪除 |
數據卷
docker運行時的持久化目錄,通過將外部目錄掛載到容器中,來實現數據的持久化.
docker engine
docker engine是負責啟動鏡像的服務,通過docker client提供的指令調用docker server提供的接口來實現對鏡像和容器的操作.
使用鏡像
啟動指令
docker run --name nginx -p 80:80 -d nginx // --name 執行容器名 -p 宿主端口:容器端口 將宿主端口映射到容器的端口 -d 后臺的方式啟動 docker run --name myredis redis
docekr run --name test --link myredis:redis debian // --link Container:Alias 目標容器的名稱:目標容器的別名 建立容器之間的鏈接
復制代碼
操作容器指令
docker ps -a // 查看所有的容器
docker images // 查看所有本地鏡像
docker stop name/ID // 停止某個容器
docker rm name/ID // 刪除某個容器
docker rm $(docker ps -aq) // 刪除所有容器
docker rmi $(docker images -q) // 刪除所有本地鏡像
復制代碼
使用docker創建一個hello world應用
編寫程序文件
創建一個目錄結構如下:
在index.py中編寫程序的主要功能如下:
from flask import Flask
app = Flask(__name__)@app.route('/')
def hello_world():return 'Hello world\n'if __name__ == '__main__':app.run(debug=True,host="0.0.0.0") // 創建一個服務 在/路徑下返回Hello world
復制代碼
編寫Dockerfile
鏡像的構建可以通過Dockerfile和構建環境的上下文來完成.通過Dockerfile可以將鏡像的構建過程持久化.
From python:3.4 // 從某一個基礎鏡像開始 From語句必須是Dockerfile的第一條語句
Run pip install Flask==0.10.1 // 執行指定的指令 由于每次執行的執行都會行成新的鏡像層,可以將多個指令進行合并
WORKDIR /app // 執行Dockerfile指令執行的工作目錄
COPY app /app // src dest 這個指令將上下文的app目錄復制到容器的app目錄
CMD python index.py // 容器啟動時執行的指令
復制代碼
構建鏡像和啟動容器
docker build -t hello . //在當前目錄的上下文上構建鏡像
docker run --name haha -p 5000:5000 helloworld // 以haha容器名字啟動helloword鏡像 并且將容器的5000端口映射到外部的5000端口
復制代碼
調試tips
- 當執行啟動鏡像的命令,可以查看鏡像的狀態看鏡像是否啟動成功,對于沒有成功啟動的鏡像可以通過docker logs查看啟動的日志來排查原因.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?歡迎大家關注我的公眾號,一起學習