一文搞清楚 Docker 镜像、容器、仓库

举报
激流丶 发表于 2023/06/17 19:03:09 2023/06/17
【摘要】 博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌Java知识图谱点击链接:体系化学习Java(Java面试专题)💕💕 感兴趣的同学可以收藏关注下 ,不然下次找不到哟💕💕@[TOC] 1、什么是 Docker 镜像、容器、仓库Docker 镜像、容器、仓库是 Docker 技术中的三个重要概念。Docker 镜像是一个只读的模板,可以用来...

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

image.png

@[TOC]

1、什么是 Docker 镜像、容器、仓库

Docker 镜像、容器、仓库是 Docker 技术中的三个重要概念。

Docker 镜像是一个只读的模板,可以用来创建 Docker 容器。镜像可以包含操作系统、应用程序、依赖库、配置文件等。

Docker 容器是 Docker 镜像的一个运行实例,可以理解为一个轻量级的虚拟机。容器包含了运行应用程序所需的所有组件,包括操作系统、应用程序、依赖库等。

Docker 仓库是用来存储和管理 Docker 镜像的地方,类似于代码仓库。Docker 官方提供了 Docker Hub 仓库,可以在其中存储和分享 Docker 镜像。用户也可以自建私有仓库来存储和管理自己的 Docker 镜像。

通过使用 Docker 镜像、容器、仓库,可以实现应用程序的快速部署、运行和管理,提高了应用程序的可移植性和可伸缩性。

2、镜像、容器、仓库之间的关系

image.png

Docker 镜像、容器、仓库之间的关系如下:

  1. Docker 镜像是一个只读的模板,包含了操作系统、应用程序、依赖库、配置文件等,用来创建 Docker 容器。

  2. Docker 容器是 Docker 镜像的一个运行实例,可以理解为一个轻量级的虚拟机。容器包含了运行应用程序所需的所有组件,包括操作系统、应用程序、依赖库等。

  3. Docker 仓库是用来存储和管理 Docker 镜像的地方,类似于代码仓库。Docker 镜像可以从仓库中拉取,也可以推送到仓库中进行存储和分享。Docker 官方提供了 Docker Hub 仓库,用户也可以自建私有仓库来存储和管理自己的 Docker 镜像。

综上所述,Docker 镜像是创建 Docker 容器的基础,Docker 容器是 Docker 镜像的运行实例,Docker 仓库是存储和管理 Docker 镜像的地方。通过使用 Docker 镜像、容器、仓库,可以实现应用程序的快速部署、运行和管理,提高了应用程序的可移植性和可伸缩性。

3、Docker 镜像

3.1、镜像列表

docker images

该命令将列出所有本地镜像的名称、标签、镜像 ID、创建时间和大小等信息。例如:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               4c108a37151f        3 weeks ago         130MB
nginx               latest              6f715f503b62        4 weeks ago         133MB
mysql               5.7                 4a3c9c5a0a3d        4 weeks ago         448MB

其中,REPOSITORY 列表示镜像的名称,TAG 列表示镜像的标签(通常是版本号),IMAGE ID 列表示镜像的唯一 ID,CREATED 列表示镜像的创建时间,SIZE 列表示镜像的大小。

3.2、查找镜像

要查找 Docker Hub 上的镜像,可以使用以下命令:

docker search <image-name>

搜索 MySQL 镜像可以使用以下命令:

docker search mysql
[root@ecs-32f7 ~]# docker search mysql
NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                           MySQL is a widely used, open-source relation…   14221     [OK]
mariadb                         MariaDB Server is a high performing open sou…   5432      [OK]
percona                         Percona Server is a fork of the MySQL relati…   614       [OK]
phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   818       [OK]
bitnami/mysql                   Bitnami MySQL Docker Image                      89                   [OK]
circleci/mysql                  MySQL is a widely used, open-source relation…   29
bitnami/mysqld-exporter                                                         5
ubuntu/mysql                    MySQL open source fast, stable, multi-thread…   49
cimg/mysql                                                                      0
rapidfort/mysql                 RapidFort optimized, hardened image for MySQL   23
rapidfort/mysql8-ib             RapidFort optimized, hardened image for MySQ…   9
google/mysql                    MySQL server for Google Compute Engine          23                   [OK]
hashicorp/mysql-portworx-demo                                                   0
rapidfort/mysql-official        RapidFort optimized, hardened image for MySQ…   7
newrelic/mysql-plugin           New Relic Plugin for monitoring MySQL databa…   1                    [OK]
databack/mysql-backup           Back up mysql databases to... anywhere!         86
linuxserver/mysql               A Mysql container, brought to you by LinuxSe…   38
bitnamicharts/mysql                                                             0
mirantis/mysql                                                                  0
docksal/mysql                   MySQL service images for Docksal - https://d…   0
linuxserver/mysql-workbench                                                     50
vitess/mysqlctld                vitess/mysqlctld                                1                    [OK]
eclipse/mysql                   Mysql 5.7, curl, rsync                          0                    [OK]
drupalci/mysql-5.5              https://www.drupal.org/project/drupalci         3                    [OK]
drupalci/mysql-5.7              https://www.drupal.org/project/drupalci         0
[root@ecs-32f7 ~]#

3.3、拉取镜像

拉取 Docker 镜像可以使用以下命令:

docker pull <镜像名称>:<标签>

其中, <镜像名称> 是要拉取的 Docker 镜像的名称, <标签> 是要拉取的 Docker 镜像的版本号或标签。例如,要拉取官方的 Nginx 镜像,可以使用以下命令:

docker pull nginx:latest

该命令将从 Docker Hub 上拉取最新版本的 Nginx 镜像,并将其保存到本地。如果要拉取指定版本的 Nginx 镜像,可以将 latest 替换为相应的版本号或标签。拉取完成后,可以使用 docker images 命令查看本地已有的 Docker 镜像列表。

[root@ecs-32f7 ~]# docker pull nginx:latest
latest: Pulling from library/nginx
f03b40093957: Pull complete
eed12bbd6494: Pull complete
fa7eb8c8eee8: Pull complete
7ff3b2b12318: Pull complete
0f67c7de5f2c: Pull complete
831f51541d38: Pull complete
Digest: sha256:af296b188c7b7df99ba960ca614439c99cb7cf252ed7bbc23e90cfda59092305
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@ecs-32f7 ~]#

3.4、删除镜像

删除 Docker 镜像可以使用以下命令:

docker rmi <镜像名称>:<标签>

其中, <镜像名称> 是要删除的 Docker 镜像的名称, <标签> 是要删除的 Docker 镜像的版本号或标签。例如,要删除本地的 Nginx 镜像,可以使用以下命令:

docker rmi nginx:latest

该命令将删除本地最新版本的 Nginx 镜像。如果要删除指定版本的 Nginx 镜像,可以将 latest 替换为相应的版本号或标签。注意,如果该镜像正在被使用,则无法删除。可以使用 docker ps 命令查看当前正在运行的 Docker 容器列表,如果某个容器正在使用该镜像,则需要先停止该容器,再删除镜像。

[root@ecs-32f7 ~]# docker rmi nginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:af296b188c7b7df99ba960ca614439c99cb7cf252ed7bbc23e90cfda59092305
Deleted: sha256:f9c14fe76d502861ba0939bc3189e642c02e257f06f4c0214b1f8ca329326cda
Deleted: sha256:419f8948c50c723f2a5ac74428af3d804b5d0079d6df8f7f827663cf10cbc366
Deleted: sha256:1030aac4f1a8096ed58d3d4a2df55dd1b1b27d919ad156d97ad1f68081d0051a
Deleted: sha256:7d90b49d96c3036539ef144ecc27c01de03902d8ea166a0f7b77d11d3779c4bd
Deleted: sha256:551acb210764654af31b6cd51adaa74edc9a202587c3395fe0e9f95a2e097f8b
Deleted: sha256:3c530958db4c75c6fb409f339367aaf9a1e163c84718c035d4b09bebc83f43e7
Deleted: sha256:8cbe4b54fa88d8fc0198ea0cc3a5432aea41573e6a0ee26eca8c79f9fbfa40e3
[root@ecs-32f7 ~]#

3.5、更新镜像

更新 Docker 镜像可以使用以下命令:

docker pull <镜像名称>:<标签>

其中, <镜像名称> 是要更新的 Docker 镜像的名称, <标签> 是要更新的 Docker 镜像的版本号或标签。例如,要更新本地的 Nginx 镜像,可以使用以下命令:

docker pull nginx:latest

该命令将会从 Docker Hub 中下载最新版本的 Nginx 镜像,并覆盖本地的同名镜像。如果要更新指定版本的 Nginx 镜像,可以将 latest 替换为相应的版本号或标签。注意,如果本地已经有了最新版本的镜像,则不需要执行该命令。

3.6、生成镜像

生成 Docker 镜像的步骤如下:

  1. 编写 Dockerfile:Dockerfile 是用于构建 Docker 镜像的脚本文件,其中包含了构建镜像所需的指令和配置信息。

  2. 构建 Docker 镜像:使用 docker build 命令根据 Dockerfile 构建 Docker 镜像。构建过程中会执行 Dockerfile 中的指令,并生成一个新的 Docker 镜像。

  3. 上传 Docker 镜像:使用 docker push 命令将生成的 Docker 镜像上传到 Docker 镜像仓库中。如果没有自己的 Docker 镜像仓库,可以使用 Docker 官方提供的 Docker Hub 镜像仓库。

下面是一个简单的 Dockerfile 示例,以 ubuntu 系统为例:

FROM ubuntu:18.04
 # 安装必要的软件包
RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip \
    && rm -rf /var/lib/apt/lists/*
 # 设置工作目录
WORKDIR /app
 # 复制应用程序文件到镜像中
COPY . /app
 # 安装 Python 依赖包
RUN pip3 install --no-cache-dir -r requirements.txt
 # 暴露应用程序端口
EXPOSE 8000
 # 设置启动命令
CMD ["python3", "app.py"]

以上 Dockerfile 文件用于构建一个 Python Web 应用程序的 Docker 镜像。在构建完成后,可以使用 docker push 命令将镜像上传到 Docker 镜像仓库中。

3.7、镜像标签

Docker 镜像标签是用来标识 Docker 镜像版本的一种方式,可以让用户更方便地管理和使用 Docker 镜像。Docker 镜像标签由两部分组成,用冒号分隔,例如: ubuntu:18.04 。其中, ubuntu 表示镜像仓库名称, 18.04 表示镜像标签。

Docker 镜像标签可以是任意字符串,但建议使用语义化的版本号或者日期作为标签,以便于管理和使用。例如, v1.0.0latest20210720 等都可以作为 Docker 镜像标签。

使用 Docker 镜像标签,可以方便地管理和使用不同版本的 Docker 镜像。例如,可以使用 docker pull ubuntu:20.04 命令拉取 Ubuntu 20.04 版本的 Docker 镜像,也可以使用 docker pull ubuntu:18.04 命令拉取 Ubuntu 18.04 版本的 Docker 镜像。

docker tag 命令用于为 Docker 镜像打标签,其语法格式如下:

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

其中, SOURCE_IMAGE 表示要打标签的 Docker 镜像, TARGET_IMAGE 表示要打的标签后的目标镜像。

例如,要为本地的 ubuntu:20.04 镜像打上 my-ubuntu:latest 的标签,可以使用以下命令:

docker tag ubuntu:20.04 my-ubuntu:latest

执行该命令后,本地的 ubuntu:20.04 镜像就会被打上 my-ubuntu:latest 的标签,可以使用 docker images 命令查看。

4、Docker 容器

4.1、容器启动

启动容器的命令是 docker start ,其语法格式如下:

docker start [OPTIONS] CONTAINER [CONTAINER...]

其中, CONTAINER 表示要启动的容器名称或 ID,可以同时启动多个容器。 OPTIONS 包括以下常用选项:

  • -a ,表示将容器的标准输入、标准输出和标准错误输出连接到当前终端。
  • -i ,表示以交互模式启动容器。
  • -d ,表示以守护进程模式启动容器。
  • –attach ,等同于 -a 选项。
  • –interactive ,等同于 -i 选项。

例如,要启动名称为 my-nginx 的 Nginx 容器,可以使用以下命令:

docker start my-nginx

如果要以交互模式启动该容器,可以使用以下命令:

docker start -ai my-nginx

如果要以守护进程模式启动该容器,可以使用以下命令:

docker start -d my-nginx

4.2、容器查看

查看容器的命令是 docker ps ,其语法格式如下:

docker ps [OPTIONS]

其中, OPTIONS 包括以下常用选项:

  • -a ,表示查看所有容器,包括已经停止的容器。
  • -q ,表示只显示容器的 ID。
  • -n ,表示显示最近创建的 n 个容器。
  • -s ,表示显示容器所占用的磁盘空间大小。
  • --format ,表示指定输出格式。
    例如,要查看当前正在运行的容器,可以使用以下命令:
docker ps

如果要查看所有容器,包括已经停止的容器,可以使用以下命令:

docker ps -a

如果只想显示容器的 ID,可以使用以下命令:

docker ps -q

如果只想显示最近创建的 5 个容器,可以使用以下命令:

docker ps -n 5

如果想显示容器所占用的磁盘空间大小,可以使用以下命令:

docker ps -s

如果想指定输出格式,可以使用以下命令:

docker ps --format "{{.ID}}\t{{.Names}}\t{{.Status}}"

上述命令将输出容器的 ID、名称和状态信息。

4.3、容器停止和重启

要停止容器,可以使用 docker stop 命令。其语法格式如下:

docker stop [OPTIONS] CONTAINER [CONTAINER...]

其中, OPTIONS 包括以下常用选项:

  • -t ,表示停止容器的等待时间,单位为秒,默认为 10 秒。
    例如,要停止 ID 为 123456 的容器,可以使用以下命令:
docker stop 123456

要重启已经停止的容器,可以使用 docker start 命令。其语法格式如下:

docker start [OPTIONS] CONTAINER [CONTAINER...]

其中, OPTIONS 包括以下常用选项:

  • -i ,表示启动容器并进入交互模式。
  • -a ,表示启动容器并附加到容器的标准输入、输出和错误输出。
  • -d ,表示以后台模式启动容器。
  • -p ,表示将容器的端口映射到主机的端口。
  • -v ,表示将主机的目录或文件挂载到容器中。
    例如,要重新启动 ID 为 123456 的容器,可以使用以下命令:
docker start 123456

如果想以交互模式启动容器,可以使用以下命令:

docker start -i 123456

如果想以后台模式启动容器,可以使用以下命令:

docker start -d 123456

如果想将容器的端口映射到主机的端口,可以使用以下命令:

docker start -p 80:80 123456

上述命令将容器的 80 端口映射到主机的 80 端口。
如果想将主机的目录或文件挂载到容器中,可以使用以下命令:

docker start -v /host/path:/container/path 123456

上述命令将主机的 /host/path 目录或文件挂载到容器的 /container/path 目录中。

4.4、后台模式和进入

后台模式是指在容器中运行应用程序时,不占用当前终端窗口,而是在后台运行。这样可以让终端窗口继续执行其他命令,而不会被占用。

在 Docker 中,要在后台模式下运行容器,可以使用 -d 参数。例如,运行一个名为 myapp 的容器,并在后台模式下运行,可以使用以下命令:

docker run -d myapp

进入容器是指在已经运行的容器中打开一个新的终端窗口,以便在容器中执行命令。在 Docker 中,可以使用 docker exec 命令进入容器。例如,进入名为 myapp 的容器,可以使用以下命令:

docker exec -it myapp /bin/bash

其中, -it 参数表示进入交互模式,并打开一个新的终端窗口。 /bin/bash 表示进入容器后执行的命令,这里是打开一个新的 Bash 终端。在进入容器后,可以在容器中执行各种命令,如查看文件、修改配置文件等。

4.5、容器导入和导出

Docker 容器导入和导出是指将容器及其文件系统导出为一个压缩文件,或将一个压缩文件导入为 Docker 容器的过程。
容器导出可以用于备份容器或迁移容器到其他机器上。容器导入可以用于创建一个新的容器,或者将容器恢复到之前的状态。
容器导出可以使用 docker export 命令。例如,将名为 mycontainer 的容器导出为一个 tar 文件,可以使用以下命令:

docker export mycontainer > mycontainer.tar

容器导入可以使用 docker import 命令。例如,将名为 mycontainer.tar 的 tar 文件导入为一个名为 myimage 的 Docker 镜像,可以使用以下命令:

docker import mycontainer.tar myimage

导入后,可以使用 docker run 命令创建一个新的容器,例如:

docker run -it myimage /bin/bash

这将创建一个新的容器,并进入容器的交互式终端。

4.6、强制停止容器

可以使用 docker stop 命令来停止容器。例如,停止名为 mycontainer 的容器,可以使用以下命令:

docker stop mycontainer

如果容器无法正常停止,可以使用 docker kill 命令来强制停止容器。例如,强制停止名为 mycontainer 的容器,可以使用以下命令:

docker kill mycontainer

注意,使用 docker kill 命令会直接终止容器进程,可能会导致数据丢失或其他问题,应该尽量避免使用。

4.7、清理停止的容器

可以使用 docker container prune 命令来清理停止的容器。这个命令会删除所有已经停止的容器,释放占用的系统资源。例如,可以使用以下命令清理停止的容器:

docker container prune

在执行命令之前,可以使用 docker container ls -a 命令来列出所有容器,确认哪些容器已经停止。执行 docker container prune 命令后,所有已经停止的容器都会被删除,无法恢复,请谨慎使用。

4.8、容器别名及操作

在 Docker 中,可以为容器设置别名,方便对容器进行操作。以下是设置容器别名及常用操作的命令:

  1. 为容器设置别名
docker rename [容器ID或容器名] [新别名]
  1. 启动容器
docker start [容器ID或容器名]
  1. 停止容器
docker stop [容器ID或容器名]
  1. 重启容器
docker restart [容器ID或容器名]
  1. 进入容器
docker exec -it [容器ID或容器名] /bin/bash
  1. 查看容器日志
docker logs [容器ID或容器名]
  1. 删除容器
docker rm [容器ID或容器名]

通过为容器设置别名,可以方便地对容器进行操作,避免了频繁输入容器ID或容器名的麻烦。

4.9、容器错误日志

在 Docker 中,可以通过查看容器的错误日志来定位和解决容器运行中的问题。以下是查看容器错误日志的命令:

docker logs [容器ID或容器名]

该命令会输出容器的标准输出和标准错误信息。如果容器运行中出现了错误,可以通过查看错误日志来定位问题所在。可以使用以下命令来查看容器最近的错误日志:

docker logs --tail [行数] [容器ID或容器名]

其中, --tail 参数用于指定要查看的日志行数。例如,要查看容器最近的 10 行错误日志,可以使用以下命令:

docker logs --tail 10 [容器ID或容器名]

通过查看容器错误日志,可以快速定位和解决容器运行中的问题,提高容器的稳定性和可靠性。

5、Docker 仓库

5.1、公有仓库

公有仓库是指可以供用户免费使用的 Docker 镜像仓库,用户可以在其中存储和分享自己的 Docker 镜像。Docker 官方提供了 Docker Hub 公有仓库,其中包含了大量的 Docker 镜像,用户可以通过搜索和下载这些镜像来快速部署和运行应用程序。除了 Docker Hub,还有一些其他的公有仓库,如 Google Container Registry、AWS Elastic Container Registry 等。用户也可以自己搭建私有仓库,用于存储和管理自己的 Docker 镜像。使用公有仓库可以方便地获取和分享 Docker 镜像,提高了应用程序的可移植性和可伸缩性。

1.Docker 官方和国内很多云服务商都提供了国内加速器服务,比如:阿里云的加速器
https://help.aliyun.com/document_detail/60750.html

2.网易加速器:http://hub-mirror.c.163.com

3.Docker官方中国加速器:https://registry.docker-cn.com

4.ustc 的镜像:https://docker.mirrors.ustc.edu.cn

5.daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用)

5.2、私有仓库

私有仓库是指用户自己搭建的 Docker 镜像仓库,用于存储和管理自己的 Docker 镜像。相比于公有仓库,私有仓库更加安全和可控,用户可以完全掌控自己的镜像,避免了因为公有仓库的镜像被篡改或者存在漏洞而导致的安全问题。私有仓库可以部署在本地服务器或者云服务器上,用户可以根据自己的需求进行扩容和优化。Docker 官方也提供了 Docker Registry 作为私有仓库的解决方案,用户可以在其中搭建自己的私有仓库。使用私有仓库可以提高应用程序的安全性和可控性,适用于一些对安全性要求比较高的企业或者组织。
1. 安装 Docker Registry

Docker Registry 是 Docker 官方提供的镜像仓库,可以用来搭建私有仓库。可以通过以下命令来拉取 Docker Registry 镜像:

docker pull registry

2. 运行 Docker Registry 容器

可以通过以下命令来运行 Docker Registry 容器:

docker run -d -p 5000:5000 --name registry registry

其中, -p 5000:5000 表示将容器内部的 5000 端口映射到主机的 5000 端口, --name registry 表示指定容器的名称为 registry。

3. 配置 Docker 客户端

在使用私有仓库时,需要在 Docker 客户端中配置私有仓库的地址。可以通过以下命令来配置:

echo '{"insecure-registries":["<私有仓库地址>:<端口号>"]}' > /etc/docker/daemon.json

其中, <私有仓库地址> 表示私有仓库的地址, <端口号> 表示私有仓库的端口号。配置完成后,需要重启 Docker 服务:

systemctl restart docker

4. 推送和拉取镜像

在配置完成后,就可以使用 docker push 命令来推送镜像到私有仓库,使用 docker pull 命令来从私有仓库拉取镜像了。例如:

docker tag <镜像名称> <私有仓库地址>:<端口号>/<镜像名称>
docker push <私有仓库地址>:<端口号>/<镜像名称>
docker pull <私有仓库地址>:<端口号>/<镜像名称>

其中, <镜像名称> 表示要推送或拉取的镜像名称, <私有仓库地址> 表示私有仓库的地址, <端口号> 表示私有仓库的端口号。

image.png

💕💕 本文由激流丶创作,原创不易,感谢支持!
💕💕喜欢的话记得点赞收藏啊!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。