Docker容器的詳解與配置

本章大綱:

  • 1.什麼是Docker
  • 2.Docker的三大核心是什麼
  • 3.Docker的概念及安裝

一、揭開Docker的神祕面紗

1.Docker是什麼
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發佈到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。
Docker作爲開源社區最火爆的項目,它是在Linux容器裏運行應用的開源工具,是一種輕量級的“虛擬機”,docker的全部源代碼都在https://github.com/docker 進行相關維護,其官網是:https://www.docker.com

docker之所以擁有衆多優勢,與操作系統虛擬化自身的特點是分不開的,傳統虛擬機需要有額外的虛擬機管理程序和虛擬機操作系統層,而docker是直接在操作系統層面之上實現的虛擬化,二者的工作示意圖如下:
Docker容器的詳解與配置

2.爲什麼要用Docker

* Docker的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現“這段代碼在我機器上沒問題啊”這類問題;——一致的運行環境
* 可以做到秒級、甚至毫秒級的啓動時間。大大的節約了開發、測試、部署的時間。——更快速的啓動時間
* 避免公用的服務器,資源會容易受到其他用戶的影響。——隔離性
* 善於處理集中爆發的服務器使用壓力;——彈性伸縮,快速擴展
* 可以很輕易的將在一個平臺上運行的應用,遷移到另一個平臺上,而不用擔心運行環境的變化導致應用無法正常運行的情況。——遷移方便
* 使用Docker可以通過定製應用鏡像來實現持續集成、持續交付、部署。——持續交付和部署

3.Docker和虛擬機的區別
作爲一種輕量級的虛擬化方式,Docker與傳統虛擬機相比具有顯著的優勢。
Docker容器很快,啓動和停止可以在秒級實現,比傳統虛擬機要快很多,Docker核心解決的問題是利用容器來實現類似VM的功能,從而利用更節省的硬件資源提供給更多的計算資源,所以Docker容器除了運行其中的應用之外,基本不消耗額外的系統資源,從而在保證應用性能的同時,減小系統開銷,使得在一臺主機上同時運行數千Docker容器成爲可能,Docker操作方便,還可以通過Dockerfile配置文件支持靈活的自動化創建和部署。
下表對使用Docker容器技術與傳統虛擬化技術的特性進行了比較。
Docker容器的詳解與配置

4.Docker的使用場景
現在開發者需要能更方便地運行在雲平臺上的應用,必須要脫離底層的硬件,同時還需要任何時間地點可獲得這些資源,這正是Docker所能提供的。Docker的容器技術可以在一臺主機上輕鬆爲任何應用創建一個輕量級的、可移植的、自給自足的容器,通過這種容器打包應用程序,意味着簡化了重新部署,調試這些瑣碎的重複工作,極大地提高了工作效率,列如,服務器從騰訊雲遷移到阿里雲,如果採用Docker容器技術,遷移只需要在新的服務器上啓動需要的容器即可。

二、Docker的三大核心

1、鏡像
docker的鏡像是創建容器的基礎,類似虛擬機的快照,可以理解爲是一個面向docker容器引擎的只讀模板,比如,一個鏡像可以是一個完整的centos操作系統環境,稱爲一個centos鏡像;可以是一個安裝了MySQL的應用程序,稱爲一個MySQL鏡像,等等。
docker提供了簡單的機制來創建和更新現有的鏡像,我們也可以從網上下載已經做好的應用鏡像來直接使用。

2、容器
docker的容器是從鏡像創建的運行實例,它可以被啓動、停止和刪除。所創建的每一個容器都是相互隔離、互不可見,可以保證安全性的平臺,可以把容器看做一個簡易版的Linux環境,docker利用容器來運行和隔離應用。

3、倉庫
docker倉庫是用來幾種保存鏡像的地方,當創建了自己的鏡像之後,可以使用push命令將它上傳到共有倉庫或者私有倉庫,這樣一來當下次要在另一臺機器上使用這個鏡像時,只需要從倉庫上拉去取下來就可以了。

倉庫註冊服務器是存放倉庫的地方,其中包含了多個倉庫,每個倉庫集中存放某一類鏡像,並且使用不同的標籤來區分他們。目前最大的公共倉庫是docker hub,存放了數量龐大的鏡像提供用戶下載使用。

docker默認的存儲目錄在/var/lib/docker,docker的鏡像、容器、日誌等內容全部都存儲在這裏,可以單獨使用大容量的分區來存儲這些內容,並且一般選擇建立LVM邏輯卷,從而避免docker運行過程中存儲目錄容量不足的問題。

三、安裝Docker的基礎操作

1、安裝及啓動
安裝時,必須保證服務器配置可上網,或者自行配置本地yum源也可以,

[root@localhost ~]# yum -y install docker       #直接安裝
[root@localhost ~]# systemctl start docker     #啓動docker服務
[root@localhost ~]# systemctl enable docker     #設置爲開機自啓動
[root@localhost ~]# docker version      #查看安裝的docker版本

2、docker的鏡像操作
(1)查找鏡像
docker運行容器前需要本地存在相應的鏡像,如果不存在本地鏡像,docker就會嘗試從默認鏡像倉庫https://hub.docker.com/ 進行查找。

[root@localhost ~]# docker search dhcp     #以DHCP作爲關鍵字進行搜索鏡像
INDEX       NAME                                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/networkboot/dhcpd                    Suitable for running a DHCP server for you...   40                   [OK]
docker.io   docker.io/joebiellik/dhcpd                     DHCP server running on Alpine Linux             14                   [OK]
docker.io   docker.io/gns3/dhcp                            A DHCP container for GNS3 using dnsmasq         2                    [OK]
docker.io   docker.io/instantlinux/dhcpd-dns-pxe           Serve DNS, DHCP and TFTP from a small Alpi...   2                    [OK]
docker.io   docker.io/ictu/dhcpd-tftpd                     dhcpd tftpd container                           1                    [OK]
                         .................#省略部分內容

返回很多包含DHCP關鍵字的鏡像,其中返回的信息包括鏡像名稱(NAME)、描述(DESCRIPTION)、星級(STARS)、是否官方創建(OFFICIAL)、是否主動創建(AUTOMATED)。默認的輸出結果會按照星級評價進行排序,表示該鏡像的受歡迎程度,在下載鏡像時,可以參考這一項,星級越高表示越受歡迎;是否爲官方鏡像一項是指是否由官方項目組創建和維護的鏡像,一般官方項目組維護的鏡像使用單個單詞作爲鏡像名稱,我們稱爲基礎鏡像或者根鏡像。如/reinblau/dhcp這種命名方式的鏡像,表示是由docker hub的用戶reinblau創建並維護的鏡像,帶有用戶名爲前綴;是否主動創建資源則是指是否允許用戶驗證鏡像的來源和內容。
(2)下載鏡像
搜索到符合需求的鏡像,可以使用docker pull命令從網絡下載鏡像到本地使用。
命令格式:docker pull 倉庫名稱[:標籤]
對於docker鏡像來說,如果下載鏡像時不指定標籤,則默認會下載倉庫中最新版本的鏡像,即選擇標籤爲latest,也可通過指定的標籤來下載特定版本的某一鏡像。這裏標籤就是用來區分鏡像版本的。

如下,下載一個鏡像

[root@localhost ~]# docker pull docker.io/networkboot/dhcpd           #下載查詢出來的某個鏡像
[root@localhost ~]# docker images      #查詢下載的鏡像
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
docker.io/networkboot/dhcpd   latest              52cbff801df2        5 months ago        105 MB
從回顯的信息可以讀出以下信息:
#REPOSITORY:鏡像屬於的倉庫;
#TAG  :鏡像的標籤信息,標記同一個倉庫中的不同鏡像;
#IMAGE ID:鏡像的唯一ID號,唯一標識了該鏡像;
#CREATED:鏡像創建的時間;
#SIZE:鏡像的大小
用戶還可以根據鏡像的唯一標識ID號,獲取鏡像的詳細信息。命令如下:
[root@localhost ~]# docker inspect 52cbff801df2      #獲取鏡像的詳細信息
#鏡像的詳細信息中包括創建時間、系統版本、主機名、域名、用戶、卷、標籤、操作系統、設備ID等各種信息。
#爲了在後續的工作使用這個鏡像,可以用docker  tag命令來爲本地鏡像添加新的標籤,
#命令格式:docker tag名稱:[標籤] 新名稱:[新標籤],具體操作如下:
[root@localhost ~]# docker tag docker.io/networkboot/dhcpd dchp:dhcp    #改新名稱及標籤
[root@localhost ~]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
dchp                          dhcp                52cbff801df2        5 months ago        105 MB
docker.io/networkboot/dhcpd   latest              52cbff801df2        5 months ago        105 MB

(3)刪除鏡像
會發現原來的鏡像還在,那麼刪除原來的鏡像試試吧!
使用docker rmi命令可以刪除多餘的鏡像,可以指定標籤進行刪除,也可以指定ID刪除鏡像
刪除鏡像的命令格式:docker rmi 倉庫名稱:標籤或docker rmi 鏡像ID號,當一個鏡像有多個標籤的時候,指定標籤只是刪除該鏡像多個標籤中的指定標籤,不會影響鏡像文件,相當於只是刪除了鏡像的一個標籤而已,但當該鏡像只剩下一個標籤的時候就要注意了,再使用刪除命令就會徹底刪除該鏡像。

[root@localhost ~]# docker rmi docker.io/networkboot/dhcpd    #刪除原本的鏡像標籤
Untagged: docker.io/networkboot/dhcpd:latest
Untagged: docker.io/networkboot/dhcpd@sha256:fdc7ff6f265249a104f32f1d7aed0aedaf2f2fc62ea10eebf596e2af3b67

當使用docker rmi命令後面跟上鏡像的ID號時,必須確保該鏡像沒有被容器使用才能進行,刪除時系統會先刪除掉所有指向該鏡像的標籤,然後刪除該鏡像文件本身,如果該鏡像已經被容器使用,正確的做法是先刪除依賴該鏡像的所有容器,再去刪除鏡像。

(4)導出鏡像
當需要把一臺機器上的鏡像遷移到另一臺機器上的時候,需要將鏡像保存位本地文件,這一過程叫做導出鏡像,可以使用docker save命令進行存出操作,之後就可以複製該文件到其他機器上。
命令格式:docker save -o 存出鏡像爲本地文件
如下:

[root@localhost ~]# docker images          #獲取鏡像名稱及標籤
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
dchp                dhcp                52cbff801df2        5 months ago        105 MB
[root@localhost ~]# docker save -o dhcptest dchp:dhcp      #導出爲本地鏡像
[root@localhost ~]# du -sh dhcptest              #會導出至本地當前工作目錄
103M    dhcptest

(5)載入鏡像
將導出的鏡像從A機器複製到B機器,需要在B機器上使用該鏡像,就可以將該導出文件導入到B機器中的鏡像庫中,這一過程叫做載入鏡像。
命令格式爲(從文件dhcp中載入鏡像導本地鏡像庫中):

[root@localhost ~]# docker load --input dhcp
#或者
[root@localhost ~]# docker load < dhcp

(6)上傳鏡像
本地存儲的鏡像越來越多,就需要指定一個專門存放這些鏡像的地方——倉庫,比較簡單的就是公共倉庫,默認上傳到dockerhub官方倉庫,需要註冊使用公共倉庫的賬號,可以使用docker login命令來輸入用戶名,密碼和郵箱來完成註冊和登錄,在上傳鏡像之前還需要對本地鏡像添加新的標籤,然後再使用docker push命令進行上傳。
命令格式:docker push 倉庫名稱:標籤

[root@localhost ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: ljztest      #輸入註冊的用戶名
Password:          #輸入密碼
Login Succeeded                     #提示登錄成功
[root@localhost ~]# docker push docker.io/ljztest/dhcp     
#在這裏登錄上傳時,報錯,發現是因爲鏡像的倉庫名稱有問題,根據提示改了下倉庫名稱,就上傳成功了
The push refers to a repository [docker.io/ljztest/dhcp]
8d3d1c857813: Pushed 
37ee4253c76e: Pushed 
b57c79f4a9f3: Pushed 
d60e01b37e74: Pushed 
e45cfbc98a50: Pushed 
762d8e1a6054: Pushed 
testdhcp: digest: sha256:fdc7ff6f265249a104f32f1d7aed0aedaf2f2fc62ea10eebf596e2af3b670477 size: 1569

、docker的容器操作
容器是docker的另一個核心概念,簡單來說,容器是鏡像的一個運行實例,是獨立運行的一個或一組應用及它們所必需的運行環境,包括文件系統、系統類庫、shell環境等。鏡像是隻讀模板,而容器會給這個只讀模板一個額外的可寫層。

(1)容器的創建與啓動
docker的創建就是將鏡像加載到容器的過程,docker的容器十分輕量級,用戶可以隨時創建或者刪除。新創建的容器默認處於停止狀態,不運行任何程序,需要在其中一個發起一個進程來啓動容器,這個進程是該容器的唯一進程,所以當該進程結束的時候,容器也會完全停止。停止的容器可以重新啓動並保留原來的修改。可以使用docker create 命令新建一個容器。

1)創建容器
命令如下(-i:表示讓容器的輸入保持打開,就是容器一直運行;-t:是讓docker分配一個僞終端):

[root@localhost ~]# docker create -it dchp:dhcp /bin/bash     #創建一個容器,並指定僞終端
2304f92a815800305804987bcb2ee20aca5f4d651d577427c476554d54171f2d
#如果此刻創建容器命令報錯“WARNING:IPv4 forwarding is disabled.Network will bot
#work.”,就使用vim編輯器打開/usr/lib/sysctl.d/00-system.conf文件,在其中添加
#net.ipv4.ip_forward=1,然後使用systemctl  start network命令重啓網絡服務即可
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2304f92a8158        dchp:dhcp           "/entrypoint.sh /b..."   8 minutes ago       Created                                 naughty_perlman
#輸出的信息顯示容器的ID號、加載的鏡像、運行的程序、創建時間、目前所處的狀態、端口映射、容器名稱等。
#上面查出的狀態一欄是create表示當前的容器是新創建的並處於停止狀態。

2)啓動和停止容器

[root@localhost ~]# docker ps -a                #先查出容器的ID號
CONTAINER ID        IMAGE               COMMAND                  CREATE
2304f92a8158        dchp:dhcp           "/entrypoint.sh /b..."   10 min
[root@localhost ~]# docker start 2304f92a8158              #啓動時,需指定容器的ID號
2304f92a8158
[root@localhost ~]# docker ps -a         #再查詢容器的狀態,會發現狀態欄變成了UP
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2304f92a8158        dchp:dhcp           "/entrypoint.sh /b..."   23 minutes ago      Up 42 seconds                           naughty_perlman
[root@localhost ~]# docker stop 2304f92a8158        #停止這個容器
2304f92a8158
[root@localhost ~]# docker ps -a            #再次查看狀態,會發現狀態欄變成了exited
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
2304f92a8158        dchp:dhcp           "/entrypoint.sh /b..."   About an hour ago   Exited (0) 4 seconds ago                       naughty_perlman

3)進入容器

[root@localhost ~]# docker start 2304f92a8158              #再次啓動這個容器
[root@localhost ~]# docker exec -it 2304f92a8158 /bin/bash     #進入這個容器
root@2304f92a8158:/# ls  #查看這個容器的根目錄,可以看到進入容器後命令提示符發生了變化
bin   dev            etc   lib    media  opt   root  sbin  sys  usr
boot  entrypoint.sh  home  lib64  mnt    proc  run   srv   tmp  var
root@2304f92a8158:/# exit       #退出這個容器
exit
[root@localhost ~]# 

(2)容器的導出與導入

[root@localhost ~]# docker ps -a      #查詢容器的ID號
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2304f92a8158        dchp:dhcp           "/entrypoint.sh /b..."   About an hour ago   Up 6 minutes                            naughty_perlman
[root@localhost ~]# docker export 2304f92a8158>centos7dhcp  #導出到當前工作目錄,並定義名字爲centos7dhcp
[root@localhost ~]# ls      #查看導出的文件,下面標紅的就是導出的文件
anaconda-ks.cfg  'centos7dhcp'  dhcptest  initial-setup-ks.cfg
#將導出的文件複製到另一臺服務器上,之後使用docker  import 命令導入,成爲鏡像
[root@localhost ~]# scp [email protected]:/root/centos7dhcp /tmp     #在另一臺服務器進行復制
[email protected]'s password:                 #輸入對端的用戶密碼
centos7dhcp                         100%   84MB  95.2MB/s   00:00    
[root@localhost ~]# cd /tmp
[root@localhost tmp]# ls     #確定複製過來了
centos7dhcp
 .............#省略部分內容
 [root@localhost tmp]# cat centos7dhcp | docker import - centos7:dhcp     
 #導入文件centos7dhcp成爲本地鏡像
sha256:e016fa46360492daa9323a0d35bccec76610433f03ba9171fe6d9a5500f823ff
[root@localhost tmp]# docker images | grep centos7        #確定鏡像導入成功
centos7                  dhcp                e016fa463604        14 minutes ago      84.7 MB

(3)容器的刪除
可以使用docker rm命令將一個已經終止狀態的容器進行刪除。


[root@localhost ~]# docker ps -a         #還是需要查出容器的ID
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2304f92a8158        dchp:dhcp           "/entrypoint.sh /b..."   About an hour ago   Up 35 minutes                           naughty_perlman
[root@localhost ~]# docker stop 2304f92a8158       #刪除容器前需要先停止容器
2304f92a8158
[root@localhost ~]# docker rm 2304f92a8158          #刪除容器
2304f92a8158

如果刪除一個正在運行的容器,可以添加-f選項強制刪除,但是建議先將容器停止再進行刪除。

———————— 本文至此結束,感謝閱讀 ————————``

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章