一、docker中镜像相关操作
1、重要概念
仓库 hub: docker在全世界范围内维护一个仓库 用来存储镜像 官方镜像 个人开发者镜像
镜像 image: 一个镜像代表一个软件安装包 mysql tomcat
容器 container: 一个镜像运行一次就会产生一个容器 一个容器认为是一个软件服务 tomcat容器 mysql容器
2、辅助命令
1. docker version -------------------------- 查看docker的信息 2. docker info -------------------------- 查看更详细的信息 3. docker --help -------------------------- 帮助命令
3、镜像相关命令
(1)查看当前本地仓库中有哪些镜像
#列出指定镜像名称信息 docker images tomcat(镜像名称) docker images -q(镜像id) 镜像名 #列出本地所有镜像 docker image ls 或者docker images
结果解释
REPOSITORY(镜像名称) TAG(版本) IMAGE ID(镜像ID) CREATED(镜像创建时间) SIZE(镜像大小) hello-world latest feb5d9fea6a5 6 months ago 13.3kB
(2)下载一个镜像
docker pull 镜像名称 #获取最新版本 docker pull redis ==> docker pull redis:latest(最新版本) # 获取指定版本 docker pull tomcat:8.5.31
(3)搜索镜像
docker search 镜像名 docker search tomcat ==>只能查看当前镜像是否存在 不能列出版本 docker search tomcat --no-trunc ==>显示完整的镜像信息
(3)删除镜像
# 删除镜像 docker image rm 镜像名:tag|镜像id docker image rm tomcat:8.5.31 #强制删除 docker image rm -f 镜像名:tag|镜像id #批量删除 docker image rm -f ${docker images tomcat -q}
二、Docker常用命令
1、操作命令的格式
docker 命令[选项]
2、如何查看docker引擎中运行容器有哪些?
1. docker ps -------------------------- 列出所有正在运行的容器 2. -a 正在运行的和历史运行过的容器 3. -q 静默模式,只显示容器编号
docker ps
(2)查看所有容器(运行停止)
docker ps -a
(3)查看所有容器ID
docker ps -aq
3、如何运行一个容器
(1)简单运行tomcat镜像
#注意:这种方式运行容器内无法访问 docker run tomcat:tag docker run tomcat: latest(latest是最新的意思)
(2)运行tomcat容器,同时设置容器与主机端口的映射关系 -p
1. #注意:可以映射多个端口号 -p 15672:15672 -pd672:5672 2. docker run -p 8080:8080 tomcat:latest
(3)运行tomcat,开发端口映射,后台启动该服务 -d
docker run -p 8082:8080 -d tomcat:latest
(4)运行tomcat,开发端口映射,后台启动该服务,指定容器名称 —name 容器名称
docker run -d -p 8083:8080 --name tomcat01 tomcat:latest
4、停止,运行,重启,暂停,恢复容器
1. docker start 容器名字或者容器id --------------- 开启容器 2. docker restart 容器名或者容器id --------------- 重启容器 3. docker stop 容器名或者容器id ------------------ 正常停止容器运行 4. docker kill 容器名或者容器id ------------------ 立即停止容器运行 5. docker pause|unpause 容器名或容器id ----------------- 暂停和恢复容器
5、杀死容器、杀死容器
docker kill id|name
6、删除容器
#删除已经停止运行的容器 docker rm 容器id和容器名 #强制删除容器,即使是运行的容器 docker rm -f 容器id和容器名 #删除所有容器 docker rm -f $(docker ps -aq)
7、查看容器内部日志
docker logs 容器id|name #实时监控服务器内服务的日志 docker logs -f 容器id|name
8、进入容器内部
docker exec -it(交互模式) 容器id|name bash #退出容器 exit
9、容器与宿主机操作系统之间文件拷贝
#如何将容器中指定文件和目录拷贝到宿主机: docker cp 容器id:容器文件或目录 主机那个目录 #如何将主机中指定文件和目录拷贝到容器内: docker cp 主机文件和目录 容器id:容器中目录
(1)将tomcat容器里面的server.xml复制一份到/usr/apps下
docker cp 7a42964beeb6:/usr/local/tomcat/conf/server.xml /usr/apps
(2)将linux中fruit这个项目war包移动到tomcat的webapps下
#1.fruit.war这个项目的位置 /usr/apache-tomcat-8.5.46/webapps #2.移动到tomcat webapps docker cp /usr/apache-tomcat-8.5.46/webapps/fruit.war 7a42964beeb6:/usr/local/tomcat/webapps/
10、如何部署一个web项目 war包项目
1. 将test.war上传到linux服务器 2. 通过docker cp命令将test.war复制到tomcat的webapps目录中即可 3.使用ip端口进行测试访问即可
11、查看容器内运行进程
docker top 容器id|name
12、查看容器内细节指令
docker inspect 容器id|name
13、容器数据卷机制
#数据卷 Data Volume 1. 作用:用来实现容器中数据和宿主机中数据进行映射的 2. 注意:**数据卷必须在容器第一次启动时设置** 3. 使用: docker run -v ...
(1)使用绝对路径设置数据卷
docker run -v 宿主机绝对路径:容器内路径:ro ... #ro:ready only 如果设置数据卷时指定ro ,代表日后容器内路径是只读的 注意:这种方式会将容器路径的原始内容全部清空,始终以宿主机路径为主
(2)使用别名方式设置数据卷
docker run -v aa:/usr/local/tomcat/webapps ... #aa是是什么? 1.aa代表docker数据卷中的别名 注意:这个别名如果存在docker直接使用 2.使用别名方式保留容器路径原始内容,前提别名对应路径不能存在内容 注意:docker根据别名创建目录默认在:/var/lib/docker/volumes/
14、容器卷应用场景
注意:凡是在容器内持有重要数据的镜像在运行时都需要指定数据卷
15、将容器打包成新的镜像
(1)为什么要将容器打包成新的镜像?
因为容器是可读可写的,可以对容器进行定制比如maven可以定制settings.xml。让他从阿里云下载jar包,将容器打包成新的镜像之后,日后基于这个镜像运行成容器,这个新容器存在原来定制的特性
(2)将容器打包成一个新的镜像
docker commit -m "deploy test project in tomcat" -a "wanghengjie" 容器id|name 镜像名:版本
16、镜像的备份与恢复
#镜像备份 docker save 镜像名:Tag -o (镜像名-tag).tar 例:docker save tomcat:80 -o tomcat-8.0.tar #恢复镜像 docker load -i tomcat-8.0.tar
三、Docker镜像原理
1、镜像是什么
镜像是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件。
2、为什么一个镜像那么大
镜像就是花卷
UnionFS(联合文件系统): Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。这种文件系统特性:就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录 。
内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉。 用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录。 对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。 而对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了。相比其他 Linux 发行版,CentOS 的 rootfs 已经算臃肿的了,alpine 还不到 10MB。 我们平时安装的 CentOS 除了 rootfs 还会选装很多软件、服务、图形桌面等,需要好几个 GB 就不足为奇了。
3、Docker镜像原理
docker的镜像实际是由一层一层的文件系统组成。 UnionFS 联合文件系统
bootfs(boot file system)主要包含bootloader(引导装载程序)和kernel(内核),bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix 系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完,后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。
4、为什么docker镜像要采用这种分层结构呢
最大的一个好处就是资源共享
比如:有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。
四、Docker 命令手册
五、后续Docker相关博客内容
Docker基础篇(2022/3/29,已经发布)
Docker常用命令总结及镜像原理(2022/3/29)
Docker安装mysql,Redis,nginx,tomcat,mongoDB,elasticSearch软件攻略(2022/3/30)
DockerFile相关命令及构建部署SpringBoot项目(2022/3/30)
Docker的网络配置和数据卷配置(2022/3/31)
Docker Compose文件的使用攻略(2022/4/1)
Docker可视化工具使用(2022/4/2)