简介

Q: Docker是什么?
专业解释:Docker是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包到一个可移植的容器中,并可以轻松地运行在任何支持Docker的平台上。
通俗理解:Docker是个工具,你可以通过docker将自己的项目和运行项目所需的环境打包成一个容器(容器可以先理解为一个文件压缩包),之后在任何你想运行此项目的平台上安装docker,然后加载此容器就能直接运行项目,不需要再配置一遍环境什么的。

Q: docker和虚拟机比有什么优势?
docker和虚拟机都可以打包项目和环境,移植到别的平台直接运行。
docker相比虚拟机的优势是docker是轻量的,轻量代表着它的打包文件小,启动、停止、重启等更快,移动方便。

Q: docker为什么比虚拟机更轻量?
要从docker和虚拟机的原理说起:
虚拟机是物理服务器通过虚拟化服务创建虚拟机,虚拟机包含完整操作系统,其中的操作系统内核、各种工具、图形化界面等占用了大量的资源,这些东西导致虚拟机的启停速度慢。当我们运行项目不需要这些服务时,虚拟机的这种方式就成为了累赘。

docker是运行在操作系统之上的平台,它打包容器时只包含应用程序和依赖包、软件库等运行环境,并不包含操作系统,因此docker的启停更快,打包出来的容器更加轻量,也因为轻量,所以一台服务器上可以同时运行多个docker容器,在不同容器中同时运行项目都可以,但是同样一台服务器同时启动几个虚拟机负担就很大了。

基本概念

docker基本概念很简单,只要了解镜像、容器、仓库三个概念即可。

  1. ‌Docker镜像(Image)‌
    专业解释:Docker镜像是一个轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,包括代码、运行时环境、库、环境变量和配置文件等。
    通俗解释:docker将运行一个项目的代码和环境配置打包成的一个压缩包文件。

  2. Docker容器(Container)
    专业解释:

    • Docker容器是镜像的运行实例。你可以使用Docker API或CLI来运行、停止、移动或删除容器。
    • 容器是轻量级的,因为它们共享宿主机的内核,并且只运行必要的进程。
    • 容器是动态的,你可以启动、停止、重启容器,并且容器内的数据会随着容器的停止而消失(除非使用了数据卷或持久化存储)。
      通俗解释:把镜像解压缩,环境能跑项目了。
  3. Docker仓库(Hub‌)
    Docker Hub是一个公共的镜像仓库,它允许用户上传、下载和管理Docker镜像。
    Docker Hub提供了大量的官方镜像和社区贡献的镜像,你可以直接使用这些镜像来运行你的应用程序。
    镜像可以从Docker Hub等镜像仓库中下载,也可以自己构建。
    可以创建私有仓库来存储和管理自己的镜像。
    镜像是静态的,它不会改变,除非重新构建。

Q:这三个概念有什么联系?
镜像可以理解为环境模板,容器可以理解为按照模板形成的可执行环境,仓库可理解为环境模板的管理处,仓库中镜像可以自己管理,也可以分享给别人用。

更多内容可以了解‌Dockerfile‌和‌Docker Compose‌这两个概念,Dockerfile就是用来自定义构建镜像的,Docker Compose通过读取docker-compose.yml文件,自动化地处理多个容器的创建、配置和启动。这里不过多介绍。

基本使用

从安装Docker开始,到运行Docker、创建和管理容器。下面是一个简要的指南,以及一些常见的Docker命令和示例。

  1. 安装Docker
    首先,无论是打包容器还是运行容器都需要在机器上安装Docker。
    Docker支持多种操作系统,包括Linux、Windows和macOS。
    从Docker的官方网站下载适合你操作系统的安装包,并按照安装指南进行安装。

  2. 运行Docker
    安装完成后,你需要启动Docker服务。在大多数Linux发行版上,你可以使用系统服务管理工具(如systemctl)来启动Docker服务。在Windows和macOS上,Docker Desktop应用程序会为你处理这些后台任务。

  3. 获取Docker镜像
    从Docker Hub(一个在线的公共镜像仓库)或其他镜像仓库中获取镜像,或者直接拷贝镜像到本地。

  4. 创建并运行Docker容器
    有了镜像,就可以使用它来创建容器了。
    docker run命令用于创建并运行一个新容器。
    例如,要基于xxx镜像启动一个交互式shell会话,你可以运行:

    1
    docker run -it xxx /bin/bash

    这里,-it选项组合了-i(交互式)和-t(分配一个伪终端)两个选项,/bin/bash是要在容器内执行的命令,作用就是启动linux系统的bash窗口。
    完整命令的执行后Docker会自动为容器生成一串随机字符组成的名称,以确保它在你的Docker主机上是唯一的(推荐使用--name参数来指定生成的容器名称方便管理)。

    1
    docker run --name my_container -it xxx /bin/bash

    要查找或确定在这个命令下创建的容器的名称,你可以使用docker ps命令来列出当前正在运行的容器。
    Q: docker ps 命令还有什么作用?
    docker ps 命令的输出列表中,你会看到正在运行的每个容器的ID、创建时间、状态、端口以及容器名称等信息。
    ‌在正在运行的容器中执行命令,示例‌:

    1
    docker exec -it my_container /bin/bash
  5. 管理Docker容器
    Docker提供了多种命令来管理容器,包括列出容器、停止容器、启动容器等。以下是一些常用的命令:
    ‌列出所有容器‌(包括正在运行的和已停止的):

    1
    docker ps -a

    停止正在运行的容器‌:

    1
    docker stop <container_id_or_name>

    ‌启动已停止的容器‌:

    1
    docker start <container_id_or_name>

    ‌删除容器‌(需要先停止容器):

    1
    docker rm <container_id_or_name>

    这个命令会创建一个新的Nginx容器,在后台运行(-d),并将容器的80端口映射到宿主机的80端口(-p 80:80)。

    1
    docker run -d -p 80:80 nginx

    从Docker Hub或其他镜像仓库下载镜像。‌‌
    示例‌,这个命令会下载Ubuntu的最新(latest)版本的镜像:

    1
    docker pull ubuntu:latest

    列出所有本地镜像‌,加上-q选项可以只显示镜像ID。示例‌:

    1
    docker images

    这个命令会在名为my_container的容器中启动一个新的bash会话。

  6. 构建自己的Docker镜像
    除了使用现有的镜像外,你还可以根据自己的需求构建自己的Docker镜像。这通常涉及编写一个Dockerfile,该文件包含了构建镜像所需的所有指令。使用docker build命令可以根据Dockerfile构建镜像。
    根据Dockerfile构建镜像,示例‌:

    1
    docker build -t my_image .

    这个命令会在当前目录下查找Dockerfile,并根据其中的指令构建一个新的镜像,命名为my_image。