Docker容器 筆記
相關(guān)知識(shí)介紹
什么是鏡像
鏡像是一種輕量級(jí),可執(zhí)行的獨(dú)立軟件包,它包含運(yùn)行某個(gè)軟件所需的所有內(nèi)容,我們把應(yīng)用程序和配置以來(lái)打包好形成一個(gè)可交付的運(yùn)行環(huán)境(包括代碼,運(yùn)行時(shí)需要的庫(kù),環(huán)境變量和配置文件等),這個(gè)打包好的運(yùn)行環(huán)境就是image鏡像文件。只有通過(guò)這個(gè)鏡像文件才能生成Docker容器實(shí)例(類(lèi)似Java中new出來(lái)一個(gè)對(duì)象)。
為什么Docker比較比VM快
(1)docker有著比虛擬機(jī)更少的抽象層。由亍docker不需要Hypervisor實(shí)現(xiàn)硬件資源虛擬化,運(yùn)行在docker容器上的程序直接使用的都是實(shí)際物理機(jī)的硬件資源。因此在CPU、內(nèi)存利用率上docker將會(huì)在效率上有明顯優(yōu)勢(shì)。
(2)docker利用的是宿主機(jī)的內(nèi)核,而不需要Guest OS。因此,當(dāng)新建一個(gè)容器時(shí),docker不需要和虛擬機(jī)一樣重新加載一個(gè)操作系統(tǒng)內(nèi)核。仍而避免引尋、加載操作系統(tǒng)內(nèi)核返個(gè)比較費(fèi)時(shí)費(fèi)資源的過(guò)程,當(dāng)新建一個(gè)虛擬機(jī)時(shí),虛擬機(jī)軟件需要加載Guest OS,返個(gè)新建過(guò)程是分鐘級(jí)別的。而docker由于直接利用宿主機(jī)的操作系統(tǒng),則省略了返個(gè)過(guò)程,因此新建一個(gè)docker容器只需要幾秒鐘。
常用命令
幫助啟動(dòng)類(lèi)啟動(dòng)命令
啟動(dòng)命令
systemctl start docker
關(guān)閉命令
systemctl start docker
開(kāi)機(jī)啟動(dòng)
systemctl enable docker
重啟
systemctl restart docker
停止
systemctl stop docker
卸載
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
幫助
docker --help
鏡像命令
列舉前5個(gè)
docker search --limit 5 redis
指定版本號(hào),獲取鏡像
docker pull redis:6.0.8
刪除命令
docker rmi 某個(gè)XXX鏡像名字ID
docker rmi -f 強(qiáng)制刪除某個(gè)XXX鏡像名字ID
docker rmi -f $(docker images -qa) 刪除全部
查看鏡像/容器/數(shù)據(jù)卷所占用的空間
docker system df
什么是虛懸鏡像
在Docker中,懸浮鏡像(也稱(chēng)為虛懸鏡像或懸掛鏡像)是指那些已經(jīng)創(chuàng)建但沒(méi)有被任何容器引用的鏡像。這些鏡像通常是在構(gòu)建新鏡像或刪除容器時(shí)產(chǎn)生的,它們是一些沒(méi)有被引用的中間層鏡像。
每次構(gòu)建鏡像時(shí),Docker會(huì)創(chuàng)建一系列的鏡像層,每一層代表鏡像的一個(gè)步驟或操作。如果在構(gòu)建過(guò)程中的某一步驟出現(xiàn)錯(cuò)誤,或者構(gòu)建后沒(méi)有將鏡像推送到遠(yuǎn)程倉(cāng)庫(kù),那么這些中間層就可能成為虛懸鏡像。此外,當(dāng)使用docker build命令構(gòu)建鏡像時(shí),如果新舊鏡像同名,舊鏡像名稱(chēng)被取消,也可能出現(xiàn)倉(cāng)庫(kù)名、標(biāo)簽均為none的鏡像,這類(lèi)無(wú)標(biāo)簽鏡像也被稱(chēng)為虛懸鏡像。
虛懸鏡像的特點(diǎn)是它們“懸浮”在Docker中,沒(méi)有被任何容器所使用,而且也不會(huì)被Docker清理工具自動(dòng)刪除。因此,需要手動(dòng)清理這些鏡像以釋放存儲(chǔ)空間??梢允褂胐ocker image prune或docker image rm命令來(lái)刪除虛懸鏡像。
容器命令
啟動(dòng)容器命令
OPTIONS說(shuō)明(常用):有些是一個(gè)減號(hào),有些是兩個(gè)減號(hào)
–name=“容器新名字”: 為容器指定一個(gè)名稱(chēng);
-d: 后臺(tái)運(yùn)行容器,并返回容器ID,也即啟動(dòng)守護(hù)式容器;
-i:以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用;
-t:為容器重新分配一個(gè)偽輸入終端,通常與 -i 同時(shí)使用;
-P: 隨機(jī)端口映射;
-p: 指定端口映射,有以下四種格式
ip:hostPort:containerPort //宿主機(jī)端口:容器端口
ip::containerPort…
以交互模式啟動(dòng)一個(gè)容器
使用鏡像centos:latest以交互模式啟動(dòng)一個(gè)容器,在容器內(nèi)執(zhí)行/bin/bash命令。
docker run -it centos /bin/bash
列出當(dāng)前所有正在運(yùn)行的容器
docker ps [OPTIONS]
退出容器
exit;
ctrl + q + p; 退出容器,但不會(huì)停止容器
強(qiáng)制停止容器(但不會(huì)刪除)
docker kill 容器ID或者容器名
刪除停止容器
docker rm 容器ID
docker rm -f $(docker ps -a -q)
一般情況下,我們希望docker的服務(wù)是在后臺(tái)運(yùn)行的,我們可以通過(guò) -d 指定容器的后臺(tái)運(yùn)行模式
docker run -d 容器名
使用鏡像centos:latest以后臺(tái)模式啟動(dòng)一個(gè)容器
docker run -d centos問(wèn)題:然后docker ps -a 進(jìn)行查看, 會(huì)發(fā)現(xiàn)容器已經(jīng)退出
很重要的要說(shuō)明的一點(diǎn): Docker容器后臺(tái)運(yùn)行,就必須有一個(gè)前臺(tái)進(jìn)程.
容器運(yùn)行的命令如果不是那些一直掛起的命令(比如運(yùn)行top,tail),就是會(huì)自動(dòng)退出的。這個(gè)是docker的機(jī)制問(wèn)題,比如你的web容器,我們以nginx為例,正常情況下,我們配置啟動(dòng)服務(wù)只需要啟動(dòng)響應(yīng)的service即可。例如
service nginx start
但是,這樣做,nginx為后臺(tái)進(jìn)程模式運(yùn)行,就導(dǎo)致docker前臺(tái)沒(méi)有運(yùn)行的應(yīng)用,這樣的容器后臺(tái)啟動(dòng)后,會(huì)立即自殺因?yàn)樗X(jué)得他沒(méi)事可做了。所以,最佳的解決方案是,將你要運(yùn)行的程序以前臺(tái)進(jìn)程的形式運(yùn)行,常見(jiàn)就是命令行模式,表示我還有交互操作,別中斷
docker run -it centos
docker run -d redis ????
查看日志
docker logs (有相關(guān)可視化工具 嘻嘻)
進(jìn)入正在運(yùn)行的容器并以命令行交互
docker exec -it 容器ID bashShell ==> docker exec -it ubuntu /bin/bash
重新進(jìn)入docker attach 容器ID
上述兩個(gè)區(qū)別
attach 直接進(jìn)入容器啟動(dòng)命令的終端,不會(huì)啟動(dòng)新的進(jìn)程,用exit退出,會(huì)導(dǎo)致容器的停止
exec 是在容器中打開(kāi)新的終端,并且可以啟動(dòng)新的進(jìn)程,用exit退出,不會(huì)導(dǎo)致容器的停止 推薦使用
從容器內(nèi)拷貝文件到主機(jī)上
docker cp 容器ID:容器內(nèi)路徑 目的主機(jī)路徑
docker cp 70e63eea3c61:/tmp/a.txt /opt/module/
導(dǎo)入和導(dǎo)出容器
export 導(dǎo)出容器的內(nèi)容留作為一個(gè)tar歸檔文件
import 從tar包中的內(nèi)容創(chuàng)建一個(gè)新的文件系統(tǒng)再導(dǎo)入為鏡像
案例
docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import -鏡像用戶(hù)/鏡像名:鏡像版本號(hào) (這里的版本號(hào)可以隨便寫(xiě),不影響程序)
聯(lián)合文件系統(tǒng)
UnionFS(聯(lián)合文件系統(tǒng)):Union文件系統(tǒng)(UnionFS)是一種分層、輕量級(jí)并且高性能的文件系統(tǒng),它支持對(duì)文件系統(tǒng)的修改作為一次提交來(lái)一層層的疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)。Union 文件系統(tǒng)是 Docker 鏡像的基礎(chǔ)。鏡像可以通過(guò)分層來(lái)進(jìn)行繼承,基于基礎(chǔ)鏡像(沒(méi)有父鏡像),可以制作各種具體的應(yīng)用鏡像。
特性:一次同時(shí)加載多個(gè)文件系統(tǒng),但從外面看起來(lái),只能看到一個(gè)文件系統(tǒng),聯(lián)合加載會(huì)把各層文件系統(tǒng)疊加起來(lái),這樣最終的文件系統(tǒng)會(huì)包含所有底層的文件和目錄
Docker鏡像加載原理:
docker的鏡像實(shí)際上由一層一層的文件系統(tǒng)組成,這種層級(jí)的文件系統(tǒng)UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導(dǎo)加載kernel, Linux剛啟動(dòng)時(shí)會(huì)加載bootfs文件系統(tǒng),在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的,包含boot加載器和內(nèi)核。當(dāng)boot加載完成之后整個(gè)內(nèi)核就都在內(nèi)存中了,此時(shí)內(nèi)存的使用權(quán)已由bootfs轉(zhuǎn)交給內(nèi)核,此時(shí)系統(tǒng)也會(huì)卸載bootfs。rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系統(tǒng)中的 /dev, /proc, /bin, /etc 等標(biāo)準(zhǔn)目錄和文件。rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如Ubuntu,Centos等等。
。
平時(shí)我們安裝進(jìn)虛擬機(jī)的CentOS都是好幾個(gè)G,為什么docker這里才200M??…最大的一個(gè)好處就是 - 共享資源,方便復(fù)制遷移,就是為了復(fù)用
比如:有多個(gè)鏡像都從相同的 base 鏡像構(gòu)建而來(lái),那么宿主機(jī)只需在磁盤(pán)上保存一份base鏡像,
同時(shí)內(nèi)存中也只需加載一份 base 鏡像,就可以為所有容器服務(wù)了。而且鏡像的每一層都可以被共享。Docker鏡像都是只讀的
當(dāng)容器啟動(dòng)時(shí),一個(gè)新的可寫(xiě)層被加載到鏡像的頂部。
這一層通常被稱(chēng)作“容器層”,“容器層”之下的都叫“鏡像層”。所有對(duì)容器的改動(dòng)-無(wú)論添加,刪除,還是修改文件都只會(huì)發(fā)生在容器層中。只有容器層是可寫(xiě)的,容器層下面的所有鏡像層都是只讀的。
Docker鏡像commit操作補(bǔ)充
-
apt-get update 更新linux包管理工具
-
apt-get -y install vim 安裝vim
-
docker commit提交容器副本使之成為一個(gè)新的鏡像: docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要?jiǎng)?chuàng)建的目標(biāo)鏡像名:[標(biāo)簽名]
docker commit -m=“add vim cmd” -a=“Eric” f98857dfb14b myubuntu:1.1
本地鏡像發(fā)布到阿里云
$ docker login --username=xxxx@qq.com xxxx.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/fly_rui/aliyun_yupi:[鏡像版本號(hào)]
$ docker push registry.cn-hangzhou.aliyuncs.com/fly_rui/aliyun:[鏡像版本號(hào)]
從Registry中拉取鏡像
$ docker pull registry.cn-hangzhou.aliyuncs.com/fly_rui/aliyun:v0.0.1
數(shù)據(jù)卷
是什么
先來(lái)看看Docker的理念:
- 將運(yùn)用與運(yùn)行的環(huán)境打包形成容器運(yùn)行 ,運(yùn)行可以伴隨著容器,但是我們對(duì)數(shù)據(jù)的要求希望是持久化的
- 容器之間希望有可能共享數(shù)據(jù)
Docker容器產(chǎn)生的數(shù)據(jù),如果不通過(guò)docker commit生成新的鏡像,使得數(shù)據(jù)做為鏡像的一部分保存下來(lái),
那么當(dāng)容器刪除后,數(shù)據(jù)自然也就沒(méi)有了。
為了能保存數(shù)據(jù)在docker中我們使用卷。
能干嘛
卷就是目錄或文件,存在于一個(gè)或多個(gè)容器中,由docker掛載到容器,但不屬于聯(lián)合文件系統(tǒng),因此能夠繞過(guò)Union File System提供一些用于持續(xù)存儲(chǔ)或共享數(shù)據(jù)的特性:
卷的設(shè)計(jì)目的就是數(shù)據(jù)的持久化,完全獨(dú)立于容器的生存周期,因此Docker不會(huì)在容器刪除時(shí)刪除其掛載的數(shù)據(jù)卷
特點(diǎn):
1:數(shù)據(jù)卷可在容器之間共享或重用數(shù)據(jù)
2:卷中的更改可以直接(實(shí)時(shí))生效
3:數(shù)據(jù)卷中的更改不會(huì)包含在鏡像的更新中
4:數(shù)據(jù)卷的生命周期一直持續(xù)到?jīng)]有容器使用它為止
容器的持久化
容器間繼承+共享數(shù)據(jù)
就相當(dāng)于一個(gè)共享文件夾
容器內(nèi)添加
直接命令添加
docker run -it -v /宿主機(jī)目錄:/容器內(nèi)目錄 centos /bin/bash //“:”代表映射:容器內(nèi)的數(shù)據(jù)備份+持久化到本地主機(jī)目錄 一個(gè)v可以?huà)燧d多個(gè)
權(quán)限管理
讀寫(xiě)(默認(rèn))
docker run -it -v /宿主機(jī)目錄:/容器內(nèi)目錄:rw centos /bin/bash
只讀(容器內(nèi)部只讀)
docker run -it -v /宿主機(jī)目錄:/容器內(nèi)目錄:ro centos /bin/bash
容器卷之間的繼承
docker run -it --privileged=true -v /opt/module/host_data:/tmp/docker_data --name=u1 ubuntu
docker run -it --privileged=true -volumes-from u1 --name u2 ubuntu
查看容器掛載目錄
docker inspect 容器ID
安裝MySQL
簡(jiǎn)單版
docker pull mysql
docker run -p 12345:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker exec -it a02dcc3c20a2 /bin/bash
mysql -uroot -p123456
這樣我們就有了一個(gè)容器版的MySQL
docker run -d -p 12345:3306 --name mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs -v /zzyyuse/mysql/data:/var/lib/mysql -e MYSQLROOTPASSWORD=123456 -d mysql:5.7
命令說(shuō)明:
-d 后臺(tái)運(yùn)行
-p 12345:3306:將主機(jī)的12345端口映射到docker容器的3306端口。
–name mysql:運(yùn)行服務(wù)名字
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d :將主機(jī)/zzyyuse/mysql錄下的conf/my.cnf 掛載到容器的 /etc/mysql/conf.d-v /zzyyuse/mysql/data:/var/lib/mysql
-v /zzyyuse/mysql/logs:/logs:將主機(jī)/zzyyuse/mysql目錄下的 logs 目錄掛載到容器的 /logs。
-e MYSQLROOTPASSWORD=123456 以root用戶(hù)啟動(dòng)并設(shè)置密碼為123456
安裝redis
下載最新的 redis 鏡像
docker pull redis文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-835204.html
啟動(dòng)鏡像
docker run -p 6379:6379 -v /opt/module/redis/data:/data -v /opt/module/conf/redis.conf:/etc/redis/redis.conf -d redis:6.0.8 redis-server /etc/redis/redis.conf --appendonly yes文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-835204.html
到了這里,關(guān)于Docker 學(xué)習(xí)指南1的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!