Docker容器技術基礎用法(二)
目錄
二、docker architecture---docker的架構圖
五、描述了docker的容器的狀態轉換和相關各種常用命令的圖解:
一、前言:
在上一篇文章我們介紹了docker容器技術,LXC他們之間的關係及由來。
那我們知道要想使用linux容器,至少在linux核心級中要支援兩種技術:1.namespaces(我們稱為名稱空間)2.Cgroups(control groups)。
接著我們可以藉助於在使用者空間組織一些工具,利用核心級所提供的這些技術,從而實現容器執行之目的,而後docker在容器執行使用簡化的道路上又進一步,他們提供了映象,而且是分層構建的映象的方式,使得容器技術的使用更加被簡化。
後來呢,在docker主導下,又有了OCI(Open Container Initiative,由Linux基金會主導於2015年6月創立。旨在圍繞容器格式和執行時指定一個開放的工業標準,由兩部分組成1. the Runtime Specification:執行時標準 2.the image Specification:映象格式標準),runC(OCF:Open Container Format叫開放的容器格式。而runC是OCF的重要實現之一)容器引擎,這樣的格式或者說是標準。而runC就是docker新版本中使用的容器引擎。
而docker專門提供了一個容納容器映象的站點我們成為dockerhub(地址為hub.docker.com),在這個網站中可以找到大多數的容器映象。
二、docker architecture---docker的架構圖
docker由這麼幾部分組成:Client端,server端(我們稱為DOCKER_HOST)和registries(預設的位置為docker Hub)
所以我們可以認為docker是C/S架構的應用程式,事實上無論是C端還是S端,都由docker一個程式提供,這個程式有很多子程式,其中有一個子程式或者叫子命令叫daemon,他就表示執行為守護程序。所以當我們執行docker daemon就把這臺主機變成守護程序伺服器,他可以監聽在我們的套接字之上。這種套接字為了安全起見,他預設只提供本機的unix socket檔案的套接字。
docker_host是真正執行容器的主機,其特徵為 有Containers(容器)和Images(映象)兩部分。他們兩個是docker主機上非常重要的組成部分。
映象來自於Registry(登錄檔,但是此處我們可以稱為叫docker的映象倉庫,預設就是Docker Hub),docker在建立容器時,Docker會先檢查本地是否有映象,預設映象是本地沒有的,如果沒有會到docker hub上去下載指定的映象到本地(因為映象是分層構建的),並且下載下來的映象在容器使用結束後不會刪除,映象是可以共享的,尤其是基礎映象是可以共享給多個上述映象使用的,映象是不可修改的是隻讀的,只能重構。
所以啟動容器的時候就是基於映象啟動,在映象的基礎之上為一個容器建立一個專用的可寫倉,從而來啟動一個容器。所以映象也需要在docker主機的本地儲存。
那麼到底我們會在這個主機上執行那些容器事先無法評估。因此就有Registry專門的倉庫來放映象,注意docker Hub上所放的映象估計有幾十萬個之多。所以不可能把沒有映象都放在本地。因此這也就是為什麼放在公共儲存位置,你用到那個就下載那個的原因。但是我們只要是用,就必須先把映象載入到本地。這裡載入所用到的協議是http或https。預設必須使用https,因為安全。同樣的Client和docker_host之間也使用這兩個協議,因為docker的api也是一個標準的restful風格的api,當然這裡我們基於本地的socket檔案通訊沒必要考慮那麼複雜,但是我們也要知道他的應用層協議也是http的就可以了。
所以我們要使用docker就需要把docker的應用程式包下載下來安裝即可。但是docker的執行過程當中,尤其是建立容器的時可能有一點慢,原因在於是第一次要去下載映象。這個下載映象的速度取決於你的網際網路連線速度。更何況docker的伺服器還在國外。所以為了實現加速訪問,docker在國內做了一個docker映象伺服器,成為docker CN,但是他的映象加速效果不太好。當然我們也可以使用阿里雲所提供的加速。中國科技大學也有docker的映象。不過dockerCN的加速是公開的任何人都可以直接使用。而使用阿里雲的docker加速需要每一個人自己的私有賬號
關於倉庫的解釋:
docker的映象是分層構建的。
Docker Registry擁有兩個功能,
第一:提供映象儲存的倉庫。
第二:提供使用者來獲取映象時的認證等功能同時還提供了當前伺服器上所有可用映象的搜尋索引。
在一個Docker Registry上倉庫會有很多,一個docker映象倉庫 有倉庫的名稱,一個倉庫叫做一個repository(簡稱repo),而一個倉庫通常只用來放一個應用程式的映象。假如我們的nginx做了一個映象,對於nginx來講有自己的應用版本(例如nginx1.0和niginx1.2)所以映象也會有應用到不同應用程式上的版本映象,所以為了能夠使得映象和應用程式版本之間有意義上的關聯關係:那麼在docker上通常一個倉庫只放一個應用程式的映象,倉庫名就是應用程式名nginx,裡面放很多niginx的版本,為了標記每一個映象,通常給每一個映象額外新增一個元件叫標籤tag,來標識每一個映象。那麼我們就叫nginx1.10版本的映象為 nginx:1.10 ,這個就是映象名,那麼用倉庫名加標籤 才能用來唯一標識一個映象,所以這個nginx是倉庫名不是映象名,映象名的唯一標識是 標籤。如果有人訪問的時候只給了倉庫名沒給標籤,那麼我們應該給他預設的。預設通常是最新的版本,一個映象是可以有多個標籤的,例如叫niginx:1.15同時我們也給他取一個映象名叫ngixn:latest就是最新版,隨後等1.16出來以後,最新版就是不是1.15的引用了,我們要引用到1.16上,所以這個lastest會經常改的,通常指向這個倉庫的最新版本,但是也有可能指向的是這個倉庫的最新的穩定版本。在nginx的次版本號為奇數是開發版,因此我們要使用最新的穩定版通常應該是1.14的。所以其標記應該為nginx:1.14和nginx:stable,而穩定版通常指向最新的穩定版。就類似於這種格式。所以在docker Hub上倉庫就有非常多了。同時在Hub裡面我們還有基礎層的系統,比如就是一個獨立的作業系統。Centos裡面的bashshell。
映象:靜態的
容器:動態的,有生命週期
注意任何一個restful風格的資源物件是支援增刪改查的操作。因為映象和容器都支援增刪改查。
networks:網路,也是一個獨立的物件,單獨執行增刪改查操作。
volumes:儲存卷,卷就是為了能夠給容器提供持久儲存的儲存空間。通常在外部的網路儲存裝置之上。可以單獨的增刪改查
plugins:外掛。增刪改查
那麼這些我們統統成為 物件
三、配置阿里雲docker映象加速
開啟這個網站https://dev.aliyun.com/search.html
四、安裝及使用docker
本文介紹的是在centos7.4下安裝docker,如您需要在windows下安裝docker請點選下面的按鈕,跳轉到我的另一篇文章
4.1、依賴及基礎環境:
1、64 bits CPU
2、Linux Kernel 3.10+
3、 Linux Kernel cgroups and namespaces
4.2、centos 7安裝方式
1、extras repository;
預設centos7的yum倉庫extras就有docker,版本比較老,下載新版本的docker的yum倉庫
[[email protected] ~]# cd /etc/yum.repos.d/
[[email protected] yum.repos.d]# wget
[[email protected] yum.repos.d]# sed -i 's# docker-ce.repo
[[email protected] yum.repos.d]# yum update
[[email protected] yum.repos.d]# yum install docker-ce
2、docker-ce的配置檔案;需要手動建立
[[email protected] yum.repos.d]# mkdir /etc/docker/
[[email protected] docker]# echo -e '{\n\t"registry-mirrors": ["https://registry.docker-cn.com"]\n}' >/etc/docker/daemon.json
[[email protected] docker]# systemctl start docker.service #啟動docker
[[email protected] docker]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 18.06.1-ce
Storage Driver: overlay2 # docker要實現分層構建,聯合掛載。必須使用這種檔案系統來支援。在centos7.4以前用的是device mapper,這種是lvm的實現,在docker上效能極差,還不穩定,已經廢棄。
......
......
......
在能看到上面的一系列資訊,說明docker已經安裝成功並可以使用了
4.3 docker的使用及命令細節剖析
4.3.1 docker如何啟動及檢視資訊
啟動docker服務:
[[email protected] yum.repos.d]# systemctl start docker.service
檢視docker資訊:
[[email protected] yum.repos.d]# docker version
檢視docker更詳細的資訊:
[[email protected] yum.repos.d]# docker info
關於上圖引數的解釋:
Containers:容器有多少個
Running:其中處於執行狀態的多少個
Paused:其中處於暫停狀態的多少個
Stopped:其中處於停止狀態的多少個
Images:有多少個映象
Server Version:伺服器版本
Storage Driver:儲存驅動後端,docker映象是分層構建,聯合掛載,這兩個的要求必須使用特殊的檔案系統或者叫儲存格式(儲存驅動)才能實現。AUFS和overlay2。centos7.4之前的版本有可能用的是Device mapper(就是LVM的實現,效能極差而且不穩定)。
Backing Filesystem:
Plugins:指的是外掛有那幾個
Volume:儲存外掛
Network:網路外掛
Log:日誌外掛
Security Options:安全選項
Kernel Version:核心版本
如果你使用了方式2安裝還能看到下圖所示的資訊:
4.3.2docker內部常用操作:
注意上圖的格式是最原始的格式,命令不帶分組的格式。
根據我們的關鍵詞nginx搜尋映象
[[email protected] yum.repos.d]# docker search nginx
下載映象到本地
[[email protected] yum.repos.d]# docker pull xxx下載到本地,命令也可以用分組的方式 docker image pull xxx 是一樣的效果
列出本地所有可用映象
[[email protected] yum.repos.d]# docker images列出本地所有可用映象,命令也可以用分組的方式 docker image ls 是一樣的效果
如果為如下圖所示:
PEPOSITORY:倉庫名稱
TAG:標籤
IMAGE ID:映象自己的唯一標識
CREATED:大概是什麼時候建立的
SIZE:體積
還可以使用[[email protected] ~]# docker image ls --no-trunc來顯示完整的資訊
預設情況下只會顯示前12位。
我們在顯示映象的時候也可以過濾:比如我們只顯示某個映象,只顯示某個倉庫的映象
還可以使用docker image ls --format string 使用Go模板進行過濾
3、docker 倉庫格式
[[email protected] docker]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 10034 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con?? 1440 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of?? 633 [OK]
jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p?? 428 [OK]
kong Open-source Microservice & API Management la?? 237 [OK]
webdevops/php-nginx Nginx with PHP-FPM 117 [OK]
kitematic/hello-world-nginx A light-weight nginx container that demonstr?? 112
zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi?? 74 [OK]
bitnami/nginx Bitnami nginx Docker Image 58 [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 48 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS?? 42
tobi312/rpi-nginx NGINX on Raspberry Pi / armhf 23 [OK]
blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 12 [OK]
wodby/drupal-nginx Nginx for Drupal container image 11 [OK]
centos/nginx-18-centos7 Platform for running nginx 1.8 or building n?? 8
webdevops/nginx Nginx container 8 [OK]
nginxdemos/hello NGINX webserver that serves a simple page co?? 8 [OK]
centos/nginx-112-centos7 Platform for running nginx 1.12 or building ?? 5
1science/nginx Nginx Docker images that include Consul Temp?? 4 [OK]
travix/nginx NGinx reverse proxy 2 [OK]
mailu/nginx Mailu nginx frontend 2 [OK]
pebbletech/nginx-proxy nginx-proxy sets up a container running ngin?? 2 [OK]
toccoag/openshift-nginx Nginx reverse proxy for Nice running on same?? 1 [OK]
ansibleplaybookbundle/nginx-apb An APB to deploy NGINX 0 [OK]
wodby/nginx Generic nginx 0 [OK]
上面列表中,沒有/分隔開的倉庫是頂級倉庫,一般是docker hub官方的。帶/分隔開的是個人使用者建立的映象
可以用下圖所示的Tags來看每個版本的大小
alpine:是專門用來構建非常小的映象檔案的一個微型發行版。他能夠給你的程式執行提供基礎環境但體積非常小,但是可能會有一些問題,可能缺少我們將來除錯的工具。所以相當不建議在生產環境中使用alpine版本。儘量自己做映象,裡面帶除錯工具的。然後上傳到docker Hub上,但是映象可能很大,我們上傳和下載都很慢。所以我們可以建私有Registry
下面我們舉個栗子:
下載映象:
[[email protected] ~]# docker image pull nginx:1.14-alpine
檢視映象是否下載成功:
[[email protected] ~]# docker image ls
我們繼續下載一個叫做busybox的映象
[[email protected] ~]# docker pull busybox:latest
也可以不寫latest,預設就是latest
刪除一個映象:
docker rmi xxx或者docker image rm xxx
建立docker容器(注意並不會啟動容器):
可以使用docker container create或者docke create
啟動docker容器:
docker container start xxx或者docker start xxx
停止正在執行的docker容器:
docker container stop xxx
強行停止正在執行的docker容器:
docker container kill xxx
建立docker容器並直接啟動該容器:
docker container run xxx或者docker run xxx
引數詳解見下文
刪除docker容器:
docker container rm xxx或者docker rm xxx
暫停docker容器:
docker container pause xxx
取消暫停docker容器:
docker container umpause xxx
哪些容器更耗資源:(可以根據資源消耗比例進行排序)
docker container top
顯示docker容器:不顯示處於停止狀態的容器的
docker container ls
如要要顯示處於停止狀態的容器:
docker container ls -a
列出所有dicker容器:不顯示處於停止狀態的容器的
docker ps
如要要顯示處於停止狀態的容器:
docker ps -a
CONTAINER ID:容器自有ID
IMAGE:基於哪個映象啟動的容器
COMMAND:在容器中運行了什麼命令,當我們基於一個映象啟動容器的時候,每個映象都有他自己定義預設要執行的程式,如果沒指就執行自己預設的程式,但是我們也可以改,我就不執行這個映象預設的程式,他裡面還有別的程式。也可以的。
CREATED:容器在什麼時候建立的
STATUS:當前處於什麼狀態
PORTS:監聽了什麼埠,其實不是監聽,而是對映,後面具體再說
NAMES:容器的名字,名字是可以省略的,省略了就用ID表示
4、啟動一個docker映象
在使用run的時候,映象是不可省略的。必須要指明run哪個映象
docker run命令啟動容器時會先在本地倉庫查詢映象,如果沒有在去docker hub倉庫中下載映象並啟動
如果不指定這個映象啟動起來執行什麼命令,他將執行映象的預設命令,當然我們可以自己給他傳遞一個命令[COMMAND]並向命令傳遞引數[ARG...]
我們還可以在啟動容器的時候加上選項[OPTIONS]
如果我們要執行一個互動式介面,像使用一個虛擬機器一樣來使用它,開啟shell
-
-t:在新容器內指定一個偽終端或終端。沒有終端是無法開啟shell的
-
-i:允許你對容器內的標準輸入 (STDIN) 進行互動。
所以我們要需要使用上述的 -t -i
一般來講我們啟動容器的時候要給他一個名字,因此還要使用 --name
如果有必要也可以在啟動容器的時候給他加入一個網路 --network
如果不加network,那麼將使用預設的叫bridge的網路
使用[[email protected] ~]# docker network ls能顯示本地有多少個網路
有三個叫bridge,host,none。我們後面再詳細講
而bridge到哪裡去,可以使用[[email protected] ~]# ifconfig命令檢視
有本地橋叫docker0,docker啟動之後會自動建立一個docker橋叫docker0,而且預設網段是172,17網段的。任何啟動的容器都會自動擁有這個網路地址,而且這個橋是net橋,是地址轉換橋,也就意味著可以通過地址轉換轉換成可以對外通訊的這個地址(上圖是192.168.123.101)
如果容器一停,可以讓他自動就刪除:(注意有些選項是互斥的不能同時用)
還可以讓容器啟動 執行到後臺
-d 表示脫離於當前終端的關係,否則他將一直佔據了終端
busybox例子:
下面我們將基於busybox啟動一個很小很小的使用者空間作為案例:(執行latest版本可以不寫:laest)
[[email protected] ~]# docker run --name b1 -it busybox:latest
這個命令預設是執行一個shell介面的,如下圖所示開啟一個shell
ls /bin 可以看到這裡面有很多的命令,他們都是busybox的命令
注意我們現在執行的是一個shell,你在裡面可以執行很多shell的子命令
可以發現我們的sh的PID號為1,這就表示為init,是整個使用者空間的總管程序,如果他宕了整個使用者空間就宕了,使用者空間宕了,相當於整個容器就要關閉了。
我們要執行其他程序,就相當於sh的子程序而已。比如像http就需要-h來告訴我們詳細用法
下面是例子:
在裡面寫入Busybox httpd server.的內容
下面我們啟動httpd
不加 -f 就是後臺,加-f就是前臺。-h指明家目錄地址
回車,他預設監聽了80埠。
這時候我們可以檢視一下運行了哪些容器(引數說明在前面有介紹)
看不到PORTS是因為沒有做埠對映,對映我們後面再解釋
那麼對於b1這個容器,他的地址是多少呢?我們使用命令[[email protected] ~]# docker inspect b1
可以看到地址是172.17.0.2
所以我們使用curl 172.17.0.2來訪問
現在我們用的是特權使用者空間跟剛才新建立的叫做b1的使用者空間裡面的容器進行互動的。相當於兩個虛擬機器之間的通訊。
而後我們要退出,不要ctrl+c,因為在shell中exit表示退出,如果sh一終止,容器就終止了。
注意現在容器看不到了。ps是不顯示已停止的容器的。所以我們需要使用命令如下,加上-a即可
那麼對於停止狀態的容器我們還可以啟動起來,使用啟動容器docker start xxx
-
-a:並附加到他的終端上(在新容器內指定一個偽終端或終端。沒有終端是無法開啟shell的)
-
-i:如果裡面預設執行shell,你要進入互動式介面就