004.Docker镜像管理
一 镜像基本操作
1.1 搜索镜像
1 root@docker:~# docker search centos #查询centos共享镜像

1.2 下载(拉取)镜像
1 root@docker:~# docker pull centos:7 #使用pull下载镜像

1.3 列出(查看)本地镜像
1 root@docker:~# docker images <特定标签> #查看本地下载的镜像

- REPOSTITORY:表示镜像的仓库源,有以下类型:
- [namespace/centos]:由命名空间和实际的仓库名称组成。
- [centos]:只有仓库名。属于顶级命名空间,只用于官方镜像。
- [dl.dockerpool.com:5000\centos:7]:指定URL路径的方式。
- TAG:镜像的标签
- 未指定镜像tag时,默认为latest,但latest没有任何特殊含义,人为的将latest作为最新稳定版本的别名;
- 一个repository可以有多个tag,而多个tag也可能对应同一个镜像。
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
1.4 推送镜像
1 root@docker:~# docker push registry.cn-hangzhou.aliyuncs.com/xhy-study-01/xhy-images-01:centos-7-xhy

1.5 导出镜像
1 root@docker:~# docker save -o centos-7.tar centos:7
1.6 导入镜像
1 root@docker:~# docker load -i centos-7.tar
1.7 删除镜像
1 root@docker:/study# docker rmi httpd
1.8 设置镜像标签
1 root@docker:~# docker tag 6de222aa7640 xhy/centos7:v3
2 root@docker:~# docker images

二 docker文件系统
2.1 Linux文件系统简介
2.2 docker文件系统
2.3 docker镜像原理



三 镜像结构
3.1 image结构

1 root@docker:/study# tar -xf centos-7.tar

1 root@docker:/study# tree

1 root@docker:/study# cat repositories
2 {"centos":{"7":"d1ed0d8ec4ec460641430566e9a8cece698e60d4ad4afcf48759ad157d340064"}}
1 root@docker:/study# cat d1ed0d8ec4ec460641430566e9a8cece698e60d4ad4afcf48759ad157d340064/json | jq .

1 root@docker:/study# tar -tf d1ed0d8ec4ec460641430566e9a8cece698e60d4ad4afcf48759ad157d340064/layer.tar

四 Dockerfile、Docker镜像和Docker容器
4.1 关系


五 docker存储驱动
5.1 底层技术
- 写时复制(CoW)
- 用时分配(allocate-on-demand)
5.2 AUFS

5.3 OverlayFS

5.4 Device mapper

5.5 Btrfs

5.6 ZFS


5.7 存储驱动的对比及适应场景
|
特点
|
优点
|
缺点
|
使用场景
|
|
|
AUFS
|
联合文件系统
未并入内核主线
文件级存储
|
作为docker的第一个存储驱动,相对稳定,且在大量的生产中实践,有较强的社区支持。
|
有多层,在做写时复制操作时,如果文件较大且存在比较低的层,可能会慢一些。
|
大并发但少IO的场景。
|
|
OverlayFS
|
联合文件系统
并入内核主线
文件级存储
|
只有两层
|
不管修改的内容大小都会复制整个文件,对大文件进行修改显示要比小文件消耗更多的时间。
|
大并发但少IO的场景。
|
|
Device mapper
|
并入内核主线
块级存储
|
块级无论是大文件还是小文件都只复制需要修改的块,并不是整个文件。
|
不支持共享存储,即有多个容器读同一个文件时,需要生产多个副本,在多容器启停的情况下可能会导致磁盘溢出。
|
适合IO密集的场景。
|
|
Btrfs
|
并入内核主线
文件级存储
|
可如Device mapper直接操作底层设备,支持动态添加设备。
|
不支持共享存储,即有多个容器读同一个文件时,需要生产多个副本,在多容器启停的情况下可能会导致磁盘溢出。
|
不适合在高密度容器的PaaS平台上使用。
|
|
ZFS
|
把所有设备密集到一个存储池进行管理。
|
支持多个容器共享一个缓存块,适合内存大的环境。
|
COW使碎片化问题更加严重,文件在硬盘上的物理地址会变得不再连续,顺序读会变得性能比较差。
|
适合PaaS和高密度的场景。
|
5.8 修改docker存储驱动类型
1 root@docker:~# vi /etc/docker/daemon.json
2 {
3 "storage-driver": "overlay2"
4 }
六 创建镜像
- 从已经创建的容器中更新镜像,并且提交这个镜像
- 使用 Dockerfile 指令来创建一个新的镜像
6.1 更新镜像并提交
- 运行容器
- 修改容器
- 将容器保存为新的镜像
1 root@docker:~# docker run --name centos-7-01 -it centos:7 /bin/bash #创建容器
2 [root@01b2b251e216 /]# yum -y install net-tools vim openssh-clients wget ntp bash-completion #安装软件
3 [root@01b2b251e216 /]# exit
4 root@docker:~# docker commit -m="has modify" -a="xhy" 01b2b251e216 centos-7-01
5 root@docker:~# docker images

- -m:提交的描述信息
- -a:指定镜像作者
- 01b2b251e216 :容器ID
- centos-7-01:指定要创建的目标镜像名
1 root@docker:~# docker images #查看镜像
- 手动创建,容易出错,效率低及可重复性弱
- 使用者并不知道镜像是如何创建出来的,里面是否有恶意程序,可能存在案例隐患
6.2 Dockerfile构建镜像举例
1 root@docker:~# mkdir /dockerfiles
2 root@docker:~# cd /dockerfiles/
3 root@docker:/dockerfiles# vi Dockerfile
4 FROM centos:7
5 MAINTAINER Fisher "xhy@imxhy.cn"
6
7 RUN /bin/echo 'root:x123456' |chpasswd
8 RUN useradd xhy
9 RUN /bin/echo 'xhy:x123456' |chpasswd
10 RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
11 EXPOSE 22
12 EXPOSE 80
13 CMD /usr/sbin/sshd -D
1 root@docker:/dockerfiles# docker build -t xhy/centos7 /dockerfiles/
- -t :指定要创建的目标镜像名
- /dockerfiles/:Dockerfile 文件所在目录
1 root@docker:~# docker images #查看镜像

1 root@docker:/dockerfiles# docker run -t -i xhy/centos7 /bin/bash #创建容器

七 Dockerfile详解
7.1 Dockerfile典型结构
1 From ubutu #第一行必须指令基于的基础镜像
2 MAINTAINER docker_user docker_user@mail.com #维护者信息
3 apt/sourcelist.list #镜像的操作指令
4 RUN apt-get update && apt-get install -y ngnix #镜像的操作指令
5 RUN echo "\ndaemon off;">>/etc/ngnix/nignix.conf #镜像的操作指令
6 CMD /usr/sbin/ngnix #容器启动时执行指令
7.2 Dockerfile相关指令
- 指令:From
1 FROM <image>
2 FROM <image>:<tag>
3 FROM <image>:<digest>
- FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。
- 如果有需求在一个 Dockerfile 中创建多个镜像,则FROM可以在一个 Dockerfile 中出现多次。
- 如果FROM语句没有指定镜像标签,则默认使用latest标签。
- 指令:MAINTAINER
1 MAINTAINER <name>
1 MAINTAINER xhy
- 指令:RUN
1 RUN <commands>
2 RUN "executable", "param1", "param2"
1 RUN echo 'Hello, Docker!'
2 RUN ["/bin/bash", "-c","echo hello"]
- 指令:CMD
1 CMD "executable","param1","param2"
2 CMD "param1","param2"
3 CMD command param1 param2 (shell form)
- 指令:ENTRYPOINT
1 ENTRYPOINT "executable", "param1", "param2"
2 ENTRYPOINT command param1 param2 (shell form)
1 ENTRYPOINT ["nginx"]
2 CMD ["-g","daemon off;"]
- 指令:ADD
1 ADD <src>... <dest>
1 ADD http://mirrors.163.com/.help/CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo
- 指令:COPY
1 COPY <src>... <dest>
1 COPY package.json /usr/src/app/
- 指令:EXPOSE
1 EXPOSE <port> [<port>...]
1 EXPOSE 22 80 8443
- 指令:ENV
1 ENV <key> <value> # 只能设置一个变量
2 ENV <key>=<value> ... # 允许一次设置多个变量
1 ENV myName="John Doe" myDog=Rex myCat=fluffy
2 ENV PG_MAJOR 9.3
3 ENV PG_VERSION 9.3.4
- 指令:VOLUME
1 VOLUME ["<路径1>", "<路径2>"...]
2 VOLUME <路径>
1 VOLUME ["/data","/opt"]
- 指令:WORKDIR
1 WORKDIR <path>
1 WORKDIR /app
- 指令:USER
1 USER <user>[:<group>]
2 USER <UID>[:<GID>]
1 RUN groupadd -r redis && useradd -r -g redis redis
2 USER redis
3 RUN [ "redis-server" ]
- 指令:ONBUILD
1 ONBUILD [INSTRUCTION]
1 [...]
2 ONBUILD ADD . /app/src
3 ONBUILD RUN /usr/local/bin/python-build --dir /app/src
4 [...]
1 FROM image-A
1 ADD . /app/src
2 RUN /usr/local/bin/python-build --dir /app/src
- 指令:HEALTHCHECK
1 HEALTHCHECK [选项] CMD <命令> :设置检查容器健康状况的命令
2 HEALTHCHECK NONE :如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
- interval=<间隔> :两次健康检查的间隔,默认为 30 秒;
- timeout=<时长> :健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
- retries=<次数> :当连续失败指定次数后,则将容器状态视为 unhealthy ,默认 3 次。
1 FROM nginx
2 RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
3 HEALTHCHECK --interval=5s --timeout=3s \
4 CMD curl -fs http://localhost/ || exit 1
7.3 dockerfile最佳实践
- 使用.dockerignore文件
- 避免安装不必要的软件包
- 每个容器都跑一个进程
- 最小化层
- 多行参数排序
1 RUN apt-get update && apt-get install -y \
2 bzr \
3 cvs \
4 git \
5 mercurial \
6 subversion
- 尽可能清理不必要的文件
004.Docker镜像管理的更多相关文章
- Docker镜像管理基础篇
Docker镜像管理基础篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker Images Docker镜像还有启动容器所需要的文件系统及其内容,因此,其用于创建并启 ...
- Devops(四):Docker 镜像管理
参考 <Docker中上传镜像到docker hub中> <Docker 镜像管理> <通过容器提交镜像(docker commit)以及推送镜像(docker push ...
- 2、docker镜像管理
Docker镜像管理 镜像是Docker容器的基础,想运行一个Docker容器就需要有镜像.我们上面已经学会了使用search搜索镜像.那么这个镜像是怎么创建的呢? 创建镜像 镜像的创建有以下几种方法 ...
- Docker学习第一天(Docker入门&&Docker镜像管理)
简介 今天小区的超市买零食老板给我说再过几天可能就卖完了我有点诧异,老板又说厂家不生产了emmm 今天总算开始docker了! 1.Docker? 1.什么是Docker Docker 是一个开源的应 ...
- 三、docker镜像管理
一.docker镜像管理 1.1.镜像搜索-search 从docker镜像仓库模糊搜索镜像 用法: docker search 镜像关键字 [root@zutuanxue ~]# docker se ...
- paas架构之docker——镜像管理
1. 镜像管理 1.1. 列出镜像 Sudo docker images 1.2. 查看镜像 Sudo docker images xxxx 1.3. 拉取镜像 Sudo docker pull ub ...
- Docker镜像管理
镜像是docker的三大核心概念之一.可以用来创建容器. Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统被称为UnionFS.镜像可以基于Dockerfile构建,Dockerf ...
- docker镜像管理(二)
docker镜像 docker镜像含有启动容器所需要的文件系统和内容,因此,其用于创建并启动docker容器 docker镜像采用分层构建机制,最底层为bootfs,其之为rootfs bootfs: ...
- Docker 学习3 Docker镜像管理基础
一.docker 常用操作及原理 1.docker 常用操作 2.docker 机制 1.docker client端是通过http或者https与server端通信的.个 2.docker 镜像可以 ...
随机推荐
- 关于Laravel 无法下载的问题
今天在git bush用composer安装laravel5.5卡住了,无法下载 解决办法:更换到国内源,就可以下载了 运行命令: composer config -g repo.packagist ...
- cetus系列~ cetus+mha
一 简介:mha+cetus高可用架构二 环境 1 mysql 5.7 并行复制+GTID 2 cetus最新版 3 mha0.57二 安装 1 安装mha-rpm包 2 做免密认证 3 ...
- python 入门基础24 元类、单例模式
内容目录: 一.元类 二.单例模式 一.元类 1 什么是元类: 源自一句话:在python中,一切皆对象,而对象都是由类实例化得到的 class OldboyTeacher: def __init__ ...
- aar jar包打包
使用Android Studio Module的方式编译出aar和jar包: aar包:打aar包时,gradle compile依赖编译进来的包不会被打到aar包中,所以接入aar的应用仍然需要添加 ...
- 零基础http代理http完美代理访问
如果翻过墙,或者做过渗透啥的,肯定对代理不陌生,说白了,代理服务器就是一个中转站,你对目标网址的请求都会进过代理服务器去请求,类似于一个被你操控的傀儡,别人能知道的也只能是这个代理,从而提升安全性和访 ...
- Netty通信原理
Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端,它极大的简化了TCP和UDP套接字服务器等网络编程. BIO(Blocking IO):每一个请求,一个S ...
- 安装VNC
一.安装相应桌面环境与vnc服务端和客户端: # yum groupinstall "GNOME Desktop Environment"(CentOS 5.x安装GNOME桌面环 ...
- /etc/profile 路径出错后相关的命令失效解决方式
关于 Linux 的配置文件 /etc/profile 路径出错后相关的命令失效解决方式(如:ls,vi不能用) 今天学习LINUX 下配置jdk 和安装tomcat 通过VI编辑/etc/profi ...
- /etc/fstab文件详解【转】
******************************************************************************* 有很多人经常修改/etc/fstab文件 ...
- 【转】C/C++内存泄漏及检测
“该死系统存在内存泄漏问题”,项目中由于各方面因素,总是有人抱怨存在内存泄漏,系统长时间运行之后,可用内存越来越少,甚至导致了某些服务失败.内存泄漏是最难发现的常见错误之一,因为除非用完内存或调用ma ...