Hyper-V + Docker 容器化部署与应用

基于 Hyper-V 与 Docker 的容器化部署与应用


前言

本文仅提供 Hyper-V 与 Docker 最低限度应用的指导,详细内容请参考官方文档

  • Microsoft 虚拟化文档 。
  • docker docs
关于 Hyper-V

Hyper-V 提供 硬件虚拟化。 这意味着每个虚拟机都在虚拟硬件上运行。 Hyper-V 允许你创建虚拟硬盘驱动器、虚拟交换机以及许多其他虚拟设备,所有这些都可以添加到虚拟机中。

  • 优势

相比传统虚拟机,Hyper-V 极大地 减少发送 I/O 请求所需的开销。使高 I/O 工作负载的 CPU 开销大大降低。

  • 局限

需要使用 GPU 进行处理的游戏或应用程序可能无法良好运行。

运行环境

宿主机
  • Windows Server 2019 x64
虚拟机
  • Windows Server 2016 x64

  • Ubuntu 20.04.1 x64


Hyper-V 的启用

Windows10 已经附带虚拟组件 Hyper-V
默认情况下 Hyper-V 组件并没有被启用,需手动启用。

  1. 服务器管理器 > 添加角色和功能
image.png
  1. 勾选 Hyper-V,待安装完成后重启系统

Hyper-V 虚拟机创建

  • 以宿主机 Windows Server 2019 + 虚拟机 Ubuntu 20.04.1为例:

  • 开始 > Windows 管理工具 > Hyper-V 管理器

image.png
  • Hyper-V 管理器 > 服务器-右键 > 新建 > 虚拟机
image.png
  • 指定名称和位置
image.png
  • 指定虚拟机代数

由于 Hyper-V 第二代虚拟机的兼容性尚不明确,此处建议选择第一代虚拟机

image.png
  • 分配内存

此处填写虚拟机所需的启动内存用量,强烈建议勾选上 为此虚拟机使用动态内存

关于 Hyper-V 动态内存管理

动态内存管理 是 Hyper-V R2 提供的一项新功能和特性,目前只有Windows Server 2008 R2 Service Pack 1((SP1)以上版本(Windows Server 2012)支持该功能,该功能能够自动平衡服务器上运行的虚拟机所占用的物理内存大小。此功能可以在管理员针对不同虚拟机所指定的内存范围内,根据虚拟机中的应用优先级来 自动调整虚拟机对物理内存的占用大小,在应用性能和内存占用大小方面进行自动平衡并达到性能优化的目的。

image.png
  • 配置网络

暂不配置,网络相关配置详见后文

image.png
  • 连接虚拟硬盘
image.png
  • 安装选项

选择 从可启动的 CD/DVD-ROM 安装操作系统,并选择已下载好的系统镜像文件。

image.png
  • 完成虚拟机创建
image.png

安装 Ubuntu

  • 选择语言
image.png
  • 选择键盘布局
image.png
  • 网卡配置

默认即可

image.png
  • 代理配置

不配置代理

image.png
  • Ubuntu 镜像配置

此处建议使用 清华大学 Ubuntu 镜像:https://mirrors.tuna.tsinghua.edu.cn/ubuntu

image.png
  • 硬盘选择

默认即可

image.png
  • 硬盘分区

默认即可

image.png
  • 服务器相关信息配置

务必牢记初始账户与密码

image.png
  • 安装 OpenSSh server

为便于未来远程终端操作与文件传输,建议安装。

image.png
  • 安装第三方常用工具包

为容器化部署作准备,此处可选 microk8sdocker 进行安装

image.png
  • 待安装完成后重启虚拟机
image.png

Hyper-V 网络配置

  • Hyper-V 管理器 > 服务器-右键 > 虚拟交换机管理器
image.png
  • 选择虚拟交换机类型
关于 Hyper-v 虚拟交换机类型
  • 外部:虚拟机可以连接外部外网(与宿主机的网络相同),允许与其他虚拟机互相通信。
  • 内部:只能在虚拟机之间或者虚拟机与宿主机之间进行网络通信,无法连接外部网络。
  • 专用:虚拟机与虚拟机之间的局域网,宿主机无法对其访问。

此处默认可选用 外部 类型。

如果宿主机不是 DHCP 动态 IP 而是静态 IP 网络配置的情况下(不进行新的 IP 配置),使用 外部 类型在可能会导致宿主机与虚拟机都无法连接外部网络。此情况下,应选择使用 内部 类型,并将宿主网络共享至内部虚拟交换机。

PS:此处以 内部 类型为例

image.png
  • 创建虚拟交换机
image.png
  • 虚拟机-右键 > 设置
image.png
  • 网络适配器

在网络适配器一栏选择刚刚新建的虚拟交换机

image.png
  • 网络连接 > 带有外部网络连接的网卡-右键 > 属性
image.png
  • 属性 > 共享

勾选 允许其他网络用户通过此计算机的 Internet 来连接允许其他网络用户控制或禁用共享的 Internet 连接,并在 家庭网络连接 中选择刚刚创建的内部虚拟交换机。

image.png
  • 进入虚拟机,确认外部网络对内部虚拟交换机的共享已经完成
image.png
  • 启动虚拟机确认安装完成

此前选择的第三方工具会在首次启动后联网下载安装,待安装完成后即可使用

image.png

Hyper-V 虚拟机与宿主机的文件传输

Linux

在 Linux 下宿主机可直接使用 SSH 协议对虚拟机进行终端操作与文件传输

  • 宿主机上生成 ssh 公钥与密钥
ssh-keygen
  • 虚拟机上生成 ssh 公钥与密钥
ssh-keygen
  • 在虚拟机内配置宿主机公钥
cd ~/.ssh
nano authorized_keys
image.png
  • 修改虚拟机 sshd 配置
cd /etc/ssh
nano sshd_config

配置以下内容

PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
image.png
  • 重启 sshd 服务
service sshd restart
  • 待服务重启完成后,即可使用 puTTY 或 MobaXterm 等支持 ssh 协议的连接工具进行操作
image.png

Windows

在 Windows 下有两种文件传输方式

1. 共享文件夹
  • 在宿主机上选择文件夹进行共享
image.png
  • 在虚拟机上添加宿主机的共享文件夹
image.png
  • 完成配置后即可通过共享文件夹进行宿主机与虚拟机的文件传输
image.png
2. RDP
  • 虚拟机开启远程桌面功能
image.png
  • 宿主机即可通过远程桌面 RDP 连接虚拟机进行文件传输
image.png

Docker 容器化部署

关于 Docker

Docker 是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。 Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。

Docker 加速镜像配置

  • 添加当前用户至 docke 用户组(可选)
sudo usermod -aG docker [用户名]
  • 配置 docker 镜像加速器
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json

向 daemon.json 文件添加以下内容:

{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ],
  "log-opts": {"max-size":"500m", "max-file":"3"}
}
image.png
  • 修改完成后重启 docker 服务:
sudo systemctl restart docker

定义 Docker 容器

关于 Docker 容器

Docker 容器与虚拟机类似但在原理上不同。容器是将操作系统层虚拟化,具有便携性、能够高效地利用服务器。由于容器的标准化,因此它可以 无视基础设施的差异,部署到任何一个地方。

关于 Docker Compose

Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Docker Compose,可以使用 YML 文件来配置应用程序需要的所有服务。并且使用一个命令就可以从 YML 文件配置中创建并启动所有服务。

  • 新建 docker-compose.yml 文件
mkdir ~/gitlab
nano ~/gitlab/docker-compose.yml
  • 填写容器定义内容
version: '3.5'
services:
  gitlab:
    image: 'gitlab/gitlab-ee:latest'
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.7.225:8929'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    ports:
      - '8929:8929'
      - '2224:22'
    volumes:
      - '/opt/gitlab/config:/etc/gitlab'
      - '/opt/gitlab/logs:/var/log/gitlab'
      - '/opt/gitlab/data:/var/opt/gitlab'
    logging: 
      options: 
        max-size: 1g
    networks:
      - gitlab

  gitlab-runner:
    image: gitlab/gitlab-runner:alpine
    restart: unless-stopped
    depends_on:
      - gitlab
    privileged: true
    volumes:
      - /opt/gitlab-runner/config:/etc/gitlab-runner
      - /opt/gitlab-runner/run/docker.sock:/var/run/docker.sock
      - /opt/gitlab-runner/docker:/bin/docker
    logging: 
      options: 
        max-size: 1g
    networks:
      - gitlab

networks:
  gitlab:

启动 Docker 容器

  • 启动容器
cd ~/gitlab
sudo docker-compose up
image.png
  • 待首次镜像拉取完成容器启动后即可访问服务
image.png

相关链接

  • 清华大学开源软件镜像站
  • 虚拟化文档
  • Hyper-V Dynamic Memory Overview
  • How To Install and Use Docker on Ubuntu 20.04
  • Docker Docs
  • Overview of Docker Compose

你可能感兴趣的:(Hyper-V + Docker 容器化部署与应用)