虚拟机 (VMware) 与容器 (Docker)

image.png

  • 注 1:Docker Desktop for Windows 现可使用 WSL2 作为 Linux 容器后端,启用相关选项后,无需在 WSL2 内部安装 Docker 即可在 Windows 或 WSL 命令行环境下使用 Docker。
  • 注 2:CentOS 8 及之后的 RH 系 Linux 系统默认采用 Podman 替代了 Docker,Podman 提供了一个与 Docker 兼容的命令行前端来管理 Docker 镜像;使用dnf/yum install docker默认将安装 podman-docker,完成安装后既可使用 Podman 来模拟执行大部分 Docker CLI 指令(即将 Docker 作为 Podman 的一个别名使用):
    image.png

Docker Hub 容器镜像仓库

Docker Hub: https://hub.docker.com/

Docker Hub 是 Docker 的公共镜像仓库,为用户提供了大量的镜像文件,Docker 通过 docer search、pull、login 和 push 等命令提供了连接 Docker Hub 服务的功能。
image.png

常用 Docker 命令

image.png
为了快速打包和部署软件环境,Docker 引入了镜像 (image) 机制,镜像是一个配置好的只读层软件环境;可以通过 dockerfile 文件创建出镜像,也可以从 Docker 仓库中下载到镜像。容器是在镜像基础之上创建出的虚拟实例,内容可读可写一个 Docker 镜像可以创建出多个容器,而且容器之间相互隔离,部署的程序不会相互干扰;所有的容器直接使用宿主机的 Linux 内核、内存和硬盘,所以容器的性能非常接近于宿主机。
下面使用以创建一个 Python 容器为案例来演示常用的 Docker 命令:

实验环境:Docker Desktop for Windows 4.8.2 + WSL2 Ubuntu 20.04

获取容器镜像

  • 拉取远端镜像:docker pull python:3.8
  • 查看本地镜像:docker images

image.png

检查镜像信息

  • docker inspect python:3.8

image.png

导出镜像文件

  • docker save python:3.8 > ./python38.tar

image.png

删除容器镜像

  • docker rmi python:3.8

    注:删除镜像前需要确保该镜像目前没有被其他容器使用,否则会删除失败。

image.png

导入镜像文件

  • docker load < python38.tar

image.png

使用应用容器

image.png

  • 创建 Python 容器并使用容器内的 bash:docker run -it --name p1 python:3.8 bash

image.png

  • 检查 Docker 容器运行状态:docker ps -a(不加-a仅查看活动的容器)

image.png

注:使用docker run命令创建并进入的 Docker 应用容器在内部执行exit后会关闭当前容器,再次使用需要重启该容器。

  • 启动现有容器:docker start p1

image.png

  • 暂停/继续运行容器:docker pause p1/docker unpause p1

image.png

  • 进入已开启的容器:docker exec -it p1 bash

image.png

注:使用docker exec命令创建并进入的 Docker 应用容器在内部执行exit后会不会关闭当前容器,再次使用无需重启容器。

  • 检查容器相关配置信息:docker inspect p1

image.png
….
image.png

  • 停止容器运行:docker stop p1
  • 删除容器(必须先停止容器运行):docker rm p1

image.png

配置容器网络

默认情况下,Docker 环境会给容器动态分配 IP 地址,这导致下次启动容器的时候,IP 地址可能就改变了;为了保证项目的正常运行,可以单独创建 Docker 内部网段,并为容器分配固定的 IP 地址。

  • 创建内部网段:docker network create --subnet 172.18.0.0/16 mynet
  • 查看已有网段:docker network ls
  • 删除已有网段:docker network rm mynet(需要先删除关联的容器)

image.png

  • 创建具有固定 IP 的容器:docker run -it --name p1 --net mynet --ip 172.18.0.2 python:3.8 bash(注:172.18.0.1为网段的网关地址,不可分配给其他容器)
  • 容器内查看当前 IP:hostname -I(注:也可使用ip addr查看 IP,但本容器未预装 iproute2 工具,需使用 apt update && apt install -y iproute2 安装后才可使用)

image.png
……
image.png

映射容器端口

默认情况下,除了宿主机之外,任何主机无法访问远程访问Docker容器。通过端口映射(可同时映射多个端口),可以把容器端口映射到宿主机的端口,这样其他主机就能访问容器了(注意:映射到宿主机的端口,不需要设置防火墙规则,便可以使用)。

  • 分别将容器内部的 5000 和 3306 端口映射到宿主机的 15000 和 13306 端口:docker run -it --name p1 -p 15000:5000 -p 13306:3306 python:3.8 bash

image.png

挂载容器目录

为了能把一部分业务数据保存在 Docker 环境之外,或者把宿主机的文件传入容器,所以需要给容器挂载宿主机的目录(注意:Docker环境只支持目录挂载,不支持文件挂载,而且一个容器可以挂载多个目录)。

  • docker run -it -v /home/ubuntu/test:/root/test --name p2 python:3.8 bash

image.png

综合应用案例

需求:创建一个 Python 项目容器,要求使用 Python 3.9 版本,并安装好 Flask Web 框架

  • 创建项目目录:mkdir project
  • 拉取容器镜像:docker pull python:3.9
  • 查看本地镜像:docker images

image.png

  • 创建 Python 容器(后台运行-d):docker run -itd --name p3 -p 9500:5000 -v /home/ubuntu/project:/root/project --net mynet --ip 172.18.0.4 python:3.9 bash

image.png

  • 使用 Python 容器:docker exec -it p1 bash

image.png

  • 容器环境下安装 Flask 框架:pip install flask -i https://mirrors.pku.edu.cn/pypi/simple

image.png
……
image.png