EC2(Windows)ベアメタルインスタンスにDockerをインストールする

こんにちは。SCSKのふくちーぬです。私はコンテナを扱う際に、Dockerインストール済みのCloud9を頻繁に使っていました。

今回は、EC2(Windowsサーバ)にWSL+Dockerをインストールする方法をご紹介します。

EC2(Windowsサーバ)でDockerを利用するためには

WindowsサーバでDockerを利用するためには、Docker Engineに加えてWSL2のインストールが必要になっています。WSLは、Windows上でLinuxを動作させる仮想化技術です。

しかし、通常のEC2インスタンスでは仮想化技術(ハイパーバイザー)を使用してAWSの物理ハードウェア上にVM(仮想マシン)を作成します。この仮想化環境では、VM(仮想マシン)自体に直接のハードウェアアクセスや仮想化の制御を加えることができません。そのためWSLのような仮想化必要とするソフトウェアの実行が制限されます。

一方、ベアメタルインスタンスでは、仮想化を使用せずに物理サーバー上で直接実行されます。これにより、ホストOSの仮想化機能に直接アクセスできるため、WSLが必要とする仮想化機能を利用できます。

 

つまりWindowsサーバでDockerを利用するためには、ベアメタルインスタンスを選定する必要があります。

WSL には、WSL 1 と WSL 2 の 2 つのバージョンがあります。

・.metal EC2 インスタンスの場合は、WSL 1 または WSL 2 のいずれかをインストールできます。

 

また料金は高額ですが、AWSではベアメタルインスタンスが提供されています。

インスタンス名
オンデマンドの時間単価
vCPU
メモリ
ストレージ
ネットワークパフォーマンス
c5n.large
USD 0.108
2
5.25 GiB
EBS のみ
最大 25 ギガビット
c5n.xlarge
USD 0.216
4
10.5 GiB
EBS のみ
最大 25 ギガビット
c5n.2xlarge
USD 0.432
8
21 GiB
EBS のみ
最大 25 ギガビット
c5n.4xlarge
USD 0.864
16
42 GiB
EBS のみ
最大 25 ギガビット
c5n.9xlarge
USD 1.944
36
96 GiB
EBS のみ
50 ギガビット
c5n.18xlarge
USD 3.888
72
192 GiB
EBS のみ
100 ギガビット
c5n.metal
USD 3.888
72
192 GiB
EBS のみ
100 ギガビット

アーキテクチャー

  • Systems Managerの管理下にするために、EC2はマネージドインスタンスとする。また、OSはWindows Server 2022を利用します。
  • 運用者は、フリートマネージャーを利用してEC2に接続します。
  • EC2にDockerをインストールし、DockerHubからイメージを取得できるようにします。

完成したCloudFormationテンプレート

以下のテンプレートをデプロイしてください。

AWSTemplateFormatVersion: 2010-09-09
Description: CFN template EC2
Parameters:
  ResourceName:
    Type: String
  AMIId:
    Type: String    
Resources:
  # ------------------------------------------------------------#
  # VPC
  # ------------------------------------------------------------#
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value:  !Sub ${ResourceName}-VPC

  # ------------------------------------------------------------#
  # Internet Gateway
  # ------------------------------------------------------------#
  InternetGateway:
    Type: AWS::EC2::InternetGateway

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

  # ------------------------------------------------------------#
  # Public Subnet
  # ------------------------------------------------------------#
  PublicSubnet1a:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: ap-northeast-1a
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub ${ResourceName}-subnet-1a

  # ------------------------------------------------------------#
  # Route Table and Routes
  # ------------------------------------------------------------#
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: PublicRouteTable

  PublicRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  PublicSubnet1aAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet1a
      RouteTableId: !Ref PublicRouteTable

  # ------------------------------------------------------------#
  # Security Group
  # ------------------------------------------------------------#
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: For EC2
      VpcId: !Ref VPC      

  # ------------------------------------------------------------#
  # IAM Role and Instance Profile
  # ------------------------------------------------------------#
  SSMRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${ResourceName}-ec2-role    
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

  InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Roles:
        - !Ref SSMRole

  # ------------------------------------------------------------#
  # EC2 Key Pair
  # ------------------------------------------------------------#        
  KeyPair:
    Type: AWS::EC2::KeyPair
    Properties:
      KeyName: !Sub ${ResourceName}-key  

  # ------------------------------------------------------------#
  # EC2 Instance
  # ------------------------------------------------------------#
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: c5n.metal
      ImageId: !Ref AMIId
      SubnetId: !Ref PublicSubnet1a
      IamInstanceProfile: !Ref InstanceProfile
      SecurityGroupIds:
        - !Ref SecurityGroup
      KeyName: !Ref KeyPair        
      Tags:
        - Key: Name
          Value: !Sub ${ResourceName}-ec2 

WSLのインストール

キーペアの値を確認し、EC2に接続

下記記事を参考に、同様の手順でEC2にフリートマネージャー経由で接続します。

WSL2のインストール

PowerShellを開き、コピー&ペーストを使って下記コマンドを実行します。

wsl --install

インストールが完了したら、インスタンスを再起動します。

その後EC2に再接続し、Ubuntuがインストールされていることを確認します。

ベアメタルインスタンスのため接続までに30分ほど時間がかかるのでお待ちください。

 

自動的にWSLが立ち上がり、Ubuntuのインストールが始まります。

ユーザー名を入力します。その後、パスワードを入力します。

再度パスワードを入力します。

インストールが完了しました。

Dockerのインストール

Ubuntuを開き、Dockerのリポジトリをセットアップするために以下のコマンドを実行します。

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

 

続けて、Docker Engineをインストールします。

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

 

sudo権限なしにdockerコマンドを実行できるように、ユーザーに対して権限付与します。

sudo groupadd docker
sudo usermod -aG docker <ユーザー名>
su - <ユーザー名>

 

Dockerサービスを起動させておきます。

sudo service docker start

 

以下のコマンドを実行しDockerのバージョンとコンテナが稼働することを確認します。

docker -v
docker run hello-world

最後に

いかがだったでしょうか。

ベアメタルインスタンスを選定することで、Dockerを導入してコンテナを利用できるようになります。お値段は高いですが、Docker実行環境の一つの候補として検討いただければと思います。

本記事が皆様のお役にたてば幸いです。

ではサウナラ~🔥

著者について
ふくちーぬ(福地孝哉)

◆所属:クラウドサービス部
◆経歴:
 2022 ANGEL Dojo ANGEL賞 2位
 2023 Japan AWS All Certifications Engineers
 2024 Japan AWS All Certifications Engineers
 2024 Japan AWS Jr. Champions
◆資格:
 熱波師,サウナ・スパ健康アドバイザー,Azure,Terraform,情報処理安全確保支援士合格
◆好きなAWSサービス:Amazon EventBridge
◆好きなサウナの温度:120℃
◆好きな水風呂の温度:16.5℃

ふくちーぬ(福地孝哉)をフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(AWS)は、企業価値の向上につながるAWS 導入を全面支援するオールインワンサービスです。AWS最上位パートナーとして、多種多様な業界のシステム構築実績を持つSCSKが、お客様のDX推進を強力にサポートします。

AWSクラウド
シェアする
タイトルとURLをコピーしました