一文搞清楚 Docker 镜像、容器、仓库
博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌
Java知识图谱点击链接:体系化学习Java(Java面试专题)
💕💕 感兴趣的同学可以收藏关注下 ,不然下次找不到哟💕💕
@[TOC]
1、什么是 Docker 镜像、容器、仓库
Docker 镜像、容器、仓库是 Docker 技术中的三个重要概念。
Docker 镜像是一个只读的模板,可以用来创建 Docker 容器。镜像可以包含操作系统、应用程序、依赖库、配置文件等。
Docker 容器是 Docker 镜像的一个运行实例,可以理解为一个轻量级的虚拟机。容器包含了运行应用程序所需的所有组件,包括操作系统、应用程序、依赖库等。
Docker 仓库是用来存储和管理 Docker 镜像的地方,类似于代码仓库。Docker 官方提供了 Docker Hub 仓库,可以在其中存储和分享 Docker 镜像。用户也可以自建私有仓库来存储和管理自己的 Docker 镜像。
通过使用 Docker 镜像、容器、仓库,可以实现应用程序的快速部署、运行和管理,提高了应用程序的可移植性和可伸缩性。
2、镜像、容器、仓库之间的关系
Docker 镜像、容器、仓库之间的关系如下:
Docker 镜像是一个只读的模板,包含了操作系统、应用程序、依赖库、配置文件等,用来创建 Docker 容器。
Docker 容器是 Docker 镜像的一个运行实例,可以理解为一个轻量级的虚拟机。容器包含了运行应用程序所需的所有组件,包括操作系统、应用程序、依赖库等。
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 镜像的步骤如下:
编写 Dockerfile:Dockerfile 是用于构建 Docker 镜像的脚本文件,其中包含了构建镜像所需的指令和配置信息。
构建 Docker 镜像:使用 docker build 命令根据 Dockerfile 构建 Docker 镜像。构建过程中会执行 Dockerfile 中的指令,并生成一个新的 Docker 镜像。
上传 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.0
、 latest
、 20210720
等都可以作为 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 中,可以为容器设置别名,方便对容器进行操作。以下是设置容器别名及常用操作的命令:
- 为容器设置别名
docker rename [容器ID或容器名] [新别名]
- 启动容器
docker start [容器ID或容器名]
- 停止容器
docker stop [容器ID或容器名]
- 重启容器
docker restart [容器ID或容器名]
- 进入容器
docker exec -it [容器ID或容器名] /bin/bash
- 查看容器日志
docker logs [容器ID或容器名]
- 删除容器
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 <私有仓库地址>:<端口号>/<镜像名称>
其中, <镜像名称> 表示要推送或拉取的镜像名称, <私有仓库地址> 表示私有仓库的地址, <端口号> 表示私有仓库的端口号。
💕💕 本文由激流丶创作,原创不易,感谢支持!
💕💕喜欢的话记得点赞收藏啊!
- 点赞
- 收藏
- 关注作者
评论(0)