您好,登錄后才能下訂單哦!
博文大綱:
- 一、docker簡介
- 二、docker的三大核心概念
1、鏡像
2、容器
3、倉庫- 三、安裝及docker的基礎(chǔ)操作
1、安裝及啟動
2、docker的鏡像操作
3、docker的容器操作
Docker作為開源社區(qū)最火爆的項目,它是在Linux容器里運行應用的開源工具,是一種輕量級的“虛擬機”,docker的全部源代碼都在https://github.com/docker 進行相關(guān)維護,其官網(wǎng)是:https://www.docker.com 。
docker之所以擁有眾多優(yōu)勢,與操作系統(tǒng)虛擬化自身的特點是分不開的,傳統(tǒng)虛擬機需要有額外的虛擬機管理程序和虛擬機操作系統(tǒng)層,而docker是直接在操作系統(tǒng)層面之上實現(xiàn)的虛擬化,二者的工作示意圖如下:
docker和虛擬機的區(qū)別如下:
docker的鏡像是創(chuàng)建容器的基礎(chǔ),類似虛擬機的快照,可以理解為是一個面向docker容器引擎的只讀模板,比如,一個鏡像可以是一個完整的centos操作系統(tǒng)環(huán)境,稱為一個centos鏡像;可以是一個安裝了MySQL的應用程序,稱為一個MySQL鏡像,等等。
docker提供了簡單的機制來創(chuàng)建和更新現(xiàn)有的鏡像,我們也可以從網(wǎng)上下載已經(jīng)做好的應用鏡像來直接使用。
docker的容器是從鏡像創(chuàng)建的運行實例,它可以被啟動、停止和刪除。所創(chuàng)建的每一個容器都是相互隔離、互不可見,可以保證安全性的平臺,可以把容器看做一個簡易版的Linux環(huán)境,docker利用容器來運行和隔離應用。
docker倉庫是用來幾種保存鏡像的地方,當創(chuàng)建了自己的鏡像之后,可以使用push命令將它上傳到共有倉庫或者私有倉庫,這樣一來當下次要在另一臺機器上使用這個鏡像時,只需要從倉庫上拉去取下來就可以了。
倉庫注冊服務器是存放倉庫的地方,其中包含了多個倉庫,每個倉庫集中存放某一類鏡像,并且使用不同的標簽來區(qū)分他們。目前最大的公共倉庫是docker hub,存放了數(shù)量龐大的鏡像提供用戶下載使用。
docker默認的存儲目錄在/var/lib/docker,docker的鏡像、容器、日志等內(nèi)容全部都存儲在這里,可以單獨使用大容量的分區(qū)來存儲這些內(nèi)容,并且一般選擇建立LVM邏輯卷,從而避免docker運行過程中存儲目錄容量不足的問題。
安裝時,必須保證服務器配置可上網(wǎng),或者自行配置本地yum源也可以,
[root@localhost ~]# yum -y install docker #直接安裝
[root@localhost ~]# systemctl start docker #啟動docker服務
[root@localhost ~]# systemctl enable docker #設(shè)置為開機自啟動
[root@localhost ~]# docker version #查看安裝的docker版本
docker運行容器前需要本地存在相應的鏡像,如果不存在本地鏡像,docker就會嘗試從默認鏡像倉庫https://hub.docker.com/ 進行查找。
[root@localhost ~]# docker search dhcp #以DHCP作為關(guān)鍵字進行搜索鏡像
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]
.................#省略部分內(nèi)容
返回很多包含DHCP關(guān)鍵字的鏡像,其中返回的信息包括鏡像名稱(NAME)、描述(DESCRIPTION)、星級(STARS)、是否官方創(chuàng)建(OFFICIAL)、是否主動創(chuàng)建(AUTOMATED)。默認的輸出結(jié)果會按照星級評價進行排序,表示該鏡像的受歡迎程度,在下載鏡像時,可以參考這一項,星級越高表示越受歡迎;是否為官方鏡像一項是指是否由官方項目組創(chuàng)建和維護的鏡像,一般官方項目組維護的鏡像使用單個單詞作為鏡像名稱,我們稱為基礎(chǔ)鏡像或者根鏡像。如/reinblau/dhcp這種命名方式的鏡像,表示是由docker hub的用戶reinblau創(chuàng)建并維護的鏡像,帶有用戶名為前綴;是否主動創(chuàng)建資源則是指是否允許用戶驗證鏡像的來源和內(nèi)容。
搜索到符合需求的鏡像,可以使用docker pull命令從網(wǎng)絡(luò)下載鏡像到本地使用。
命令格式:docker pull 倉庫名稱[:標簽]
對于docker鏡像來說,如果下載鏡像時不指定標簽,則默認會下載倉庫中最新版本的鏡像,即選擇標簽為latest,也可通過指定的標簽來下載特定版本的某一鏡像。這里標簽就是用來區(qū)分鏡像版本的。
如下,下載一個鏡像
[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:鏡像創(chuàng)建的時間;
#SIZE:鏡像的大小
用戶還可以根據(jù)鏡像的唯一標識ID號,獲取鏡像的詳細信息。命令如下:
[root@localhost ~]# docker inspect 52cbff801df2 #獲取鏡像的詳細信息
#鏡像的詳細信息中包括創(chuàng)建時間、系統(tǒng)版本、主機名、域名、用戶、卷、標簽、操作系統(tǒng)、設(shè)備ID等各種信息。
#為了在后續(xù)的工作使用這個鏡像,可以用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
會發(fā)現(xiàn)原來的鏡像還在,那么刪除原來的鏡像試試吧!
使用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號時,必須確保該鏡像沒有被容器使用才能進行,刪除時系統(tǒng)會先刪除掉所有指向該鏡像的標簽,然后刪除該鏡像文件本身,如果該鏡像已經(jīng)被容器使用,正確的做法是先刪除依賴該鏡像的所有容器,再去刪除鏡像。
當需要把一臺機器上的鏡像遷移到另一臺機器上的時候,需要將鏡像保存位本地文件,這一過程叫做導出鏡像,可以使用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
#在這里登錄上傳時,報錯,發(fā)現(xiàn)是因為鏡像的倉庫名稱有問題,根據(jù)提示改了下倉庫名稱,就上傳成功了
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的另一個核心概念,簡單來說,容器是鏡像的一個運行實例,是獨立運行的一個或一組應用及它們所必需的運行環(huán)境,包括文件系統(tǒng)、系統(tǒng)類庫、shell環(huán)境等。鏡像是只讀模板,而容器會給這個只讀模板一個額外的可寫層。
docker的創(chuàng)建就是將鏡像加載到容器的過程,docker的容器十分輕量級,用戶可以隨時創(chuàng)建或者刪除。新創(chuàng)建的容器默認處于停止狀態(tài),不運行任何程序,需要在其中一個發(fā)起一個進程來啟動容器,這個進程是該容器的唯一進程,所以當該進程結(jié)束的時候,容器也會完全停止。停止的容器可以重新啟動并保留原來的修改??梢允褂胐ocker create 命令新建一個容器。
1)創(chuàng)建容器
命令如下(-i:表示讓容器的輸入保持打開,就是容器一直運行;-t:是讓docker分配一個偽終端):
[root@localhost ~]# docker create -it dchp:dhcp /bin/bash #創(chuàng)建一個容器,并指定偽終端
2304f92a815800305804987bcb2ee20aca5f4d651d577427c476554d54171f2d
#如果此刻創(chuàng)建容器命令報錯“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命令重啟網(wǎng)絡(luò)服務即可
[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號、加載的鏡像、運行的程序、創(chuàng)建時間、目前所處的狀態(tài)、端口映射、容器名稱等。
#上面查出的狀態(tài)一欄是create表示當前的容器是新創(chuàng)建的并處于停止狀態(tài)。
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 #再查詢?nèi)萜鞯臓顟B(tài),會發(fā)現(xiàn)狀態(tài)欄變成了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 #再次查看狀態(tài),會發(fā)現(xiàn)狀態(tài)欄變成了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 #查看這個容器的根目錄,可以看到進入容器后命令提示符發(fā)生了變化
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 #查詢?nèi)萜鞯腎D號
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
.............#省略部分內(nèi)容
[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命令將一個已經(jīng)終止狀態(tài)的容器進行刪除。
[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選項強制刪除,但是建議先將容器停止再進行刪除。
———————— 本文至此結(jié)束,感謝閱讀 ————————
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。