博文大綱:linux
- 1、docker簡介
- 2、docker的三大核心概念
一、鏡像
二、容器
三、倉庫- 3、安裝及docker的基礎操做
一、安裝及啓動
二、docker的鏡像操做
三、docker的容器操做
Docker做爲開源社區最火爆的項目,它是在Linux容器裏運行應用的開源工具,是一種輕量級的「虛擬機」,docker的所有源代碼都在https://github.com/docker 進行相關維護,其官網是:https://www.docker.com 。git
docker之因此擁有衆多優點,與操做系統虛擬化自身的特色是分不開的,傳統虛擬機須要有額外的虛擬機管理程序和虛擬機操做系統層,而docker是直接在操做系統層面之上實現的虛擬化,兩者的工做示意圖以下:github
docker和虛擬機的區別以下:docker
docker的鏡像是建立容器的基礎,相似虛擬機的快照,能夠理解爲是一個面向docker容器引擎的只讀模板,好比,一個鏡像能夠是一個完整的centos操做系統環境,稱爲一個centos鏡像;能夠是一個安裝了MySQL的應用程序,稱爲一個MySQL鏡像,等等。
docker提供了簡單的機制來建立和更新現有的鏡像,咱們也能夠從網上下載已經作好的應用鏡像來直接使用。shell
docker的容器是從鏡像建立的運行實例,它能夠被啓動、中止和刪除。所建立的每個容器都是相互隔離、互不可見,能夠保證安全性的平臺,能夠把容器看作一個簡易版的Linux環境,docker利用容器來運行和隔離應用。vim
docker倉庫是用來幾種保存鏡像的地方,當建立了本身的鏡像以後,可使用push命令將它上傳到共有倉庫或者私有倉庫,這樣一來當下次要在另外一臺機器上使用這個鏡像時,只須要從倉庫上拉去取下來就能夠了。centos
倉庫註冊服務器是存放倉庫的地方,其中包含了多個倉庫,每一個倉庫集中存放某一類鏡像,而且使用不一樣的標籤來區分他們。目前最大的公共倉庫是docker hub,存放了數量龐大的鏡像提供用戶下載使用。安全
docker默認的存儲目錄在/var/lib/docker,docker的鏡像、容器、日誌等內容所有都存儲在這裏,能夠單獨使用大容量的分區來存儲這些內容,而且通常選擇創建LVM邏輯卷,從而避免docker運行過程當中存儲目錄容量不足的問題。bash
安裝時,必須保證服務器配置可上網,或者自行配置本地yum源也能夠,服務器
[root@localhost ~]# yum -y install docker #直接安裝 [root@localhost ~]# systemctl start docker #啓動docker服務 [root@localhost ~]# systemctl enable docker #設置爲開機自啓動 [root@localhost ~]# docker version #查看安裝的docker版本
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建立並維護的鏡像,帶有用戶名爲前綴;是否主動建立資源則是指是否容許用戶驗證鏡像的來源和內容。
搜索到符合需求的鏡像,可使用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
會發現原來的鏡像還在,那麼刪除原來的鏡像試試吧!
使用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:fdc7ff6f265249a104f32f1d7aed0aedaf2f2fc62ea10eebf596e2af3b670477
當使用docker rmi命令後面跟上鏡像的ID號時,必須確保該鏡像沒有被容器使用才能進行,刪除時系統會先刪除掉全部指向該鏡像的標籤,而後刪除該鏡像文件自己,若是該鏡像已經被容器使用,正確的作法是先刪除依賴該鏡像的全部容器,再去刪除鏡像。
當須要把一臺機器上的鏡像遷移到另外一臺機器上的時候,須要將鏡像保存位本地文件,這一過程叫作導出鏡像,可使用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
將導出的鏡像從A機器複製到B機器,須要在B機器上使用該鏡像,就能夠將該導出文件導入到B機器中的鏡像庫中,這一過程叫作載入鏡像。
命令格式爲(從文件dhcp中載入鏡像導本地鏡像庫中):
[root@localhost ~]# docker load --input dhcp #或者 [root@localhost ~]# docker load < dhcp
本地存儲的鏡像愈來愈多,就須要指定一個專門存放這些鏡像的地方——倉庫,比較簡單的就是公共倉庫,默認上傳到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的另外一個核心概念,簡單來講,容器是鏡像的一個運行實例,是獨立運行的一個或一組應用及它們所必需的運行環境,包括文件系統、系統類庫、shell環境等。鏡像是隻讀模板,而容器會給這個只讀模板一個額外的可寫層。
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 ~]#
[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 root@192.168.1.1:/root/centos7dhcp /tmp #在另外一臺服務器進行復制 root@192.168.1.1'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
可使用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選項強制刪除,可是建議先將容器中止再進行刪除。
———————— 本文至此結束,感謝閱讀 ————————