docker概述

docker介紹與體系結構
docker是什麼
docker是一個開源的應用容器引擎,使用go語言開發,基於Linux內核的cgroup、namespace、Union FS等技術,對應用進程進行封裝隔離,而且獨立與宿主機與其餘進程,這種運行時封裝的狀態稱爲容器。
docker早期版本實現是基於LXC,並進一步對其封裝,包括文件系統、網絡互連、鏡像管理等方面,極大簡化了容器管理。從0.7版本之後開始去除LXC,轉爲自行研發的libcontainer,從1.11版本開始,進一步演進爲使用runC和containerd。
docker理念是將應用及依賴包打包到一個可移植的容器中,可發佈到任意linux發行版docker引擎上。使用沙箱機制運行程序,程序之間互相隔離。
docker體系結構
linux

containerd:一個簡單的守護進程,使用runC管理容器,向docker engine提供接口。
shim:只負責管理一個容器。
runC:一個輕量級的工具,只用來運行容器。
查看進程樹:pstree -p或ps axjf
[root@docker ~]# ps axjf
985 1182 1182 1182 ? -1 Ss 0 0:01 _ sshd: root@pts/0
1182 1366 1366 1366 pts/0 2029 Ss 0 0:00 _ -bash
1366 1830 1830 1366 pts/0 2029 T 0 0:00 _ ping www.baidu.com
1366 2029 2029 1366 pts/0 2029 R+ 0 0:00 _ ps axjf
內部組件
namespace
命名空間,linux內核提供的一種對進程資源隔離的機制,例如進程、網絡、掛載點等資源。
cgroup
控制組,linux內核提供的一種限制進程資源的機制,例如cpu、內存等資源。
[root@docker ~]# ll /sys/fs/cgroup/
total 0
drwxr-xr-x. 2 root root 0 Jun 7 01:04 blkio
lrwxrwxrwx. 1 root root 11 Jun 7 01:04 cpu -> cpu,cpuacct
lrwxrwxrwx. 1 root root 11 Jun 7 01:04 cpuacct -> cpu,cpuacct
drwxr-xr-x. 2 root root 0 Jun 7 01:04 cpu,cpuacct
drwxr-xr-x. 2 root root 0 Jun 7 01:04 cpuset
drwxr-xr-x. 4 root root 0 Jun 7 01:04 devices
drwxr-xr-x. 2 root root 0 Jun 7 01:04 freezer
drwxr-xr-x. 2 root root 0 Jun 7 01:04 hugetlb
drwxr-xr-x. 2 root root 0 Jun 7 01:04 memory
lrwxrwxrwx. 1 root root 16 Jun 7 01:04 net_cls -> net_cls,net_prio
drwxr-xr-x. 2 root root 0 Jun 7 01:04 net_cls,net_prio
lrwxrwxrwx. 1 root root 16 Jun 7 01:04 net_prio -> net_cls,net_prio
drwxr-xr-x. 2 root root 0 Jun 7 01:04 perf_event
drwxr-xr-x. 2 root root 0 Jun 7 01:04 pids
drwxr-xr-x. 4 root root 0 Jun 7 01:04 systemd
unionFS
聯合文件系統,支持將不一樣位置的目錄掛載到同一虛擬文件系統,造成一種分層的模型。
虛擬機與容器區別
nginx

以KVM與docker對比爲例:
啓動時間
docker秒級啓動,kvm分鐘級啓動。
輕量級
容器鏡像大小一般以M爲單位,虛擬機以G爲單位。
容器資源佔用小,比虛擬機 部署更快速。
性能
容器共享宿主機內核,系統級虛擬化,佔用資源少,沒有Hypervisor層開銷,容器性能基本接近物理機。
虛擬機須要Hypervisor層支持,虛擬化一些設備,具備完整的GuestOS,虛擬化開銷大,於是下降性能,沒有容器性能好。
安全性
因爲共享宿主機內核,只是進程級隔離,所以隔離性和穩定性不如虛擬機,容器具備必定權限訪問宿主機內核,存在必定安全隱患。
使用要求
KVM基於硬件的徹底虛擬化,須要硬件cpu虛擬化技術支持。
容器共享宿主機內核,可運行在主流的linux發行版,不用考慮cpu是否支持虛擬化技術。
docker應用場景
場景一:節省項目環境部署時間
一、單項目打包
每次部署項目到測試、生產等環境,都要部署一大堆依賴的軟件、工具,並且部署期間出現問題概率很大,不經意間就花費很長時間。
docker主要理念就是環境打包部署,可在任意docker engine運行。期間咱們只須要將每一個項目環境打包到鏡像,push到鏡像倉庫,當須要部署這個項目時,直接pull鏡像啓動容器,這個項目就能夠訪問了。一次構建屢次部署,一勞永逸。
二、整套項目打包
公司有一個產品能夠整套部署到客戶環境,以往都是派一名實施工程師到客戶現場部署。若是使用docker咱們能夠前期整套項目封裝打包,實現一鍵部署,分分鐘完成,就不須要再到客戶現場。例如官方的docker compose編排工具。
三、新開源技術試用
當咱們想調研一些開源項目,咱們能夠直接從公共鏡像倉庫pull項目官方作好的鏡像,啓動容器便可。
場景二:環境一致性
開發工程師在windows系統開發項目,測試、生產環境操做系統都是linux系統,這就產生了環境不一致的狀況,項目在開發本地運行沒有問題,到了測試或生產環境沒法運行,解決這個問題最好方式就是三處環境保持一致。軟件版本、操做系統、物理機、雲主機等不可能徹底保持一致。
docker將項目環境打包成鏡像,能夠在任何docker engine上運行,此時docker就是咱們項目的基石。
docker可移植性,保持運行狀態一致性。
場景三:持續集成
一個項目版本快速迭代的測試場景,須要一個合理的CI(持續集成)/CD(持續部署)環境支撐。CI/CD是一個週期性自動化項目測試環境,包括構建、部署、測試、發佈等工做,不多須要人工干預。項目測試流程以下:
docker

docker結合Jenkins構建持續集成環境以下:
json

docker在上面這個圖中的做用是促使項目鏡像構建和快速部署,打通測試環境與生產環境,高度保持多個環境之間一致性。
場景四:微服務
微服務是近幾年比較火的架構,簡單的來講就是儘量細粒度拆分業務程序架構,由多個獨立服務組成業務系統。
docker的容器設計原則,一個容器一個服務,容器之間互相隔離,一個服務獨立部署在一個容器中,恰到好處的實現了微服務。
場景五:彈性伸縮
彈性伸縮一般是集羣模式下存在。例如AWS AutoScaling,能夠自定義資源閾值,SLB自動添加EC2雲主機,應對業務訪問量突發狀況。
當採用docker技術之後,這種彈性伸縮的單元就是雲主機之上的容器。
容器集羣化管理已經有成熟的解決方案,例如官方的swarm,google的kubernetes(k8s)。
因爲docker容器快速啓動特性,能夠快速的啓動幾十個,甚至上百個容器來提供更多併發和資源利用(若是宿主機資源不夠,還須要加主機到集羣中)。
Linux安裝docker
docker官方文檔:https://docs.docker.com/
docker-ce centos版:https://docs.docker.com/install/linux/docker-ce/centos/
安裝依賴包
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
添加docker軟件包源
[root@docker ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
更新yum包索引
[root@docker ~]# yum makecache fast
安裝docker ce
[root@docker ~]# yum install -y docker-ce
啓動
[root@docker ~]# systemctl start docker
查看docker信息
[root@docker ~]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 18.09.6
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-862.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.697GiB
Name: docker
ID: 3EAH:DXYW:7DXA:76IW:AKHC:TKG5:FC5N:QPRB:SFAY:T6HB:LSCS:CUPK
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
下載nginx image
[root@docker ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
743f2d6c1f65: Pulling fs layer
d6c2f01b1dae: Pulling fs layer
d4da6ff1b555: Pulling fs layer
error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/62/62c261073ecffe22a28f2ba67760a9320bc4bfe8136a83ba9b579983346564be/data?verify=1559898802-6kJ3EPQFnUNrY1vlJ7ApCoUBZ%2Bg%3D: EOF
以上下載錯誤緣由是時區設置錯誤致使。
[root@docker ~]# date
Fri Jun 7 04:24:41 EDT 2019
修改linux時區
[root@docker ~]# \cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@docker ~]# date
Fri Jun 7 16:27:52 CST 2019
再次下載成功
[root@docker ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
743f2d6c1f65: Pull complete
d6c2f01b1dae: Pull complete
d4da6ff1b555: Pull complete
Digest: sha256:12db363acf5b2d2f9f5fed240e228a04692bdac68402430fbd2f720c3a967d01
Status: Downloaded newer image for nginx:latest
卸載
[root@docker ~]# yum remove docker-ce
[root@docker ~]# rm -fr /var/lib/dockerwindows

相關文章
相關標籤/搜索