1、揭開 Docker 的神祕面紗
Docker 是在Linux容器中運行的應用的開源工具,是一種輕量級的「虛擬機」誕生於2013年,短短几年時間,已經成爲了開源社區最火爆的項目。
.
那麼爲何Docker會這麼火呢?看看下圖就知道了:
linux
做爲一種輕量級的虛擬機方式,Docker 與傳統虛擬機相比具備顯著的優點。
Docker 之因此擁有衆多優點,與操做系統虛擬化自身的特色是分不開的。傳統虛擬機須要額外的虛擬機管理程序和虛擬機操做系統層,而Docker容器是直接在操做系統層面上實現的虛擬化。
Docker 的使用場景
如今開發者須要能方便地建立運行在雲平臺上的應用,必需要脫離底層硬件,同時還須要任什麼時候間地點可獲取這些資源,這正是Docker所能提供的。Docker 的容器技術能夠在一臺主機上輕鬆爲任何應用建立一個輕量級的、可移植的、自給自足的容器。經過這中容器打包應用程序,意味着簡化了從新部署、調試這些瑣碎的重複工做,極大的提升了工做效率。例如,服務器從騰訊雲遷移到阿里雲,若是採用Docker容器技術,遷移只須要在新的服務器上啓動須要的容器便可。
2、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,存放了數量龐大的鏡像供用戶下載使用。
3、安裝Docker
Centos 系統下安裝 Docker 能夠有兩種方式:一種是使用 curl 得到 Docker 的安裝腳本進行安裝。另外一種是使用 YUM 倉庫來安裝Docker。
注意:目前Docker只能支持64位操做系統
注意:目前Docker只能支持64位操做系統
注意:目前Docker只能支持64位操做系統
這裏我使用的是Docker本身的YUM源進行安裝
開始安裝:git
[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服務端和客戶端運行在一臺機器上。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 官方維護的一個公共倉庫。
一、搜索鏡像:shell
[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] ............... // 省略部份內容
二、獲取鏡像:
搜索到符合的鏡像,可使用docker pull 進行下載到本地centos
[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
三、查看鏡像信息:安全
[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號,獲取鏡像的詳細信息:bash
[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
四、刪除鏡像:網絡
命令格式: docker rmi 倉庫名稱:標籤 或者 docker rmi 鏡像ID號
當使用 docker rmi 命令後面跟上鏡像的 ID 號時,必須確保該鏡像沒有被容器正在使用才能進行,刪除時系統會先刪除全部指向該鏡像的標籤,而後刪除該鏡像文件自己。若是該鏡像已經被容器使用,正確的作法是先刪除依賴該鏡像的全部容器,再去刪除鏡像。
五、存出和載入鏡像:
存出curl
[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
六、上傳鏡像:
本地存出的鏡像愈來愈多,就須要指定一個專門存放這些鏡像的地方——倉庫,目前比較方便的就是公共倉庫,默認上傳到 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環境等。鏡像是隻讀模板,而容器會給這個只讀模板一個額外的可寫層。
一、容器的建立與啓動:
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 ,表示容器已經處於啓動狀態
二、容器的運行與中止:
[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,停止狀態。
三、容器的進入:
[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 /]#
四、容器的導出與導入:
用戶能夠將任何一個 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
五、容器的刪除:
命令格式: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 運行過程當中存儲目錄容量不足的問題。