Docker的常規應用手冊

一 、什么是 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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容