虚拟机 (VMware) 与容器 (Docker)
- 注 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 的一个别名使用):
Docker Hub 容器镜像仓库
Docker Hub: https://hub.docker.com/
Docker Hub 是 Docker 的公共镜像仓库,为用户提供了大量的镜像文件,Docker 通过 docer search、pull、login 和 push 等命令提供了连接 Docker Hub 服务的功能。
常用 Docker 命令
为了快速打包和部署软件环境,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
检查镜像信息
docker inspect python:3.8
导出镜像文件
docker save python:3.8 > ./python38.tar
删除容器镜像
docker rmi python:3.8
注:删除镜像前需要确保该镜像目前没有被其他容器使用,否则会删除失败。
导入镜像文件
docker load < python38.tar
使用应用容器
- 创建 Python 容器并使用容器内的 bash:
docker run -it --name p1 python:3.8 bash
- 检查 Docker 容器运行状态:
docker ps -a
(不加-a
仅查看活动的容器)
注:使用
docker run
命令创建并进入的 Docker 应用容器在内部执行exit
后会关闭当前容器,再次使用需要重启该容器。
- 启动现有容器:
docker start p1
- 暂停/继续运行容器:
docker pause p1
/docker unpause p1
- 进入已开启的容器:
docker exec -it p1 bash
注:使用
docker exec
命令创建并进入的 Docker 应用容器在内部执行exit
后会不会关闭当前容器,再次使用无需重启容器。
- 检查容器相关配置信息:
docker inspect p1
….
- 停止容器运行:
docker stop p1
- 删除容器(必须先停止容器运行):
docker rm p1
配置容器网络
默认情况下,Docker 环境会给容器动态分配 IP 地址,这导致下次启动容器的时候,IP 地址可能就改变了;为了保证项目的正常运行,可以单独创建 Docker 内部网段,并为容器分配固定的 IP 地址。
- 创建内部网段:
docker network create --subnet 172.18.0.0/16 mynet
- 查看已有网段:
docker network ls
- 删除已有网段:
docker network rm mynet
(需要先删除关联的容器)
- 创建具有固定 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
安装后才可使用)
映射容器端口
默认情况下,除了宿主机之外,任何主机无法访问远程访问Docker容器。通过端口映射(可同时映射多个端口),可以把容器端口映射到宿主机的端口,这样其他主机就能访问容器了(注意:映射到宿主机的端口,不需要设置防火墙规则,便可以使用)。
- 分别将容器内部的 5000 和 3306 端口映射到宿主机的 15000 和 13306 端口:
docker run -it --name p1 -p 15000:5000 -p 13306:3306 python:3.8 bash
挂载容器目录
为了能把一部分业务数据保存在 Docker 环境之外,或者把宿主机的文件传入容器,所以需要给容器挂载宿主机的目录(注意:Docker环境只支持目录挂载,不支持文件挂载,而且一个容器可以挂载多个目录)。
docker run -it -v /home/ubuntu/test:/root/test --name p2 python:3.8 bash
综合应用案例
需求:创建一个 Python 项目容器,要求使用 Python 3.9 版本,并安装好 Flask Web 框架
- 创建项目目录:
mkdir project
- 拉取容器镜像:
docker pull python:3.9
- 查看本地镜像:
docker images
- 创建 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
- 使用 Python 容器:
docker exec -it p1 bash
- 容器环境下安装 Flask 框架:
pip install flask -i https://mirrors.pku.edu.cn/pypi/simple
……