- 一、 Docker 的四大组成对象
- 二、搭建运行 Docker 环境
- 三、在 Windows 和 Mac 中使用 Docker
- 四、使用容器:镜像与容器
- 五、使用容器:从镜像仓库获得镜像
- 六、使用容器:运行和管理容器
- 七、为容器配置网络
- 八、管理和存储数据
- 九、操作镜像:保存和共享镜像
- 十、操作镜像:通过 Dockerfile 创建镜像
- 十一、常见 Dockerfile 使用技巧
- 十二、使用 Docker Hub 中的镜像
- 十三、组合操作:使用 Docker Compose 管理容器
- 十四、组合操作:常用的 Docker Compose 配置项
- 十五、组合操作:编写 Docker Compose 项目
- 十六、组合操作:应用于服务化开发
五、使用容器:从镜像仓库获得镜像
5.1 镜像仓库
如果说我们把镜像的结构用 Git
项目的结构做类比,那么镜像仓库就可以看似 GitLab
、 GitHub
等的托管平台,只不过 Docker
的镜像仓库托管的不是代码项目,而是镜像
当然,存储镜像并不是镜像仓库最值得炫耀的功能,其最大的作用是实现了 Docker
镜像的分发。借助镜像仓库,我们得到了一个镜像的中转站,我们可以将开发环境上所使用的镜像推送至镜像仓库,并在测试或生产环境上拉取到它们,而这个过程仅需要几个命令,甚至自动化完成…
5.2 获取镜像
虽然有很多种方式将镜像引入到 Docker
之中,但我们最为常用的获取现有镜像的方式还是直接从镜像仓库中拉取,因为这种方式简单、快速、有保障
要拉取镜像,我们可以使用 docker pull
命令,命令的参数就是我们之前所提到的镜像仓库名。
$ sudo docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
124c757242f8: Downloading [===============================================> ] 30.19MB/31.76MB
9d866f8bde2a: Download complete
fa3f2f277e67: Download complete
398d32b153e8: Download complete
afde35469481: Download complete...
- 当我们运行这个命令后,
Docker
就会开始从镜像仓库中拉取我们所指定的镜像了,在控制台中,我们可以看到镜像拉取的进度。下载进度会分为几行,其实每一行代表的就是一个镜像层。Docker
首先会拉取镜像所基于的所有镜像层,之后再单独拉取每一个镜像层并组合成这个镜像。当然,如果在本地已经存在相同的镜像层 ( 共享于其他的镜像 ),那么Docker
就直接略过这个镜像层的拉取而直接采用本地的内容。 - 上面是一个拉取官方镜像并且没有给出镜像标签的例子,大家注意到,当我们没有提供镜像标签时,
Docker
会默认使用latest
这个标签…
我们也能够使用完整的镜像命名来拉取镜像
$ sudo docker pull openresty/openresty:1.13.6.2-alpine
1.13.6.2-alpine: Pulling from openresty/openresty
ff3a5c916c92: Pull complete
ede0a2a1012b: Pull complete
0e0a11843023: Pull complete
246b2c6f4992: Pull complete
Digest: sha256:23ff32a1e7d5a10824ab44b24a0daf86c2df1426defe8b162d8376079a548bf2
Status: Downloaded newer image for openresty/openresty:1.13.6.2-alpine...
镜像在被拉取之后,就存放到了本地,接受当前这个 Docker
实例管理了,我们可以通过 docker images
命令看到它们
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest cd6d8154f1e1 12 days ago 84.1MB
openresty/openresty 1.13.6.2-alpine 08d5c926e4b6 3 months ago 49.3MB...
5.3 Docker Hub
Docker Hub
是 Docker
官方建立的中央镜像仓库,除了普通镜像仓库的功能外,它内部还有更加细致的权限管理,支持构建钩子和自动构建,并且有一套精致的 Web 操作页面
Docker Hub 的地址是:hub.docker.com/
- 由于定位是
Docker
的中央镜像仓库系统,同时也是Docker Engine
的默认镜像仓库,所以Docker Hub
是开发者共享镜像的首选,那么也就意味着其中的镜像足够丰富 - 常用服务软件的镜像,我们都能在
Docker Hub
中找到,甚至能找到针对它们不同用法的不同镜像。 - 同时,
Docker Hub
也允许我们将我们制作好的镜像上传到其中,与广大Docker
用户共享你的成果
5.4 搜索镜像
- 由于
Docker Hub
提供了一套完整的Web
操作界面,所以我们搜索其中的镜像会非常方便
在 Docker Hub 的搜索结果中,有几项关键的信息有助于我们选择合适的镜像:
OFFICIAL
代表镜像为Docker
官方提供和维护,相对来说稳定性和安全性较高STARS
代表镜像的关注人数,这类似GitHub
的Stars
,可以理解为热度PULLS
代表镜像被拉取的次数,基本上能够表示镜像被使用的频度…
除了直接通过 Docker Hub
网站搜索镜像这种方式外,我们还可以用 docker CLI 中的 docker search
这个命令搜索 Docker Hub
中的镜像
$ sudo docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 8397 [OK]
dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC 220 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 171 [OK]
consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 129 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 95 [OK]
ubuntu-upstart Upstart is an event-based replacement for th… 89 ...
5.5 管理镜像
对镜像的管理要比搜索和获取镜像更常用,所以了解镜像管理相关的操作以及知识是非常有必要的
除了之前我们所提到的 docker images
可以列出本地 Docker
中的所有镜像外,如果我们要获得镜像更详细的信息,我们可以通过 docker inspect
这个命令
$ sudo docker inspect redis:3.2
[
{
"Id": "sha256:2fef532eadb328740479f93b4a1b7595d412b9105ca8face42d3245485c39ddc",
"RepoTags": [
"redis:3.2"
],
"RepoDigests": [
"redis@sha256:745bdd82bad441a666ee4c23adb7a4c8fac4b564a1c7ac4454aa81e91057d977"
],
## ......
}
]...
在 docker inspect
的结果中我们可以看到关于镜像相当完备的信息
除了能够查看镜像的信息外,· docker inspect·
还能查看容器等之前我们所提到的 Docker
对象的信息,而传参的方式除了传递镜像或容器的名称外,还可以传入镜像 ID 或容器 ID
。
$ sudo docker inspect redis:4.0
$ sudo docker inspect 2fef532e
参数识别
之前我们所谈到镜像 ID
是 64
个字符,而 docker images
命令里的缩写也有 12
个字符,为什么我这里展示的操作命令里只填写了 8
个字符呢
- 不论我们是通过镜像名还是镜像
ID
传递到docker inspect
或者其他类似的命令 ( 需要指定Docker
对象的命令 ) 里,Docker
都会根据我们传入的内容去寻找与之匹配的内容,只要我们所给出的内容能够找出唯一的镜像,那么Docker
就会对这个镜像执行给定的操作。反之,如果找不到唯一的镜像,那么操作不会进行,Docker
也会显示错误 - 也就是说,只要我们提供了能够唯一识别镜像或容器的信息,即使它短到只有 1 个字符,
Docker
都是可以处理的
例如我们有五个镜像:
REPOSITORY TAG IMAGE ID CREATED SIZE
php 7-fpm f214b5c48a25 11 days ago 368MB
ubuntu latest cd6d8154f1e1 13 days ago 84.1MB
redis 3.2 2fef532eadb3 13 days ago 76MB
redis 4.0 e1a73233e3be 13 days ago 83.4MB
openresty/openresty 1.13.6.2-alpine 08d5c926e4b6 3 months ago 49.3MB
cogset/cron latest c01d5ac6fc8a 16 months ago 125MB...
我们注意到镜像 ID
前缀为 2
的只有 redis:3.2
这个镜像,那么我们就可以使用 2 来指代这个镜像
$ sudo docker inspect 2
而前缀为 c
的镜像有两个,这时候如果我们直接使用 c
来指代镜像的话, Docker
会提示未能匹配到镜像
$ sudo docker inspect c
[]
Error: No such object: c
5.6 删除镜像
虽然 Docker
镜像占用的空间比较小,但日渐冗杂的镜像和凌乱的镜像版本会让管理越来越困难,所以有时候我们需要清理一些无用的镜像,将它们从本地的 Docker Engine
中移除
删除镜像的命令是 docker rmi
,参数是镜像的名称或 ID
$ sudo docker rmi ubuntu:latest
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:de774a3145f7ca4f0bd144c7d4ffb2931e06634f11529653b23eba85aef8e378
Deleted: sha256:cd6d8154f1e16e38493c3c2798977c5e142be5e5d41403ca89883840c6d51762
Deleted: sha256:2416e906f135eea2d08b4a8a8ae539328482eacb6cf39100f7c8f99e98a78d84
Deleted: sha256:7f8291c73f3ecc4dc9317076ad01a567dd44510e789242368cd061c709e0e36d
Deleted: sha256:4b3d88bd6e729deea28b2390d1ddfdbfa3db603160a1129f06f85f26e7bcf4a2
Deleted: sha256:f51700a4e396a235cee37249ffc260cdbeb33268225eb8f7345970f5ae309312
Deleted: sha256:a30b835850bfd4c7e9495edf7085cedfad918219227c7157ff71e8afe2661f63...
- 删除镜像的过程其实是删除镜像内的镜像层,在删除镜像命令打印的结果里,我们可以看到被删除的镜像层以及它们的
ID
。当然,如果存在两个镜像共用一个镜像层的情况,你也不需要担心Docker
会删除被共享的那部分镜像层,只有当镜像层只被当前被删除的镜像所引用时,Docker
才会将它们从硬盘空间中移除… docker rmi
命令也支持同时删除多个镜像,只需要通过空格传递多个镜像ID
或镜像名即可
$ sudo docker rmi redis:3.2 redis:4.0
Untagged: redis:3.2
Untagged: redis@sha256:745bdd82bad441a666ee4c23adb7a4c8fac4b564a1c7ac4454aa81e91057d977
Deleted: sha256:2fef532eadb328740479f93b4a1b7595d412b9105ca8face42d3245485c39ddc
## ......
Untagged: redis:4.0
Untagged: redis@sha256:b77926b30ca2f126431e4c2055efcf2891ebd4b4c4a86a53cf85ec3d4c98a4c9
Deleted: sha256:e1a73233e3beffea70442fc2cfae2c2bab0f657c3eebb3bdec1e84b6cc778b75
## .........
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论