Docker詳解與安裝

一、揭開 Docker 的神祕面紗
Docker 是在Linux容器中運行的應用的開源工具,是一種輕量級的“虛擬機”誕生於2013年,短短几年時間,已經成爲了開源社區最火爆的項目。
.
那麼爲什麼Docker會這麼火呢?看看下圖就知道了:
Docker詳解與安裝

作爲一種輕量級的虛擬機方式,Docker 與傳統虛擬機相比具有顯著的優勢。
Docker 之所以擁有衆多優勢,與操作系統虛擬化自身的特點是分不開的。傳統虛擬機需要額外的虛擬機管理程序和虛擬機操作系統層,而Docker容器是直接在操作系統層面上實現的虛擬化。
Docker詳解與安裝
Docker 的使用場景
現在開發者需要能方便地創建運行在雲平臺上的應用,必須要脫離底層硬件,同時還需要任何時間地點可獲取這些資源,這正是Docker所能提供的。Docker 的容器技術可以在一臺主機上輕鬆爲任何應用創建一個輕量級的、可移植的、自給自足的容器。通過這中容器打包應用程序,意味着簡化了重新部署、調試這些瑣碎的重複工作,極大的提高了工作效率。例如,服務器從騰訊雲遷移到阿里雲,如果採用Docker容器技術,遷移只需要在新的服務器上啓動需要的容器即可。
二、Docker 的核心概念
1.鏡像
Docker的鏡像(mage) 是創建容器的基礎,類似虛擬機的快照.可以理解爲是一個 面向Docker 容器引擎的只讀模板。比如,一個鏡像可以是一個完整的 CentOS操作系統環境,稱爲一個CentOS 鏡像;可以是一個安裝了MySQL的應用程序.稱爲一個MySOL鏡像.等等
Doacker提供了簡單的機制來創建和更新現有的鏡像.用戶也可以從網上下載已經做好的應用鏡像來直接使用。
2.容器
Docker的容器(Conainer! 是從鏡像創建的運行實例,它可以被啓動.停止和刪除。所創建的每個容器都是相互隔離.互不可見,可以保證安全性的平臺。可以把容器看作一個簡易版的Linux環境,Docker 利用容器來運行和隔離應用。
3.倉庫
Docker倉庫(Repository) 是用來集中保存鏡像的地方,當創建了自己的鏡像之後,可以使用push 命令將它上傳到公有倉庫(Pbli) 或者私有倉庫(Private), 這樣一來當下次要 在另外一臺機器上使用這個鏡像時,只需要從倉庫上拉取下來就可以了。
倉庫註冊服務器(Registry) 是存放倉庫的地方,其中包含了多個倉庫,每個倉庫集中存放某一類鏡像,並且使用不同的標籤(Tag) 來區分它們,目前最大的公共倉庫是Docker Hb,存放了數量龐大的鏡像供用戶下載使用。
三、安裝Docker
Centos 系統下安裝 Docker 可以有兩種方式:一種是使用 curl 獲得 Docker 的安裝腳本進行安裝。另一種是使用 YUM 倉庫來安裝Docker。
注意:目前Docker只能支持64位操作系統
注意:目前Docker只能支持64位操作系統
注意:目前Docker只能支持64位操作系統
這裏我使用的是Docker自己的YUM源進行安裝
開始安裝:

[root@test /]# yum -y install docker             # 安裝docker
[root@test /]# systemctl start docker              # 啓動服務
[root@test /]# systemctl enable docker           # 設爲開機自啓動
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

安裝好的Docker有兩個程序:Docker服務端和Docker客戶端。其中Docker服務進程,管理着所有的容器。Docker 客戶端則扮演着Docker服務端的遠程控制器,可以用來控制 Docker 的服務端進程。大部分的情況下,Docker服務端和客戶端運行在一臺機器上。

[root@test /]# docker version 
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: docker-1.13.1-75.git8633870.el7.centos.x86_64
 Go version:      go1.9.4
 Git commit:      8633870/1.13.1
 Built:           Fri Sep 28 19:45:08 2018
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: docker-1.13.1-75.git8633870.el7.centos.x86_64
 Go version:      go1.9.4
 Git commit:      8633870/1.13.1
 Built:           Fri Sep 28 19:45:08 2018
 OS/Arch:         linux/amd64
 Experimental:    false

Docker 鏡像操作
Docker 運行容器前需要本地存在對應的鏡像,如果不存在本地鏡像,Docker 就會嘗試從默認鏡像倉庫 https://hub.docker.com 處下載,這是一個由 Docker 官方維護的一個公共倉庫。
1、搜索鏡像:

[root@test /]# docker search dhcp        # 命令格式 docker search 關鍵字
INDEX       NAME                                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/networkboot/dhcpd                    Suitable for running a DHCP server for you...   43                   [OK]
docker.io   docker.io/joebiellik/dhcpd                     DHCP server running on Alpine Linux             15                   [OK]
docker.io   docker.io/gns3/dhcp                            A DHCP container for GNS3 using dnsmasq         3                    [OK]
...............      // 省略部分內容

2、獲取鏡像:
搜索到符合的鏡像,可以使用docker pull 進行下載到本地

[root@test /]# docker pull docker.io/networkboot/dhcpd
Using default tag: latest
Trying to pull repository docker.io/networkboot/dhcpd ... 
latest: Pulling from docker.io/networkboot/dhcpd
898c46f3b1a1: Downloading 5.602 MB/32.47 MB
63366dfa0a50: Download complete 
041d4cd74a92: Download complete 
6e1bee0f8701: Download complete 
114483241095: Downloading 3.693 MB/6.702 MB
ef446bdcb1f0: Waiting 

3、查看鏡像信息:

[root@test /]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
docker.io/networkboot/dhcpd   latest              52cbff801df2        8 months ago        105 MB
從回顯的信息中可以讀出:
REPOSITORY:鏡像屬於的倉庫
TAG:鏡像的標籤信息,標記同一個倉庫的不同鏡像
IMAGE ID :鏡像的唯一ID號,唯一標識了該鏡像
CREATED:鏡像創建時間
VIRTUAL SIZE:鏡像大小

用戶可根據鏡像的唯一標識ID號,獲取鏡像的詳細信息:

[root@test /]# docker inspect 52cbff801df2
[
    {
        "Id": "sha256:52cbff801df2c6e2da3866d9f9476f20f190f64a0e886fbdfa79d843befa666a",
        "RepoTags": [
            "docker.io/networkboot/dhcpd:latest"
        ],
...............................  // 省略部分內容

鏡像的詳細信息包含了創建時間、系統版本、主機名、域名、用戶、卷、標籤、操作系統、設備ID等各種信息。
爲了方便使用,可爲本地的鏡像添加新標籤:

[root@test /]# docker tag docker.io/networkboot/dhcpd  dhcp:dhcp
[root@test /]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
dhcp                          dhcp                52cbff801df2        8 months ago        105 MB
docker.io/networkboot/dhcpd   latest              52cbff801df2        8 months ago        105 MB

4、刪除鏡像:

命令格式:
docker  rmi  倉庫名稱:標籤
或者
docker rmi   鏡像ID號

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

[root@test /]# docker save -o /tmp/dhcp docker.io/networkboot/dhcpd
[root@test /]# ll -d /tmp/dhcp 
-rw------- 1 root root 107891712 Nov 25 17:56 /tmp/dhcp

載入

[root@test tmp]# docker load --input dhcp
[root@test tmp]# docker load < dhcp

6、上傳鏡像:
本地存出的鏡像越來越多,就需要指定一個專門存放這些鏡像的地方——倉庫,目前比較方便的就是公共倉庫,默認上傳到 DockerHub 官方倉庫,需要註冊使用公共倉庫的賬號,可以使用docker login 命令來輸入用戶名、密碼和郵箱來註冊和登陸。在上傳鏡像之前還需要對本地鏡像添加新的標籤,然後再使用docker push來進行上傳。
例如: 在公共倉庫上已經註冊了一個賬號,本例賬號爲test,鏡像標籤爲docker/dhcp:centos7.3
(1)首先使用賬號登錄官方倉庫:

[root@test /]# 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: test                       # 輸入賬號
Password:                               # 輸入密碼
Login  Succeeded

(2)成功登陸後就可以上傳鏡像:

[root@test /]# docker push docker/dhcp:centos7.3

Docker 容器操作
容器是Docker的另一個核心概念,簡單來說,容器就是鏡像的一個運行實例,是獨立運行的一個或一組應用及它們所必須的運行環境,包括文件系統、系統類庫、shell環境等。鏡像是隻讀模板,而容器會給這個只讀模板一個額外的可寫層。
1、容器的創建與啓動:
Docker 的創建就是鏡像加載到容器的過程,Docker 的容器十分輕量級,用戶可以隨時創建或刪除。新創建的容器默認處於停止狀態,不運行任何程序,需要在其中發起一個進程來啓動容器,這個進程就是該容器的唯一進程,所以當該進程結束的時候,容器也會完全停止。停止的容器可以重新啓動並保留原來的修改。

[root@test /]# docker create -it docker.io/networkboot/dhcpd /bin/bash           # 創建容器
08ab448cd0be320b24d6878b377bfa6957127c7ffb4c7e050e64340deeee1562
# -i 表示讓容器的輸入保持打開;-t 表示讓Docker分配一個僞終端

如果此處創建容器命令報錯“WARNING: IPv4 forwarding is disabled.Networking will notwork." ,就使用vi編輯器打開/usr/lib/sysctl.d/00-system.conf文件,在其中添加net.ipv4.ip_ forward=1, 然後使用service network start命令重啓網絡服務。

使用docker create 命令創建新容器後會返回一個唯一的ID。

[root@test /]# docker ps -a                 # 查看所有容器的運行狀態        -a 可以列出系統最近一次啓動的容器
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS               NAMES
08ab448cd0be        docker.io/networkboot/dhcpd   "/entrypoint.sh /b..."   5 minutes ago       Created                                 keen_payne
命令格式: docker   start   容器的ID/名稱
[root@test /]# docker start 08ab448cd0be                # 可跟容器的ID與名稱
08ab448cd0be
[root@test /]# docker ps -a | grep 08ab448cd0be 
08ab448cd0be        docker.io/networkboot/dhcpd   "/entrypoint.sh /b..."   8 minutes ago       Up About a minute                       keen_payne
# 容器啓動後,可以看到容器狀態一欄已經變成了 UP ,表示容器已經處於啓動狀態

2、容器的運行與停止:

[root@test /]# docker stop 08ab448cd0be
08ab448cd0be
[root@test /]# docker ps -a 
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                     PORTS               NAMES
08ab448cd0be        docker.io/networkboot/dhcpd   "/entrypoint.sh /b..."   10 minutes ago      Exited (0) 5 seconds ago                       keen_payne
# 查看容器的運行狀態,可以看出容器處於Exited,中止狀態。

3、容器的進入:

[root@test /]# docker exec -it 08ab448cd0be /bin/bash
#  -i 表示讓容器的輸入保持打開;-t 表示讓Docker分配一個僞終端
root@08ab448cd0be:/# ls                  # 已經進入到了容器中
bin  boot  dev  entrypoint.sh  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@08ab448cd0be:/# exit
exit
[root@test /]# 

4、容器的導出與導入:
用戶可以將任何一個 Docker 容器從一臺機器遷移到另一臺機器。在遷移過程中,首先需要將已經創建好的容器導出爲文件,可以使用 docker export 命令實現,無論這個容器是處於運行還是停止均可導出。導出之後可將導出文件傳輸到其他機器,通過相應的導入命令實現容器的遷移。

命令格式:docker export  容器ID/名稱>文件名
[root@test /]# docker export  08ab448cd0be>centos7dhcp
[root@test /]# ll -d centos7dhcp 
-rw-r--r-- 1 root root 87825920 Nov 25 19:58 centos7dhcp

導出的文件從A機器複製到B機器,之後使用docker import 命令導入,成爲鏡像 。

命令格式:cat    文件名 | docker  import   - 生成的鏡像名稱:標籤
[root@test /]# cat centos7dhcp | docker import - centos7:dhcp
sha256:e7193f77c973a89dd2d1046f09eb4328798f4ee9dff92ad13514fb7268bc3c27
[root@test /]# docker images | grep centos7
centos7                       dhcp                e7193f77c973        17 seconds ago      84.7 MB

5、容器的刪除:

命令格式:docker  rm   容器ID/名稱
[root@test /]# docker stop 08ab448cd0be
08ab448cd0be
[root@test /]# docker rm 08ab448cd0be
08ab448cd0be
[root@test /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
# 如果刪除一個正在運行的容器,可以添加 -f 選項強制刪除,但是建議先將容器停止再做刪除操作

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

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