Docker常用命令
帮助启动类命令
|
|
镜像命令
|
|
虚悬镜像:仓库名、tag都为
容器命令
|
|
镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,称为层级的文件系统UnionFS。Union文件系统(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就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。 对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
本地镜像发布
发布到阿里云
-
阿里云官网搜索
容器镜像服务
,创建个人实例 ,新建命名空间和仓库名称,进入管理界面 -
按照管理界面的命令,将镜像push到阿里云镜像仓库
1 2 3
docker login --username=xxxxxx registry.cn-hangzhou.aliyuncs.com docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ctstudy/ubuntu-test:[镜像版本号] docker push registry.cn-hangzhou.aliyuncs.com/ctstudy/ubuntu-test:[镜像版本号]
-
从阿里云镜像仓库拉取镜像
1
docker pull registry.cn-hangzhou.aliyuncs.com/ctstudy/ubuntu-test:[镜像版本号]
发布到私有库
官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。
Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。
Docker Registry镜像是官方提供的工具,可以用于构建私有镜像仓库。
-
下载镜像
1
docker pull registry
-
运行镜像
1 2
docker run -d -p 5000:5000 -v /dockerRepo:/var/lib/registry --privileged=true registry ## -v 数据卷 容器中,仓库会被创建在容器的 /var/lib/registry 目录下(不能为其他的目录)
-
curl命令查看容器中的镜像
1
curl -XGET http://localhost:5000/v2/_catalog # 显示 {"repositories":[]}
-
将要上传的镜像(ubuntu)修改为符合私服规范的tag
1
docker tag 镜像[:Tag] Host:Port/Repository:Tag # 如:docker tag ubuntu:1.2 localhost:5000/ubuntu:1.2
-
修改配置文件使之支持http
1
vim /etc/docker/daemon.json
修改为:
1 2 3 4
{ "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"], // 你自己的阿里云镜像,不用改,别忘了加逗号 "insecure-registries": ["localhost:5000"] }
修改完后重启docker。
-
push推送到私服库
1
docker push localhost:5000/ubuntu:1.2
再次验证:
1
curl -XGET http://localhost:5000/v2/_catalog # 显示 {"repositories":[ubuntu]}
-
pull到本地
1
docker pull localhost:5000/ubuntu:1.2
容器数据卷
|
|
我们对数据的要求希望是持久化的,Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。为了能保存数据在docker中我们使用卷。
-
数据卷可在容器之间共享或重用数据
-
卷中的更改可以直接实时生效,爽
-
数据卷中的更改不会包含在镜像的更新中
-
查看是否挂载成功:
1
docker inspect 容器ID
-
映射的读写规则
1 2
docker run --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 #容器内文件只读 docker run --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名 #默认,读写都可以
-
数据卷的继承与共享
1 2
docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu # 容器一 docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu # 容器二,他们共享容器卷