docker入門簡介

簡介

docker(容器技術)是實現虛擬化技術的一種方案,經過利用linux中命名空間,控制組和聯合文件系統這個三個主要技術,來實現應用程序空間的隔離.經過對應用程序運行環境的封裝來生成鏡像並部署來實現跨平臺,必定程度上加快了服務交付的總體流程.這篇文章主要介紹docker的一些基本概念來對容器技術有個簡單的認識.python

docker與傳統的虛擬機方案的對比

different

  1. 傳統的虛擬機技術主要經過虛擬機監控器實現虛擬操做系統和宿主操做系統之間的交互.docker經過操做系統提供的能力實現了應用程序以前的隔離,減小了語言轉換的過程,所以在啓動速度和運行效率上更勝一籌.
  2. 容器技術更加偏向於程序的移植和依賴的打包而虛擬機技術則是側重於徹底的虛擬出一個另外一個虛擬環境.
  3. docker能提供更快的交付過程.經過合理的對宿主操做系統資源的劃分,能有效地提升系統的資源利用率.

核心技術介紹

namespace(隔離)

經過NameSpace技術能夠修改容器的視圖.linux

int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);
複製代碼

在linux中能夠經過系統調用clone來建立新的進程,當第三個參數flags指定CLONE_NEWNS就會在新的namespace下啓動新進程.
namespace
在上面的例子中系統自己有已經運行的不少進程,經過運行鏡像而且執行bin/sh進程能夠進入容器的交互界面.在容器中只能看到root進程和ps進程.這樣經過namespace技術就實現了不一樣進程間的隔離.nginx

Control Groups(限制)

namespace建立的進程與其餘進程以前對主機的資源是競爭關係的.Linux Control Group技術就是限制進程組可以使用資源上限的一種技術.經過對容器使用資源的上線進行設置能有效地使用主機的資源和防止資源的過渡佔用.redis

Union File System

聯合文件系統能夠同時掛載不一樣的實際文件或者目錄到同一目錄.Docker基於聯合文件系統提出AUFS(Advanced Union File System).AUFS經過將更新掛載到老的文件之上,來實現文件的保存修改.(空間的減小).docker

docker核心概念介紹

鏡像

鏡像是封裝了虛擬環境的運行內容的文件包,docker經過利用AUFS實現了增量的鏡像結構.flask

容器

容器是隔離的虛擬環境,裏面運行着docker鏡像.容器有如下的幾種狀態:bash

狀態 含義
Created 容器已經被建立資源已經就緒,應用程序未運行
Running 容器中的應用容器處於運行中
Paused 容器暫停
Stopped 容器中止
Deleted 容器被刪除,佔有的資源以及資源的的管理信息已經被刪除

數據卷

docker運行時的持久化目錄,經過將外部目錄掛載到容器中,來實現數據的持久化.app

docker engine

dockerEngine
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應用

編寫程序文件

建立一個目錄結構以下:
category
在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和構建環境的上下文來完成.經過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端口
複製代碼

run

調試tips

  • 當執行啓動鏡像的命令,能夠查看鏡像的狀態看鏡像是否啓動成功,對於沒有成功啓動的鏡像能夠經過docker logs查看啓動的日誌來排查緣由.

                                                       

                                                           歡迎你們關注個人公衆號,一塊兒學習

相關文章
相關標籤/搜索