青梅梦呓

和世界交手的这许多年,你是否光彩依旧,兴致盎然

0%

重学Docker之镜像(一)

在写完podman体验的文章后,有几个朋友说作为开发还没开始使用Docker,就要去Docker,这世界变化太快。回过头想重新看一下Docker的使用,也体验一下最近docker带来的新的改变。谨做系列文章以记。

前言

Docker的安装现在已经非常的简单,不管是Mac Windows还是Linux得各种发行版本,也都默认就带了docker-compose
这样的单机容器编排工具和kubernetes。 我的实验环境如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
OS: macOS Catalina 1.15.4

$ docker version
Client: Docker Engine - Community
Version: 19.03.8
API version: 1.40
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:21:11 2020
OS/Arch: darwin/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 19.03.8
API version: 1.40 (minimum version 1.12)
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:29:16 2020
OS/Arch: linux/amd64
Experimental: true
containerd:
Version: v1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683


$ docker-compose -v
docker-compose version 1.25.4, build 8d51620a

镜像加速

可以使用阿里云的镜像加速,我不喜欢,更多地时候我是使用科学上网。export http_proxy=xxx就可以

镜像概念

镜像是一个包含程序运行的必要依赖环境和代码的只读文件,采用分层的文件系统,将每一次改变以读写层的形式增加到原来的制度文件上。

镜像与容器的联系

镜像是容器运行的基石。
结构示意图

容器 = 容器镜像 + 可读可写层
平面示意图

镜像的管理

镜像查看

1
2
3
4
5
6
7
8
9
10
11
12
13
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
getting-started latest a1d482020cca 3 hours ago 142MB
node latest a511eb5c14ec 4 days ago 941MB
node 12-alpine 7a48db49edbf 6 days ago 88.7MB
docker/getting-started latest 3c156928aeec 2 weeks ago 24.8MB
k8s.gcr.io/kube-proxy v1.15.5 cbd7f21fec99 6 months ago 82.4MB
k8s.gcr.io/kube-controller-manager v1.15.5 1399a72fa1a9 6 months ago 159MB
k8s.gcr.io/kube-apiserver v1.15.5 e534b1952a0d 6 months ago 207MB
k8s.gcr.io/kube-scheduler v1.15.5 fab2dded59dd 6 months ago 81.1MB
k8s.gcr.io/coredns 1.3.1 eb516548c180 15 months ago 40.3MB
k8s.gcr.io/etcd 3.3.10 2c4adeb21b4f 17 months ago 258MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 2 years ago 742kB

下载和删除镜像

可以docker pull 也可以docker run(不存在就会下载)。 下载之前还可以运行docker search查看一下。 删除镜像使用docker rmi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
$ docker pull --help

Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Pull an image or a repository from a registry

Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
--platform string Set platform if server is multi-platform capable
-q, --quiet Suppress verbose output


$ docker pull redis:latest
latest: Pulling from library/redis
54fec2fa59d0: Pull complete
9c94e11103d9: Pull complete
04ab1bfc453f: Pull complete
a22fde870392: Pull complete
def16cac9f02: Pull complete
1604f5999542: Pull complete
Digest: sha256:f7ee67d8d9050357a6ea362e2a7e8b65a6823d9b612bc430d057416788ef6df9
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

# 删除后使用docker pull
$ docker rmi redis
Untagged: redis:latest
Untagged: redis@sha256:f7ee67d8d9050357a6ea362e2a7e8b65a6823d9b612bc430d057416788ef6df9
Deleted: sha256:f9b9909726890b00d2098081642edf32e5211b7ab53563929a47f250bcdc1d7c
Deleted: sha256:7bd7286c61dee81eb691f022d070202ba2840574c460f6dcbc21792f8bf22a7f
Deleted: sha256:ba618723adf8eb28ec3d2b2003442599e3f947b4d66875b80dc6582c61f89a27
Deleted: sha256:cd3c331f934414f0d7a2a3ceb80935a54252dba553f1c1ee823961a07e8d1957
Deleted: sha256:09f9b5d7722b181ae2acd61396c20549afdea66ee31f921850191db5afe6738a
Deleted: sha256:3bd2921d0d3dd52dbcdc462f35b11cb89df901205284b0fea03c19bb8359907a
Deleted: sha256:c2adabaecedbda0af72b153c6499a0555f3a769d52370469d8f6bd6328af9b13

# 可以查看一下是否删除了
$ docker images

# 参数p 指映射端口[docker端口:宿主机端口] 参数d 指以daemon方式运行
$ docker run -dp 6379:6379 redis:latest
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
54fec2fa59d0: Pull complete
9c94e11103d9: Pull complete
04ab1bfc453f: Pull complete
a22fde870392: Pull complete
def16cac9f02: Pull complete
1604f5999542: Pull complete
Digest: sha256:f7ee67d8d9050357a6ea362e2a7e8b65a6823d9b612bc430d057416788ef6df9
Status: Downloaded newer image for redis:latest
48edbbc56ccb13bb265d805f0fd0660d6f0d5004aa8eea5eb71b61074e997247

创建本地镜像

Dockerfile创建镜像

将需要对镜像进行的操作全部 写到一个文件中,然后使用docker build 命令从这个文件中创建镜像。这种方法可以使镜像的创 建变得透明和独立化, 并且创建过程可以被重复执行。 Dockerfile文件以行为单位, 行首为 Dockerfile命令,命令都是大写形式,其后紧跟着的是命令的参数。

具体可以参看后续的Dockerfile笔记。

镜像分发

将自己打包好的镜像可以推送到dockerhub或者阿里云镜像中心,亦或者是私人的镜像仓库都可以。

1
2
3
4
5
6
7
8
$ docker push --help

Usage: docker push [OPTIONS] NAME[:TAG]

Push an image or a repository to a registry

Options:
--disable-content-trust Skip image signing (default true)

自动化构建

除了在本地创建镜像然后使用push命令将其推送到DockerHub之外,可以使用DockerHub(阿里云也提供了)提供的自动化构建技术在服务端直接构建镜像。一个包含Dockerfile 文件的Git Hub或Bit Bucket的仓库,Docker Hub的构建集群服务器就会自动构建镜像。通过这种 方式构建出来的镜像会被标记为Automated Build,也可以称为受信构建(Trusted Build)。

自动化构建的优点在于:

  • 用户可以确保他拉取的镜像是使用特定方式构建出来的。
  • 访问你的Docker Hub的用户能够自由查阅Dockerfile文件。
  • 因为构建的过程是自动的,所以能确保仓库里的镜像都是最新的。