Docker镜像是什么
镜像是一种轻量级的可执行的独立的软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行软件所需要的所有内容,包括代码,运行时库,环境变量和配置文件;
举个例子:
我们要安装tomcat 大约11M
去官网下载tomcat
我们在docker上下载的tomcat镜像—483M
这是因为tomcat运行所需要jdk环境,所以在下载镜像时会将tomcat所需要的依赖(运行是库等)一起打包下载下来;
tomcat镜像是由三层结构构成的;各个镜像之间可以共用某些资源;比如centos的一些镜像
下载第二个镜像时速度会非常快(其实不算是从仓库下载,而是本地的base镜像复制一份,运行时在内存中再加载一份)
为了更直观的查看镜像的分层信息----执行下面的命令:
docker image inspect tomcat:latest
执行之后---->>
[
{
"Id": "sha256:451d25ef4583d58da6cb84bbbfd36aa6e752a8efa3d9a137da9b77334e7b902b",
"RepoTags": [
"tomcat:latest"
],
"RepoDigests": [
"tomcat@sha256:9edc5c51c2dec7794769eede1e88a60e77abe355b73a77e231c464a8384d3697"
],
"Parent": "",
"Comment": "",
"Created": "2022-06-28T00:54:54.364194878Z",
"Container": "049353471f080c6f9cdb481b1e99cf40d263c1130a657161c9c2f064ec557c05",
"ContainerConfig": {
"Hostname": "049353471f08",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"8080/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/tomcat/bin:/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LANG=en_US.UTF-8",
"LANGUAGE=en_US:en",
"LC_ALL=en_US.UTF-8",
"JAVA_VERSION=jdk-17.0.3+7",
"JAVA_HOME=/opt/java/openjdk",
"CATALINA_HOME=/usr/local/tomcat",
"TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib",
"LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib",
"GPG_KEYS=A9C5DF4D22E99998D9875A5110C01C5A2F6059E7",
"TOMCAT_MAJOR=10",
"TOMCAT_VERSION=10.0.22",
"TOMCAT_SHA512=fe46db8794f066882b30e7a94bd8d3dbcf29e8e8ffaf67c1355846755745a7c9eafd124819283f218bcf410921a485b44b57b56fd6251fb99d67d95f3dd36826"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"catalina.sh\" \"run\"]"
],
"Image": "sha256:fa0b50a395becf0a0a5c020fe2e2e2b46a59ed714c9543cf44bc45c6fd28c4e9",
"Volumes": null,
"WorkingDir": "/usr/local/tomcat",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "20.10.12",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"8080/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/tomcat/bin:/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LANG=en_US.UTF-8",
"LANGUAGE=en_US:en",
"LC_ALL=en_US.UTF-8",
"JAVA_VERSION=jdk-17.0.3+7",
"JAVA_HOME=/opt/java/openjdk",
"CATALINA_HOME=/usr/local/tomcat",
"TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib",
"LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib",
"GPG_KEYS=A9C5DF4D22E99998D9875A5110C01C5A2F6059E7",
"TOMCAT_MAJOR=10",
"TOMCAT_VERSION=10.0.22",
"TOMCAT_SHA512=fe46db8794f066882b30e7a94bd8d3dbcf29e8e8ffaf67c1355846755745a7c9eafd124819283f218bcf410921a485b44b57b56fd6251fb99d67d95f3dd36826"
],
"Cmd": [
"catalina.sh",
"run"
],
"Image": "sha256:fa0b50a395becf0a0a5c020fe2e2e2b46a59ed714c9543cf44bc45c6fd28c4e9",
"Volumes": null,
"WorkingDir": "/usr/local/tomcat",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 482519550,
"VirtualSize": 482519550,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/7528c10792622ebe441a52fd0b6e4e3315876efef47156aaa194db29a52d2a49/diff:/var/lib/docker/overlay2/a80446b459c17627a18b6a1c50c118324046c5eeef52e34ef8bff11904da9cad/diff:/var/lib/docker/overlay2/a75c8fa300341c107196edc36d4f9ccd0c41686bcdc957d07e1be724a5e63ef4/diff:/var/lib/docker/overlay2/d2205f56c88b01207462b5ab463231d75bd73fe28f283bd544d347afd532d14f/diff:/var/lib/docker/overlay2/37d44d9e0afaca2f3f59953a7fadc1e19a33328c2591e724d7d445f8f319e204/diff:/var/lib/docker/overlay2/07b640eac09047b7edbf33a16b5f59eaf813f7fb8ce3e6d6bdc6d3c2a64c1ae9/diff",
"MergedDir": "/var/lib/docker/overlay2/3a0d1078504f3de9f66dcdfeed164eee8dbf28a3a099a5a0f17ccd764f99a02d/merged",
"UpperDir": "/var/lib/docker/overlay2/3a0d1078504f3de9f66dcdfeed164eee8dbf28a3a099a5a0f17ccd764f99a02d/diff",
"WorkDir": "/var/lib/docker/overlay2/3a0d1078504f3de9f66dcdfeed164eee8dbf28a3a099a5a0f17ccd764f99a02d/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:a790f937a6aea2600982de54a5fb995c681dd74f26968d6b74286e06839e4fb3",
"sha256:16f636807506521a66f09cdd9eaff9b911004f0284e400a04f70fe184006569b",
"sha256:e369ffcb8f5d3ec8be94988ccec7f99d36b6f5eeb197421bf7512cb2bb761ae0",
"sha256:571824725172feb66b22770b3902a40c7bc2d6285eff9d4e5804bf4619fe776f",
"sha256:31c135ba5e112ab8d4c40cb2694952a8021fda4fe76db3ba6e1efa67f23163e3",
"sha256:6171d86da26955eb21b3fa0671a31bb6c4cdfaa44b4fde339ea530a3bb899f41",
"sha256:e019a18df1faf83dc044ac7b1839df0b3b64ef19fe9de1f17f10b5886790c156"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
上面提到了镜像其实是一个分层结构,分层结构的好处就是提高了复用性----这里就要提到UnionFS;
UnionFS(联合文件系统): Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
Union 文件系统是 Docker 镜像
的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
联合文件系统的特性:
一次同时加载多个文件系统,但从外面看起来,只能看到一个;
镜像的特点:
Docker镜像都是只读的,当启动一个镜像时,一个新的可写的层会被加载到镜像层顶部,这一层就是我们所说的容器层,容器层之下的叫做镜像层;
分层体现:
镜像的操作,有时候我们写好了一个程序,把这个程序做成对应的镜像,以便后续继续使用,这时候我们就需要docker commit 命令了
首先我们尝试运行一个容器—tomcat
docker run -it -p 8888:8080 tomcat
运行之后访问 8888端口----404错误
我们为什么会访问404错误呢?
我们进入到容器里面看一下
# 看一下i容器的 id
C:\Users\Gavin>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
961c9b239a6c tomcat "catalina.sh run" 5 hours ago Up 5 hours 0.0.0.0:8888->8080/tcp vibrant_satoshi
之后进入容器里面,我们知道访问tomcat时会,我们会将一些资源文件放到webapp里面
进入tomcat这个容器,
这里有两个命令需要区分一些
docker attach
exec 在容器中打开新的终端,并且可以启动新的进程
attach 直接进入容器启动命令的终端,不会启动新的进程
docker attach containerid 进入容器
发现进不去,
那就换一种方式试一下
dockcer exec -it containerid /bin/bash
进入webapps里面,发现什么都没有
接下来就是向docker容器里面添加一些文件了;
执行 docker cp 命令
C:\Users\Gavin>docker exec -it 961c /bin/bash #进入容器
root@961c9b239a6c:/usr/local/tomcat# ls
bin lib NOTICE temp
BUILDING.txt LICENSE README.md webapps
conf logs RELEASE-NOTES webapps.dist
CONTRIBUTING.md native-jni-lib RUNNING.txt work
root@961c9b239a6c:/usr/local/tomcat/webapps #查看webapps里面的文件
C:\Users\Gavin>docker cp d:/ROOT 961c:/usr/local/tomcat/webapps/ROOT #从宿主机复制文件到 容器
C:\Users\Gavin>docker exec -it 961c /bin/bash
root@961c9b239a6c:/usr/local/tomcat# cd webapps
root@961c9b239a6c:/usr/local/tomcat/webapps# ls
ROOT
root@961c9b239a6c:/usr/local/tomcat/webapps# cd ROOT/
root@961c9b239a6c:/usr/local/tomcat/webapps/ROOT# ls
asf-logo-wide.svg bg-nav.png index.jsp tomcat.svg
bg-button.png bg-upper.png RELEASE-NOTES.txt WEB-INF
bg-middle.png favicon.ico tomcat.css
接着重新运行该容器
docker restart containerid
C:\Users\Gavin>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
961c9b239a6c tomcat "catalina.sh run" 5 hours ago Up 5 hours 0.0.0.0:8888->8080/tcp vibrant_satoshi
C:\Users\Gavin>docker restart 961c
961c
C:\Users\Gavin>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
961c9b239a6c tomcat "catalina.sh run" 5 hours ago Up 7 seconds 0.0.0.0:8888->8080/tcp vibrant_satoshi
查看对应端口,发现已经有了相应访问内容;
所以当我们pull下载相应镜像时,一些文件并没有,所以我们要自己打包一下镜像以便下次继续访问;
制作镜像:
下面自己制作镜像文件:
docker commit
C:\Users\Gavin>docker commit -a"gavin" -m"add tomcat necefile" 961c gav
in/tomcat1.1
sha256:0e1da64fe76ea8ec2365530542b87fb3e160c41d4f1a1f1780a0bd3153b84c8b
命令解析:
C:\Users\Gavin>docker commit --help
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith
<hannibal@a-team.com>") #作者信息
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message #镜像信息
-p, --pause Pause container during commit #(default true) 在提交期间暂停容器
查看制作的容器----->>
运行镜像
执行制作好的tomcat容器
查看制作的镜像:
运行镜像---->>
C:\Users\Gavin>docker run -it -p 8888:8080 gavin/tomcat1.1
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /opt/java/openjdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar