Docker架構
1、什么是docker
? 是一個平臺,是構建、測試、部署和發布容器化應用的平臺。Docker 是一個開 源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的 容器中,然后發布到任何流行的linux機器或Windows 機器上,也可以實現虛擬 化,容器是完全使用沙箱機制,相互之間不會有任何接口
2、基本概念
鏡像(Image):Docker 鏡像(Image),就相當于是一個 root 文件系統。Docker 鏡像是用于創建 Docker 容器的模板
容器(Container):容器是獨立運行的一個或一組應用,是鏡像運行時的實體
倉庫(Repository):倉庫可看著一個代碼控制中心,用來保存鏡像。
docker客戶端:Docker 客戶端通過命令行或者其他工具使用 Docker SDK 與 Docker 的守護進程通信
docker namespace:docker通過命名空間實現資源容器與容器,與宿主機間的隔離。
-
網絡:docker 提供四種不同的網絡模式,Host、Container、None 和 Bridge
-
默認網絡設置Bridge.在這種模式下,除了分配隔離的網絡命名空間之外,Docker 還會為所有的容器設置 IP 地址。當 Docker 服務器在主機上啟動之后會創建新的虛擬網橋 docker0,隨后在該主機上啟動的全部服務在默認情況下都與該網橋相連。在默認情況下,每一個容器在創建時都會創建一對虛擬網卡,兩個虛擬網卡組成了數據的通道,其中一個會放在創建的容器中,會加入到名為 docker0 網橋中。查看brctl show
image.png
-
- 掛載點
3、docker工作原理
docker使軟件開發者無需擔心配置和依賴性,在任何地方打包,發送和運行他們的應用程序。
- image.png
Cgroups(Control Groups): 實現資源限制
工作原理簡單來說就是它的架構形式,client -- dockerhost -- docker daemon - registry
4、docker架構
- Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器
- Docker采用 C/S架構 Docker daemon 作為服務端接受來自客戶的請求,并處理這些請求(創建、運行、分發容器)。 客戶端和服務端既可以運行在一個機器上,也可通過 socket 或者RESTful API 來進行通信
- docker daemon 一般在宿主主機后臺運行,等待接收來自客戶端的消息。 Docker 客戶端則為用戶提供一系列可執行命令,用戶用這些命令實現跟 Docker daemon 交互。
- image.png
docker與VMware對比
- image.png
-
VM(VMware)在宿主機器、宿主機器操作系統的基礎上創建虛擬層、虛擬化的操作系統、虛擬化的倉庫,然后再安裝應用;
Container(Docker容器),在宿主機器、宿主機器操作系統上創建Docker引擎,在引擎的基礎上再安裝應用。
Docker在宿主機器的操作系統上創建Docker引擎,直接在宿主主機的操作系統上調用硬件資源,而不是虛擬化操作系統和硬件資源
docker常用命令
命令 | 描述 | 語法 | 常用選項 |
---|---|---|---|
docker run | 創建一個新的容器并運行一個命令 | docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
-d: 后臺運行容器,并返回容器ID; -i: 以交互模式運行容器,通常與 -t 同時使用,-t: 為容器重新分配一個偽輸入終端; -P:隨機端口映射,容器內部端口隨機映射到主機的高端口 -p: 指定端口映射,格式為:主機(宿主)端口:容器端口 --name="nginx-lb": 為容器指定一個名稱; 更多選項參考:https://www.runoob.com/docker/docker-run-command.html |
docker start /stop /restart |
啟動/停止/重啟一個容器 | docker start/ stop/restart [OPTIONS] CONTAINER [CONTAINER...] |
|
docker kill | 殺掉一個運行中的容器 | docker kill [OPTIONS] CONTAINER [CONTAINER...] | -s :向容器發送一個信號 |
docker rm | 刪除一個或多個容器 | docker rm [OPTIONS] CONTAINER [CONTAINER...] |
-f :通過 SIGKILL 信號強制刪除一個運行中的容器。 -v :刪除與容器關聯的卷 |
docker pause/uppause | 暫停或恢復容器中所有的進程 | ||
docker create | 創建一個新的容器但不啟動它 | docker create [OPTIONS] IMAGE [COMMAND] [ARG...] | 用法同docker run |
docker exec | 在運行的容器中執行命令 | docker exec [OPTIONS] CONTAINER COMMAND [ARG...] |
-i :即使沒有附加也保持STDIN 打開 -t :分配一個偽終端 eg :docker exec -i -t mynginx /bin/bash |
docker ps | 列出容器 | docker ps [OPTIONS] |
-a :顯示所有的容器,包括未運行的。 -q :靜默模式,只顯示容器編號。 -n :列出最近創建的n個容器。 -l :顯示最近創建的容器。 |
docker inspect | 獲取容器/鏡像的元數據。 | docker inspect [OPTIONS] NAME|ID [NAME|ID...] | |
docker top | 查看容器中運行的進程信息,支持 ps 命令參數 | docker top [OPTIONS] CONTAINER [ps OPTIONS] | |
docker attach | 連接到正在運行中的容器 | docker attach [OPTIONS] CONTAINER | |
docker events | 從服務器獲取實時事件 | docker events [OPTIONS] | |
docekr logs | 獲取容器的日志 | docker logs [OPTIONS] CONTAINER |
-f : 跟蹤日志輸出 --since :顯示某個開始時間的所有日志 -t : 顯示時間戳 --tail :僅列出最新N條容器日志 eg: docker logs --since="2016-07-01" --tail=10 mynginx |
docker export | 將文件系統作為一個tar歸檔文件導出到STDOUT | docker export [OPTIONS] CONTAINER | -o :將輸入內容寫到文件 |
docker port | 列出指定的容器的端口映射,或者查找將PRIVATE_PORT NAT到面向公眾的端口 | docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]] | |
docker commit | 從容器創建一個新的鏡像 | docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] | |
docker cp | 用于容器與主機之間的數據拷貝 | docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH |
-L :保持源目標中的鏈接 |
docker diff | 檢查容器里文件結構的更改 | ||
docker login/logout | 登陸到一個Docker鏡像倉庫 | ||
docker pull/push/search | |||
docker images | 列出本地鏡像 | docker images [OPTIONS] [REPOSITORY[:TAG]] |
-a :列出本地所有的鏡像 -f :顯示滿足條件的鏡像 -q :只顯示鏡像ID。 |
docker rmi | 刪除本地一個或多少鏡像 | docker rmi [OPTIONS] IMAGE [IMAGE...] | -f :強制刪除; |
docker tag | 標記本地鏡像,將其歸入某一倉庫 | ocker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] | |
docker build | 命令用于使用 Dockerfile 創建鏡像 | docker build [OPTIONS] PATH | URL | - |
-f :指定要使用的Dockerfile路徑 --tag, -t: 鏡像的名字及標簽 其他限制選項參考:https://www.runoob.com/docker/docker-build-command.html |
docker history | 查看指定鏡像的創建歷史 | ||
docker save | 將指定鏡像保存成 tar 歸檔文件 | ||
docker load | 導入使用docker save 命令導出的鏡像 | docker load [OPTIONS] | -i : 指定導入的文件 |
docker import | 從歸檔文件中創建鏡像 | docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] |
-c :應用docker 指令創建鏡像; -m :提交時的說明文字; |
docker info | 顯示 Docker 系統信息,包括鏡像和容器數 | ||
docker version | 顯示 Docker 版本信息 |
Dockerfile
1、什么是dockerfile
- Dockerfile是一個包含用于組合映像的命令的文本文檔??梢允褂迷诿钚兄姓{用任何命令。 Docker通過讀取
Dockerfile
中的指令自動生成映像。 - Dockerfile 一般分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令,’#’ 為 Dockerfile 中的注釋。
2、Dockerfile 常用語法
語法 | 描述 |
---|---|
FROM <IMAGE> | 鏡像制作的基鏡像,必須為第一個命令 |
MAINTAINER | 維護者信息 |
RUN <SHELL COMMAND> | 用于在鏡像容器中執行命令 |
ADD <src> <dest> | 將本地文件添加到容器中,tar類型文件會自動壓,可訪問網絡文件,不能用于多階段構建中 |
COPY <src> <dest> | 將本地文件添加到容器中,但不會自動解壓文件,也不能訪問網絡文件,能用于多階段構建中mutli-stage |
CMD ["","",...] | 容器運行時運行的命令 |
ENV<key>=<value> ... | 給容器設置環境變量 |
EXPOSE <PORT> | 指定于外界交互的端口 |
VOLUME <Directory> | 用于指定持久化目錄 |
user <USER>:<GROUP> | 指定運行容器時的用戶,組 |
docker-compos
1、docker-compos是什么
docker compose 是 docker 提供的一個命令行工具,用來定義和運行由多個容器組成的應用,我們可以通過 YAML 文件聲明式的定義應用程序的各個服務,并由單個命令完成應用的創建和啟動。
#linux安裝docker-compos
* curl -L https://github.com/docker/compose/releases/download/1.20.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
* chmod +x /usr/local/bin/docker-compose
2、docker-compose與k8s, swarm容器編排工具
swarm
swarm 是Docker公司自行研發的一款用來管理多主機上的Docker容器的工具,可以負責啟動容器,監控容器狀態,也 提供服務之間的負載均衡。
特點: 更快速的運行速度 快速簡單的配置 容器間低耦合 版本控制與組件重用
缺點: 跨平臺支持效果差 不提供存儲選項 監控信息不足
#kubernetes
kubernetes Google 開元容器編排引擎,支持自動化部署,大規模可伸縮,應用容器化管理,能做到零停機的情況下進行更新。
優點:運行速度快 遵循不可變基礎架構的原則(利于回滾) 提供聲明式配置 大規模部署和更新軟件 處理應用程序的可用性 提供存儲卷管理
缺點: 進程初始化時間較長 遷移到無狀態需要很多工作
#docker-compose
基于Docker的單主機容器編排工具。
3、docker-compose語法
(1)語法格式: yaml 文件
? 使用compose 3個步驟
- 使用Dockerfile 定義應用程序環境,以便在任何地方重現該環境
- 在docker-compose.yml文件中定義組成應用程序的服務,以便各個服務在一個隔離環境中一起運行
- 運行docker-compose up命令,啟動運行整個應用程序。
(2)docker-compose.yml結構:services、networks、volumes
-
services主要用來定義各個容器
version: '3' services: #services模塊 euraka: #指明服務名稱 build: . #指明Dockerfile所在路徑 ports: #指明映射的端口 - "8761:8761"
services模塊下其他命令,與build同級
- command:覆蓋容器啟動后默認執行的命令(Dockerfile定義的CMD)。
- dns
- dns_search
- environment:環境變量設置,可使用屬組或字典兩種方式。定義的變量會覆蓋.env文件中定義的重名環境變量
- entrypoint:可以覆蓋Dockerfile中定義的entrypoint命令
- env_file:從文件中獲取環境變量,可指定一個文件或多個文件路徑列表。
- expose:暴露端口,只將端口暴露給連接的服務器。而不是暴露給宿主機
- external_links:連接到docker-compose.yml外部的容器
- iamges:指定運行容器使用的鏡像
- links:連接到其他服務的容器 SERVICES:ALIAS
-
networks定義需要使用到的network ,與services平級
- 默認情況下,compose為應用創建一個網絡,服務的每個容器都會加入該網絡中。這樣,容器就可被該網絡中的其他容器訪問,該容器還能以服務名稱作為hostname被其他容器訪問。
- networks模塊自定義網絡
- 詳細可參考《spring cloud 與docker》一書 p286-p289
-
volumes定義services使用到的volume,與services平級
volumes:卷掛載路徑設置(HOST:CONTAINER 或HOST:CONTAINER:ro)
docker 與微服務 --待學習整理
1、什么叫微服務
...