Docker从0到1,一文学会基础概念、安装使用和集群管理

公众号:MCNU云原生,欢迎微信搜索关注,更多干货,及时掌握!

一、容器技术

Docker引领着容器生态,但也是容器生态的一部分,在了解Docker之前需要先了解以下容器技术。

1.1、容器是什么?

容器是一种轻量级的虚拟化技术,它可以将应用程序及其所有依赖项封装在一个独立的运行环境中。容器内的应用程序可以在不同的环境中运行,而不必担心运行时环境的差异性。

1.2、为什么需要容器?

在传统的应用程序部署模式中,应用程序与其依赖项被安装在主机操作系统中。这会导致应用程序之间相互干扰,难以升级和管理。容器技术通过隔离应用程序及其依赖项,可以解决这些问题。

另外,容器技术还可以提高应用程序的可移植性,便于在不同的环境中运行,包括开发、测试、生产等环境。

1.3、容器的工作原理

容器的工作原理基于操作系统级别的虚拟化技术,使用了Linux内核的命名空间和控制组(cgroup)功能。命名空间提供了隔离容器内的进程、文件系统、网络和用户空间等资源,每个容器都有自己的文件系统、进程树和网络接口,因此可以在同一主机上运行多个相互隔离的应用程序。

控制组是Linux内核的一个功能,可以为每个进程设置资源限制和优先级,包括CPU、内存、磁盘、网络等资源。Docker使用控制组来控制容器的资源使用情况,可以为每个容器设置资源限制和优先级,确保容器之间的资源不会相互干扰。

当用户启动一个Docker容器时,Docker会首先从指定的镜像中创建一个新的容器文件系统,并在其中启动一个新的进程。这个进程会成为容器的主进程,并在容器内运行所有的应用程序和服务。

在容器内部,Docker会为容器的主进程创建一个新的命名空间,并将容器内的进程、文件系统、网络和用户空间等资源都隔离在这个命名空间内。这使得容器内的应用程序可以独立地运行,而不会受到主机操作系统或其他容器的影响。

在容器外部,Docker会为每个容器分配一个唯一的标识符,称为容器ID。通过容器ID,用户可以管理容器的状态,包括启动、停止、删除等操作。同时,Docker还提供了一系列的命令行工具,方便用户对容器进行管理和监控。

二、Docker介绍

2.1、Docker是什么?

Docker是一种开源的容器化平台,它可以让开发者将应用程序及其所有依赖项打包成一个可移植的容器,以便在不同的计算机、操作系统和云服务上运行。Docker容器是轻量级、可移植、自包含的,具有高度可扩展性和可定制性,这使得Docker成为现代应用程序开发和部署的重要工具。

使用Docker,开发者可以通过定义一个Dockerfile来描述应用程序的运行环境和依赖项,然后使用Docker命令将这个Dockerfile构建成一个容器镜像。容器镜像包含了应用程序及其所有依赖项,可以在不同的计算机、操作系统和云服务上运行,而不需要担心环境差异和配置问题。

Docker还提供了一套强大的命令行工具和API,使得容器的创建、管理、监控和扩展变得简单易用。开发者可以使用Docker Compose来定义和运行多个容器组成的应用程序,并使用Docker Swarm来管理多个Docker主机上的容器集群。

总的来说,Docker是一个开源的、跨平台的、轻量级的容器化平台,它提供了强大的容器管理和部署功能,可以帮助开发者更轻松地构建、交付和运行现代应用程序。

2.2、Docker的架构

如上图所示,传统的虚拟机的虚拟化在操作系统之上有一层Hypervisor层,虚拟机运行其上,虚拟机里面还需要再运行一个操作系统,而Docker Engine是位于操作系统之上的一层虚拟化,App直接运行在Docker Engine之上,对比传统的虚拟机的形式,其更加轻量,对系统资源的消耗更少,管理也更加简单。

Docker可以分为两部分:客户端和服务器。

Docker客户端是一个命令行工具,开发者可以在本地电脑上使用该工具构建、管理和部署Docker容器。Docker客户端可以通过Docker命令与Docker服务器进行交互,发送请求并接收响应。Docker客户端可以运行在任何支持Docker API的操作系统上,如Linux、macOS、Windows等。

Docker服务器是Docker的主要组件,它负责管理Docker镜像和容器。Docker服务器由多个组件组成,包括Docker守护进程、Docker REST API、Docker图形用户界面等。Docker服务器可以在单个主机上运行,也可以在多个主机上通过Docker Swarm进行集群管理。

2.3、Docker的概念

Docker 包括三个基本概念:镜像(Image)、容器(Container)、仓库(Repository),这是最重要的三个概念,理解了这三个概念,就能够更好地理解整个Docker的生命周期。

**Docker镜像(Image)**是Docker容器运行时的只读模板,它包含了一个完整的Docker容器所需的所有文件和配置。Docker镜像可以看作是Docker容器的“模板”或“蓝图”,每个Docker容器都是由一个或多个Docker镜像构建而成的。

**Docker容器(Container)**是Docker镜像的运行实例,它是一个独立运行的、可移植的软件包,包含了应用程序及其所有依赖项和运行环境。Docker容器可以在不同的平台和环境中运行,而不会受到底层系统环境的影响。

**Docker仓库(Repository)**是用来存储和分享Docker镜像的地方,类似于代码仓库。Docker仓库可以分为两种类型:公共仓库和私有仓库。Docker Hub是最大的公共Docker仓库,它包含了数千个Docker镜像,开发者可以免费下载和使用。私有Docker仓库则需要用户自己搭建,可以用于内部应用程序的部署和共享。

当开发者需要使用某个应用程序时,可以从Docker仓库中下载相应的Docker镜像,并使用Docker镜像构建Docker容器。Docker容器可以在本地或远程的Docker主机上运行,并可以通过Docker命令进行管理和操作。

三、Docker安装部署

在CentOS下安装和部署Docker非常简单,可以按照以下步骤进行操作:

  1. 更新系统软件包

首先需要确保系统软件包是最新的,可以使用以下命令更新:

sudo yum update
  1. 安装Docker

执行以下命令来安装Docker:

sudo yum install docker

安装完成后,可以使用以下命令来启动Docker:

sudo systemctl start docker
  1. 设置Docker开机自启动

执行以下命令来设置Docker开机自启动:

sudo systemctl enable docker
  1. 验证安装

执行以下命令来验证Docker是否已经安装成功:

docker version

如果安装成功,会输出Docker的版本信息。

至此,Docker在CentOS下的安装和部署就完成了。可以开始使用Docker来构建、部署和管理应用程序了。

四、Docker镜像

4.1、Docker镜像介绍

Docker镜像是Docker容器的基础,是一个轻量级的、可执行的独立软件包,其中包含了运行特定应用程序所需的所有文件、库和配置。每个Docker镜像都是只读的,可以根据它来创建一个或多个Docker容器。

Docker镜像由多个镜像层组成,每个镜像层都包含文件系统的一部分。每个镜像层都可以由Dockerfile中的一个命令来创建,并且可以重复使用在不同的Docker镜像中。当需要构建一个新的镜像时,可以从已有的镜像中继承一些层,然后添加一些新的层。

Docker镜像可以从Docker Hub上下载,也可以从Dockerfile构建而来。在Dockerfile中,可以使用各种命令来构建Docker镜像,例如COPY、ADD、RUN、ENV等。可以使用Dockerfile构建自己的镜像,也可以在Docker Hub上分享自己的镜像。

在Docker镜像的使用过程中,可以使用以下命令来管理和维护Docker镜像:

  • docker images:列出本地主机上的所有Docker镜像。
  • docker search <image-name>:在Docker Hub上搜索Docker镜像。
  • docker pull <image-name>:从Docker Hub上下载指定的Docker镜像。
  • docker build -t <image-name> :使用Dockerfile构建一个新的Docker镜像。
  • docker push <image-name>:将本地的Docker镜像推送到Docker Hub上。
  • docker rmi <image-id>:删除指定的Docker镜像。

在实际应用中,Docker镜像的使用非常广泛,可以通过镜像来构建、部署和管理各种类型的应用程序,为应用程序的开发、测试、发布和部署带来了极大的便利。

4.2、Docker镜像构建

Docker镜像的构建和分发是使用Docker的重要功能之一,可以通过构建和分发Docker镜像,方便地将应用程序部署到不同的环境中,同时也能够保证应用程序的一致性和可移植性。

Docker镜像的构建通常通过Dockerfile来实现。Dockerfile是一个文本文件,包含了一系列指令,用于描述Docker镜像的构建过程。通常的构建过程是:

  • 从基础镜像开始构建
  • 运行一些命令,如安装软件、复制文件、设置环境变量等
  • 将构建好的镜像保存到本地或上传到Docker仓库

下面是一个简单的Dockerfile示例:

FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y python3 python3-pip
COPY . /app
WORKDIR /app
RUN pip3 install -r requirements.txt
CMD ["python3", "app.py"]

这个Dockerfile以最新版本的Ubuntu作为基础镜像,安装了Python3和pip,将当前目录下的文件复制到/app目录下,安装了requirements.txt中指定的Python依赖,并设置了容器的启动命令。

使用以下命令可以根据Dockerfile构建镜像:

docker build -t <image-name> .

其中,-t选项指定了镜像的名称和标签,"."表示使用当前目录作为构建上下文。

4.3、Docker镜像分发

Docker镜像的分发通常有两种方式:保存为文件和上传到Docker Hub。

  • 保存为文件

    使用以下命令将Docker镜像保存为tar格式的文件:

docker save <image-name> -o <file-name>.tar

可以将文件传输到其他机器上,使用以下命令将文件加载为Docker镜像:

docker load -i <file-name>.tar
  • 上传到Docker Hub

    Docker Hub是一个公共的Docker镜像仓库,可以将Docker镜像上传到Docker Hub,其他用户可以通过Docker Hub搜索和下载镜像。使用以下命令将Docker镜像上传到Docker Hub:

docker login
docker tag <image-name> <docker-id>/<image-name>:<tag>
docker push <docker-id>/<image-name>:<tag>

其中,docker login命令用于登录Docker Hub账号,docker tag命令用于给镜像打标签,docker push命令用于将镜像推送到Docker Hub上。

总之,Docker镜像的构建和分发是Docker使用的重要功能,可以大大简化应用程序的部署和管理过程。构建Docker镜像需要使用Dockerfile,分发Docker镜像可以将它保存为文件或上传到Docker Hub。通过这些操作,我们可以轻松地在不同的环境中部署应用程序,并保证应用程序的一致性和可移植性。

需要注意的是,在构建和分发Docker镜像时,我们应该尽量避免在镜像中包含敏感信息,如密码、密钥等,以避免泄漏。另外,我们还需要注意Docker镜像的大小,尽量精简镜像的内容,减少镜像的大小,以提高镜像的下载和部署速度。

除了手动构建和分发Docker镜像外,还可以使用一些自动化的工具来简化这些操作,如Docker Compose和Docker Swarm等。这些工具可以轻松地定义和管理多个Docker容器和镜像,并提供了更高级的功能,如负载均衡、容器编排等。

总之,Docker镜像的构建和分发是使用Docker的重要功能之一,掌握这些操作可以让我们更好地管理和部署应用程序,并提高开发和部署效率。

五、Docker仓库搭建

Docker仓库分为两种类型:公共仓库和私有仓库。

公共仓库是由Docker官方提供的,最大的公共Docker仓库是Docker Hub。Docker Hub包含了数千个Docker镜像,开发者可以免费下载和使用,也可以将自己构建的Docker镜像推送到Docker Hub中与其他人分享。

私有仓库是由用户自己搭建的,可以用于内部应用程序的部署和共享。私有仓库可以在企业内部搭建,保护私有代码和应用程序的安全性和可控性。常见的私有Docker仓库包括Docker Registry和Harbor等。

以Docker Registry为例,搭建Docker私有仓库(在安装Docker Registry之前,需要先安装Docker。)

5.1、下载Docker Registry

可以在Docker Registry的官方GitHub仓库中下载最新的Docker Registry版本。

$ git clone https://github.com/docker/distribution.git
$ cd distribution

5.2、构建Docker Registry镜像

Docker Registry是一个Docker镜像,需要通过Dockerfile构建。可以使用以下命令构建Docker Registry镜像。

$ docker build -t my-registry .

5.3、运行Docker Registry容器

构建Docker Registry镜像后,可以使用以下命令运行Docker Registry容器。

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

这里使用了-d参数让容器在后台运行,-p参数将Docker Registry容器的5000端口映射到主机的5000端口,–name参数为容器指定一个名称,my-registry参数指定了运行的镜像名称。

5.4、配置Docker客户端

完成Docker Registry的安装和部署后,需要将Docker客户端配置为使用该私有仓库。可以在Docker客户端的配置文件/etc/docker/daemon.json中添加如下内容:

{
  "insecure-registries": ["my-registry:5000"]
}

其中my-registry:5000是Docker Registry容器所在的主机地址和端口。

5.5、测试Docker Registry

配置完成后,可以使用Docker客户端命令测试Docker Registry是否成功运行。

$ docker pull hello-world
$ docker tag hello-world my-registry:5000/hello-world
$ docker push my-registry:5000/hello-world
$ docker rmi my-registry:5000/hello-world
$ docker pull my-registry:5000/hello-world

这里分别执行了从Docker Hub拉取hello-world镜像、将其标记为my-registry:5000/hello-world、将镜像推送到Docker Registry、删除本地镜像和从Docker Registry拉取镜像的操作。如果以上操作均执行成功,则表示Docker Registry已经成功部署。

注意:在实际使用中,需要根据实际需求进行安全配置和认证授权等操作,以确保Docker Registry的安全性和可控性。

六、常用Docker命令

Docker是一个功能强大的容器化平台,提供了很多常见的用法和命令,以下是一些常见的用法和命令:

6.1、搜索和下载镜像

使用以下命令可以在Docker Hub上搜索和下载镜像:

docker search <image-name>
docker pull <image-name>
6.2、构建和推送镜像

使用以下命令可以构建自己的镜像,并将其推送到Docker Hub:

docker build -t <image-name> .
docker push <image-name>
6.3、删除本地镜像
docker rmi <image-name>
6.4、给镜像打标签
docker tag [SOURCE_IMAGE[:TAG]] [TARGET_IMAGE[:TAG]]

Docker 镜像是用于创建 Docker 容器的模板,它们可以通过名称和标签来识别。每个 Docker 镜像可以有多个标签,这些标签可以使用户更方便地识别和使用 Docker 镜像。

其中,SOURCE_IMAGE 是要打标签的 Docker 镜像的名称或 ID,可以包含可选的标签。TARGET_IMAGE 是带有新标签的 Docker 镜像的名称或 ID。如果没有为 TARGET_IMAGE 指定标签,则将使用默认标签 latest

下面是一些示例:

给一个本地的 Docker 镜像打一个新的标签:

docker tag my-image:latest my-registry.com/my-image:v1.0

这个命令会为 my-image:latest 镜像打上一个新标签 my-registry.com/my-image:v1.0,其中 my-registry.com 是 Docker 镜像的仓库地址。

将一个已经打好标签的 Docker 镜像重新打上一个新的标签:

docker tag my-registry.com/my-image:v1.0 my-registry.com/my-image:latest

这个命令会为 my-registry.com/my-image:v1.0 镜像打上一个新标签 my-registry.com/my-image:latest,并将原来的 latest 标签替换掉。

注意,docker tag 命令只是为 Docker 镜像打上新标签,不会创建新的镜像。如果需要创建新的镜像,需要使用 docker build 命令。

6.5、运行容器

使用以下命令可以运行容器:

docker run -it <image-name> <command>

其中,是需要在容器内执行的命令。

6.6、列出镜像和容器

使用以下命令可以列出所有的镜像和容器:

docker images
docker ps -a
6.7、启动、停止、删除容器

使用以下命令可以停止和删除容器:

docker start <container-id>
docker stop <container-id>
docker rm <container-id>
6.8、进入容器

使用以下命令可以进入容器:

docker exec -it <container-id> /bin/bash

其中,/bin/bash是要在容器内执行的命令。

6.9、显示容器日志

使用以下命令可以查看容器的日志:

docker logs <container-id>
6.10、显示容器端口映射

使用以下命令可以查看容器的端口映射:

docker port <container-id>
6.11、查看容器的信息
docker inspect <container-id>

七、Docker Compose

Docker Compose 是 Docker 官方提供的一个用于定义和运行多个 Docker 容器的工具。它可以通过一个 YAML 文件来定义应用的服务、网络和卷等相关配置,然后使用一个命令即可启动、停止和重启整个应用的容器。使用Docker Compose的好处是:

  1. 简化开发流程:Docker Compose可以通过单个文件定义所有服务,并在单个命令下启动它们。这简化了开发人员的工作流程,因为他们无需手动运行每个容器。
  2. 可移植性:Docker Compose文件可以与其他开发人员和生产环境共享,确保在所有环境中都可以准确地部署应用程序。
  3. 管理多个容器:Docker Compose可以管理多个容器,从而使部署和管理多个容器的应用程序更加容易。例如,您可以使用Docker Compose来启动数据库、Web服务器和应用程序服务器,这些容器可以相互通信。
  4. 简化部署:Docker Compose可以一次性运行多个容器,从而简化了部署应用程序的过程。
  5. 自定义网络:使用Docker Compose,您可以定义自己的网络,并将容器连接到该网络。这样,您可以确保容器之间的通信安全和可靠。

总之,Docker Compose提供了一个简单、可移植、可扩展且可靠的方式来管理和部署多个Docker容器的应用程序。

以下是 Docker Compose 的用法:

7.1、定义 Compose 文件

首先,需要创建一个 Compose 文件(默认文件名为 docker-compose.yml),用于定义应用的服务、网络和卷等相关配置。这个文件可以包含多个服务的定义,每个服务可以包含多个容器。下面是一个示例 Compose 文件:

version: '3'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  db:
    image: postgres
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword

volumes:
  db-data:

这个 Compose 文件定义了两个服务:webdbweb 服务基于当前目录下的 Dockerfile 构建一个 Flask 应用的容器,并将容器内的 5000 端口映射到主机的 5000 端口。db 服务使用 PostgreSQL 官方镜像创建一个容器,同时将容器内的数据目录挂载到一个名为 db-data 的卷上。

7.2、启动 Compose 应用

在创建好 Compose 文件后,可以使用 docker-compose up 命令来启动整个应用的容器。这个命令会自动下载镜像、创建和启动容器,并将容器的输出输出到终端上。如果需要在后台运行容器,可以加上 -d 参数。例如:

docker-compose up -d

7.3、停止和重启 Compose 应用

可以使用 docker-compose stop 命令来停止整个应用的容器,同时保留容器的状态。可以使用 docker-compose start 命令来重新启动之前停止的容器。

如果需要重新构建应用的镜像,可以使用 docker-compose build 命令。

7.4、清理 Compose 应用

可以使用 docker-compose down 命令来停止并删除整个应用的容器、网络和卷等资源。这个命令会删除容器、网络和卷等资源,但不会删除构建好的镜像。如果需要删除镜像,可以使用 docker rmi 命令。

这就是 Docker Compose 的基本用法,它可以极大地简化多个 Docker 容器的管理和部署工作,同时提高了开发者的效率。

八、Docker Swarm

Docker Swarm是Docker官方提供的用于管理多个Docker主机的工具,它可以将多个Docker主机组成一个虚拟的Docker主机集群,使得用户可以像操作单个Docker主机一样来管理和部署容器。

Docker Swarm的用法如下:

8.1、初始化Swarm

在Docker Swarm中,需要将一个Docker主机指定为“管理节点”,其他Docker主机则作为“工作节点”加入到Swarm中。要初始化Swarm,需要在一个Docker主机上运行以下命令:

$ docker swarm init --advertise-addr <MANAGER-IP>

其中<MANAGER-IP>是该Docker主机的IP地址。

8.2、添加工作节点

在其他Docker主机上,可以运行以下命令将它们加入到Swarm中:

$ docker swarm join --token <TOKEN> <MANAGER-IP>:<MANAGER-PORT>

其中<TOKEN>是管理节点提供的令牌,<MANAGER-IP><MANAGER-PORT>是管理节点的IP地址和端口。

8.3、部署服务

在Swarm中,用户可以定义和部署服务,服务是一组容器的逻辑单元,可以是一个Web应用程序或数据库等。要在Swarm中部署服务,需要编写一个Docker Compose文件,并使用以下命令来创建和启动服务:

$ docker stack deploy --compose-file <COMPOSE-FILE> <STACK-NAME>

其中<COMPOSE-FILE>是Docker Compose文件的路径,<STACK-NAME>是服务的名称。

8.4、扩展和缩小服务

在Swarm中,可以根据需要扩展或缩小服务的规模,可以使用以下命令来扩展或缩小服务:

$ docker service scale <SERVICE-NAME>=<REPLICAS>

其中<SERVICE-NAME>是服务的名称,<REPLICAS>是服务的副本数。

Docker Swarm提供了一个简单而强大的方式来管理和部署多个Docker容器,可以使用户更加容易地管理容器、扩展服务和实现高可用性。

以上基本涵盖了Docker相关的概念和基础使用方法,掌握以上内容,已能满足日常Docker基础管理和使用的需要,心动不如行动,学习起来吧。

猜你喜欢

转载自blog.csdn.net/projim_tao/article/details/129347052