筆記整理來源 B站UP主狂神說Javahttps://space.bilibili.com/95256449/
<<三體>>: 弱小和無知不是生存的障礙,傲慢才是。
即使再小的帆笤成,就往死里學(xué)
Docker 學(xué)習(xí)
- Docker 概述
- Docker安裝
- Docker命令
- 鏡像命令
- 容器命令
- 操作命令
- 。轰异。憔古。
- Docker鏡像
- 容器數(shù)據(jù)卷
- DockerFile
- Docker網(wǎng)絡(luò)原理
- IDEA整合Docker(單機Docker)
- Docker Compose
- Docker Swarm
- CI\CD Jenkins
Docker概述
Docker為什么出現(xiàn)?
一款產(chǎn)品: 開發(fā)–上線 兩套環(huán)境鲜滩!應(yīng)用環(huán)境伴鳖,應(yīng)用配置!
開發(fā) — 運維徙硅。 問題:我在我的電腦上可以允許榜聂!版本更新,導(dǎo)致服務(wù)不可用嗓蘑!對于運維來說考驗十分大须肆?
環(huán)境配置是十分的麻煩匿乃,每一個及其都要部署環(huán)境(集群Redis、ES豌汇、Hadoop…) !費事費力幢炸。
發(fā)布一個項目( jar + (Redis MySQL JDK ES) ),項目能不能帶上環(huán)境安裝打包!
之前在服務(wù)器配置一個應(yīng)用的環(huán)境 Redis MySQL JDK ES Hadoop 配置超麻煩了瘤礁,不能夠跨平臺阳懂。
開發(fā)環(huán)境Windows,最后發(fā)布到Linux柜思!
傳統(tǒng):開發(fā)jar岩调,運維來做!
現(xiàn)在:開發(fā)打包部署上線赡盘,一套流程做完号枕!
安卓流程:java — apk —發(fā)布(應(yīng)用商店)一 張三使用apk一安裝即可用!
docker流程: java-jar(環(huán)境) — 打包項目帯上環(huán)境(鏡像) — ( Docker倉庫:商店)-----
Docker給以上的問題陨享,提出了解決方案葱淳!
[圖片上傳失敗...(image-f56e3e-1599841040576)]
Docker的思想就來自于集裝箱!
JRE – 多個應(yīng)用(端口沖突) – 原來都是交叉的抛姑!
隔離:Docker核心思想赞厕!打包裝箱!每個箱子是互相隔離的定硝。
Docker通過隔離機制皿桑,可以將服務(wù)器利用到極致!
本質(zhì):所有的技術(shù)都是因為出現(xiàn)了一些問題蔬啡,我們需要去解決诲侮,才去學(xué)習(xí)!
Docker歷史
2010年箱蟆,幾個的年輕人沟绪,就在美國成立了一家公司 dotcloud
做一些pass的云計算服務(wù)!LXC(Linux Container容器)有關(guān)的容器技術(shù)空猜!
Linux Container容器是一種內(nèi)核虛擬化技術(shù)绽慈,可以提供輕量級的虛擬化,以便隔離進(jìn)程和資源辈毯。
他們將自己的技術(shù)(容器化技術(shù))命名就是 Docker
Docker剛剛延生的時候坝疼,沒有引起行業(yè)的注意!dotCloud
漓摩,就活不下去裙士!
開源
2013年,Docker開源管毙!
越來越多的人發(fā)現(xiàn)docker的優(yōu)點腿椎!火了桌硫。Docker每個月都會更新一個版本!
2014年4月9日啃炸,Docker1.0發(fā)布铆隘!
docker為什么這么火?十分的輕巧南用!
在容器技術(shù)出來之前膀钠,我們都是使用虛擬機技術(shù)!
虛擬機:在window中裝一個VMware裹虫,通過這個軟件我們可以虛擬出來一臺或者多臺電腦肿嘲!笨重!
虛擬機也屬于虛擬化技術(shù)筑公,Docker容器技術(shù)雳窟,也是一種虛擬化技術(shù)!
vm : linux centos 原生鏡像(一個電腦O宦拧) 隔離封救、需要開啟多個虛擬機! 幾個G 幾分鐘
docker: 隔離捣作,鏡像(最核心的環(huán)境 4m + jdk + mysql)十分的小巧誉结,運行鏡像就可以了!小巧券躁! 幾個M 秒級啟動惩坑!
聊聊Docker
Docker基于Go語言開發(fā)的!開源項目嘱朽!
docker官網(wǎng):https://www.docker.com/
文檔:https://docs.docker.com/ Docker的文檔是超級詳細(xì)的旭贬!
Docker能干嘛
之前的虛擬機技術(shù)怔接!
[圖片上傳失敗...(image-798a35-1599841040575)]
虛擬機技術(shù)缺點:
1搪泳、 資源占用十分多
2、 冗余步驟多
3扼脐、 啟動很慢岸军!
容器化技術(shù)
容器化技術(shù)不是模擬一個完整的操作系統(tǒng)
[圖片上傳失敗...(image-e454b1-1599841040575)]
比較Docker和虛擬機技術(shù)的不同:
- 傳統(tǒng)虛擬機,虛擬出一條硬件瓦侮,運行一個完整的操作系統(tǒng)艰赞,然后在這個系統(tǒng)上安裝和運行軟件
- 容器內(nèi)的應(yīng)用直接運行在宿主機的內(nèi)容,容器是沒有自己的內(nèi)核的肚吏,也沒有虛擬我們的硬件方妖,所以就輕便了
- 每個容器間是互相隔離,每個容器內(nèi)都有一個屬于自己的文件系統(tǒng)罚攀,互不影響
DevOps(開發(fā)党觅、運維)
應(yīng)用更快速的交付和部署
傳統(tǒng):一對幫助文檔雌澄,安裝程序。
Docker:打包鏡像發(fā)布測試一鍵運行杯瞻。
更便捷的升級和擴縮容
使用了 Docker之后镐牺,我們部署應(yīng)用就和搭積木一樣
項目打包為一個鏡像,擴展服務(wù)器A魁莉!服務(wù)器B
更簡單的系統(tǒng)運維
在容器化之后睬涧,我們的開發(fā),測試環(huán)境都是高度一致的
更高效的計算資源利用
Docker是內(nèi)核級別的虛擬化旗唁,可以在一個物理機上可以運行很多的容器實例畦浓!服務(wù)器的性能可以被壓榨到極致。
Docker安裝
Docker的基本組成
[圖片上傳失敗...(image-f9af32-1599841040583)]
鏡像(image):
docker鏡像就好比是一個目標(biāo)检疫,可以通過這個目標(biāo)來創(chuàng)建容器服務(wù)宅粥,tomcat鏡像==>run==>容器(提供服務(wù)器),通過這個鏡像可以創(chuàng)建多個容器(最終服務(wù)運行或者項目運行就是在容器中的)电谣。
容器(container):
Docker利用容器技術(shù)秽梅,獨立運行一個或者一組應(yīng)用,通過鏡像來創(chuàng)建的.
啟動剿牺,停止企垦,刪除缚甩,基本命令
目前就可以把這個容器理解為就是一個簡易的 Linux系統(tǒng)即硼。
倉庫(repository):
倉庫就是存放鏡像的地方!
倉庫分為公有倉庫和私有倉庫夕春。(很類似git)
Docker Hub是國外的湃崩。
阿里云…都有容器服務(wù)器(配置鏡像加速!)
安裝Docker
環(huán)境準(zhǔn)備
Linux要求內(nèi)核3.0以上
? ~ uname -r
4.15.0-96-generic # 要求3.0以上
? ~ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
安裝
幫助文檔:https://docs.docker.com/engine/install/
#1.卸載舊版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2.需要的安裝包
yum install -y yum-utils
#3.設(shè)置鏡像的倉庫
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#默認(rèn)是從國外的荧降,不推薦
#推薦使用國內(nèi)的
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum軟件包索引
yum makecache fast
#4.安裝docker相關(guān)的 docker-ce 社區(qū)版 而ee是企業(yè)版
yum install docker-ce docker-ce-cli containerd.io
#5、啟動docker
docker systemctl start docker
#6\. 使用docker version查看是否按照成功
docker version
#7\. 測試
docker run hello-world
#7\. 測試
? ~ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1\. The Docker client contacted the Docker daemon.
2\. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3\. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4\. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
#8.查看一下下載的鏡像
? ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 4 months ago 13.3kB
了解:卸載docker
#1\. 卸載依賴
yum remove docker-ce docker-ce-cli containerd.io
#2\. 刪除資源
rm -rf /var/lib/docker
# /var/lib/docker 是docker的默認(rèn)工作路徑攒读!
阿里云鏡像加速
1朵诫、登錄阿里云找到容器服務(wù)
[圖片上傳失敗...(image-6b31a3-1599841040574)]
2、找到鏡像加速器
[圖片上傳失敗...(image-95ef5-1599841040574)]
3薄扁、配置使用
[圖片上傳失敗...(image-db6122-1599841040574)]
回顧HelloWorld流程
[圖片上傳失敗...(image-5c57bb-1599841040574)]
docker run 流程圖
[圖片上傳失敗...(image-bf3c98-1599841040574)]
底層原理
Docker是怎么工作的剪返?
Docker是一個Client-Server結(jié)構(gòu)的系統(tǒng),Docker的守護(hù)進(jìn)程運行在主機上邓梅。通過Socket從客戶端訪問脱盲!
Docker-Server接收到Docker-Client的指令,就會執(zhí)行這個命令日缨!
為什么Docker比Vm快
1钱反、docker有著比虛擬機更少的抽象層。由于docker不需要Hypervisor實現(xiàn)硬件資源虛擬化,運行在docker容器上的程序直接使用的都是實際物理機的硬件資源。因此在CPU面哥、內(nèi)存利用率上docker將會在效率上有明顯優(yōu)勢乙各。
2、docker利用的是宿主機的內(nèi)核,而不需要Guest OS幢竹。
GuestOS: VM(虛擬機)里的的系統(tǒng)(OS);
HostOS:物理機里的系統(tǒng)(OS)耳峦;
[圖片上傳失敗...(image-64cdc1-1599841040574)]
因此,當(dāng)新建一個 容器時,docker不需要和虛擬機一樣重新加載一個操作系統(tǒng)內(nèi)核。仍而避免引導(dǎo)焕毫、加載操作系統(tǒng)內(nèi)核返個比較費時費資源的過程,當(dāng)新建一個虛擬機時,虛擬機軟件需要加載GuestOS,返個新建過程是分鐘級別的蹲坷。而docker由于直接利用宿主機的操作系統(tǒng),則省略了這個復(fù)雜的過程,因此新建一個docker容器只需要幾秒鐘。
Docker的常用命令
幫助命令
docker version #顯示docker的版本信息邑飒。
docker info #顯示docker的系統(tǒng)信息循签,包括鏡像和容器的數(shù)量
docker 命令 --help #幫助命令
幫助文檔的地址:https://docs.docker.com/engine/reference/commandline/build/
鏡像命令
docker images #查看所有本地主機上的鏡像 可以使用docker image ls代替
docker search 搜索鏡像
docker pull 下載鏡像 docker image pull
docker rmi 刪除鏡像 docker image rm
docker images 查看所有本地的主機上的鏡像
? ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 e73346bdf465 24 hours ago 448MB
# 解釋
#REPOSITORY # 鏡像的倉庫源
#TAG # 鏡像的標(biāo)簽
#IMAGE ID # 鏡像的id
#CREATED # 鏡像的創(chuàng)建時間
#SIZE # 鏡像的大小
# 可選項
Options:
-a, --all Show all images (default hides intermediate images) #列出所有鏡像
-q, --quiet Only show numeric IDs # 只顯示鏡像的id
? ~ docker images -aq #顯示所有鏡像的id
e73346bdf465
d03312117bb0
d03312117bb0
602e111c06b6
2869fc110bf7
470671670cac
bf756fb1ae65
5acf0e8da90b
docker search 搜索鏡像
? ~ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9500 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3444 [OK]
# --filter=STARS=3000 #搜索出來的鏡像就是STARS大于3000的
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
? ~ docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9500 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3444 [OK]
docker pull 下載鏡像
# 下載鏡像 docker pull 鏡像名[:tag]
? ~ docker pull tomcat:8
8: Pulling from library/tomcat #如果不寫tag,默認(rèn)就是latest
90fe46dd8199: Already exists #分層下載: docker image 的核心 聯(lián)合文件系統(tǒng)
35a4f1977689: Already exists
bbc37f14aded: Already exists
74e27dc593d4: Already exists
93a01fbfad7f: Already exists
1478df405869: Pull complete
64f0dd11682b: Pull complete
68ff4e050d11: Pull complete
f576086003cf: Pull complete
3b72593ce10e: Pull complete
Digest: sha256:0c6234e7ec9d10ab32c06423ab829b32e3183ba5bf2620ee66de866df640a027 # 簽名 防偽
Status: Downloaded newer image for tomcat:8
docker.io/library/tomcat:8 #真實地址
#等價于
docker pull tomcat:8
docker pull docker.io/library/tomcat:8
docker rmi 刪除鏡像
? ~ docker rmi -f 鏡像id #刪除指定的鏡像
? ~ docker rmi -f 鏡像id 鏡像id 鏡像id 鏡像id#刪除指定的鏡像
? ~ docker rmi -f $(docker images -aq) #刪除全部的鏡像
容器命令
docker run 鏡像id 新建容器并啟動
docker ps 列出所有運行的容器 docker container list
docker rm 容器id 刪除指定容器
docker start 容器id #啟動容器
docker restart 容器id #重啟容器
docker stop 容器id #停止當(dāng)前正在運行的容器
docker kill 容器id #強制停止當(dāng)前容器
說明:我們有了鏡像才可以創(chuàng)建容器疙咸,Linux县匠,下載centos鏡像來學(xué)習(xí)
? ~ docker container
Usage: docker container COMMAND
Manage containers
Commands:
attach Attach local standard input, output, and error streams to a running container
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
exec Run a command in a running container
export Export a container's filesystem as a tar archive
inspect Display detailed information on one or more containers
kill Kill one or more running containers
logs Fetch the logs of a container
ls List containers
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
prune Remove all stopped containers
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
run Run a command in a new container
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes
Run 'docker container COMMAND --help' for more information on a command.
新建容器并啟動
docker run [可選參數(shù)] image | docker container run [可選參數(shù)] image
#參書說明
--name="Name" 容器名字 tomcat01 tomcat02 用來區(qū)分容器
-d 后臺方式運行
-it 使用交互方式運行,進(jìn)入容器查看內(nèi)容
-p 指定容器的端口 -p 8080(宿主機):8080(容器)
-p ip:主機端口:容器端口
-p 主機端口:容器端口(常用)
-p 容器端口
容器端口
-P(大寫) 隨機指定端口
# 測試撒轮、啟動并進(jìn)入容器
? ~ docker run -it centos /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
8a29a15cefae: Already exists
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
[root@95039813da8d /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@95039813da8d /]# exit #從容器退回主機
exit
? ~ ls
shell user.txt
列出所有運行的容器
#docker ps命令 #列出當(dāng)前正在運行的容器
-a, --all Show all containers (default shows just running)
-n, --last int Show n last created containers (includes all states) (default -1)
-q, --quiet Only display numeric IDs
? ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68729e9654d4 portainer/portainer "/portainer" 14 hours ago Up About a minute 0.0.0.0:8088->9000/tcp funny_curie
d506a017e951 nginx "nginx -g 'daemon of…" 15 hours ago Up 15 hours 0.0.0.0:3344->80/tcp nginx01
? ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95039813da8d centos "/bin/bash" 3 minutes ago Exited (0) 2 minutes ago condescending_pike
1e46a426a5ba tomcat "catalina.sh run" 11 minutes ago Exited (130) 9 minutes ago sweet_gould
14bc9334d1b2 bf756fb1ae65 "/hello" 3 hours ago Exited (0) 3 hours ago amazing_stonebraker
f10d60f473f5 bf756fb1ae65 "/hello" 3 hours ago Exited (0) 3 hours ago dreamy_germain
68729e9654d4 portainer/portainer "/portainer" 14 hours ago Up About a minute 0.0.0.0:8088->9000/tcp funny_curie
677cde5e4f1d elasticsearch "/docker-entrypoint.…" 15 hours ago Exited (143) 8 minutes ago elasticsearch
33eb3f70b4db tomcat "catalina.sh run" 15 hours ago Exited (143) 8 minutes ago tomcat01
d506a017e951 nginx "nginx -g 'daemon of…" 15 hours ago Up 15 hours 0.0.0.0:3344->80/tcp nginx01
24ce2db02e45 centos "/bin/bash" 16 hours ago Exited (0) 15 hours ago hopeful_faraday
42267d1ad80b bf756fb1ae65 "/hello" 16 hours ago Exited (0) 16 hours ago ecstatic_sutherland
? ~ docker ps -aq
95039813da8d
1e46a426a5ba
14bc9334d1b2
f10d60f473f5
68729e9654d4
677cde5e4f1d
33eb3f70b4db
d506a017e951
24ce2db02e45
42267d1ad80b
退出容器
exit #容器直接退出
ctrl +P +Q #容器不停止退出
刪除容器
docker rm 容器id #刪除指定的容器乞旦,不能刪除正在運行的容器,如果要強制刪除 rm -rf
docker rm -f $(docker ps -aq) #刪除指定的容器
docker ps -a -q|xargs docker rm #刪除所有的容器
啟動和停止容器的操作
docker start 容器id #啟動容器
docker restart 容器id #重啟容器
docker stop 容器id #停止當(dāng)前正在運行的容器
docker kill 容器id #強制停止當(dāng)前容器
常用其他命令
后臺啟動命令
# 命令 docker run -d 鏡像名
? ~ docker run -d centos
a8f922c255859622ac45ce3a535b7a0e8253329be4756ed6e32265d2dd2fac6c
? ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 問題docker ps. 發(fā)現(xiàn)centos 停止了
# 常見的坑题山,docker容器使用后臺運行兰粉,就必須要有要一個前臺進(jìn)程,docker發(fā)現(xiàn)沒有應(yīng)用顶瞳,就會自動停止
# nginx玖姑,容器啟動后,發(fā)現(xiàn)自己沒有提供服務(wù)慨菱,就會立刻停止焰络,就是沒有程序了
查看日志
docker logs --help
Options:
--details Show extra details provided to logs
* -f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
* --tail string Number of lines to show from the end of the logs (default "all")
* -t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
? ~ docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #模擬日志
#顯示日志
-tf #顯示日志信息(一直更新)
--tail number #需要顯示日志條數(shù)
docker logs -t --tail n 容器id #查看n行日志
docker logs -ft 容器id #跟著日志
查看容器中進(jìn)程信息 ps
# 命令 docker top 容器id
[圖片上傳失敗...(image-abffa5-1599841040572)]
查看鏡像的元數(shù)據(jù)
# 命令
docker inspect 容器id
#測試
? ~ docker inspect 55321bcae33d
[
{
"Id": "55321bcae33d15da8280bcac1d2bc1141d213bcc8f8e792edfd832ff61ae5066",
"Created": "2020-05-15T05:22:05.515909071Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo 6666;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 22973,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-05-15T05:22:06.165904633Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:470671670cac686c7cf0081e0b37da2e9f4f768ddc5f6a26102ccd1c6954c1ee",
"ResolvConfPath": "/var/lib/docker/containers/55321bcae33d15da8280bcac1d2bc1141d213bcc8f8e792edfd832ff61ae5066/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/55321bcae33d15da8280bcac1d2bc1141d213bcc8f8e792edfd832ff61ae5066/hostname",
"HostsPath": "/var/lib/docker/containers/55321bcae33d15da8280bcac1d2bc1141d213bcc8f8e792edfd832ff61ae5066/hosts",
"LogPath": "/var/lib/docker/containers/55321bcae33d15da8280bcac1d2bc1141d213bcc8f8e792edfd832ff61ae5066/55321bcae33d15da8280bcac1d2bc1141d213bcc8f8e792edfd832ff61ae5066-json.log",
"Name": "/bold_bell",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "docker-default",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Capabilities": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/1f347949ba49c4dbee70cea9ff3af39a14e602bc8fac8331c46347bf6708757a-init/diff:/var/lib/docker/overlay2/5afcd8220c51854a847a36f52775b4ed0acb16fe6cfaec3bd2e5df59863835ba/diff",
"MergedDir": "/var/lib/docker/overlay2/1f347949ba49c4dbee70cea9ff3af39a14e602bc8fac8331c46347bf6708757a/merged",
"UpperDir": "/var/lib/docker/overlay2/1f347949ba49c4dbee70cea9ff3af39a14e602bc8fac8331c46347bf6708757a/diff",
"WorkDir": "/var/lib/docker/overlay2/1f347949ba49c4dbee70cea9ff3af39a14e602bc8fac8331c46347bf6708757a/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "55321bcae33d",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"while true;do echo 6666;sleep 1;done"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200114",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS",
"org.opencontainers.image.created": "2020-01-14 00:00:00-08:00",
"org.opencontainers.image.licenses": "GPL-2.0-only",
"org.opencontainers.image.title": "CentOS Base Image",
"org.opencontainers.image.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "63ed0c837f35c12453bae9661859f37a08541a0749afb86e881869bf6fd9031b",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/63ed0c837f35",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "b129d9a5a2cbb92722a2101244bd81a9e3d8af034e83f338c13790a1a94552a1",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.4",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:04",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "ad5ada6a106f5ba3dda9ce4bc1475a4bb593bf5f7fbead72196e66515e8ac36a",
"EndpointID": "b129d9a5a2cbb92722a2101244bd81a9e3d8af034e83f338c13790a1a94552a1",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.4",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:04",
"DriverOpts": null
}
}
}
}
]
? ~
進(jìn)入當(dāng)前正在運行的容器
# 我們通常容器都是使用后臺方式運行的,需要進(jìn)入容器符喝,修改一些配置
# 命令
docker exec -it 容器id bashshell
#測試
? ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55321bcae33d centos "/bin/sh -c 'while t…" 10 minutes ago Up 10 minutes bold_bell
a7215824a4db centos "/bin/sh -c 'while t…" 13 minutes ago Up 13 minutes zen_kepler
55a31b3f8613 centos "/bin/bash" 15 minutes ago Up 15 minutes lucid_clarke
? ~ docker exec -it 55321bcae33d /bin/bash
[root@55321bcae33d /]#
[圖片上傳失敗...(image-50485c-1599841040571)]
# 方式二
docker attach 容器id
#測試
docker attach 55321bcae33d
正在執(zhí)行當(dāng)前的代碼...
區(qū)別
#docker exec #進(jìn)入當(dāng)前容器后開啟一個新的終端闪彼,可以在里面操作。(常用)
#docker attach # 進(jìn)入容器正在執(zhí)行的終端
[圖片上傳失敗...(image-443665-1599841040571)]
從容器內(nèi)拷貝到主機上
docker cp 容器id:容器內(nèi)路徑 主機目的路徑
#進(jìn)入docker容器內(nèi)部
? ~ docker exec -it 55321bcae33d /bin/bash
[root@55321bcae33d /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
#新建一個文件
[root@55321bcae33d /]# echo "hello" > java.java
[root@55321bcae33d /]# cat java.java
hello
[root@55321bcae33d /]# exit
exit
? ~ docker cp 55321bcae33d:/java.java / #拷貝
? ~ cd /
? / ls #可以看見java.java存在
bin home lib mnt run sys vmlinuz
boot initrd.img lib64 opt sbin tmp vmlinuz.old
dev initrd.img.old lost+found proc srv usr wget-log
etc java.java media root swapfile var
學(xué)習(xí)方式:將我的所有筆記敲一遍洲劣,自己記錄筆記备蚓!
小結(jié):
[圖片上傳失敗...(image-4606f6-1599841040578)]
attach Attach local standard input, output, and error streams to a running container
#當(dāng)前shell下 attach連接指定運行的鏡像
build Build an image from a Dockerfile # 通過Dockerfile定制鏡像
commit Create a new image from a container's changes #提交當(dāng)前容器為新的鏡像
cp Copy files/folders between a container and the local filesystem #拷貝文件
create Create a new container #創(chuàng)建一個新的容器
diff Inspect changes to files or directories on a container's filesystem #查看docker容器的變化
events Get real time events from the server # 從服務(wù)獲取容器實時時間
exec Run a command in a running container # 在運行中的容器上運行命令
export Export a container's filesystem as a tar archive #導(dǎo)出容器文件系統(tǒng)作為一個tar歸檔文件[對應(yīng)import]
history Show the history of an image # 展示一個鏡像形成歷史
images List images #列出系統(tǒng)當(dāng)前的鏡像
import Import the contents from a tarball to create a filesystem image #從tar包中導(dǎo)入內(nèi)容創(chuàng)建一個文件系統(tǒng)鏡像
info Display system-wide information # 顯示全系統(tǒng)信息
inspect Return low-level information on Docker objects #查看容器詳細(xì)信息
kill Kill one or more running containers # kill指定docker容器
load Load an image from a tar archive or STDIN #從一個tar包或標(biāo)準(zhǔn)輸入中加載一個鏡像[對應(yīng)save]
login Log in to a Docker registry #
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
作業(yè)練習(xí)
Docker 安裝Nginx
#1\. 搜索鏡像 search 建議大家去docker搜索课蔬,可以看到幫助文檔
#2\. 拉取鏡像 pull
#3囱稽、運行測試
# -d 后臺運行
# --name 給容器命名
# -p 宿主機端口:容器內(nèi)部端口
? ~ docker run -d --name nginx00 -p 82:80 nginx
75943663c116f5ed006a0042c42f78e9a1a6a52eba66311666eee12e1c8a4502
? ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75943663c116 nginx "nginx -g 'daemon of…" 41 seconds ago Up 40 seconds 0.0.0.0:82->80/tcp nginx00
? ~ curl localhost:82 #測試
<!DOCTYPE html>,,,,
思考問題:我們每次改動nginx配置文件,都需要進(jìn)入容器內(nèi)部二跋?十分的麻煩战惊,要是可以在容器外部提供一個映射路徑,達(dá)到在容器修改文件名扎即,容器內(nèi)部就可以自動修改吞获?√數(shù)據(jù)卷况凉!
[圖片上傳失敗...(image-3606b-1599841040578)]
作用:docker 來裝一個tomcat
# 官方的使用
docker run -it --rm tomcat:9.0
# 之前的啟動都是后臺,停止了容器各拷,容器還是可以查到刁绒, docker run -it --rm image 一般是用來測試,用完就刪除
--rm Automatically remove the container when it exits
#下載
docker pull tomcat
#啟動運行
docker run -d -p 8080:8080 --name tomcat01 tomcat
#測試訪問有沒有問題
curl localhost:8080
#進(jìn)入容器
? ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db09851cf82e tomcat "catalina.sh run" 28 seconds ago Up 27 seconds 0.0.0.0:8080->8080/tcp tomcat01
? ~ docker exec -it db09851cf82e /bin/bash
root@db09851cf82e:/usr/local/tomcat#
# 發(fā)現(xiàn)問題:1烤黍、linux命令少了知市。 2.沒有webapps
思考問題:我們以后要部署項目,如果每次都要進(jìn)入容器是不是十分麻煩速蕊?要是可以在容器外部提供一個映射路徑嫂丙,webapps,我們在外部放置項目规哲,就自動同步內(nèi)部就好了跟啤!
作業(yè):部署es+kibana
# es 暴露的端口很多!
# es 的數(shù)據(jù)一般需要放置到安全目錄唉锌!掛載
# --net somenetwork ? 網(wǎng)絡(luò)配置
# 啟動elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 測試一下es是否成功啟動
? ~ curl localhost:9200
{
"name" : "d73ad2f22dd3",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "atFKgANxS8CzgIyCB8PGxA",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
? ~ docker stats # 查看docker容器使用內(nèi)存情況
[圖片上傳失敗...(image-661dd5-1599841040569)]
#關(guān)閉隅肥,添加內(nèi)存的限制,修改配置文件 -e 環(huán)境配置修改
? ~ docker rm -f d73ad2f22dd3
? ~ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
[圖片上傳失敗...(image-ebef01-1599841040569)]
? ~ curl localhost:9200
{
"name" : "b72c9847ec48",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "yNAK0EORSvq3Wtaqe2QqAg",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
作業(yè):使用kibana連接es袄简?思考網(wǎng)絡(luò)如何才能連接
[圖片上傳失敗...(image-74fc4-1599841040569)]
可視化
- portainer(先用這個)
docker run -d -p 8080:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
- Rancher(CI/CD再用)
什么是portainer武福?
Docker圖形化界面管理工具!提供一個后臺面板供我們操作痘番!
docker run -d -p 8080:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
測試訪問: 外網(wǎng):8080
進(jìn)入之后的面板
[圖片上傳失敗...(image-3b9026-1599841040569)]
Docker鏡像講解
鏡像是什么
鏡像是一種輕量級捉片、可執(zhí)行的獨立軟件保,用來打包軟件運行環(huán)境和基于運行環(huán)境開發(fā)的軟件汞舱,他包含運行某個軟件所需的所有內(nèi)容伍纫,包括代碼、運行時庫昂芜、環(huán)境變量和配置文件
Docker鏡像加載原理
UnionFs (聯(lián)合文件系統(tǒng))
UnionFs(聯(lián)合文件系統(tǒng)):Union文件系統(tǒng)(UnionFs)是一種分層莹规、輕量級并且高性能的文件系統(tǒng),他支持對文件系統(tǒng)的修改作為一次提交來一層層的疊加泌神,同時可以將不同目錄掛載到同一個虛擬文件系統(tǒng)下( unite several directories into a single virtual filesystem)良漱。Union文件系統(tǒng)是 Docker鏡像的基礎(chǔ)。鏡像可以通過分層來進(jìn)行繼承欢际,基于基礎(chǔ)鏡像(沒有父鏡像)母市,可以制作各種具體的應(yīng)用鏡像
特性:一次同時加載多個文件系統(tǒng),但從外面看起來损趋,只能看到一個文件系統(tǒng)患久,聯(lián)合加載會把各層文件系統(tǒng)疊加起來,這樣最終的文件系統(tǒng)會包含所有底層的文件和目錄
Docker鏡像加載原理
docker的鏡像實際上由一層一層的文件系統(tǒng)組成,這種層級的文件系統(tǒng)UnionFS蒋失。
boots(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引導(dǎo)加 kernel, Linux剛啟動時會加bootfs文件系統(tǒng)返帕,在 Docker鏡像的最底層是 boots。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的篙挽,包含boot加載器和內(nèi)核荆萤。當(dāng)boot加載完成之后整個內(nèi)核就都在內(nèi)存中了,此時內(nèi)存的使用權(quán)已由 bootfs轉(zhuǎn)交給內(nèi)核铣卡,此時系統(tǒng)也會卸載bootfs观腊。
rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系統(tǒng)中的/dev,/proc,/bin,/etc等標(biāo)準(zhǔn)目錄和文件算行。 rootfs就是各種不同的操作系統(tǒng)發(fā)行版梧油,比如 Ubuntu, Centos等等。
[圖片上傳失敗...(image-1fae2b-1599841040569)]
平時我們安裝進(jìn)虛擬機的CentOS都是好幾個G州邢,為什么Docker這里才200M儡陨?
[圖片上傳失敗...(image-631084-1599841040568)]
對于個精簡的OS,rootfs可以很小,只需要包合最基本的命令量淌,工具和程序庫就可以了骗村,因為底層直接用Host的kernel,自己只需要提供rootfs就可以了呀枢。由此可見對于不同的Linux發(fā)行版胚股, boots基本是一致的, rootfs會有差別裙秋,因此不同的發(fā)行版可以公用bootfs.
虛擬機是分鐘級別琅拌,容器是秒級!
分層理解
分層的鏡像
我們可以去下載一個鏡像摘刑,注意觀察下載的日志輸出进宝,可以看到是一層層的在下載
[圖片上傳失敗...(image-812fef-1599841040568)]
思考:為什么Docker鏡像要采用這種分層的結(jié)構(gòu)呢?
最大的好處枷恕,我覺得莫過于資源共享了党晋!比如有多個鏡像都從相同的Base鏡像構(gòu)建而來,那么宿主機只需在磁盤上保留一份base鏡像徐块,同時內(nèi)存中也只需要加載一份base鏡像未玻,這樣就可以為所有的容器服務(wù)了,而且鏡像的每一層都可以被共享胡控。
查看鏡像分層的方式可以通過docker image inspect 命令
? / docker image inspect redis
[
{
"Id": "sha256:f9b9909726890b00d2098081642edf32e5211b7ab53563929a47f250bcdc1d7c",
"RepoTags": [
"redis:latest"
],
"RepoDigests": [
"redis@sha256:399a9b17b8522e24fbe2fd3b42474d4bb668d3994153c4b5d38c3dafd5903e32"
],
"Parent": "",
"Comment": "",
"Created": "2020-05-02T01:40:19.112130797Z",
"Container": "d30c0bcea88561bc5139821227d2199bb027eeba9083f90c701891b4affce3bc",
"ContainerConfig": {
"Hostname": "d30c0bcea885",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"REDIS_VERSION=6.0.1",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.0.1.tar.gz",
"REDIS_DOWNLOAD_SHA=b8756e430479edc162ba9c44dc89ac394316cd482f2dc6b91bcd5fe12593f273"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"redis-server\"]"
],
"ArgsEscaped": true,
"Image": "sha256:704c602fa36f41a6d2d08e49bd2319ccd6915418f545c838416318b3c29811e0",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "18.09.7",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"REDIS_VERSION=6.0.1",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.0.1.tar.gz",
"REDIS_DOWNLOAD_SHA=b8756e430479edc162ba9c44dc89ac394316cd482f2dc6b91bcd5fe12593f273"
],
"Cmd": [
"redis-server"
],
"ArgsEscaped": true,
"Image": "sha256:704c602fa36f41a6d2d08e49bd2319ccd6915418f545c838416318b3c29811e0",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 104101893,
"VirtualSize": 104101893,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/adea96bbe6518657dc2d4c6331a807eea70567144abda686588ef6c3bb0d778a/diff:/var/lib/docker/overlay2/66abd822d34dc6446e6bebe73721dfd1dc497c2c8063c43ffb8cf8140e2caeb6/diff:/var/lib/docker/overlay2/d19d24fb6a24801c5fa639c1d979d19f3f17196b3c6dde96d3b69cd2ad07ba8a/diff:/var/lib/docker/overlay2/a1e95aae5e09ca6df4f71b542c86c677b884f5280c1d3e3a1111b13644b221f9/diff:/var/lib/docker/overlay2/cd90f7a9cd0227c1db29ea992e889e4e6af057d9ab2835dd18a67a019c18bab4/diff",
"MergedDir": "/var/lib/docker/overlay2/afa1de233453b60686a3847854624ef191d7bc317fb01e015b4f06671139fb11/merged",
"UpperDir": "/var/lib/docker/overlay2/afa1de233453b60686a3847854624ef191d7bc317fb01e015b4f06671139fb11/diff",
"WorkDir": "/var/lib/docker/overlay2/afa1de233453b60686a3847854624ef191d7bc317fb01e015b4f06671139fb11/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:c2adabaecedbda0af72b153c6499a0555f3a769d52370469d8f6bd6328af9b13",
"sha256:744315296a49be711c312dfa1b3a80516116f78c437367ff0bc678da1123e990",
"sha256:379ef5d5cb402a5538413d7285b21aa58a560882d15f1f553f7868dc4b66afa8",
"sha256:d00fd460effb7b066760f97447c071492d471c5176d05b8af1751806a1f905f8",
"sha256:4d0c196331523cfed7bf5bafd616ecb3855256838d850b6f3d5fba911f6c4123",
"sha256:98b4a6242af2536383425ba2d6de033a510e049d9ca07ff501b95052da76e894"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
理解:
所有的 Docker鏡像都起始于一個基礎(chǔ)鏡像層扳剿,當(dāng)進(jìn)行修改或培加新的內(nèi)容時,就會在當(dāng)前鏡像層之上铜犬,創(chuàng)建新的鏡像層舞终。
舉一個簡單的例子轻庆,假如基于 Ubuntu Linux16.04創(chuàng)建一個新的鏡像癣猾,這就是新鏡像的第一層敛劝;如果在該鏡像中添加 Python包,
就會在基礎(chǔ)鏡像層之上創(chuàng)建第二個鏡像層纷宇;如果繼續(xù)添加一個安全補丁夸盟,就會創(chuàng)健第三個鏡像層該像當(dāng)前已經(jīng)包含3個鏡像層,如下圖所示(這只是一個用于演示的很簡單的例子)像捶。
[圖片上傳失敗...(image-ccb242-1599841040577)]
在添加額外的鏡像層的同時上陕,鏡像始終保持是當(dāng)前所有鏡像的組合,理解這一點非常重要拓春。下圖中舉了一個簡單的例子释簿,每個鏡像層包含3個文件,而鏡像包含了來自兩個鏡像層的6個文件硼莽。
[圖片上傳失敗...(image-f792f1-1599841040566)]
上圖中的鏡像層跟之前圖中的略有區(qū)別庶溶,主要目的是便于展示文件
下圖中展示了一個稍微復(fù)雜的三層鏡像,在外部看來整個鏡像只有6個文件懂鸵,這是因為最上層中的文件7是文件5的一個更新版
[圖片上傳失敗...(image-f52e15-1599841040566)]
文種情況下偏螺,上層鏡像層中的文件覆蓋了底層鏡像層中的文件。這樣就使得文件的更新版本作為一個新鏡像層添加到鏡像當(dāng)中
Docker通過存儲引擎(新版本采用快照機制)的方式來實現(xiàn)鏡像層堆棧匆光,并保證多鏡像層對外展示為統(tǒng)一的文件系統(tǒng)
Linux上可用的存儲引撃有AUFS套像、 Overlay2、 Device Mapper终息、Btrfs以及ZFS夺巩。顧名思義,每種存儲引擎都基于 Linux中對應(yīng)的
件系統(tǒng)或者塊設(shè)備技術(shù)周崭,井且每種存儲引擎都有其獨有的性能特點劲够。
Docker在 Windows上僅支持 windowsfilter 一種存儲引擎,該引擎基于NTFS文件系統(tǒng)之上實現(xiàn)了分層和CoW [1]休傍。
下圖展示了與系統(tǒng)顯示相同的三層鏡像征绎。所有鏡像層堆并合井,對外提供統(tǒng)一的視圖
[圖片上傳失敗...(image-e45997-1599841040566)]
特點
Docker 鏡像都是只讀的磨取,當(dāng)容器啟動時人柿,一個新的可寫層加載到鏡像的頂部!
這一層就是我們通常說的容器層忙厌,容器之下的都叫鏡像層凫岖!
[圖片上傳失敗...(image-c64f7c-1599841040566)]
commit鏡像
docker commit 提交容器成為一個新的副本
# 命令和git原理類似
docker commit -m="描述信息" -a="作者" 容器id 目標(biāo)鏡像名:[TAG]
實戰(zhàn)測試
# 1、啟動一個默認(rèn)的tomcat
docker run -d -p 8080:8080 tomcat
# 2逢净、發(fā)現(xiàn)這個默認(rèn)的tomcat 是沒有webapps應(yīng)用哥放,官方的鏡像默認(rèn)webapps下面是沒有文件的歼指!
docker exec -it 容器id
# 3、拷貝文件進(jìn)去
# 4甥雕、將操作過的容器通過commit調(diào)教為一個鏡像踩身!我們以后就使用我們修改過的鏡像即可,這就是我們自己的一個修改的鏡像社露。
docker commit -m="描述信息" -a="作者" 容器id 目標(biāo)鏡像名:[TAG]
docker commit -a="kuangshen" -m="add webapps app" 容器id tomcat02:1.0
如果你想要保存當(dāng)前容器的狀態(tài)挟阻,就可以通過commit來提交,獲得一個鏡像峭弟,就好比我們我們使用虛擬機的快照附鸽。
入門成功!B魅场?辣浮!
docker 進(jìn)階 之容器數(shù)據(jù)卷 DockerFile Docker網(wǎng)絡(luò) — 狂神說