上海网站建设咨询站霸网络,什么专业可以做网站编辑,莱阳seo外包,wordpress多媒体占用id参考#xff1a; 1.镜像是什么#xff1f;#xff08;面试题#xff09; 是一种轻量级、可执行的独立软件包#xff0c;它包含运行某个软件所需的所有内容#xff0c;我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文…参考 1.镜像是什么面试题 是一种轻量级、可执行的独立软件包它包含运行某个软件所需的所有内容我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等)这个打包好的运行环境就是image镜像文件。 只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。 1.1分层的镜像
1.2UnionFS联合文件系统
UnionFS联合文件系统Union文件系统UnionFS是一种分层、轻量级并且高性能的文件系统它支持对文件系统的修改作为一次提交来一层层的叠加同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承基于基础镜像没有父镜像可以制作各种具体的应用镜像。
特性一次同时加载多个文件系统但从外面看起来只能看到一个文件系统联合加载会把各层文件系统叠加起来这样最终的文件系统会包含所有底层的文件和目录 1.3Docker镜像加载原理 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就是各种不同的操作系统发行版比如UbuntuCentos等等。 1.4平时我们安装进虚拟机的CentOS都是好几个G为什么docker这里才200M 面试题 对于一个精简的OSrootfs可以很小只需要包括最基本的命令、工具和程序库就可以了因为底层直接用Host的kernel自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
1.5为什么 Docker 镜像要采用这种分层结构呢 (面试题
镜像分层最大的一个好处就是共享资源方便复制迁移就是为了复用。 比如说有多个镜像都从相同的 base 镜像构建而来那么 Docker Host 只需在磁盘上保存一份 base 镜像 同时内存中也只需加载一份 base 镜像就可以为所有容器服务了。而且镜像的每一层都可以被共享。
重点理解
Docker镜像层都是只读的容器层是可写的 当容器启动时一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”“容器层”之下的都叫“镜像层”。
当容器启动时一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”“容器层”之下的都叫“镜像层”。 所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的容器层下面的所有镜像层都是只读的。 1.6Docker镜像commit操作案例
docker commit提交容器副本使之成为一个新的镜像
docker commit -m提交的描述信息 -a作者 容器ID 要创建的目标镜像名:[标签名] 案例演示ubuntu安装vim
从Hub上下载ubuntu镜像到本地并成功运行
原始的默认Ubuntu镜像是不带着vim命令的 外网连通的情况下安装vim
docker容器内执行上述两条命令 apt-get update apt-get -y install vim 安装完成后commit我们自己的新镜像 [rootlocalhost test]# docker commit -madd vim cmd -azzz b6f03f9a5f33 atguigu.myubuntu:1.1
sha256:331f923b17404d61136e2c67e48a8c91dff04c9f75aff020c6c501dd989d5550
[rootlocalhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
atguigu.myubuntu 1.1 331f923b1740 30 seconds ago 187MB
redis latest 7614ae9453d1 20 months ago 113MB
mysql 5.7 c20987f18b13 20 months ago 448MB
mysql latest 3218b38490ce 20 months ago 516MB
ubuntu latest ba6acccedd29 22 months ago 72.8MB启动我们的新镜像并和原来的对比 [rootlocalhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
atguigu.myubuntu 1.1 331f923b1740 30 seconds ago 187MB
redis latest 7614ae9453d1 20 months ago 113MB
mysql 5.7 c20987f18b13 20 months ago 448MB
mysql latest 3218b38490ce 20 months ago 516MB
ubuntu latest ba6acccedd29 22 months ago 72.8MB
[rootlocalhost test]# docker run -it 331f923b1740
root89c2c49edda0:/# vim a.txt
root89c2c49edda0:/# ^C
1 官网是默认下载的Ubuntu没有vim命令 2我们自己commit构建的镜像新增加了vim功能可以成功使用。 Docker中的镜像分层支持通过扩展现有镜像创建新的镜像。类似Java继承于一个Base基础类自己再按需扩展。 新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件就在现有镜像的基础上增加一层 2.本地镜像发布到阿里云 2.1本地镜像发布到阿里云流程 OPTIONS说明 -a :提交的镜像作者 -m :提交时的说明文字 2.2镜像的生成方法 2.3将本地镜像推送到阿里云
阿里云登录 - 欢迎登录阿里云安全稳定的云计算服务平台 创建仓库镜像 选择个人实例
阿里云免费试用 - 阿里云 立即试用 设置 registry 密码 abc123456 创建命名空间 atguigu123456 选择 命名空间 atguigu123456 创建镜像仓库 2.4操作操作指南
1. 登录阿里云Docker Registry
$ docker login --usernamersingstar18046059785 registry.cn-shenzhen.aliyuncs.com
用于登录的用户名为阿里云账号全名密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
$ docker pull registry.cn-shenzhen.aliyuncs.com/atguigu123456/atguigu12345678:[镜像版本号]
3. 将镜像推送到Registry
$ docker login --usernamersingstar18046059***后3位自己加 registry.cn-shenzhen.aliyuncs.com$ docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/atguigu123456/atguigu12345678:[镜像版本号]$ docker push registry.cn-shenzhen.aliyuncs.com/atguigu123456/atguigu12345678:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
4. 选择合适的镜像仓库地址
从ECS推送镜像时可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络请使用 registry-vpc.cn-shenzhen.aliyuncs.com 作为Registry的域名登录。
5. 示例
使用docker tag命令重命名镜像并将它通过专有网络地址推送至Registry。
$ docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEregistry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB$ docker tag 37bb9c63c8b2 registry-vpc.cn-shenzhen.aliyuncs.com/acs/agent:0.7-dfb6816
使用 docker push 命令将该镜像推送至远程。
$ docker push registry-vpc.cn-shenzhen.aliyuncs.com/acs/agent:0.7-dfb6816 操作
登录 docker login --usernamersingstar18046059*** registry.cn-shenzhen.aliyuncs.com 密码abc123456 先将推送 Registry $ docker login --usernamersingstar18046059785 registry.cn-shenzhen.aliyuncs.com$ docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/atguigu123456/atguigu12345678:[镜像版本号]$ docker push registry.cn-shenzhen.aliyuncs.com/atguigu123456/atguigu12345678:[镜像版本号] 将阿里云上的镜像下载到本地
先删除在拉取 容器运行成功 阿里云登录 - 欢迎登录阿里云安全稳定的云计算服务平台
3.本地镜像发布到私有库
3.1Docker Registry 是什么 1 官方Docker Hub地址https://hub.docker.com/中国大陆访问太慢了且准备被阿里云取代的趋势不太主流。 2 Dockerhub、阿里云这样的公共镜像仓库可能不太方便涉及机密的公司不可能提供镜像给公网所以需要创建一个本地私人仓库供给团队使用基于公司内部项目构建镜像。 Docker Registry是官方提供的工具可以用于构建私有镜像仓库
3.2将本地镜像推送到私有库 1.下载镜像Docker Registry
docker pull registry docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privilegedtrue registry 默认情况仓库被创建在容器的/var/lib/registry目录下建议自行用容器卷映射方便于宿主机联调 2.运行私有库Registry相当于本地有个私有Docker hub -v 数据卷
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privilegedtrue registry 默认情况仓库被创建在容器的/var/lib/registry目录下建议自行用容器卷映射方便于宿主机联调 [rootlocalhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-shenzhen.aliyuncs.com/atguigu123456/atguigu12345678 1.1 331f923b1740 6 hours ago 187MB
redis latest 7614ae9453d1 20 months ago 113MB
mysql 5.7 c20987f18b13 20 months ago 448MB
mysql latest 3218b38490ce 20 months ago 516MB
registry latest b8604a3fe854 21 months ago 26.2MB
ubuntu latest ba6acccedd29 22 months ago 72.8MB
[rootlocalhost ~]# docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privilegedtrue registry
docker: invalid reference format.
See docker run --help.
[rootlocalhost ~]# docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privilegedtrue registry
31ad71fb3042a3d4bd71603ade8f03f04b2fb2a8c5dd78e4d1928d3347f4f55c
[rootlocalhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31ad71fb3042 registry /entrypoint.sh /etc… 33 seconds ago Up 32 seconds 0.0.0.0:5000-5000/tcp, :::5000-5000/tcp romantic_hellman
a413e193d890 redis docker-entrypoint.s… 4 weeks ago Up 2 hours 0.0.0.0:6379-6379/tcp, :::6379-6379/tcp redis
6ae5aab74552 mysql:5.7 docker-entrypoint.s… 4 weeks ago Up 2 hours 0.0.0.0:3306-3306/tcp, :::3306-3306/tcp, 33060/tcp mysql
[rootlocalhost ~]# 3.案例演示创建一个新镜像ubuntu安装ifconfig命令 4. 从Hub上下载ubuntu镜像到本地并成功运行
5.原始的Ubuntu镜像是不带着ifconfig命令的 ^C
[rootlocalhost ~]# docker run -it ubuntu /bin/bash
root824f6a2400aa:/# ^C
root824f6a2400aa:/# ifconfig
bash: ifconfig: command not found
root824f6a2400aa:/# 6.外网连通的情况下安装ifconfig命令并测试通过
docker容器内执行上述两条命令apt-get update apt-get install net-tools 7.安装完成后commit我们自己的新镜像
公式docker commit -m提交的描述信息 -a作者 容器ID 要创建的目标镜像名:[标签名]命令在容器外执行记得docker commit -mifconfig cmd add -azzyy a69d7c825c4f注意这是容器id zzyyubuntu:1.2
错写成 imgae id : 会报错重新开个会话 Last login: Sat Sep 2 19:19:55 2023 from gateway
[rootlocalhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a393315bd74d ubuntu /bin/bash 22 seconds ago Up 21 seconds admiring_euler
31ad71fb3042 registry /entrypoint.sh /etc… 14 minutes ago Up 14 minutes 0.0.0.0:5000-5000/tcp, :::5000-5000/tcp romantic_hellman
a413e193d890 redis docker-entrypoint.s… 4 weeks ago Up 3 hours 0.0.0.0:6379-6379/tcp, :::6379-6379/tcp redis
6ae5aab74552 mysql:5.7 docker-entrypoint.s… 4 weeks ago Up 3 hours 0.0.0.0:3306-3306/tcp, :::3306-3306/tcp, 33060/tcp mysql
[rootlocalhost ~]# docker commit -mifconfig cmd add -azzyy a393315bd74d zzyyubuntu:1.2
sha256:4e9bf890de32a7b38af8dc2c434e84ff349430ceaeb4233ed704c9eb8ae6dc6e
[rootlocalhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zzyyubuntu 1.2 4e9bf890de32 22 seconds ago 72.8MB
registry.cn-shenzhen.aliyuncs.com/atguigu123456/atguigu12345678 1.1 331f923b1740 6 hours ago 187MB
redis latest 7614ae9453d1 20 months ago 113MB
mysql 5.7 c20987f18b13 20 months ago 448MB
mysql latest 3218b38490ce 20 months ago 516MB
registry latest b8604a3fe854 21 months ago 26.2MB
ubuntu latest ba6acccedd29 22 months ago 72.8MB
[rootlocalhost ~]# 启动我们的新镜像并和原来的对比 问题 docker unbunt exit 退出容器在进去 之后ifconfig失效了 curl验证私服库上有什么镜像 curl -XGET http://192.168.111.162:5000/v2/_catalog 可以看到目前私服库没有任何镜像上传过。。。。。。 将新镜像zzyyubuntu:1.2修改符合私服规范的Tag 按照公式 docker tag 镜像:Tag Host:Port/Repository:Tag 自己host主机IP地址填写同学你们自己的不要粘贴错误O(∩_∩)O 使用命令 docker tag 将zzyyubuntu:1.2 这个镜像修改为192.168.111.162:5000/zzyyubuntu:1.2 docker tag zzyyubuntu:1.2 192.168.111.162:5000/zzyyubuntu:1.2 修改配置文件使之支持http 别无脑照着复制registry-mirrors 配置的是国内阿里提供的镜像加速地址不用加速的话访问官网的会很慢。 2个配置中间有个逗号 ,别漏了这个配置是json格式的。 2个配置中间有个逗号 ,别漏了这个配置是json格式的。 2个配置中间有个逗号 ,别漏了这个配置是json格式的。
vim命令新增如下红色内容vim /etc/docker/daemon.json
{ registry-mirrors: [https://aa25jngu.mirror.aliyuncs.com], insecure-registries: [192.168.111.162:5000] }
push推送到私服库
docker push 192.168.111.162:5000/zzyyubuntu:1.2 curl验证私服库上有什么镜像2
curl -XGET http://192.168.111.162:5000/v2/_catalog pull到本地并运行
docker pull 192.168.111.162:5000/zzyyubuntu:1.2 4.Docker容器数据卷
4.1坑容器卷记得加入
--privilegedtrue
Docker挂载主机目录访问如果出现cannot open directory .: Permission denied解决办法在挂载目录后多加一个--privilegedtrue参数即可 原因 如果是CentOS7安全模块会比之前系统版本加强不安全的会先禁止所以目录挂载的情况被默认为不安全的行为 在SELinux里面挂载目录被禁止掉了额如果要开启我们一般使用--privilegedtrue命令扩大容器的权限解决挂载目录没有权限的问题也即 使用该参数container内的root拥有真正的root权限否则container内的root只是外部的一个普通用户权限。
4.2回顾下上一讲的知识点参数V
还记得蓝色框框中的内容吗 4.3数据卷 是什么
卷就是目录或文件存在于一个或多个容器中由docker挂载到容器但不属于联合文件系统因此能够绕过Union File System提供一些用于持续存储或共享数据的特性 卷的设计目的就是数据的持久化完全独立于容器的生存周期因此Docker不会在容器删除时删除其挂载的数据卷。
一句话有点类似我们Redis里面的rdb和aof文件
将docker容器内的数据保存进宿主机的磁盘中
4.3.1运行一个带有容器卷存储功能的容器实例
docker run -it --privilegedtrue -v /宿主机绝对路径目录:/容器内目录 镜像名 4.4 能做什么
* 将运用与运行的环境打包镜像run后形成容器实例运行 但是我们对数据的要求希望是持久化的 Docker容器产生的数据如果不备份那么当容器实例删除后容器内的数据自然也就没有了。 为了能保存数据在docker中我们使用卷。 4.4.1数据的特点 1数据卷可在容器之间共享或重用数据 2卷中的更改可以直接实时生效 3数据卷中的更改不会包含在镜像的更新中 4数据卷的生命周期一直持续到没有容器使用它为止
4.5 数据卷案例
4.5.1宿主vs容器之间映射添加容器卷
直接命令添加
公式docker run -it -v /宿主机目录:/容器内目录 ubuntu /bin/bash docker run -it --name myu3 --privilegedtrue -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash docker run -it --privilegedtrue -v /宿主机绝对路径目录:/容器内目录 镜像名
查看数据卷是否挂载成功
docker inspect 容器ID 容器和宿主机之间数据共享
1 docker修改主机同步获得 2 主机修改docker同步获得 3 docker容器stop主机修改docker容器重启看数据是否同步。 4.5.2 读写规则映射添加说明
读写(默认) rw read write docker run -it --privilegedtrue -v /宿主机绝对路径目录:/容器内目录:rw 镜像名 默认同上案例默认就是rw
只读
容器实例内部被限制只能读取不能写 /容器目录:ro 镜像名 就能完成功能此时容器自己只能读取不能写 ro read only 此时如果宿主机写入内容可以同步给容器内容器可以读取到。
4.5.3卷的继承和共享
容器1完成和宿主机的映射 docker run -it --privilegedtrue -v /mydocker/u:/tmp --name u1 ubuntu 容器2继承容器1的卷规则 docker run -it --privilegedtrue --volumes-from 父类 --name u2 ubuntu