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