一. Docker 的基本概念:容器、镜像、仓库等。
- 镜像(Image):Docker 镜像是一个轻量级的、可执行的独立软件包,包含运行某个软件所需的所有内容,包括代码、运行时、系统工具、库和设置。
- 容器(Container):Docker 容器是镜像的一个运行实例,可以在容器中运行应用程序及其依赖项。容器提供了一种虚拟化技术,使得应用程序之间相互隔离,不会相互干扰。
- 仓库(Repository):Docker 仓库是用于存储镜像和容器的地方。公共仓库可以在 Docker Hub 上找到,私有仓库则可以在本地或云端部署。
二. Docker 的安装和配置:包括安装 Docker、启动 Docker 服务、配置 Docker 网络等。
Docker 的安装和配置步骤如下:
- 卸载旧版本 Docker。
- 下载 Docker 安装包。
- 安装 Docker。
- 启动 Docker 服务。
- 配置 Docker 网络。
三. Docker 的基本命令:包括创建容器、启动容器、停止容器、删除容器等。
- docker version:查看Docker版本信息。
- docker info:查看Docker系统信息,包括容器数量、镜像数量、存储空间等。
- docker pull:从Docker Hub上拉取镜像。
- docker push:将镜像推送到Docker Hub上。
- docker run:创建一个新的容器并运行一个命令。
- docker ps:列出当前正在运行的容器。
- docker stop:停止一个或多个正在运行的容器。
- docker rm:删除一个或多个容器。
- docker images:列出本地主机上的所有镜像。
- docker rmi:删除一个或多个镜像。
四. Docker 的网络设置:包括桥接模式、主机模式、容器模式等。
Docker 安装时会自动在宿主机上创建三个网络,分别是 bridge 网络、host 网络和 none 网络。可以通过 docker network ls 命令查看当前默认的三个网络。
启动容器时,可以通过 --network 参数来指定容器连接的网络模式,如下所示:
- bridge:使用桥接网络模式。
- host:使用主机网络模式,容器将共享宿主机的网络栈。
- none:使用无网络模式,容器将没有自己的网络栈,只能使用宿主机的网络。
五. Docker 的数据卷:包括创建数据卷、使用数据卷等。
Docker 的数据卷是一种用于持久化和共享数据的技术。Docker 的镜像是由多个只读的文件系统叠加在一起形成的。当我们启动一个容器时,Docker 会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层。这时如果修改正在运行的容器中已有的文件,那么这个文件将会从只读层复制到读写层。该文件的只读版本还在,只是被上面读写层的该文件的副本隐藏。当删除 Docker 或者重新启动时,之前的更改将会消失。为了解决这个问题,Docker 引入了数据卷(volume)机制。Volume 是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享和持久化提供便利 。
你可以使用以下命令来创建一个数据卷:docker volume create <volume_name>。例如:docker volume create myvol。然后你可以使用以下命令来挂载一个目录到数据卷中:docker run -v /path/on/host:/path/in/container …。例如:docker run -v /home/user/data:/app/data …。这样你就可以在容器内部访问宿主机上的目录了 。
六.常见的 Docker 面试题:
- 什么是 Docker?
Docker 是一个开源平台,用于支持开发人员构建、部署、运行、更新和管理容器。容器是标准化的可执行组件,结合了应用程序源代码以及在任何环境中运行该代码所需的所有依赖项,包括系统工具、库和设置 。 - Docker 的优势是什么?
1.更高效的利用系统资源:由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
2.更快速的启动时间:传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
3.一致的运行环境:开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 可以提供一致的运行环境,避免了这种问题。
4.更容易迁移:使用 Docker,您可以将应用程序及其依赖项打包到一个可移植的容器中,并在任何地方运行该容器。这样可以轻松地将应用程序从一个数据中心迁移到另一个数据中心。
5.更容易扩展:使用 Docker,您可以轻松地添加或删除容器实例以满足需求。如果您需要更多的资源,可以添加更多的实例;如果您需要更少的资源,可以删除多余的实例。 - Docker 镜像和容器有什么区别?
Docker 中镜像(Image)和容器(Container)是两个核心概念,它们有以下主要区别:
- 定义和用途:镜像(Image):镜像是一个只读的文件系统快照,它包含了一个应用程序及其运行环境所需的所有内容,包括代码、库、依赖项、配置等。镜像是用于创建容器的模板,可以看作是一个静态的、不可更改的应用程序打包。容器(Container):容器是一个运行时实例,它是基于镜像创建的,包含了应用程序及其所有依赖项的运行环境。容器可以被启动、停止、删除等,它提供了一个隔离的运行环境,使应用程序能够在不同的容器中运行,而不受主机环境的影响。
- 大小:镜像比容器大,因为镜像除了应用程序本身之外,还包含了运行应用程序所需的所有依赖项。
- 存储位置:镜像通常存储在本地文件系统中,而容器则存储在 Docker 引擎中。
- 修改方式:镜像一旦创建就不能被修改,而容器可以在运行时进行修改和更新。
4.如何启动一个 Docker 容器?
启动一个 Docker 容器可以使用以下命令:docker start <容器ID或容器名称>。如果要在后台运行容器,可以使用 -d 参数,例如:docker start -d <容器ID或容器名称>。如果要查看正在运行的容器,可以使用 docker ps 命令。
如何查看正在运行的 Docker 容器?
要查看正在运行的 Docker 容器,可以使用以下命令:
docker ps
该命令将显示当前正在运行的所有 Docker 容器的列表,包括每个容器的名称、ID、状态、镜像名称、命令等信息。
5.如何停止一个 Docker 容器?
要停止一个 Docker 容器,可以使用以下命令:docker stop <容器ID或容器名称>。该命令将发送一个 TERM 信号给容器,让容器做一些退出前必须做的保护性、安全性操作,然后让容器自动停止运行。如果在一段时间内容器没有停止运行,可以使用 docker kill 命令强制终止容器。具体命令如下:
docker stop <容器ID或容器名称>
docker kill <容器ID或容器名称>
6.如何删除一个 Docker 容器?
要删除一个 Docker 容器,可以使用以下命令:docker rm <容器ID或容器名称>。该命令将强制删除指定的容器,包括其中的所有文件和目录。如果要强制删除正在运行的容器,可以使用 -f 参数,例如:docker rm -f <容器ID或容器名称>。
-
如何查看本地的 Docker 镜像列表?
要查看本地的 Docker 镜像列表,可以使用以下命令:docker images。该命令将列出本地主机上已有的镜像的基本信息,包括镜像的名称、标签、ID、大小、创建时间等。例如:docker images
该命令将输出如下结果:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest abcdef123456 3 days ago 132MB
ubuntu 20.04 xyz123abc 3 days ago 132MB
mysql 8.0 uvw789abcd 3 days ago 553MB
redis 6.0 xyz123abc 3 days ago 132MB
7.如何将本地文件或目录挂载到容器中?
要将本地文件或目录挂载到 Docker 容器中,可以使用以下命令:docker run -v <本地路径>:<容器路径> <镜像名称>。其中,-v 参数用于指定要挂载的本地路径和容器路径,<本地路径> 是要挂载的本地文件或目录的路径,<容器路径> 是容器内的目标路径。例如,要将宿主机上的 /data1 目录挂载到容器内的 /data2 目录,可以使用以下命令:
docker run -v /data1:/data2 <镜像名称>
8.如何使用数据卷进行持久化存储?
要使用数据卷进行持久化存储,可以使用以下命令:docker run -v <本地路径>:<容器路径> --name <容器名称> <镜像名称>。其中,-v 参数用于指定要挂载的本地路径和容器路径,–name 参数用于指定容器的名称,<镜像名称> 是要使用的镜像名称。例如,要将宿主机上的 /data1 目录挂载到名为 my_container 的容器内的 /data2 目录,可以使用以下命令:
docker run -v /data1:/data2 --name my_container <镜像名称>