一 、什么是 Docker
Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國期間發起的一個公司內部項目,它是基于 dotCloud 公司多年云服務技術的一次革新,并于 2013 年 3月以 Apache 2.0 授權協議開源),主要項目代碼在 GitHub 上進行維護。Docker 項目后來還加入了 Linux 基金會,并成立推動開放容器聯盟。其主要特點有:
源碼開源,免費
使用 Google公司推出的 Go 語言進行開發實現
基于 Linux 內核技術,對進程進行封裝隔離,屬于操作系統層面的虛擬化技術
由于隔離的進程獨立于宿主和其它的隔離的進程,因此也稱其為容器
比虛擬機技術更為輕便、快捷:傳統虛擬機技術是虛擬出一套硬件后,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行于宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更為輕便。
更高效的利用系統資源:由于容器不需要進行硬件虛擬以及運行完整操作系統等額外開銷,Docker 對系統資源的利用率更高。無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳統虛擬機技術更高效
更快速的啟動時間:由于直接運行于宿主內核,無需啟動完整的操作系統,因此可以做到秒級、甚至毫秒級的啟動時間
一致的運行環境:Docker 的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 “這段代碼在我機器上沒問題啊” 這類問題。
持續交付和部署:Docker 可以通過定制應用鏡像來實現持續集成、持續交付、部署。開發人員可以通過 Dockerfile 來進行鏡像構建,并結合 持續集成(Continuous Integration) 系統進行集成測試,而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合持續部署(Continuous Delivery/Deployment) 系統進行自動部署。
更輕松的遷移:Docker 可以在很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運行結果是一致的。因此用戶可以很輕易的將在一個平臺上運行的應用,遷移到另一個平臺上
更輕松的維護和擴展:Docker 使用的分層存儲以及鏡像的技術,使得應用重復部分的復用更為容易,也使得應用的維護更新更加簡單,基于基礎鏡像進一步擴展鏡像也變得非常簡單。此外,Docker 團隊同各個開源項目團隊一起維護了一大批高質量的官方鏡像,既可以直接在生產環境使用,又可以作為基礎進一步定制,大大的降低了應用服務的鏡像制作成本。
二、基本概念
Docker 包括三個基本概念
鏡像(Image):相當于是一個含操作系統的完整的 root 文件系統。除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數,鏡像系統設計為分層存儲的架構,由多層文件系統聯合組成,鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。
容器(Container):鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行于屬于自己的獨立的 命名空間,每一個容器運行時,是以鏡像為基礎層,在其上創建一個當前容器的存儲層,當容器消亡時,容器存儲層也隨之消亡。因此,任何保存于容器存儲層的信息都會隨容器刪除而丟失。因此,所有的文件寫入操作,都應該使用 數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。數據卷的生存周期獨立于容器,容器消亡,數據卷不會消亡。
倉庫(Repository):一個集中的存儲、分發鏡像的服務,Docker Registry就是這樣的服務。一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標簽(Tag);每個標簽對應一個鏡像。一個倉庫包含的是同一個軟件的不同版本的鏡像,而標簽則用于對應于軟件的的不同版本。我們可以通過 <倉庫名>:<標簽> 的格式來指定具體是哪個版本的鏡像。如果不給出標簽,將以 latest 作為默認標簽。例如:ubuntu:14.04 、 ubuntu:16.04來具體指定所需哪個版本的鏡像,而ubuntu ,那將視為ubuntu:latest。
三、CentOS中的安裝
使用yum源安裝
yum –y install docker
使用官方安裝腳本安裝
curl -sSL?https://get.docker.com/?| sh
使用阿里云的安裝腳本安裝
curl -sSL?http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
版本查詢
docker -v
三、啟動 Docker 引擎
systemctl enable docker
systemctl start docker
四、Docker compose項目
使用docker就不得不提Docker Compose,它是 Docker 官方編排(Orchestration)項目之一,負責快速在集群中部署分布式應用。它允許用戶通過一個單獨的 docker-compose.
yml 模板文件(YAML 格式)來定義一組相關聯的應用容器為一個項目(project)。就是說,你可以通過docker-compose.yml 模板文件來定義一個服務器集群,服務器集群中的每個服務器就是一個容器,可以配置多個容器之間的網絡連接、端口,容器服務器名稱、服務器中運行的鏡像、服務器的環境配置、啟動命令等。使用的鏡像,可以手動拉取鏡像,也可以自動以docker-compose.yml 構建環境后自動拉取。
Compose 中有兩個重要的概念:
服務(service):一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例。
項目(project):由一組關聯的應用容器組成的一個完整業務單元,在 dockercompose.yml 文件中定義。
五、Docker compose安裝與卸載
Compose 目前支持 Linux 和 Mac OS 平臺,兩者的安裝過程大同小異。安裝 Compose 之前,要先安裝 Docker(需要 Docker Engine 1.7.1+),Compose 可以通過 Python 的 pip 工具進行安裝,可以直接下載編譯好的二進制文件使用,甚至直接運行在 Docker 容器中。
1)首先安裝epel擴展源:
sudo yum -y install epel-release
2)然后安裝python-pip
sudo yum -y install python-pip
pip install docker-compose
3)版本查詢
docker-compose –v
4)卸載
pip uninstall docker-compose
六、Docker 命令查詢
Docker 命令有兩大類,客戶端命令和服務端命令。前者是主要的操作接口,后者用來啟動 Docker daemon。
客戶端命令:基本命令格式為?docker [OPTIONS] COMMAND [arg...] ;
服務端命令:基本命令格式為?docker daemon [OPTIONS] 。
可以通過 man docker 或 docker help 來查看這些命令。
1)服務端命令:docker daemon [OPTIONS] ,[OPTIONS] 的選項有:
--api-cors-header="":CORS 頭部域,默認不允許 CORS,要允許任意的跨域訪問,可以指定為 “*”;?
--authorization-plugin="":載入認證的插件;
-b="":將容器掛載到一個已存在的網橋上。指定為 'none' 時則禁用容器的網絡,與 --bip 選項互斥;
--bip="":讓動態創建的 docker0 網橋采用給定的 CIDR 地址; 與 -b 選項互斥;
--cgroup-parent="":指定 cgroup 的父組,默認 fs cgroup 驅動為/docker ,systemd cgroup 驅動為 system.slice ;
--cluster-store="":構成集群(如 Swarm)時,集群鍵值數據庫服務地址;
--cluster-advertise="":構成集群時,自身的被訪問地址,可以為host:port 或 interface:port ;
--cluster-store-opt="":構成集群時,鍵值數據庫的配置選項;
--config-file="/etc/docker/daemon.json":daemon 配置文件路徑;
--containerd="":containerd 文件的路徑;
-D, --debug=true|false:是否使用 Debug 模式。缺省為 false;
--default-gateway="":容器的 IPv4 網關地址,必須在網橋的子網段內;
--default-gateway-v6="":容器的 IPv6 網關地址;
--default-ulimit=[]:默認的 ulimit 值;
--disable-legacy-registry=true|false:是否允許訪問舊版本的鏡像倉庫服務器;
--dns="":指定容器使用的 DNS 服務器地址;
--dns-opt="":DNS 選項;
--dns-search=[]:DNS 搜索域;
--exec-opt=[]:運行時的執行選項;
--exec-root="":容器執行狀態文件的根路徑,默認為 /var/run/docker ;
--fixed-cidr="":限定分配 IPv4 地址范圍;
--fixed-cidr-v6="":限定分配 IPv6 地址范圍;
-G, --group="":分配給 unix 套接字的組,默認為 docker ;
-g, --graph="":Docker 運行時的根路徑,默認為 /var/lib/docker ;
-H, --host=[]:指定命令對應 Docker daemon 的監聽接口,可以為 unix 套接字(unix:///path/to/socket),文件句柄(fd://socketfd)或 tcp 套接字(tcp://[host[:port]]),默認為 unix:///var/run/docker.sock;
--icc=true|false:是否啟用容器間以及跟 daemon 所在主機的通信。默認為true。
--insecure-registry=[]:允許訪問給定的非安全倉庫服務;
--ip="":綁定容器端口時候的默認 IP 地址。缺省為 0.0.0.0;
--ip-forward=true|false:是否檢查啟動在 Docker 主機上的啟用 IP 轉發服務,默認開啟。注意關閉該選項將不對系統轉發能力進行任何檢查修改;
--ip-masq=true|false:是否進行地址偽裝,用于容器訪問外部網絡,默認開啟;
--iptables=true|false:是否允許 Docker 添加 iptables 規則。缺省為 true;
--ipv6=true|false:是否啟用 IPv6 支持,默認關閉;
-l, --log-level="debug|info|warn|error|fatal":指定日志輸出級別;?
--label="[]":添加指定的鍵值對標注;
--log-driver="jsonfile|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none":指定日志后端驅動,默認為 json-file;
--log-opt=[]:日志后端的選項;
--mtu=VALUE:指定容器網絡的 mtu;
-p="":指定 daemon 的 PID 文件路徑。缺省為 /var/run/docker.pid ;
--raw-logs:輸出原始,未加色彩的日志信息;
--registry-mirror=://:指定 docker pull 時使用的注冊服務器鏡像地址;
-s, --storage-driver="":指定使用給定的存儲后端;
--selinux-enabled=true|false:是否啟用 SELinux 支持。缺省值為 false。SELinux 目前尚不支持 overlay 存儲驅動;
--storage-opt=[]:驅動后端選項;
--tls=true|false:是否對 Docker daemon 啟用 TLS 安全機制,默認為否;
--tlscacert= /.docker/ca.pem:TLS CA 簽名的可信證書文件路徑;
--tlscert= /.docker/cert.pem:TLS 可信證書文件路徑;
--tlscert= /.docker/key.pem:TLS 密鑰文件路徑;
--tlsverify=true|false:啟用 TLS 校驗,默認為否;
--userland-proxy=true|false:是否使用用戶態代理來實現容器間和出容器的回環通信,默認為 true;
--userns-remap=default|uid:gid|user:group|user|uid:指定容器的用戶命名空間,默認是創建新的 UID 和 GID 映射到容器內進程。
2)客戶端命令:docker [OPTIONS] COMMAND [arg...] ;[OPTIONS] 的選項有:
--config="":指定客戶端配置文件,默認為 /.docker ;?
-D=true|false:是否使用 debug 模式。默認不開啟;
-H, --host=[]:指定命令對應 Docker daemon 的監聽接口,可以為 unix 套接字(unix:///path/to/socket),文件句柄(fd://socketfd)或 tcp 套接字(tcp://[host[:port]]),默認為 unix:///var/run/docker.sock;
-l, --log-level="debug|info|warn|error|fatal":指定日志輸出級別;
--tls=true|false:是否對 Docker daemon 啟用 TLS 安全機制,默認為否;
--tlscacert= /.docker/ca.pem:TLS CA 簽名的可信證書文件路徑;
--tlscert= /.docker/cert.pem:TLS 可信證書文件路徑;
--tlscert= /.docker/key.pem:TLS 密鑰文件路徑;
--tlsverify=true|false:啟用 TLS 校驗,默認為否。
3)客戶端命令:docker [OPTIONS] COMMAND [arg...] ;COMMAND的選項有:
可以使用:docker?? COMMAND? --help 來查看每個命令的具體用法
attach:依附到一個正在運行的容器中;?
build:從一個 Dockerfile 創建一個鏡像;
commit:從一個容器的修改中創建一個新的鏡像;
cp:在容器和本地宿主系統之間復制文件中;
create:創建一個新容器,但并不運行它;
diff:檢查一個容器內文件系統的修改,包括修改和增加;
events:從服務端獲取實時的事件;
exec:在運行的容器內執行命令;?
export:導出容器內容為一個 tar 包;
history:顯示一個鏡像的歷史信息;
images:列出存在的鏡像;
import:導入一個文件(典型為 tar 包)路徑或目錄來創建一個本地鏡像;
info:顯示一些相關的系統信息;
inspect:顯示一個容器的具體配置信息;
kill:關閉一個運行中的容器 (包括進程和所有相關資源);
load:從一個 tar 包中加載一個鏡像;
login:注冊或登錄到一個 Docker 的倉庫服務器;
logout:從 Docker 的倉庫服務器登出;
logs:獲取容器的 log 信息;
network:管理 Docker 的網絡,包括查看、創建、刪除、掛載、卸載等;
node:管理 swarm 集群中的節點,包括查看、更新、刪除、提升/取消管理節點等;
pause:暫停一個容器中的所有進程;
port:查找一個 nat 到一個私有網口的公共口;
ps:列出主機上的容器;
pull:從一個Docker的倉庫服務器下拉一個鏡像或倉庫;
push:將一個鏡像或者倉庫推送到一個 Docker 的注冊服務器;
rename:重命名一個容器;
restart:重啟一個運行中的容器;
rm:刪除給定的若干個容器;
rmi:刪除給定的若干個鏡像;
run:創建一個新容器,并在其中運行給定命令;
save:保存一個鏡像為 tar 包文件;
search:在 Docker index 中搜索一個鏡像;
service:管理 Docker 所啟動的應用服務,包括創建、更新、刪除等;
start:啟動一個容器;
stats:輸出(一個或多個)容器的資源使用統計信息;
stop:終止一個運行中的容器;
swarm:管理 Docker swarm 集群,包括創建、加入、退出、更新等;
tag:為一個鏡像打標簽;
top:查看一個容器中的正在運行的進程信息;
unpause:將一個容器內所有的進程從暫停狀態中恢復;
update:更新指定的若干容器的配置信息;
version:輸出 Docker 的版本信息;?
volume:管理 Docker volume,包括查看、創建、刪除等;
wait:阻塞直到一個容器終止,然后輸出它的退出符。
4)Docker 刪除命令實例
a)刪除一個容器
docker rm
b)強制刪除一個容器
docker rm -f
c)強制刪除全部容器
docker rm -f $(docker ps -aq)
d)刪除一個鏡像:
docker rmi
e)強制刪除一個鏡像:
docker rmi -f
f)強制刪除全部鏡像
docker rmi -f $(docker images -q)
5)一張圖總結 Docker 的命令
container事件狀態圖?
Docker 命令分布圖:
七、Docker Compose命令查詢
對于 Compose 來說,大部分命令的對象既可以是項目本身,也可以指定為項目中的服務或者容器。如果沒有特別的說明,命令對象將是項目,這意味著項目中所有的服務都會受到命令影響。執行 docker-compose [COMMAND] --help 或者 docker-compose help [COMMAND] 可以查看具體某個命令的使用格式。
Compose 命令的基本的使用格式是:
docker-compose [-f=...] [options] [COMMAND] [ARGS...]
[options]?選項:
-f, --file FILE 指定使用的 Compose 模板文件,默認為 dockercompose.yml ,可以多次指定。?
-p, --project-name NAME 指定項目名稱,默認將使用所在目錄名稱作為項目名。
--x-networking 使用 Docker 的可拔插網絡后端特性(需要 Docker 1.9 及以后版本)。
--x-network-driver DRIVER 指定網絡后端的驅動,默認為 bridge (需要 Docker 1.9 及以后版本)。
--verbose 輸出更多調試信息。
-v, --version 打印版本并退出。
[COMMAND] 選項:
1)build:格式為 docker-compose build [options] [SERVICE...]
構建(重新構建)項目中的服務容器。服務容器一旦構建后,將會帶上一個標記名,例如對于 web 項目中的一個 db 容器,可能是 web_db。可以隨時在項目目錄下運行 docker-compose build 來重新構建服務。
它的[options] 選項包括:
--force-rm 刪除構建過程中的臨時容器。?
--no-cache 構建鏡像過程中不使用 cache(這將加長構建過程)。
--pull 始終嘗試通過 pull 來獲取更新版本的鏡像。
2)kill:格式為 docker-compose kill [options] [SERVICE...]
通過發送 SIGKILL 信號來強制停止服務容器。支持通過 -s 參數來指定發送的信號,例如通過如下指令發送 SIGINT 信號:docker-compose kill -s SIGINT
3)logs:格式為 docker-compose logs [options] [SERVICE...]
查看服務容器的輸出。默認情況下,docker-compose 將對不同的服務輸出使用不同的顏色來區分。可以通過 --no-color 來關閉顏色。該命令在調試問題的時候十分有用。
4)pause:格式為 docker-compose pause [SERVICE...]?
暫停一個服務容器。
5)port:格式為 docker-compose port [options] SERVICE PRIVATE_PORT?
打印某個容器端口所映射的公共端口。
[options] 選項:
--protocol=proto 指定端口協議,tcp(默認值)或者 udp。
--index=index 如果同一服務存在多個容器,指定命令對象容器的序號(默認為 1)。
6)ps:格式為 docker-compose ps [options] [SERVICE...]?
列出項目中目前的所有容器。
選項:?
-q 只打印容器的 ID 信息。
7)pull:格式為 docker-compose pull [options] [SERVICE...]?
拉取服務依賴的鏡像。
選項:
--ignore-pull-failures 忽略拉取鏡像過程中的錯誤。
8)restart:格式為 docker-compose restart [options] [SERVICE...]?
重啟項目中的服務。
選項:
-t, --timeout TIMEOUT 指定重啟前停止容器的超時(默認為 10 秒)。
9)rm:格式為 docker-compose rm [options] [SERVICE...]
刪除所有(停止狀態的)服務容器。推薦先執行 docker-compose stop 命令來停止容器。?
選項:
-f, --force 強制直接刪除,包括非停止狀態的容器。一般盡量不要使用該選項。
-v 刪除容器所掛載的數據卷。
10)run:格式為 docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]?
在指定服務上執行一個命令。
例如:
$ docker-compose run ubuntu ping docker.com
將會啟動一個 ubuntu 服務容器,并執行 ping docker.com 命令。
默認情況下,如果存在關聯,則所有關聯的服務將會自動被啟動,除非這些服務已經在運行中。?
該命令類似啟動容器后運行指定的命令,相關卷、鏈接等等都將會按照配置自動創建。
兩個不同點:
給定命令將會覆蓋原有的自動運行命令;
不會自動創建端口,以避免沖突。
如果不希望自動啟動關聯的容器,可以使用 --no-deps 選項,例如
$ docker-compose run --no-deps web python manage.py shell?
將不會啟動 web 容器所關聯的其它容器。
[options] 選項:
-d 后臺運行容器。?
--name NAME 為容器指定一個名字。
--entrypoint CMD 覆蓋默認的容器啟動指令。
-e KEY=VAL 設置環境變量值,可多次使用選項來設置多個環境變量。
-u, --user="" 指定運行容器的用戶名或者 uid。
--no-deps 不自動啟動關聯的服務容器。
--rm 運行命令后自動刪除容器, d 模式下將忽略。
-p, --publish=[] 映射容器端口到本地主機。
--service-ports 配置服務端口并映射到本地主機。
-T 不分配偽 tty,意味著依賴 tty 的指令將無法運行。
11)scale:格式為 docker-compose scale [options] [SERVICE=NUM...]?
設置指定服務運行的容器個數。通過 service=num 的參數來設置數量。例如:
$ docker-compose scale web=3 db=2
將啟動 3 個容器運行 web 服務,2 個容器運行 db 服務。一般的,當指定數目多于該服務當前實際運行容器,將新創建并啟動容器;反之,停止容器。
選項:
-t, --timeout TIMEOUT 停止容器時候的超時(默認為 10 秒)。
12)start:格式為 docker-compose start [SERVICE...]?
啟動已經存在的服務容器。
13)stop:格式為 docker-compose stop [options] [SERVICE...]
停止已經處于運行狀態的容器,但不刪除它。通過 docker-compose start 可以再次啟動這些容器。?
選項:
-t, --timeout TIMEOUT 停止容器時候的超時(默認為 10 秒)。
14)unpause:格式為 docker-compose unpause [SERVICE...] 。
恢復處于暫停狀態中的服務。
15)up:格式為 docker-compose up [options] [SERVICE...] 。
該命令十分強大,它將嘗試自動完成包括構建鏡像,(重新)創建服務,啟動服務,并關聯服務相關容器的一系列操作。
鏈接的服務都將會被自動啟動,除非已經處于運行狀態。可以說,大部分時候都可以直接通過該命令來啟動一個項目。
默認情況, docker-compose up 啟動的容器都在前臺,控制臺將會同時打印所有容器的輸出信息,可以很方便進行調試。當通過 Ctrl-C 停止命令時,所有容器將會停止。
如果使用 docker-compose up -d ,將會在后臺啟動并運行所有的容器。一般推薦生產環境下使用該選項。
默認情況,如果服務容器已經存在, docker-compose up 將會嘗試停止容器,然后重新創建(保持使用 volumes-from 掛載的卷),以保證新啟動的服務匹配docker-compose.yml 文件的最新內容。如果用戶不希望容器被停止并重新創建,可以使用 docker-compose up --no-recreate 。這樣將只會啟動處于停止狀態的容器,而忽略已經運行的服務。如果用戶只想重新部署某個服務,可以使用docker-compose up --no-deps -d 來重新創建服務并后臺停止舊服務,啟動新服務,并不會影響到其所依賴的服務。
[options] 選項:?
-d 在后臺運行服務容器。
--no-color 不使用顏色來區分不同的服務的控制臺輸出。?
--no-deps 不啟動服務所鏈接的容器。
--force-recreate 強制重新創建容器,不能與 --no-recreate 同時使用。
--no-recreate 如果容器已經存在了,則不重新創建,不能與 --forcerecreate同時使用。
--no-build 不自動構建缺失的服務鏡像。
-t, --timeout TIMEOUT 停止容器時候的超時(默認為 10 秒)。
16)migrate-to-labels:格式為 docker-compose migrate-to-labels 。
重新創建容器,并添加 label。
主要用于升級 1.2 及更早版本中創建的容器,添加缺失的容器標簽。實際上,最徹底的辦法當然是刪除項目,然后重新創建。
17)version:格式為 docker-compose version 。
打印版本信息。
原文鏈接:http://blog.51cto.com/newthink/1898398
更詳細的了解參考:https://doc.yonyoucloud.com/doc/docker_practice/index.html