Docker 入门——镜像

2023-11-02 17:34:54 浏览数 (1)

DockDocker 入门——镜像er 是一种流行的开源平台,可以让开发者和运维人员轻松地创建、部署和运行应用程序。Docker 的核心概念之一就是镜像,它是一个包含了应用程序代码、依赖库、配置文件和运行环境的可执行文件。使用 Docker 镜像,我们可以在任何支持 Docker 的机器上快速地启动一个容器,而不需要担心环境差异和兼容性问题。

上一篇讲解了docker的安装部署,在这篇中,我们将介绍 Docker 镜像的特性、基本概念和操作方法,包括如何创建、查看、拉取、推送和删除镜像。

1、Docker 镜像的特性有:

  • 可移植:Docker 镜像可以在不同的平台和环境中运行,无需修改。
  • 可复用:Docker 镜像可以被多个容器(container)共享,无需重复下载或安装。
  • 可分层:Docker 镜像是由多个层(layer)组成的,每一层都是一个只读的文件系统,可以被缓存和复用。当创建或更新一个镜像时,只需修改最上层,而不影响其他层。

  • 可版本化:Docker 镜像可以被打上标签(tag),以便于管理和追踪不同的版本。

2、docker镜像的操作方法

创建镜像 有两种主要的方法可以创建 Docker 镜像:使用Dockerfile或者从现有的容器中提交。

  • 使用 Dockerfile 创建镜像 Dockerfile 是一个文本文件,其中包含了一系列的指令,用来描述如何构建一个镜像。例如,下面是一个简单的 Dockerfile,它基于 ubuntu 镜像,安装了 curl 工具,并设置了工作目录为 /app: FROM ubuntu RUN apt-get update && apt-get install -y curl WORKDIR /app 我们可以使用 docker build 命令来根据 Dockerfile 创建镜像,指定一个标签(tag)来命名镜像: docker build -t my-image:latest . 这里的 . 表示当前目录,也就是 Dockerfile 所在的目录。我们也可以指定一个 URL 或者一个 git 仓库作为构建上下文(context),Docker 会从中获取 Dockerfile 和其他文件。
  • 从现有的容器中提交镜像 另一种创建镜像的方法是从一个已经运行或者停止的容器中提交(commit)出一个新的镜像。这种方法可以用来保存容器的当前状态,或者对现有的镜像进行修改。例如,我们可以先启动一个 ubuntu 容器,并在其中执行一些命令: docker run -it ubuntu bash root@container-id:/# apt-get update && apt-get install -y curl root@container-id:/# mkdir /app root@container-id:/# exit 然后,我们可以使用 docker commit 命令来从这个容器中创建一个新的镜像,并指定一个标签: docker commit container-id my-image:latest

查看镜像 我们可以使用 docker images 命令来查看本地机器上已经存在的镜像列表,它会显示每个镜像的仓库名(repository)、标签(tag)、ID、大小和创建时间等信息:

代码语言:javascript复制
[root@localhost learn_docker]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
nginx                    latest    bc649bab30d1   10 days ago    187MB
ubuntu                   latest    e4c58958181a   2 weeks ago    77.8MB
sheepgreen/liferestart   latest    9b1a5d218680   6 months ago   368MB
centos                   latest    5d0da3dc9764   2 years ago    231MB

我们也可以使用 docker image inspect 命令来查看某个镜像的详细信息,它会返回一个 JSON 格式的数据,包含了镜像的元数据、层(layer)、环境变量、端口映射等信息:

代码语言:javascript复制
[root@localhost learn_docker]# docker image inspect my-image:latest
[
    {
        "Id": "sha256:790e0c39e09be81d9504a557dec20b798b9dfefd98d76a50efb45bba92bd3617",
        "RepoTags": [
            "my-image:latest"
        ],
        "RepoDigests": [],
        "Parent": "",
        "Comment": "buildkit.dockerfile.v0",
        "Created": "2023-10-22T05:44:58.754295499-07:00",
        "Container": "",
        "ContainerConfig": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": null,
            "Cmd": null,
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "DockerVersion": "",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "",
            "Volumes": null,
            "WorkingDir": "/app",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.opencontainers.image.ref.name": "ubuntu",
                "org.opencontainers.image.version": "22.04"
            }
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 77823876,
        "VirtualSize": 77823876,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/22hqwpd0mcsd779vryudnwz58/diff:/var/lib/docker/overlay2/38417850e4fdf05552c4c4c921bc5ed6192a26941e31f87b84a12da40c09c280/diff",
                "MergedDir": "/var/lib/docker/overlay2/v3dv81b9wyey58b1chg6fzubf/merged",
                "UpperDir": "/var/lib/docker/overlay2/v3dv81b9wyey58b1chg6fzubf/diff",
                "WorkDir": "/var/lib/docker/overlay2/v3dv81b9wyey58b1chg6fzubf/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:256d88da41857db513b95b50ba9a9b28491b58c954e25477d5dad8abb465430b",
                "sha256:68ad0e7b06e50fb604ce15cfe5dc33380d40195f3d4a8b9cb34c10a7d7bbeee4",
                "sha256:fef60240b1321ce90dc96f5652aa97eb61d42cf956ce9fd3cea36dee00ba4efa"
            ]
        },
        "Metadata": {
            "LastTagTime": "2023-10-22T05:44:58.777160604-07:00"
        }
    }
]

拉取和推送镜像 除了本地创建镜像,我们还可以从远程的镜像仓库(registry)中拉取(pull)或者推送(push)镜像。镜像仓库是一个存储和分发镜像的服务,可以是公开的或者私有的。最常用的公开镜像仓库是 Docker Hub,它提供了数以万计的免费和付费的镜像,供用户下载和使用。

  • 拉取镜像 我们可以使用 docker pull 命令来从远程镜像仓库中拉取镜像到本地机器上,指定镜像的仓库名和标签: docker pull ubuntu:latest 如果不指定标签,默认会拉取最新版本(latest)的镜像。我们也可以指定一个完整的镜像名,包括仓库地址、用户名、仓库名和标签: docker pull registry.hub.docker.com/library/ubuntu:latest 这里的 registry.hub.docker.com 是 Docker Hub 的地址,library 是官方提供的镜像,ubuntu 是仓库名,latest 是标签。如果要拉取非官方或者私有的镜像,需要指定相应的用户名和密码: docker login registry.hub.docker.com -u <username> -p <password> docker pull <registry.hub.docker.com>/username/my-image:latest
  • 推送镜像 我们也可以使用 docker push 命令来将本地的镜像推送到远程的镜像仓库中,指定镜像的仓库名和标签: docker push my-image:latest 如果要推送到非本地或者非默认的镜像仓库,需要先登录到相应的仓库,并指定完整的镜像名: docker login <registry.hub.docker.com> -u <username> -p <password> docker tag my-image:latest <registry.hub.docker.com>/<username>/my-image:latest docker push <registry.hub.docker.com>/<username>/my-image:latest

删除镜像 我们可以使用 docker rmi 命令来删除本地机器上不再需要的镜像,指定镜像的仓库名、标签或者 ID:

代码语言:javascript复制
docker rmi my-image:latest 
docker rmi a1b2c3d4e5f6

如果要删除所有未被使用的镜像,可以使用 -a 参数:

代码语言:javascript复制
docker rmi -a 
代码语言:javascript复制
删除镜像 我们可以使用 `docker rmi` 命令来删除本地机器上不再需要的镜像,指定镜像的仓库名、标签或者 ID:

```bash
docker rmi my-image:latest 
docker rmi a1b2c3d4e5f6

如果要删除所有未被使用的镜像,可以使用 -a 参数:

代码语言:javascript复制
docker rmi -a 

总结 在本文中,我们介绍了 Docker 镜像的基本概念和操作方法,包括如何创建、查看、拉取、推送和删除镜像。Docker 镜像是一种轻量级、可移植、可复用的应用程序打包方式,它可以大大简化应用程序的开发、部署和运行过程。希望本文能够对您有所帮助,欢迎您在评论区留下您的反馈和建议。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

邀请人:江湖有缘

0 人点赞