docker(容器技術)是實現虛擬化技術的一種方案,經過利用linux中命名空間,控制組和聯合文件系統這個三個主要技術,來實現應用程序空間的隔離.經過對應用程序運行環境的封裝來生成鏡像並部署來實現跨平臺,必定程度上加快了服務交付的總體流程.這篇文章主要介紹docker的一些基本概念來對容器技術有個簡單的認識.python
經過NameSpace技術能夠修改容器的視圖.linux
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);
複製代碼
在linux中能夠經過系統調用clone來建立新的進程,當第三個參數flags指定CLONE_NEWNS就會在新的namespace下啓動新進程.
在上面的例子中系統自己有已經運行的不少進程,經過運行鏡像而且執行bin/sh進程能夠進入容器的交互界面.在容器中只能看到root進程和ps進程.這樣經過namespace技術就實現了不一樣進程間的隔離.nginx
namespace建立的進程與其餘進程以前對主機的資源是競爭關係的.Linux Control Group技術就是限制進程組可以使用資源上限的一種技術.經過對容器使用資源的上線進行設置能有效地使用主機的資源和防止資源的過渡佔用.redis
聯合文件系統能夠同時掛載不一樣的實際文件或者目錄到同一目錄.Docker基於聯合文件系統提出AUFS(Advanced Union File System).AUFS經過將更新掛載到老的文件之上,來實現文件的保存修改.(空間的減小).docker
鏡像是封裝了虛擬環境的運行內容的文件包,docker經過利用AUFS實現了增量的鏡像結構.flask
容器是隔離的虛擬環境,裏面運行着docker鏡像.容器有如下的幾種狀態:bash
狀態 | 含義 |
---|---|
Created | 容器已經被建立資源已經就緒,應用程序未運行 |
Running | 容器中的應用容器處於運行中 |
Paused | 容器暫停 |
Stopped | 容器中止 |
Deleted | 容器被刪除,佔有的資源以及資源的的管理信息已經被刪除 |
docker運行時的持久化目錄,經過將外部目錄掛載到容器中,來實現數據的持久化.app
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) // 刪除全部本地鏡像
複製代碼
建立一個目錄結構以下:
在index.py中編寫程序的主要功能以下:ui
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能夠將鏡像的構建過程持久化.
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端口
複製代碼
歡迎你們關注個人公衆號,一塊兒學習