原文地址:https://docs.docker-cn.com/engine/docker-overview/#docker-enginehtml
Docker是一個開發,集裝,運行應用程序的開放平臺。Docker使您能夠將應用程序與基礎架構分離,以便快速交付軟件。使用Docker,您能夠像管理應用程序同樣管理基礎架構。經過利用Docker的方法快速集裝,測試和部署代碼,您能夠顯着減小編寫代碼和在生產中運行代碼之間的延遲。python
Docker提供了在稱爲容器的鬆散隔離環境中打包和運行應用程序的功能。隔離和安全性容許您在給定主機上同時運行多個容器。容器是輕量級的,由於它們不須要管理程序的額外負載,而是直接在主機內核中運行。這意味着您能夠在給定硬件組合上運行比使用虛擬機時更多的容器。您甚至能夠在實際虛擬機的主機中運行Docker容器!linux
Docker提供工具和平臺來管理容器的生命週期:git
Docker Engine是一個C-S應用程序,包含如下主要組件:github
server,是一種長時間運行的程序,稱爲守護程序進程( dockerd
命令)。golang
一個REST API,它指定程序能夠用來與守護進程通訊並指示它作什麼的接口。docker
命令行界面(CLI)客戶端(docker
命令)。json
CLI使用Docker REST API經過腳本或直接CLI命令控制Docker守護程序或與之交互。許多其餘Docker應用程序使用底層API和CLI。ubuntu
守護程序建立和管理Docker對象,例如鏡像,容器,網絡和卷。centos
Docker容許開發人員使用提供應用程序和服務的本地容器在標準化環境中工做,從而簡化了開發生命週期。容器很是適合持續集成和持續開發(CI / CD)工做流程。
請考慮如下示例場景。
Docker基於容器的平臺容許高度可移植的工做負載。Docker容器能夠在開發人員的本地筆記本電腦上,在數據中心的物理或虛擬機上,在雲提供商上,或在混合環境中運行。
Docker的可移植性和輕量級特性還能夠輕鬆地動態管理工做負載,按照業務需求即時擴展或拆除應用程序和服務。
Docker輕巧而快速。它爲基於管理程序的虛擬機提供了一種可行的,經濟高效的替代方案,所以您可使用更多的計算容量來實現業務目標。Docker很是適合高密度環境以及須要用更少資源完成更多工做的中小型部署。
Docker使用C-S架構。Docker 客戶端與Docker 守護進程通訊,後者負責構建,運行和分發Docker容器。Docker客戶端和守護程序能夠 在同一系統上運行,也能夠將Docker客戶端鏈接到遠程Docker守護程序。Docker客戶端和守護程序使用REST API,經過UNIX套接字或網絡接口進行通訊。
Docker守護程序(dockerd
)偵聽Docker API請求並管理Docker對象,如鏡像,容器,網絡和卷。守護程序還能夠與其餘守護程序通訊以管理Docker服務。
Docker client(docker
)是許多Docker用戶與Docker交互的主要方式。當您使用諸如此類的命令時docker run
,客戶端會將這些命令發送給它們dockerd
,而後執行這些命令。該docker
命令使用Docker API。Docker客戶端能夠與多個守護進程通訊。
Docker倉庫存儲Docker鏡像。Docker Hub和Docker Cloud是任何人均可以使用的公共倉庫,Docker配置爲默認在Docker Hub上查找鏡像。您甚至能夠運行本身的私有倉庫。若是您使用Docker Datacenter(DDC),它包括Docker Trusted Registry(DTR)。
使用docker pull
或docker run
命令時,將從配置的倉庫中提取所需的鏡像。使用該docker push
命令時,您的鏡像將被推送到配置的鏡像倉庫。
Docker商店容許您購買和出售Docker鏡像或免費分發。例如,您能夠從軟件供應商處購買包含應用程序或服務的Docker映像,並使用該映像將應用程序部署到測試,登錄和生產環境中。您能夠經過提取新版本的映像並從新部署容器來升級應用程序。
使用Docker時,您將建立和使用鏡像,容器,網絡,卷,插件和其餘對象。本節簡要介紹其中一些對象。
一個鏡像是一個帶有指令的只讀模板,它用於建立一個Docker容器。一般,鏡像基於另外一個鏡像(基礎鏡像),並帶有一些額外的自定義。例如,您能夠構建基於鏡像的ubuntu
鏡像,但安裝Apache Web服務器和應用程序,以及運行應用程序所需的配置詳細信息。
您能夠建立本身的鏡像,也能夠只使用其餘人建立的鏡像並在鏡像倉庫中發佈。要構建本身的鏡像,可使用簡單的語法建立Dockerfile,以定義建立鏡像和運行鏡像所需的步驟。Dockerfile中的每條指令都在鏡像中建立一個鏡像層。更改Dockerfile並重建鏡像時,僅重建已更改的那些層。與其餘虛擬化技術相比,這是使鏡像如此輕量,小巧和快速的部分緣由。
容器是鏡像的可運行實例。您可使用Docker API或CLI建立,運行,中止,移動或刪除容器。您能夠將容器鏈接到一個或多個網絡,將存儲鏈接到它,甚至能夠根據其當前狀態建立新鏡像。
默認狀況下,容器與其餘容器及其主機相對隔離。您能夠控制容器的網絡,存儲或其餘基礎子系統與其餘容器或主機的隔離程度。
容器由其鏡像以及您在建立或運行它時提供給它定義的任何配置選項。當容器中止時,沒有存儲在持久化存儲中的全部改變都會消失。
docker run
command如下命令運行ubuntu
容器,以交互方式附加到本地命令行會話,而後運行/bin/bash
。
$ docker run -i -t ubuntu /bin/bash
運行此命令時,會發生如下狀況(假設您使用的是默認倉庫配置):
若是您沒有ubuntu
本地鏡像,Docker會從您配置的倉庫中提取鏡像,就好像您已docker pull ubuntu
手動運行同樣。
Docker建立一個新容器,就像您docker create
手動運行命令同樣。
Docker將讀寫文件系統分配給容器,做爲其最後一層。這容許正在運行的容器在其本地文件系統中建立或修改文件和目錄。
Docker建立了一個網絡接口,用於將容器鏈接到默認網絡,由於您沒有指定任何網絡選項。這包括爲容器分配IP地址。默認狀況下,容器可使用主機的網絡鏈接鏈接到外部網絡。
Docker啓動容器並執行/bin/bash
。因爲容器以交互方式運行並鏈接到終端(因爲-i
和-t
)標誌,所以您可使用鍵盤提供輸入,並將輸出記錄到終端。
鍵入exit
以終止/bin/bash
命令時,容器會中止但不會被刪除。您能夠從新啓動它或將其刪除。
服務容許您跨多個Docker守護程序擴展容器,這些守護程序一塊兒做爲具備多個管理器和工做程序的羣組一塊兒工做。swarm的每一個成員都是Docker守護程序,而且守護進程都使用Docker API進行通訊。服務容許您定義所需的狀態,例如在任何給定時間必須可用的服務的副本數。默認狀況下,服務在全部工做節點之間進行負載平衡。對於消費者來講,Docker服務彷佛是一個單獨的應用程序。Docker Engine支持Docker 1.12及更高版本中的swarm模式。
Docker是用Go編寫的,它利用Linux內核的幾個功能來提供其功能。
Docker使用一種稱爲namespaces
提供隔離工做空間的技術來稱爲容器。當您運行容器時,Docker會爲該容器建立一組namespaces。
這些命名空間提供了一隔離層。容器的每一個方面都在一個單獨的命名空間中運行,其訪問權限僅限於該命名空間。
Docker Engine在Linux上使用如下命名空間:
pid
命名空間:進程隔離(PID:進程ID)。net
命名空間:管理網絡接口(NET:網絡)。ipc
命名空間:管理訪問IPC資源(IPC:進程間通訊)。mnt
命名空間:管理文件系統掛載點(MNT:Mount)。uts
命名空間:隔離內核和版本標識符。(UTS:Unix Timesharing System)。Linux上的Docker Engine還依賴於另外一種稱爲control groups(cgroups
)的技術。cgroup將應用程序限制爲特定的一組資源。control groups容許Docker Engine將可用的硬件資源共享給容器,並可選擇強制執行限制和約束。例如,您能夠限制特定容器的可用內存。
聯合文件系統或UnionFS是經過建立層來操做的文件系統,使它們很是輕量和快速。Docker Engine使用UnionFS爲容器提供構建塊。Docker Engine可使用多種UnionFS變體,包括AUFS,btrfs,vfs和DeviceMapper。
Docker Engine將namespaces,control groups和UnionFS組合到一個稱爲容器格式的包裝器中。默認的容器格式是libcontainer
。未來,Docker能夠經過與BSD Jails或Solaris Zones等技術集成來支持其餘容器格式。
docker支持架構
Docker 的安裝和使用有一些前提條件,主要體如今體系架構和內核的支持上。
對於體系架構,除了 Docker 一開始就支持的 X86-64 ,其餘體系架構的支持則一直在不斷地完善和推動中。
docker版本
Docker 分爲 CE 和 EE 兩大版本。CE 即社區版,免費支持週期 7 個月;EE 即企業版,強調安全,付費使用,支持週期 24 個月。
咱們在安裝前能夠參看官方文檔獲取最新的 Docker 支持狀況,官方文檔在這裏:https://docs.docker.com/install/。
docker內核支持檢測
Docker 對於內核支持的功能,即內核的配置選項也有必定的要求(好比必須開啓 Cgroup 和 Namespace 相關選項,以及其餘的網絡和存儲驅動等)。
Docker 源碼中提供了一個檢測腳原本檢測和指導內核的配置,腳本連接在這裏:https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh。
在知足前提條件後,安裝就變得很是的簡單了。
卸載老版本
因爲 Docker-CE 支持 64 位版本的 CentOS 7 ,而且要求內核版本不低於 3.10,首先咱們須要卸載掉舊版本的 Docker:
$ sudo yum remove docker docker-client docker-client-latest docker-common \
docker-latest docker-latest-logrotate \
docker-logrotate docker-selinux docker-engine-selinux docker-engine
安裝依賴包
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
安裝yum源
yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce
[root@localhost ~]# docker info
Containers: 2
Running: 2
Paused: 0
Stopped: 0
Images: 4
Server Version: 18.09.0
Storage Driver: overlay2
Backing Filesystem: extfs
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: c4446665cb9c30056f4998ed953e6d4ff22c7c39
runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-693.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 3.702GiB
Name: localhost.localdomain
ID: B6DC:4GR2:YPOR:YXZ4:XYAV:HGJD:MDGW:BFPP:ET4I:GWNL:6QGB:CCJG
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
Registry Mirrors:
http://f1361db2.m.daocloud.io/
Live Restore Enabled: false
Product License: Community Engine
配置鏡像加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
[root@VM_0_2_centos src]# systemctl start docker
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
查看錯誤日誌:
[root@VM_0_2_centos src]# journalctl -xe
-- Unit session-3268832.scope has finished starting up.
--
-- The start-up result is done.
Jul 06 07:48:01 VM_0_2_centos systemd[1]: Started Session 3268833 of user root.
-- Subject: Unit session-3268833.scope has finished start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit session-3268833.scope has finished starting up.
--
-- The start-up result is done.
Jul 06 07:48:01 VM_0_2_centos CROND[16180]: (root) CMD (/usr/local/gse/agent/bin/gsectl watch)
Jul 06 07:48:01 VM_0_2_centos CROND[16181]: (root) CMD (/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &)
Jul 06 07:48:01 VM_0_2_centos systemd[1]: start request repeated too quickly for docker.service
Jul 06 07:48:01 VM_0_2_centos systemd[1]: Failed to start Docker Application Container Engine.
-- Subject: Unit docker.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit docker.service has failed.
--
-- The result is failed.
Jul 06 07:48:01 VM_0_2_centos systemd[1]: Unit docker.socket entered failed state.
Jul 06 07:48:01 VM_0_2_centos systemd[1]: docker.service failed.
Jul 06 07:48:01 VM_0_2_centos postfix/pickup[11032]: 93B4D6C26C: uid=0 from=<root>
Jul 06 07:48:01 VM_0_2_centos postfix/cleanup[12516]: 93B4D6C26C: message-id=<20190705234801.93B4D6C26C@VM_0_2_centos.localdomain>
Jul 06 07:48:01 VM_0_2_centos postfix/qmgr[2094]: 93B4D6C26C: from=<root@VM_0_2_centos.localdomain>, size=810, nrcpt=1 (queue active
Jul 06 07:48:01 VM_0_2_centos postfix/local[12517]: 93B4D6C26C: to=<root@VM_0_2_centos.localdomain>, orig_to=<root>, relay=local, de
Jul 06 07:48:01 VM_0_2_centos postfix/cleanup[12516]: 958776C270: message-id=<20190705234801.958776C270@VM_0_2_centos.localdomain>
Jul 06 07:48:01 VM_0_2_centos postfix/bounce[10699]: 93B4D6C26C: sender non-delivery notification: 958776C270
Jul 06 07:48:01 VM_0_2_centos postfix/qmgr[2094]: 958776C270: from=<>, size=2801, nrcpt=1 (queue active)
Jul 06 07:48:01 VM_0_2_centos postfix/qmgr[2094]: 93B4D6C26C: removed
Jul 06 07:48:01 VM_0_2_centos postfix/local[12517]: 958776C270: to=<root@VM_0_2_centos.localdomain>, relay=local, delay=0, delays=0/
Jul 06 07:48:01 VM_0_2_centos postfix/qmgr[2094]: 958776C270: removed
Jul 06 07:48:02 VM_0_2_centos sshd[16160]: Invalid user felix from 51.38.57.78
Jul 06 07:48:02 VM_0_2_centos sshd[16160]: input_userauth_request: invalid user felix [preauth]
Jul 06 07:48:02 VM_0_2_centos sshd[16160]: pam_unix(sshd:auth): check pass; user unknown
Jul 06 07:48:02 VM_0_2_centos sshd[16160]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=5
Jul 06 07:48:03 VM_0_2_centos sshd[16160]: Failed password for invalid user felix from 51.38.57.78 port 45756 ssh2
Jul 06 07:48:04 VM_0_2_centos sshd[16160]: Received disconnect from 51.38.57.78: 11: Bye Bye [preauth]
You have mail in /var/spool/mail/root
錯誤緣由:xfsprogs 版本過低
解決方法:
yum update xfsprogs
再次啓動docker服務,成功。
root@VM_0_2_centos src]# systemctl start docker [root@VM_0_2_centos src]# ps xau|grep docker root 17203 3.8 0.2 1040056 60512 ? Ssl 07:52 0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock