详解Docker你需要知道的Docker进阶知识二
Docker镜像
镜像仓库(Repository)用于存放镜像,每个仓库都有唯一的地址,和网址类似。镜像仓库托管在某个 Registry,Registry 和GitHub类似。Docker 提供了一个官方的 Registry,官方 Registry 里的镜像仓库地址可以省去前面的域名前缀,其它 Registry 里的镜像仓库地址必须要指定域名前缀,以保证唯一性。
镜像仓库地址后面可以跟一个 TAG。比如一个镜像名称 ubuntu:14.04 ,冒号前面的 ubuntu 是镜像仓库地址(由于是官方 Registry 里的,可以省略域名前缀),后面的 14.04 是 TAG,TAG 通常设置为镜像的版本号。
Docker 镜像是分层存储的,每一个镜像都由多层组成。镜像之间会共享一些相同的层,从而减小镜像占用的存储空间。 查看docker镜像[root@VM_0_17_centos ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE flask_app 0.1 1aa01015fcfd 3 days ago 188MB python 3.7-slim 84de2ffd919d 10 days ago 179MB web latest 15f1f39a0848 2 weeks ago 76.2MB
也可以查看指定的镜像: [root@VM_0_17_centos ~]# docker image ls ubuntu REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest ccc6e87d482b 7 weeks ago 64.2MB ubuntu 14.04 6e4f1fe62ff1 2 months ago 197MB
查看镜像的详细信息 [root@VM_0_17_centos ~]# docker image inspect ubuntu [ { "Id": "sha256:ccc6e87d482b79dd1645affd958479139486e47191dfe7a997c862d89cd8b4c0", "RepoTags": [ "ubuntu:latest" ] ......从仓库中拉取镜像docker pull [OPTIONS] NAME[:TAG|@DIGEST]
比较常用的配置参数为 -a ,代表下载仓库中所有 TAG 的镜像,默认只下载 latest TAG 的镜像。
如果要下载 ubuntu:14.04 镜像,可使用如下命令: [root@VM_0_17_centos docker]# docker image pull ubuntu:14.04 14.04: Pulling from library/ubuntu 2e6e20c8e2e6: Pull complete 30bb187ac3fc: Pull complete b7a5bcc4a58a: Pull complete Digest: sha256:ffc76f71dd8be8c9e222d420dc96901a07b61616689a44c7b3ef6a10b7213de4 Status: Downloaded newer image for ubuntu:14.04 docker.io/library/ubuntu:14.04 [root@VM_0_17_centos docker]# docker image ls ubuntu REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 14.04 6e4f1fe62ff1 2 months ago 197MB构建镜像commit
对于我们 pull 的新镜像 ubuntu:14.04 来说,如果我们需要对其进行更新,可以创建一个容器,在容器中进行修改,然后将修改提交到一个新的镜像中。
提交修改使用如下命令: docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
该命令从一个修改过的容器创建一个新的镜像。例如,我们运行一个容器,然后在其中创建一个文件,最后使用 commit 命令: [root@VM_0_17_centos image]# docker container run -it --name hellodocker2 busybox /bin/sh / # touch test1 test2 [root@VM_0_17_centos image]# docker container commit hellodocker2 busybox:test sha256:1e30e8ed656966581812d4d23b5196edcc45d38affc20454cafa46d41f45a0e0 [root@VM_0_17_centos image]# docker image ls busybox REPOSITORY TAG IMAGE ID CREATED SIZE busybox test 1e30e8ed6569 10 seconds ago 1.22MB busybox latest 6d5fcfe5ff17 2 months ago 1.22MB
通过上述操作我们创建了一个新的镜像,但是本方法不推荐在生产环境使用,因为这种方式的可维护性很差。推荐的创建镜像的方法是使用 Dockerfile ,修改镜像可通过修改 Dockerfile ,然后使用新的 Dockerfile 来构建新的镜像。 build
docker 可以从一个 Dockerfile 文件中读取指令来构建镜像。Dockerfile 是一个包含用户构建镜像所需命令的文本文件。在 创建好该文件后,我们可以使用如下命令来构建镜像: docker image build [OPTIONS] PATH | URL
构建镜像的第一件事是将 Dockerfile 文件所在目录下的所有内容发送给 Docker 守护进程。所以最好创建一个新的目录,在其中保存 Dockerfile ,并在其中添加构建镜像所需的其它文件。
对于一个 Dockerfile 文件内容来说,基本语法格式如下所示: # Comment INSTRUCTION arguments
使用 # 号作为注释,指令( INSTRUCTION )不区分大小写,但是为了可读性,一般将其大写。Dockerfile 中的指令一般包含下面几个部分: 基础镜像:以哪个镜像为基础进行制作,使用 FROM 指令来指定基础镜像,一个 Dockerfile 必须以 FROM 指令启动。 维护者信息:可以指定该 Dockerfile 编写人的姓名及邮箱,使用 MAINTAINER 指令。 镜像操作命令:对基础镜像进行修改的命令,比如安装新的软件,进行配置等,常见的是 RUN 命令。 容器启动命令:基于该镜像的容器启动时需要执行的命令,常见的是 CMD 命令或 ENTRYPOINT
下面是一个最基本的 Dockerfile : # 指定基础镜像 FROM ubuntu:14.04 # 维护者信息 MAINTAINER hellodocker/hellodocker@soundhearer.com # 镜像操作命令 RUN apt-get -yqq update && apt-get install -yqq apache2 # 容器启动命令 CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
通过阅读上述内容中我们熟悉的一些 linux 指令,可以很容易的知道该 Dockerfile 将创建一个 apache 镜像。
其中 FROM 指定基础镜像。RUN 命令默认使用 /bin/sh ,并使用 root 权限执行。CMD 命令也是默认在 /bin/sh 中执行,但是只能有一条 CMD 指令,如果有多条则只有最后一条会被执行。
下面我们创建一个空目录,在其中编辑 Dockerfile 文件,然后基于此文件构建一个新的镜像: # 首先创建目录并切换目录 $ mkdir /home/hellodocker/test1 && cd /home/hellodocker/test1 # 编辑 Dockerfile 文件,默认文件名为 `Dockerfile`,也可以使用其它值,使用其它值需要在构建时通过 `-f` 参数指定,这里我们使用默认值。并在其中添加上述示例的内容 $ vim Dockerfile # 使用 build 命令,`-t` 参数指定新的镜像 $ docker image build -t hellodocker:2.0 .
在构建完成后,我们可以使用该镜像启动一个容器来运行 apache 服务,运行如下命令: # 使用 -p 参数将本机的 8000 端口映射到容器中的 80 端口上。 $ docker container run -d -p 8000:80 --name hellodocker3 hellodocker:2.0
此时,容器启动成功后,并且配置了端口映射,我们就可以通过本机的 8000 端口访问容器 hellodocker3 中的 apache 服务了。我们打开浏览器,输入 localhost:8000 删除
删除 ubuntu:latest 镜像可以使用如下命令: # 删除镜像 $ docker image rm ubuntu
删除所有的镜像 docker rmi $(docker images -q)