镜像是Docker运行容器的前提
上一篇文章Docker学习(二)——Docker架构讲述了Docker的基本架构,接下来逐步拆分讲解Docker的核心内容之一——镜像.
Docker 运行容器前需要本地存有对应的镜像,如果镜像不存在,Docker会尝试先从默认(Docker Hub公共注册服务器中的仓库)镜像仓库下载,用户也可以配置使用自己的仓库. 本章内容主要有:获取镜像,查看镜像信息,搜寻镜像,删除镜像,创建镜像,存储和载入镜像,上传镜像. 看着内容很多,其实熟悉Git的朋友,分分钟就可以理解上面的这些内容, 操作方式都是相通的, 话不多说,看命令说话.
获取镜像
语法: docker pull NAME[:TAG]
- 从Docker Hub的Ubuntu仓库下载最新版本Ubuntu镜像(如果不指定tag,默认tag是latest,即下载最新版本)
1
$ docker pull ubuntu
- 从Docker Hub的Ubuntu仓库下载指定版本Ubuntu镜像
1
$ docker pull ubuntu:16.04
- 我们前面讲过,默认是从Docker Hub的Registry中下载,所以以上的命令相当于
1
2$ docker pull registry.hub.docker.com/ubuntu:latest
$ docker pull registry.hub.docker.com/ubuntu:16.04 - 从其他注册服务器下载Docker镜像(如DockerPool社区,需要指定完整的注册服务器地址)
1
$ docker pull dl.dockerpool.com:5000/ubuntu
- 详细信息请使用下面命令自行了解
1
$ docker pull --help
查看镜像信息
语法:docker images
通过该命令可以查看本地所有的镜像,说明一下执行该命令之后每列的含义
- REPOSITORY: 来自于哪个仓库,同样是如果没有指定注册服务器的地址,那默认就是Docker Hub的仓库
- TAG:镜像的标签信息,比如latest、16.04
- IMAGE ID:镜像的唯一ID标识
- CREATED:(镜像拉取到本地或者在本地创建镜像的时间)
- VIRTUAL SIZE:镜像的大小
repository是不同的仓库,tag是标记同一个仓库的不同的镜像
Tag打标记
有时候镜像需要一个自己需要的tag标识,这会我们需要用到docker 的tag命令来方便我们管理镜像
语法:docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
- 给镜像打上自己的标签
1
$ docker tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:20171106_ubuntu
- 详细信息请使用下面命令自行了解
1
$ docker tag --help
执行完以上命令再次查看[docker images]本地所有镜像,发现我们打了标记的镜像和被打标记的镜像的镜像ID竟然一样.这说明新打上标签的镜像只是指向了同一个镜像文件,只是别名不同,标签在这里就起到了引用或快捷方式的作用.
查看镜像的详细信息
语法:docker inspect [OPTIONS] NAME|ID [NAME|ID]
执行[docker inspect]命令会得到一个Json格式的信息,如果我们需要关注某一个部分,可以使用[-f]参数来使用,镜像ID使用前几个字符就可以,不用输入全部
- 查看刚刚打了标记的Ubuntu镜像的详细信息(镜像ID因人而异)
1
$ docker inspect 5506de2b643b
- 查看镜像指定的详细信息
1
$ docker inspect -f {{".Architecture"}} 5506
- 详细信息请使用下面命令自行了解
1
$ docker inspect --help
搜寻镜像
语法:docker search [OPTIONS] TERM
- 搜寻mysql镜像
1
$ docker search mysql
- 说明一下执行该命令之后每列的含义
- NAME: 镜像名称
- DESCRIPTION:竞相描述
- STARTS:镜像星级(代表受欢迎程度)
- OFFICIAL:是否为官方创建和维护的
- AUTOMATED:是否自动创建(自动创建的资源允许用户验证镜像内容以及来源)
删除镜像
语法:docker rmi [OPTIONS] IMAGE [IMAGE…], IMAGE可以是镜像标签或者镜像ID,rmi其实就是remove image的缩写.
删除镜像这里的规矩稍稍多一点但是遵循以下几个原则,不用背诵以下,会在后面的实践中逐步来验证
- 当本地一个镜像有多个标签时,删除某一个标签不影响其他镜像
- 当本地一个镜像只有一个标签时,删除该标签会彻底删除该镜像
- 当通过镜像ID删除镜像的时候,会逐个删除指向该镜像的标签,最终删除镜像.
- 当有该镜像创建的容器存在时,镜像不会被删除,docker会更换该镜像ID,并且镜像没有名字.
- 当有该镜像创建的容器存在时,可以使用[-f] 参数来强制删除镜像(不建议这样做)
- 当有该镜像创建的容器存在时,应遵循先删除容器,然后再删除镜像
- 删除mysql镜像
1
$ docker rmi mysql:latest
创建镜像
创建镜像有三种方式:
- 基于已有镜像的容器创建
- 基于本地模板导入
- 基于Dockerfile创建(最常用,此处先了解整个过程,后续章节经常使用的时候自然就会了)
基于已有镜像的容器创建新镜像
语法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
- 启动镜像(通过容器运行Ubuntu16.04, 并且进入bash环境),运行后通过[docker ps -a]来查看容器信息,当下主要关注容器ID
1
$ docker run -it ubuntu:1604 /bin/bash
- 创建test文件并且退出容器
1
2touch test
exit - 通过运行的容器创建新的镜像,执行成功后会返回新创建的镜像ID信息
1
$ docker commit -m "added a new file" -a "fraser" a925cb test:latest
- 详细信息请使用下面命令自行了解[“-m”:提交信息,”-a”:作者信息,”-p”:提交时暂停容器运行]
1
$ docker commit --help
基于本地模板导入
可以直接从一个操作系统模板文件导入一个镜像,推荐OpenVZ提供的模板来创建(个人觉得这个应用的不是很多,了解即可)
- 通过模板文件导入
1
$ sudo cat ubuntu-16.04-x86_64.tar.gz | docker import - ubuntu:1604
基于Dockerfile创建
Dockerfile需要讲解的内容很多,包括里面各个指令的应用,我们会单独拿出一个章节来讲解Dockerfile.
存出和载入镜像
存出镜像
语法:docker save [OPTIONS] IMAGE [IMAGE…] , 存出镜像到本地文件
- 存出本地的ubuntu:1604镜像为ubuntu_1604.tar
1
$ docker save -o ubuntu_1604.tar ubuntu:1604
- 详细信息请使用下面命令自行了解
1
$ docker save --help
载入镜像
语法:docker load [OPTIONS] , 从存出的本地文件中再导入到本地镜像库
- 从ubuntu_1604.tar文件导入镜像到到本地镜像列表
1
2
3$ docker load --input ubuntu_1604.tar
或
$ docker load < ubuntu_1604.tar
上传镜像
语法:docker push [OPTIONS] NAME[:TAG]
用户在DockerHub上完成注册之后,即可上传自制的镜像,但是需要打上带有user的标签(注册的用户名)
- 将本地hello-world镜像加上标签
1
$ docker tag hello-world:latest fraseryu/helloworld:latest
- 查看本地镜像列表可以看到打上标签的镜像
1
$ docker images
- 登录完成DockerHub授权认证,输入刚刚在DockerHub上注册的用户名和密码
1
$ docker login
- push本地订制的镜像到DockerHub
1
$ docker push fraseryu/helloworld:latest
- 登录DockerHub看到我们的镜像已经push成功