一.关于Docker镜像
Docker镜像含有启动容器所需要的文件系统及其内容 ,因此 其用于创建并启动docke镜像.
采用分层构建机制 最底层为bootfs ,向上为rootfs
bootfs:用于系统引导的文件系统,包括bootloader和kernel ,容器启动完成后会被卸载以节约内存资源
rootfs:位于bootfs之上,变现为docker容器的跟文件系统
- 传统模式中,系统启动之时,内核挂载tootfs时会首先将其挂载为"只读" 模式,完整性自检完成后将其重新挂载为读写模式
- docker中,rootfs由内核挂载为"只读"模式,而后通过"联合挂载"技术额外挂载一个"可写"层;
二.Docker镜像分层
- 位于下层的镜像称为父镜像,最底层的称为基础镜像(base image)
- 最上层为”可读写”层,其下的均为”只读”层
- 当删除容器时 ,可写层会一起删除
- 当删除容器时 ,可写层会一起删除
三.Docker存储
- 启动容器时,docker daemon会试图从本地获取相关的镜像,本地镜像不存在时,其将从Registry中下载该镜像并保存到本地.
Registry没有特别指定 默认为docker hub ,如果使用别的Registry ,则必须在镜像的访问路径给名服务器地址
四.Docker Hub
注册账号:https://hub.docker.com/signup
获取镜像:
#docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
<registry>[:<port>] 哪个仓库服务器加端口 docker hub 可省略
/[<namespace>/] 名称空间 哪个用户的仓库 顶层可省略
<name>:<tag> 仓库名加标签名
其他著名仓库服务器:https://quay.io/
例:
[root@Docker ~]# docker pull quay.io/coreos/flannel:v0.10.0-s390x //端口默认为443
五.镜像相关操作
5.1 镜像的生成途径
- Dockerfile
- 基于容器制作
- Docker Hub automater builds
5.2 基于容器做镜像
1.先启动一个容器 做好修改
先pull busybox镜像 启动后做一个主页 这样下次启动主页就存在
[root@liujie ~]# docker run --name web1 -it busybox
/ # mkdir /data/html
mkdir: can't create directory '/data/html': No such file or directory
/ # mkdir -p /data/html
/ # vi /data/html/index.html
hello httpd
//此时不能关闭容器
2.基于容器做镜像
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit [OPTIONS] CONTAINER 基于哪个容器做镜像
[REPOSITORY[:TAG]] 属于哪个仓库拥有什么标签 如果省略则代表本地的裸镜像 不属于任何仓库
[root@liujie ~]# docker commit -p web1 //-p是暂停 防止保存部分文件
sha256:b4ecf4975f3b22284c26be372197aa73029d0781acaeb584456fb624fc1fa934
[root@liujie ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> b4ecf4975f3b 12 minutes ago 1.15MB
仓库为空 标签也为空 id为生成id
为了后续管理 可以为打标签
[root@liujie ~]# docker tag b4ecf4975f3b 18834478096/httpd:v0.1 //基于id 18834478096为docker hub账号为后续上传
[root@liujie ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
18834478096/httpd v0.1 b4ecf4975f3b About an hour ago 1.15MB
删除镜像: 两个标签时可删除 只有一个标签删除会报错
[root@liujie ~]# docker image rm liujie/httpd:v0.1.1
Untagged: liujie/httpd:v0.1.1
3. 启动做好的镜像
[root@liujie ~]# docker run --name t1 -it 18834478096/httpd:v0.1
/ # cd /
/ # ls
bin data dev etc home proc root sys tmp usr var
/ # //之前创建好的data目录存在
5.3 上传镜像
放到docker hub上:
1.注册账号
2.使用Docker hub账号在验证本地登录
[root@liujie ~]# docker login -u 18834478096
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
3. 查看本地的镜像
[root@liujie ~]# docker image images
REPOSITORY TAG IMAGE ID CREATED SIZE
18834478096/httpd v0.1 b4ecf4975f3b 3 hours ago 1.15MB
如果REPOITORY的名不是你Docker hub账号和仓库,即Docker ID/仓库名,是上传不成功的
4.在Docker Hub上创建仓库
5.推镜像
[root@liujie ~]# docker image push 18834478096/httpd:v0.1
The push refers to repository [docker.io/18834478096/httpd]
de66091347b2: Pushed
8a788232037e: Mounted from library/busybox
v0.1: digest: sha256:eccf03eea662b180d52d3c4909bcd82cfc7a7b319c6a4d664643750cdf0544b9 size: 734
上传阿里镜像仓库
https://cr.console.aliyun.com/
选择本地仓库 创建镜像仓库
点击管理
1.给镜像打标签 使用阿里云地址
[root@liujie ~]# docker image images
REPOSITORY TAG IMAGE ID CREATED SIZE
18834478096/httpd v0.1 b4ecf4975f3b 3 hours ago 1.15MB
[root@liujie ~]# docker tag 18834478096/httpd:v0.1 registry.cn-qingdao.aliyuncs.com/18834478096/httpd:v0.1
[root@liujie ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
18834478096/httpd v0.1 b4ecf4975f3b 3 hours ago 1.15MB
registry.cn-qingdao.aliyuncs.com/18834478096/httpd v0.1 b4ecf4975f3b 3 hours ago 1.15MB
2.登录阿里云
[root@liujie ~]# docker logout
Removing login credentials for https://index.docker.io/v1/
[root@liujie ~]# docker login --username=18834478096 registry.cn-qingdao.aliyuncs.com
Password: //密码为Registry登录密码
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
3.推镜像到阿里云
[root@liujie ~]# docker push registry.cn-qingdao.aliyuncs.com/18834478096/httpd:v0.1
The push refers to repository [registry.cn-qingdao.aliyuncs.com/18834478096/httpd]
de66091347b2: Pushed
8a788232037e: Pushed
v0.1: digest: sha256:eccf03eea662b180d52d3c4909bcd82cfc7a7b319c6a4d664643750cdf0544b9 size: 734
5.4 镜像导入导出
打包镜像
[root@liujie ~]# docker save -o myfirst.gz 18834478096/httpd:v0.1
[root@liujie ~]# ll
total 230540
-rw------- 1 root root 1386496 Dec 19 23:01 myfirst.gz
发送压缩包到其他docker主机使用
[root@liujie2 ~]# docker load -i myfirst.gz
[root@liujie2 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
18834478096/httpd v0.1 b4ecf4975f3b 4 hours ago 1.15MB
这种方法run之前要先pull镜像 不然run还会从默认地址下镜像