赞
踩
仓库 Registry
保存了多个镜像
镜像 image
容器 Container
image创建的运行实例。容器只包含业务运行所需的runtime环境。
镜像和容器可以类比成java中的类和实例
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统叫UnionFS。
UnionFS(联合文件系统):
- Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
- 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像的最底层是bootfs。
**bootfs **(boot file system):主要包含bootloader和kernel。
- bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
- 对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用宿主机的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载
为什么 Docker 镜像要采用这种分层结构呢?
- 可以共享资源
- 有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像
- 同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。
- 镜像的每一层都可以被共享。
List images
docker images -a
:列出所有镜像,包含中间印象层docker images -q
:显示当前镜像的iddocker images -qa
:列出所有镜像的iddocker images -digests
: 显示镜像摘要信息docker images -digests --no-trunc
: 显示镜像完整的摘要信息docker images prune
:可以清理无用的imagesSearch the Docker Hub for images
docker search -filter stars=300 tomcat
:列出STARS不小于300的镜像Pull an image or a repository from a registry
docker pull xxxx
等价于 docker pull xxxx:latest
remove an or more images
docker rmi xxxx
docker rmi -f xxxx
:Force removal of an imagedocker rmi -f xxxx oooo
:Force removal of more imagesdocker rmi -f $(docker images -qa)
:docker images -qa列出的id全传递给rmi参数并删掉docker commit
:提交容器副本使之成为一个新的镜像。可以创建自己的镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
dockerpush
:把image提交到docker hub的repository中。
docker login
:登录账号密码docker tag [imageName] finn5842/[repoName]:[tagName]
: 指定一个tag。比如docker tag nginx finn5842/nginx:http1.1docker push [tagName]
: 提交。比如:docker push finn5842/nginx:http1.1新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND]
–name=“name”:容器名称
-d:启动守护式容器。即后台运行容器,并返回容器ID
-i:以交互模式运行容器,通常与-t一起使用
-t:为容器重新分配一个伪输入终端,通常与-i一起使用
docker run -it --name=“myMySQL” mysql
-P:随机分配端口号
-p:指定端口号
-p 10060:8080 前面是docker暴露给外界的端口,后面是tomcat服务的接口
- 1
docker run -d xxxx
:以后台模式启动一个容器⭐
docker机制:
- docker容器后台运行时,必须有个前台进程
- 容器运行的命令除非要求一直挂起,如运行top, tail,否则就会自动退出
问题:通过docker ps -a 进行查看时, 发现容器自动退出。
原因:所以,容器以后台模式运行时,如果没有发现前台进程,就是立即自动退出
解决办法:运行的容器以前台运行的方式进行。
列出container
docker ps
:列出正在运行的容器
docker ps -a
:列出所有正在运行和历史上运行过的容器
docker ps -l
:列出最近创建的容器
docker ps -q
:列出正在运行的容器编号
docker ps -aq 就是列出所有容器的编号
docker ps -n xx
:列出最近创建的xx个容器
exit
ctrl+shift+z
离开容器,但不关闭容器
ctrl+p+q
docker start xxxx
:启动容器docker restart xxxx
:重启容器docker stop xxxx
docker kill
:强制停止容器docker rm xxxx
:删除已停止的容器
docker rm -f xxxx
:强制删除容器
docker rm -f $(docker ps -aq)
:强制删除所有容器
docker ps -aq|xargs docker rm
:强制删除所有容器(把docker ps -aq传给xargs,并作为下一个命令的参数)
docker attach xxxx
:直接进入容器启动命令终端,不会启动新的进程docker exec -it xxxx
:在容器中打开终端,并启动新的进程。默认是以docker exec -it xxxx /bin/bash
的方式交互
docker exec -it xxxx ls -l /tmp
:直接对xxxx容器进行ls -l /tmp操作并返回,并不进入容器docker inspect xxxx
docker cp xxxx:容器目录 主机目录
:复制容器内容到主机
从容器->宿主机
容器的opt目录下的aa.txt文件拷贝到宿主机的/usr/目录下
docker cp mycontainer:/opt/aa.txt /usr/
主机->容器
docker cp /usr/aa.txt mycontainer:/opt
容器数据卷
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
总结:
容器的持久化 + 容器间或容器和宿主机间继承和数据共享
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
举例:
docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash
查看数据卷是否挂载成功:docker inspect xxxx
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WbuPxWEr-1658545902845)(https://raw.githubusercontent.com/FinnSHI/PictureBed/main/imgs/202110302038205.png)]
容器和宿主机之间实现了数据共享
容器停止退出后,主机修改后数据仍然同步
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
:命令(带权限)。此时容器内数据卷只能读,不能写VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
:可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷
示例:
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished--------create successfully"
CMD /bin/bash
build后生成image
run
查看
主机对应默认地址
注意:
- 如果Docker挂载主机目录时,访问出现错误:Docker cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
先启动一个父容器dc01
docker run -it --name dc02 --volumes-from dc01 zzyy/centos
:dc02继承自dc01 (image:zzyy/centos)
Dockerfile是用来构建Docker image的文件,是由一系列命令和参数构成的脚本
每条保留字指令都必须为大写字母且后面要跟随至少一个参数
指令按照从上到下,顺序执行
每条指令都会创建一个新的镜像层,并对镜像进行提交
#
表示注释
从应用软件的角度来看,DockerFile、Image与Container分别代表软件的三个不同阶段:
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
描述:
docker build
指令产生一个Docker镜像。运行Docker镜像,创建容器; Docker Hub 中 99% 的镜像都是通过在 base 镜像 scratch 中安装和配置需要的软件构建出来的.
创建myTomcat文件夹:
mkdir -p /finn/mydockerfile/myTomcat
mkdir -p
是递归创建目录,如果上级文件夹不存在,会一起创建出来
在上述目录下touch c.txt
将jdk和tomcat安装的压缩包拷贝进上一步目录
使用一个 Dockerfile
模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose
恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose
中有两个重要的概念:
service
):一个应用容器,实际上可以包括运行多个相同镜像的容器实例。project
):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml
文件中定义。Compose
的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose
项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose
来进行编排管理。
手册资料:
https://docs.docker.com/compose/
yaml是docker-compose的核心。它一共有三层
#3层
version: '' #版本
services: #服务
服务1:
#服务配置
#其他配置 网络/卷、全局规则
volumes:
networks:
configs:
docker-compose up
docker-compose up --build
docker-compose down
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。