docker镜像使用

本文最后更新于:2022年10月21日 晚上

Docker 镜像使用

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

下面我们来学习:

  1. 管理和使用本地 Docker 主机镜像

  2. 创建镜像

列出镜像列表

我们可以使用docker images来列出本地主机上的镜像。

输出介绍:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一仓库源可以有多个标签(TAG),代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 18.04、20.04 等多个不同的版本,我们使用REPOSITORY:TAG来定义不同的镜像。

例如,如果要使用版本为 18.04 的 ubuntu 系统镜像来运行容器时,命令如下:

1
docker run -t -i ubuntu:18.04 /bin/bash 

如果要使用版本为 20.04 的 ubuntu 系统镜像来运行容器时,命令如下:

1
docker run -t -i ubuntu:20.04 /bin/bash

如果不指定一个镜像的版本标签,例如只使用 ubuntu,docker 将默认使用ubuntu:latest镜像。

获取一个新的镜像

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用docker pull命令来下载它。

查找镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为:https://hub.docker.com/

我们也可以使用docker search命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

1
docker search httpd

输出介绍:

  • NAME:镜像仓库源的名称

  • DESCRIPTION:镜像的描述

  • OFFICIAL:是否 docker 官方发布

  • stars:类似 Github 里面的 star,表示点赞、喜欢的意思。

  • AUTOMATED:自动构建。

删除镜像

镜像删除使用docker rmi命令,比如我们删除 hello-world 镜像:

1
docker rmi hello-world

创建镜像

当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  1. 从已经创建的容器中更新镜像,并且提交这个镜像

  2. 使用 Dockerfile 创建一个新的镜像

更新镜像

更新镜像是首先利用镜像创建一个容器,然后按照需求更改容器,最后将容器保存为新的镜像。

比如我们使用 ubuntu 18.04 创建一个容器:

1
docker run -it ubuntu:18.04 /bin/bash

执行ping命令,发现没有这个命令:

使用下列命令安装:

1
2
apt-get update
apt install iputils-ping

运行ping命令,可以运行。

输入exit退出这个容器,这个ID为9fa201c74faa的容器是按照我们的需求更改的容器,我们可以通过docker commit来提交该容器的副本。

1
docker commit -m="add ping" -a="tyro" 9fa201c74faa ubuntu:my

参数说明:

  • -m:提交的描述信息
  • -a:指定镜像作者
  • e218edb10161:容器 ID
  • runoob/ubuntu:v2:指定要创建的目标镜像名

此时本地已经有了ubuntu:my镜像。

使用新镜像启动一个容器:

1
docker run -it ubuntu:my /bin/bash

此时已经可以直接使用ping命令了。

构建镜像

我们使用命令docker build, 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

接下来我们创建一个test文件夹,并新建一个 Dockerfile 文件。

1
2
3
4
mkdir test
cd test
touch Dockerfile
gedit Dockerfile

输入以下内容:

1
2
3
4
5
6
7
8
9
10
FROM    centos:6.7
MAINTAINER Fisher "fisher@sudops.com"

RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

1
2
3
4
>FROM centos
>RUN yum -y install wget
>RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
>RUN tar -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

1
2
3
4
>FROM centos
>RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

使用docker build命令构建一个镜像:

1
docker build -t tyro/centos:6.7 .

参数说明:

  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

指令最后一个 . 又被称为上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

使用docker images查看镜像列表:

我们可以使用新的镜像来创建容器

1
docker run -t -i tyro/centos:6.7  /bin/bash

从上面看到新镜像已经包含我们创建的用户 runoob。

设置镜像标签

我们可以使用docker tag命令,为镜像添加一个新的标签。

1
docker tag a50c05872c53 tyro/centos:dev

docker tag 镜像ID,这里是 a50c05872c53 ,用户名称、镜像源名(repository name)和新的标签名(tag)。

使用docker images命令可以看到,ID为 a50c05872c53 的镜像多了一个标签。

参考链接:Docker 镜像使用 | 菜鸟教程 (runoob.com)


docker镜像使用
https://summersong.top/post/5434ffb1.html
作者
SummerSong
发布于
2022年10月19日
更新于
2022年10月21日
许可协议