一、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引擎中运行容器有哪些?
docker ps -------------------------- 列出所有正在运行的容器
-a 正在运行的和历史运行过的容器
-q 静默模式,只显示容器编号
(1)查看正在运行的容器
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
#注意:可以映射多个端口号 -p 15672:15672 -pd672:5672
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 命令手册
命令 | 描述 |
连接到正在运行中的容器 | |
通过Dockerfile构建一个镜像 | |
docker builder | 管理builds |
docker checkpoint | 管理checkpoints |
从容器创建一个新的镜像 | |
docker config | 管理 Docker 配置 |
docker container | 管理容器(一般都会省略container,比如docker container ps ==> docker ps) |
docker context | 管理 contexts |
用于容器与主机之间的数据拷贝 | |
创建一个新容器 | |
检查容器里文件结构的变化 | |
docker events | 从服务器获取实时事件 |
在运行的容器中执行命令 | |
docker export | 将文件系统作为一个tar归档文件导出 |
查看指定镜像的创建历史 | |
docker image | 管理镜像 |
列出所有镜像 | |
从归档文件中创建镜像 | |
示 Docker 系统信息,包括镜像和容器数 | |
获取容器/镜像的元数据 | |
杀掉一个运行中的容器 | |
从归档文件中或STDIN中加载一个镜像 | |
登录 Docker | |
登出 Docker | |
获取容器日志 | |
docker manifest | 管理显示镜像 manifest 信息 |
docker network | 管理网络 |
docker node | 管理Swarm节点 |
暂停容器进程 | |
docker plugin | 管理插件 |
显示容器端口映射关系 | |
显示容器列表 | |
从镜像仓库中拉取或者更新指定镜像 | |
将本地的镜像上传到镜像仓库 | |
重命名容器 | |
重启容器 | |
删除容器 | |
删除镜像 | |
在一个新容器中运行命令(创建并进入容器) | |
将指定镜像保存成 tar 归档文件 | |
在公共仓库中搜索镜像 | |
docker secret | 管理 Docker secrets |
docker service | 管理Docker服务 |
docker stack | 管理 Docker stacks |
启动容器 | |
docker stats | Display a live stream of container(s) resource usage statistics |
停止容器 | |
docker swarm | 管理 Swarm |
docker system | 管理 Docker |
标记本地镜像,将其归入某一仓库 | |
查看容器中运行的进程信息,支持 ps 命令参数 | |
docker trust | 管理Docker镜像上的trust |
取消容器暂停 | |
更新容器配置 | |
显示 Docker 版本信息 | |
docker volume | 管理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)