docker学习文档

Docker

  1. 安装

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.设置镜像仓库

yum-config-manager
–add-repo
https://download.docker.com/linux/centos/docker-ce.repo #国外地址
yum-config-manager
–add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云

更新yum软件包索引

yum makecache fast

4.安装docker docker-ce社区版 ee是企业版

yum install docker-ce docker-ce-cli containerd.io

5.启动Docker

systemctl start docker

6.查看docker版本

docker version

7.hello-world

docker run hello-world

8.查看下载的hello-world镜像

docker images
了解卸载docker

1.卸载依赖

yum remove docker-ce docker-ce-cli containerd.io

2.删除资源

rm -rf /var/lib/docker #docker默认工作路径
rm -rf /var/lib/containerd
2.阿里云镜像加速

1.登录阿里云

2.镜像加速器

3.配置使用

1.第一步

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://po1qcvly.mirror.aliyuncs.com”]
}
EOF

2.第二步

sudo systemctl daemon-reload

3.第三步

sudo systemctl restart docker

2.1 底层原理

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!

Client-Server接收到Client-Client的指令,就会执行这个命令

2.1 Docker为什么比VM快

1、Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。

2、Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。
在这里插入图片描述

所以说,新建一个容器的时候,Docker不需要向虚拟机一样重新加载一个操作系统内核,避免引导,虚拟机是加载Guest OS,分钟级别的而Docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级!

3.Docker常用命令

帮助命令

docker version #显示docker的版本信息
docker info #显示docker的系统信息 包括镜像和容器的数量
docker 命令 --help #万能命令
帮助文档地址:https://docs.docker.com/reference/

镜像命令

docker images 查看所有本地的主机上的镜像

[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 4 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
-a, --all 列出所有的镜像
-q, --quiet 只显示镜像的Id
docker search 搜索镜像

#搜索mysql镜像
docker search mysql
#可选项,通过搜藏来过滤
–filter =stars=3000 #搜索出来的镜像就是stars大于3000
docker pull 下载镜像

#下载镜像
docker pull 镜像名[:tag]版本默认最新版
[root@localhost /]# docker pull mysql
Using default tag: latest #如果不写tag 默认就是latest
latest: Pulling from library/mysql
b4d181a07f80: Pull complete #分层下载,docker iamge的核心 联合文件系统
a462b60610f5: Pull complete
578fafb77ab8: Pull complete
524046006037: Pull complete
d0cbe54c8855: Pull complete
aa18e05cc46d: Pull complete
32ca814c833f: Pull complete
9ecc8abdb7f5: Pull complete
ad042b682e0f: Pull complete
71d327c6bb78: Pull complete
165d1d10a3fa: Pull complete
2f40c47d0626: Pull complete
Digest: sha256:52b8406e4c32b8cf0557f1b74517e14c5393aff5cf0384eff62d9e81f4985d4b#签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
#等价于
docker pull mysql === docker pull docker.io/library/mysql:latest
#指定版本下载
[root@localhost /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
b4d181a07f80: Already exists
a462b60610f5: Already exists
578fafb77ab8: Already exists
524046006037: Already exists
d0cbe54c8855: Already exists
aa18e05cc46d: Already exists
32ca814c833f: Already exists
52645b4af634: Pull complete
bca6a5b14385: Pull complete
309f36297c75: Pull complete
7d75cacde0f8: Pull complete
Digest: sha256:1a2f9cd257e75cc80e9118b303d1648366bc2049101449bf2c8d82b022ea86b7
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 删除镜像

#删除指定ID镜像
docker rmi -f 镜像ID
#删除指定ID镜像 (多个)
docker rmi -f 镜像ID 镜像ID 镜像ID 镜像ID
#递归删除所有镜像
docker rmi -f $(docker images -aq) 意思是全部镜像的id
容器命令

说明:我们有了镜像才可以创建容器 linux 下载一个centos镜像来测试学习

docker pull centos
新建容器并启动

docker run [可选参数] image
#参数说明
–name=“Name” 容器名称 tomcat01
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P 随机指定端口
#测试 进入容器
[root@localhost /]# docker run -it centos /bin/bash 启动以交互方式运行后面是操作控制台 一般Linux的在这个路径
#查看容器内的centos基础版本很多命令都是不完善的 (centos里面创建centos并进入)
[root@1797b984e8ee /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#从容器中退回到主机
[root@1797b984e8ee /] exit # exit
[root@localhost /]# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
列出所有的运行的容器

docker ps 命令

空 # 列出当前正在运行的容器
-a # 列出当前正在运行的容器 随便带出历史的内容
-n=?# 显示最近创建的容器 ?后面是显示的个数
-q # 只显示容器的编号
#列出当前在运行的容器 (下面表示没有)
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#查看曾经运行过的容器
[root@localhost /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e270f5d60b2c centos “/bin/bash --name=ba…” 5 minutes ago Exited (2) 5 minutes ago recursing_gagarin
b80479a9e9b3 centos “/bin/bash” 9 minutes ago Exited (0) 7 minutes ago strange_jemison
fb14b327581a d1165f221234 “/hello” 8 hours ago Exited (0) 8 hours ago eager_varahamihira
退出容器

exit #直接退出容器
Ctrl + P + Q
删除容器

docker rm #容器id 删除指定容器docker rm -f $(docker ps -aq) #删除所有容器docker ps -a -q|xargs docker rm #删除所有容器
启动和停止容器操作

docker start 容器id #启动容器docker restart 容器id #重启动容器docker stop 容器id #停止当前正在运行动容器docker kill 容器id #强制停止当前容器
常用其他命令

#通过命令 docker run -d 镜像名 [root@bogon /]# docker run -d centos #问题 docker ps 时候发现 centos停止了 #常见的坑,docker 容器后台运行,就必须要有一个前台进程 docker发现没有命令就会停止#nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志

docker logs -f -t --tail 10 #容器id 没有日志 # 自己编写一段shell脚本[root@bogon /]# docker run -d centos /bin/sh -c “while true;do echo Sxr;sleep 1;done”[root@bogon /]# docker psPORTS NAMESd5d5d925582f centos #显示日志-tf #显示日志 f带上时间–tail number #要显示的日志条数[root@bogon /]# docker logs -f -t --tail 10 d5d5d925582f [root@bogon /]# docker logs -tf --tail 10 d5d5d925582f
查看容器中的进程信息ps

top命令 [root@bogon /]# docker top 容器idUID PID PPID C STIME TTY TIME root 3064 3044 0 09:37 ? 00:00:00 root 3117 3064 0 09:38 ? 00:00:00
查看镜像的源数据

#命令[root@bogon /]# docker inspect 容器#测试[ { “Id”: “d5afb8e77654614fa32059e7c913fb2bac2810d25ded026514afaf5f700074a9”, “Created”: “2021-07-07T01:37:58.911090097Z”, “Path”: “/bin/sh”, “Args”: [ “-c”, “while true;do echo Sxr;sleep 1;done” ], “State”: { “Status”: “running”, “Running”: true, “Paused”: false, “Restarting”: false, “OOMKilled”: false, “Dead”: false, “Pid”: 3064, “ExitCode”: 0, “Error”: “”, “StartedAt”: “2021-07-07T01:37:59.148116164Z”, “FinishedAt”: “0001-01-01T00:00:00Z” }, “Image”: “sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55”, “ResolvConfPath”: “/var/lib/docker/containers/d5afb8e77654614fa32059e7c913fb2bac2810d25ded026514afaf5f700074a9/resolv.conf”, “HostnamePath”: “/var/lib/docker/containers/d5afb8e77654614fa32059e7c913fb2bac2810d25ded026514afaf5f700074a9/hostname”, “HostsPath”: “/var/lib/docker/containers/d5afb8e77654614fa32059e7c913fb2bac2810d25ded026514afaf5f700074a9/hosts”, “LogPath”: “/var/lib/docker/containers/d5afb8e77654614fa32059e7c913fb2bac2810d25ded026514afaf5f700074a9/d5afb8e77654614fa32059e7c913fb2bac2810d25ded026514afaf5f700074a9-json.log”, “Name”: “/sleepy_shockley”, “RestartCount”: 0, “Driver”: “overlay2”, “Platform”: “linux”, “MountLabel”: “”, “ProcessLabel”: “”, “AppArmorProfile”: “”, “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, “CgroupnsMode”: “host”, “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/ee550b2c380e5601d6978d3321ef8ff4cc24717748323235ddc4fab37cb67993-init/diff:/var/lib/docker/overlay2/39edc3f6f14c91fa8316e372cedc38a165c438a17bac6ba618a772481f37662e/diff”, “MergedDir”: “/var/lib/docker/overlay2/ee550b2c380e5601d6978d3321ef8ff4cc24717748323235ddc4fab37cb67993/merged”, “UpperDir”: “/var/lib/docker/overlay2/ee550b2c380e5601d6978d3321ef8ff4cc24717748323235ddc4fab37cb67993/diff”, “WorkDir”: “/var/lib/docker/overlay2/ee550b2c380e5601d6978d3321ef8ff4cc24717748323235ddc4fab37cb67993/work” }, “Name”: “overlay2” }, “Mounts”: [], “Config”: { “Hostname”: “d5afb8e77654”, “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 Sxr;sleep 1;done” ], “Image”: “centos”, “Volumes”: null, “WorkingDir”: “”, “Entrypoint”: null, “OnBuild”: null, “Labels”: { “org.label-schema.build-date”: “20201204”, “org.label-schema.license”: “GPLv2”, “org.label-schema.name”: “CentOS Base Image”, “org.label-schema.schema-version”: “1.0”, “org.label-schema.vendor”: “CentOS” } }, “NetworkSettings”: { “Bridge”: “”, “SandboxID”: “4c1c660153c5ced82b88b8c9608a4713734fe7db414536651757d4c8a377ae1f”, “HairpinMode”: false, “LinkLocalIPv6Address”: “”, “LinkLocalIPv6PrefixLen”: 0, “Ports”: {}, “SandboxKey”: “/var/run/docker/netns/4c1c660153c5”, “SecondaryIPAddresses”: null, “SecondaryIPv6Addresses”: null, “EndpointID”: “120c50b1dc7840ea683adfbadb8b7bf503de5b33baab8a3af0882efe67224777”, “Gateway”: “172.17.0.1”, “GlobalIPv6Address”: “”, “GlobalIPv6PrefixLen”: 0, “IPAddress”: “172.17.0.2”, “IPPrefixLen”: 16, “IPv6Gateway”: “”, “MacAddress”: “02:42:ac:11:00:02”, “Networks”: { “bridge”: { “IPAMConfig”: null, “Links”: null, “Aliases”: null, “NetworkID”: “847ca54f07a31bbae0a3c255e8be3dfc7e5aa2c25ef38493efc4bb17687ef7ce”, “EndpointID”: “120c50b1dc7840ea683adfbadb8b7bf503de5b33baab8a3af0882efe67224777”, “Gateway”: “172.17.0.1”, “IPAddress”: “172.17.0.2”, “IPPrefixLen”: 16, “IPv6Gateway”: “”, “GlobalIPv6Address”: “”, “GlobalIPv6PrefixLen”: 0, “MacAddress”: “02:42:ac:11:00:02”, “DriverOpts”: null } } } }]
进入当前正在运行的容器

#我们通常容器都是使用后台方式运行的需要进入容器,修改一些配置#命令docker exec -it 容器id bashshell # bashshell 操作 linux或者别的操作命令#测试[root@bogon /]# docker exec -it d5afb8e77654 /bin/bash[root@d5afb8e77654 /]# lsbin etc lib lost+found mnt proc run srv tmp vardev home lib64 media opt root sbin sys usr[root@d5afb8e77654 /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 01:37 ? 00:00:00 /bin/sh -c while true;droot 1945 0 0 02:10 pts/0 00:00:00 /bin/bashroot 1976 1945 0 02:10 pts/0 00:00:00 ps -efroot 1977 1 0 02:10 ? 00:00:00 /usr/bin/coreutils --co#方式二[root@bogon /]# docker attach 容器id正在执行当前代码…#docker exec :进入容器后开启一个新的终端,可以在里面操作(常用)#docker attach :进入容器正在执行的终端,不会启动一个新的进程
从容器内拷贝文件到主机上

docker cp 容器id:容器内路径 目的的主机路径[root@bogon /home]# docker cp 容器id:/容器路径 /主机路径#测试[root@bogon /home]# docker cp 24fe5f78c8af:/home/test.java /home///先在容器内创建文件或目录[root@24fe5f78c8af home]#touch test.java[root@24fe5f78c8af home]# lstest.javaCtrl+p+q[root@bogon /home]# docker cp 24fe5f78c8af:/home/test.java /home/[root@bogon /home]# lsSxr.java test.java www yacon[root@bogon /home]# rm -rf Sxr.java [root@bogon /home]# lstest.java www yacon#拷贝是一个手动过程未来使用 -v 数据卷的技术,可以实现数据同步
作业练习

1.docker安装nginx

docker安装nginx docker search nginx (建议去docker搜索,可以看到帮助文档)

1.下载镜像 docker pull nginx

#运行测试#-d后台运行#-name 给容器命名#-p 宿主机端口,容器内部端口[root@bogon /home]# docker run -d --name gninx01 -p 9012:80 nginx14721648dc2f25d542173dbc3ede0aa529aa0c1ce39929c18a2ba10136823f7a[root@bogon /home]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES14721648dc2f nginx “/docker-entrypoint.…” 9 seconds ago Up 8 seconds 0.0.0.0:9012->80/tcp, :::9012->80/tcp gninx01[root@bogon /home]# curl localhost:9012Welcome to nginx!

Welcome to nginx!

If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.

For online documentation and support please refer tonginx.org.
Commercial support is available atnginx.com.

Thank you for using nginx.

所以说可以直接访问 3344进入容器开启的服务#进入容器[root@bogon /home]# docker exec -it gninx01 /bin/bashroot@14721648dc2f:/# lsbin etc mnt sbin varboot home opt srvdev lib proc sysdocker-entrypoint.d lib64 root tmpdocker-entrypoint.sh media run usrroot@14721648dc2f:/# whereis nginxnginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginxroot@14721648dc2f:/# cd /etc/nginx/root@14721648dc2f:/etc/nginx# lsconf.d mime.types nginx.conf uwsgi_paramsfastcgi_params modules scgi_paramsroot@14721648dc2f:/etc/nginx#
端口暴露的概念

问题:我们每次改动nginx配置文件,都需要进入内部,十分麻烦,我要是可以在容器外部提供一个映射路径,达到在外部修改文件,容器内部可以自动修改,-v 数据卷!

1.docker安装tomcat

#官方使用$ docker run -it --rm tomcat:9.0#我们之前的启动都是后台,停止了容器之后,容器还是可以查到 docker run -it --rm,一般用来测试用完即删#下载在启动$ docker pull tomcat:9.0#启动运行docker run -d --name tom01 -p 7788:8080 tomcat#测试访问没有问题#进入容器 [root@bogon /]# docker exec -it tom01 /bin/bash#发现问题 1、linux命令少了,2.没有webapps 阿里云镜像的原因,默认是最小的镜像,所有不必要的都剔除掉#保证最小可运行的环境
思考问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?webapps,我们在外部放置项目,就自动同步在内部就好了!

3.部署ES+kibana

#es 暴露端口很多#es十分耗内存#es的数据一般要放置到安全目录:挂载#–net somenetwork 网络配置#启动ES docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” elasticsearch:7.6.2#启动了 linux 就卡住了 #es是十分耗内存的#docker stats 查看cou状态

#测试一下es是否成功了 外面浏览器测试 http://192.168.1.129:9200/{ “name” : “81ed6583d383”, “cluster_name” : “docker-cluster”, “cluster_uuid” : “-luzu__vQyy-LU43jeBKWg”, “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 stop 容器id#修改配置文件 -e 环境配置修改docker run -d --name elasticsearch03 -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

作业:使用kibana连接Es 思考网络怎么才能连接过去

可视化

porainer(先用这个)
docker run -d -p 8088:9000 \ #后面别几把写空格会死人的(气死人)–restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true porainer/portainer
Rancher(CI/CD再用)
什么是porainer ?

Docker图形化界面管理工具!提供一个后台面板供我们操作

docker run -d -p 8088:9000 \ #后面别几把写空格会死人的(气死人)–restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true porainer/portainer
访问测试:外网 8088 通过它来访问

选择本地

平时不会用玩玩就行

Docker镜像讲解

镜像是什么

镜像是一种轻量级、 可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内
容,包括代码、运行时、库、环境变量和配置文件。 所有应用,直接打包docker镜像,就可以跑起来!!

如何得到镜像

从远程仓库下载
朋友拷贝给你
自己制作一个镜像 DockerFile
Docker镜像加载原理

UnionFS (联合文件系统)
下载的时候看到的一层层就是这个

Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

img

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M??

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。 虚拟机是分钟级别,容器时秒级

分层的镜像
以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载

为什么 Docker 镜像要采用这种分层结构呢

img

最大的一个好处就是 - 共享资源

比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

“Layers”: [ “sha256:764055ebc9a7a290b64d17cf9ea550f1099c202d83795aa967428ebdf335c9f7”, “sha256:245c9d23f65373415922e53424032cabe7b282c5cf8f9f8070a7d1830fca6871”, “sha256:ebef6caacb966ed54c0c3facf2288fa5124452f2c0a17faa1941625eab0ceb54”, “sha256:0b7b774038f08ec329e4dd2c0be440c487cfb003a05fce87cd5d1497b602f2c1”, “sha256:a71d36a87572d637aa446110faf8abb4ea74f028d0e0737f2ff2b983ef23abf3”, “sha256:9e1fddfb3a22146392a2d6491e1af2f087da5e6551849a6174fa23051ef8a38f” ]

如何提交自己的镜像 commit镜像

docker commit 提交容器成为一个新的副本#命令和git原理类似docker commit -m=“提交的描述信息" -a=“作者” 容器id 目标镜像名:[TAG]
实战测试

#1.启动tomcat发现没有页面显示,因为官方的webapps里面是没有文件的所以说我们要从webapps.dist文件里面拷贝进去#但是自己是很难受的#2.拷贝 操作root@ed8e9ece8550:/usr/local/tomcat/# cp -r webapps.dist/* webapps/#3.看下是否进去root@ed8e9ece8550:/usr/local/tomcat/webapps# lsROOT docs examples host-manager manager#4.把他放进到镜像中去 用commit操作将容器提交成为一个镜像 我们以后可以使用修改后的即可# -m -a 位置随便 docker commit -m=“提交的描述信息" -a=“作者” 容器id 目标镜像名:[TAG][root@bogon ~]# docker commit -a=“SxrTj” -m=“webapps app” ed8e9ece8550 tomcat01:1.0

镜像:就是从docker下载的相当于一个模板而容器它会在所有的镜像层之上增加一个可写层 这个可写层有运行在CPU上的进程 而且有两个不同的状态:运行态(Running)和退出态(Exited)。这就是Docker容器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值