逐步学习Docker部署和容器管理

1. 什么是Docker?

Docker 是一个开源平台,支持开发人员构建、部署、运行、更新和管理容器,这些容器是标准化的可执行组件,结合了应用源代码以及在任何环境中运行该代码所需的操作系统 (OS) 库和依赖项。

容器简化了分布式应用的部署和交付过程。 随着组织转向云原生开发和混合多云环境,它们已变得越来越流行。 开发人员可以直接使用 Linux 和其他操作系统中内置的功能,在没有 Docker 的情况下创建容器。 但 Docker 使容器化更加迅速、简便和安全。 截至本文撰写之时,Docker 报告称,已有超过 1300 万名开发人员在使用该平台(链接位于 ibm.com 外部)。

Docker 也指 Docker, Inc.(链接位于 ibm.com 外部),即销售 Docker 商业版本的企业,还可以是 Docker, Inc. 和许多其他组织和个人开展的 Docker 开源项目。

info:IBM


2. Docker的基本概念

  • 镜像(Image) : 容器的基础,类似于模板,包含了运行应用所需的所有内容。
  • 容器(Container):由镜像创建的运行实例,是一个独立的、隔离的运行环境。
  • 仓库(Repository):用于存储和分享镜像的地方,可以公开或私有。
  • Dockerfile:用于定义镜像内容的文本文件,可以通过其构建定制镜像。

3. Docker的安装与配置

  • 安装Docker:根据不同Linux发行版选择合适的安装方式,如apt、yum或官方脚本,当然你也可以在Windows上安装Docker Desktop。
  • 配置镜像加速器:使用国内镜像加速器,加快镜像下载速度。
  • 用户权限设置:将用户添加到docker用户组,避免使用sudo运行Docker命令。

3.1 Docker的基本常用命令

  • docker info: 显示docker的系统信息,包括镜像和容器的数量
docker info
  • docker version: 显示docker的版本信息
docker version
  • docker --help: 显示基本帮助信息,包括常用命令的列表和全局选项
docker COMMAND --help
  • docker images: 查看所有本地主机上的镜像 可以使用docker image ls代替
docker images
  • docker search: 搜索镜像
docker search
  • docker pull: 下载镜像 docker image pull
docker pull
  • docker rmi: 删除镜像 docker image rm
docker rmi
#docker删除指定容器
docker rm 容器id
#删除所有容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
  • docker run 镜像id: 新建容器并启动。例如,在后台运行一个Nginx容器,并将主机的3306端口映射到容器的3306端口
docker run -d -p 3306:3306 --name my-nginx nginx
  • docker ps: 列出所有正在运行的容器及其相关信息,如容器ID、名称、状态等
docker ps
  • docker build: 通过Dockerfile构建镜像。例如,通过Dockerfile在当前目录下构建一个名为my-custom-image的镜像
docker build -t my-custom-image
  • docker push: 将镜像推送到仓库。例如,先给镜像打上标签,然后将镜像推送到Docker Hub的仓库中
docker tag my-custom-image username/my-custom-image
docker push username/my-custom-image
  • docker exec: 在容器内执行命令。例如,进入容器的bash终端,允许您在容器内执行命令
docker exec -it container_id bash
  • docker stop/start: 停止/启动容器。例如,停止指定ID的容器
docker stop/start container_id

4. 容器网络

  • 主机网络(Host Network):使用主机网络模式时,容器与宿主机共享网络命名空间。这意味着容器使用与宿主机相同的IP地址和端口,可以直接访问宿主机上的网络服务。
  • 桥接网络(Bridge Network):桥接网络是Docker默认创建的网络类型。在桥接网络中,每个容器都被分配一个独立的IP地址,并且可以通过指定的名称进行通信。桥接网络允许容器之间和容器与主机之间进行相互通信。
  • None网络(None Network):在None网络模式下,容器将没有网络接口,因此无法直接访问网络。但是,你可以通过其他方式(例如主机网络或桥接网络)与容器进行通信。
  • Overlay网络(Overlay Network):Overlay网络允许多个Docker守护进程在不同主机上的容器进行通信。它使用VXLAN(Virtual Extensible LAN)技术在不同的主机之间创建隧道,使得容器之间可以透明地通信。Overlay网络通常用于构建分布式应用程序或跨主机容器集群。

5. 数据管理

  • 数据卷(Volume):数据卷是一个可供一个或多个容器使用的特殊目录,可以将其与容器内的目录进行挂载。数据卷可以用于在容器之间共享数据,以及将数据持久化保存。数据卷的好处是在容器删除后仍然保留,不受容器生命周期的影响。
  • 挂载主机目录(Bind Mount):通过挂载主机目录,你可以将宿主机上的目录直接映射到容器中。这使得容器可以访问宿主机上的文件系统并读取或写入数据。挂载主机目录适用于需要与宿主机共享数据或访问宿主机文件系统的情况。
  • 匿名卷(Anonymous Volume):可以通过指定VOLUME指令或在容器运行时使用-v选项来创建匿名卷。匿名卷是自动由Docker创建的,并且在容器删除后会保留在宿主机上,但它没有持久化的能力,仅用于临时存储数据。
  • 数据卷容器(Data Volume Container):数据卷容器是一个专门用于管理数据卷的容器。你可以创建一个数据卷容器,并将其挂载到其他容器来共享数据。数据卷容器提供了更好的灵活性和数据管理能力,允许多个容器共享和访问相同的数据卷。

6. Docker Compose

  • 定义服务:使用 Docker Compose,你可以定义多个服务(即容器)以及它们的配置。每个服务都可以包含容器的镜像、容器的名称、暴露的端口、挂载的卷以及其它配置选项。
  • 管理容器关系:你可以使用 Docker Compose 定义多个服务之间的关系和依赖关系。这使得你可以轻松地创建应用程序的整体架构,例如前端和后端服务的连接或数据库与应用程序的连接。
  • 配置容器参数:通过 Docker Compose,你可以为每个容器设置环境变量、启动命令、资源限制等参数。这使你可以方便地自定义容器的行为。
  • 启动和停止应用程序:使用 Docker Compose,你可以一键启动或停止整个应用程序。它会根据定义的配置自动创建和管理容器。
  • 扩展和更新应用程序:Docker Compose 允许你轻松扩展应用程序,例如增加多个副本或负载均衡容器。当配置文件发生变化时,你可以使用 Docker Compose 快速更新应用程序。

7. Docker Swarm

  • 集群管理:Docker Swarm 允许你将多个 Docker 主机组成一个集群,形成一个单一的虚拟计算资源池。你可以使用一个主节点(manager)来管理整个集群,包括容器的部署、调度和监控。
  • 服务编排:使用 Docker Swarm,你可以定义服务,即容器的集合,并指定各个服务所需的镜像、资源配置、副本数等。Swarm 会负责将服务的容器分配到集群中的不同主机上,并自动处理容器启动、停止和失败转移等操作。
  • 冗余和高可用性:Docker Swarm 提供了冗余和高可用性功能,确保集群的稳定和容错能力。如果一个主节点失效,Swarm 会自动选举一个新的主节点来接管管理操作,保证集群的正常运行。
  • 服务扩展:使用 Docker Swarm,你可以根据需要快速扩展服务的规模。只需指定所需的副本数,Swarm 就会自动在集群中的不同主机上启动相应数量的容器,实现服务的水平扩展。
  • 跨主机网络:Docker Swarm 提供了内置的跨主机网络功能,使得容器之间可以直接通信,无需手动配置网络连接。这使得跨主机容器集群的构建和管理变得更加方便和灵活。

8. Docker安全

  • 命名空间和隔离:Docker 使用 Linux 命名空间和控制组(cgroups)来实现容器的隔离。每个容器都有自己独立的文件系统、进程空间和网络栈,以及资源限制和权限控制,从而避免了容器之间的相互干扰。
  • 容器镜像的安全性:使用官方和受信任的容器镜像是保证容器安全性的重要一环。官方镜像经过 Docker 团队的审查和维护,有更高的可信度。同时,你也可以通过签名验证、镜像扫描工具等方式来确保镜像的完整性和安全性。
  • 容器的最小化和仅读模式:为了减少容器的攻击面,可以采用最小化容器的原则,即只安装运行所需的软件和依赖项。此外,可以将容器设置为仅读模式,以防止容器运行时被修改或恶意注入。
  • 安全配置和最佳实践:使用安全的配置和最佳实践是保护 Docker 安全的重要措施。例如,限制容器的权限,避免使用特权模式,及时更新容器镜像和宿主机操作系统等。
  • 容器网络的防火墙和访问控制:通过使用容器网络的防火墙和访问控制规则,可以限制容器之间和容器与外部网络的通信,从而保护容器的网络安全。

9. Docker在CI/CD中的应用

  • 环境一致性:Docker 提供了容器化的环境,使得开发、测试和生产环境之间可以保持一致。通过在容器中打包应用程序及其依赖,可以避免环境差异导致的问题,在不同环境中更轻松地进行开发、测试和部署。
  • 快速构建和部署:使用 Docker,可以将应用程序和其依赖项打包成镜像,使得构建和部署过程更简单和高效。构建镜像只需在 Dockerfile 中定义所需的组件和配置,并使用 Docker 构建命令即可。在部署阶段,通过拉取预先构建好的镜像,可以快速部署应用程序并进行水平扩展。
  • 可移植性和可重复性:Docker 镜像是独立于底层操作系统的,可以在不同的主机和云平台上运行。这使得应用程序的部署具有很高的可移植性,并能够在不同环境中实现一致的部署和运行结果。
  • 自动化测试和集成:Docker 容器可以与常用的 CI/CD 工具集成,如 Jenkins、GitLab CI、Travis CI 等。通过在容器中运行自动化测试,可以更快速、可靠地进行单元测试、集成测试和端到端测试,提高测试效率和结果的可靠性。
  • 与编排工具的结合:Docker 可以与容器编排工具(如 Docker Swarm、Kubernetes)结合使用,实现弹性扩展、负载均衡和自动恢复等功能。借助这些工具,可以更好地管理和编排容器化的应用程序,实现高效的 CI/CD 流程。