Docker 是一个开源平台,用于自动化开发、部署和运行应用程序的过程,通过使用容器化技术,Docker 允许开发者将应用及其依赖打包成一个轻量级、可移植的容器,然后这个容器可以在任何地方运行。这样,它解决了“在我的机器上可以运行”的问题,提高了软件交付的效率和可靠性。

容器

容器化是一种虚拟化技术,它允许你在隔离的环境中运行和部署应用。每个容器独立运行一个或多个应用程序,包括它们所需的所有依赖。这就像将你的应用及其所有依赖打包在一个集装箱中,无论在什么环境下运输(运行),都能确保其内容不受影响。

生命周期

容器的生命周期管理是 Docker 使用的核心概念之一,涉及容器从创建到销毁的全过程。容器的生命周期可以通过一系列的 Docker 命令来管理,这些命令包括创建、启动、停止、重启、删除等操作。

生命周期

创建容器

创建容器是容器生命周期的第一步,这一过程依赖于 Docker 镜像。Docker 镜像是一个包含了应用及其依赖的轻量级、可执行的软件包,确保了应用在任何环境下的一致性和可移植性。

docker run hello-world

容器管理

容器一旦创建,就可以通过各种命令进行管理。这些命令允许用户控制容器的生命周期,包括启动、停止、重启和删除等操作。

  • 启动容器docker start my_container,此命令用于启动一个或多个已经创建但停止运行的容器。
  • 停止容器docker stop my_container,该命令用于停止一个或多个正在运行的容器。停止容器会向容器内的主进程发送 SIGTERM 信号,之后发送 SIGKILL 信号,以确保容器停止运行。
  • 查看运行中的容器docker ps,此命令展示了所有当前正在运行的容器。使用 -a 选项可以查看包括停止的在内的所有容器。
  • 进入运行中的容器docker exec -it my_container /bin/bash,该命令允许用户进入一个正在运行的容器内部,并以交互模式启动一个新的终端会话。这对于调试应用或管理容器内的服务非常有用。
  • 删除容器docker rm my_container,使用这个命令可以删除一个或多个已停止的容器。如果要删除运行中的容器,需要加上 -f--force 参数来强制删除。

高级容器管理

除了基本的生命周期管理命令,Docker 还提供了一系列高级功能,以支持更复杂的容器操作和管理需求。

  • 查看容器日志docker logs my_container,这个命令允许用户检查和跟踪容器内的标准输出和错误输出。对于调试应用和监控容器运行状态非常有用。
  • 查看容器内部进程docker top my_container,此命令显示运行在容器内部的进程列表,有助于了解容器内部的活动。
  • 暂停容器docker pause my_container,该命令用于暂停运行中的容器,所有进程都会被挂起。这可以用于资源管理或在特定时刻“冻结”容器的状态。
  • 恢复容器docker unpause my_container,与 docker pause 相对,此命令用于恢复被暂停的容器的执行。
  • 容器资源限制:在创建或运行容器时,可以通过 --memory--cpu-shares 等参数来限制容器可以使用的资源,从而避免单个容器占用过多的系统资源。

数据卷

数据卷是 Docker 实现数据持久化和共享的关键机制之一。通过使用数据卷,用户可以在不同容器之间共享数据,同时保证数据的持久化存储,即使容器被删除,卷中的数据也不会丢失。

  • 数据持久化:数据卷提供了一种机制,可以将数据存储在容器之外,确保重要数据不会因容器的删除而丢失。
  • 数据共享与重用:数据卷可以被多个容器挂载和访问,实现数据的共享。
  • 容器解耦:通过数据卷,应用程序的运行状态可以与数据保持独立,便于应用的迁移和备份。

使用数据卷

创建和使用数据卷的基本命令如下:

# 创建一个新的数据卷
docker volume create my_volume
 
# 将数据卷挂载到容器
docker run -d -v my_volume:/path/in/container --name my_container my_image

此命令会启动一个新的容器,将之前创建的数据卷 my_volume 挂载到容器的指定路径 /path/in/container 下。容器内应用对该路径的任何写操作都会直接反映到数据卷上,同样,对数据卷的任何更改也会立即在挂载它的所有容器中可见。

数据卷容器

数据卷容器是一种使用数据卷共享数据的模式。通过创建一个专门的容器来持有数据卷,其他容器可以通过 —volumes-from 标志来挂载这个容器中的数据卷。

# 创建一个带数据卷的容器
docker run -d --name data_container -v my_volume:/path/in/container my_image
 
# 使用 --volumes-from 从其他容器挂载数据卷
docker run -d --name app_container --volumes-from data_container my_app_image

这种方法使得数据的管理和共享变得更加集中和高效。

Docker 网络

Docker 网络功能允许容器相互通信,并与外部世界交互。Docker 提供了多种网络模式,以支持不同的使用场景。

网络模式

  • bridge:默认网络模式。当容器运行在桥接网络中时,Docker 会自动使用私有子网内的 IP 地址来分配给每个容器,并通过 NAT 实现与外部网络的通信。
  • host:在这种模式下,容器共享宿主机的网络命名空间,不进行网络隔离。容器的网络性能更好,但是安全性降低。
  • none:在这种模式下,容器具有自己的网络命名空间,但不配置任何网络接口,通常用于需要手动管理网络的高级场景。

自定义网络

创建自定义网络可以提供更灵活的网络配置,使得容器间的通信更加方便和安全。

# 创建自定义桥接网络
docker network create --driver bridge my_custom_bridge
 
# 运行容器时指定网络
docker run -d --name my_container --network my_custom_bridge my_image

在自定义网络中,容器可以通过容器名相互访问,而不需要使用 IP 地址,简化了容器间通信的配置。

网络连接和断开

Docker 允许在运行时将容器连接到网络或从网络断开。

# 将运行中的容器连接到网络
docker network connect my_custom_bridge my_container
 
# 将容器从网络断开
docker network disconnect my_custom_bridge my_container

这提供了动态管理容器网络连接的灵活性,允许根据需要调整容器的网络配置。