こんにちは。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実行環境の一つの候補として検討いただければと思います。
本記事が皆様のお役にたてば幸いです。
ではサウナラ~?











