Docker ①(환경 구축 시작 +WordPress)

개시하다


이번에는 Docker를 EC2에 설치하여WordPress를 가동해 봅시다.
Dock ker를 알고 있다고 생각하지만 만져보지 않은 사람을 향한 손잡이입니다.

Docker 소개


https://knowledge.sakura.ad.jp/13265/
Docker는 인프라 관계와 DevOps 분야에서 주목받는 기술 중 하나로 Docker사가 개발한 컨테이너형 가상 환경을 제작, 분배, 운행하는 플랫폼이다.

물리적 기반, 가상화, 컨테이너 차이


물리적 기초
가상화
컨테이너
하나의 물리적 토대 위에서 하나의 OS는 호스트 OS를 실행하면 전체 시스템의 관리 하드웨어 성격을 누릴 수 있는 사무처리 적용성이 높고 정지 없이 시스템에서 사용할 수 있다
가상 하드웨어에 대한 오버헤드 관리 필요 가상 디스크 부팅기에 대한 고객 OS 시작/중지 필요
소프트웨어 개발의 작업 시간은 소프트웨어 개발의 작업 시간을 줄이고 운행 시간의 봉인화 비용을 거의 0 호스트 OS에서 볼 수 있는 매우 가벼운 응용 환경을 실현했다.



Docker의 장점

  • 코드로 용기를 관리하기 때문에 재사용 가능
  • 누구나 다른 환경에서 동일한 환경을 만들 수 있음
  • 코드로 용기를 관리하기 때문에 구성 관리가 쉬워졌다.
  • 수법의 구성


    다음은 이번에 수작업으로 제작한 환경.
  • Public 서브넷에서 SSH(22번 포트) 및 HTTP(8080번 포트)에 대한 인터넷 액세스를 허용하는 EC2 인스턴스를 만듭니다.
  • 위에서 만든 EC2 인스턴스에 Docker 엔진을 설치합니다.
  • WordPress와 MySQL의 Docker 이미지를 가져와 시작합니다.
  • WordPress의 블로그 사이트가 이미 설립되었음을 확인합니다.
  • 손수


    환경 구조


    먼저 원격 서버에 Docker를 시작하는 환경을 구축해야 합니다.
    AWS의 EC2에서 환경을 구축하기 위해 AWS의 서비스는 클라우드 포메이션을 사용합니다.
    CloudFormation에 관해서는 아래에 글을 쓸 테니 여기를 참고하세요.
    https://zenn.dev/soshimiyamoto/articles/3c624728438902
    먼저 다음 템플릿으로 VPC, Subnet, 인터넷 Gateway를 만듭니다.
    다른 스택에서 이러한 정보를 활용하려면 Outputs 섹션에서 VPC, Subnet 정보를
    출력
    network.yml
    AWSTemplateFormatVersion: 2010-09-09
    
    Resources: 
    
      # ------------------------------------------------------------#
      #  VPC
      # ------------------------------------------------------------#
      MyVPC:
        Type: AWS::EC2::VPC
        Properties:
          CidrBlock: 10.0.0.0/16
          InstanceTenancy: default
          EnableDnsSupport: true
          EnableDnsHostnames: true
          Tags:
          - Key: Name
            Value: MyVPC
      
      # ------------------------------------------------------------#
      #  Internet Gateway
      # ------------------------------------------------------------#
      InternetGateway:
        Type: AWS::EC2::InternetGateway
        Properties:
          Tags:
          - Key: Name
            Value: My-InternetGateway
      AttachGateway:
        Type: AWS::EC2::VPCGatewayAttachment
        Properties:
          VpcId: !Ref MyVPC
          InternetGatewayId: !Ref InternetGateway
    
      # ------------------------------------------------------------#
      #  Route Table
      # ------------------------------------------------------------#
      RouteTable:
        Type: AWS::EC2::RouteTable
        DependsOn: AttachGateway
        Properties:
          VpcId: !Ref MyVPC
          Tags:
          - Key: Name
            Value: My-RouteTable
      Route:
        Type: AWS::EC2::Route
        DependsOn: AttachGateway
        Properties:
          RouteTableId: !Ref RouteTable
          DestinationCidrBlock: 0.0.0.0/0
          GatewayId: !Ref InternetGateway
      
      # ------------------------------------------------------------#
      #  Public Sunbet A
      # ------------------------------------------------------------#
      PublicSubnetA:
        Type: AWS::EC2::Subnet
        DependsOn: AttachGateway
        Properties:
          AvailabilityZone: "ap-northeast-1a"
          CidrBlock: 10.0.1.0/24
          MapPublicIpOnLaunch: 'true'
          VpcId: !Ref MyVPC
          Tags:
          - Key: Name
            Value: PublicSubnetA
      PublicRouteTableAssociation:
        Type: AWS::EC2::SubnetRouteTableAssociation
        Properties:
          SubnetId: !Ref PublicSubnetA
          RouteTableId: !Ref RouteTable  
    
    Outputs:
      VPC1:
        Value: !Ref MyVPC
        Export: 
          Name: VPCName
      SubnetA:
        Value: !Ref PublicSubnetA
        Export:
          Name: SubnetName
    
    그런 다음 EC2 인스턴스와 연관된 보안 그룹을 생성합니다.
    HTTP(8080포트), SSH(22포트)가 인터넷에서 Security Group Ingress를 통해 입국 규칙을 지정할 수 있도록 하기 위해서다.
    security.yml
    AWSTemplateFormatVersion: 2010-09-09
    Resources: 
      MySecurityGroup:
        Type: AWS::EC2::SecurityGroup
        Properties:
          VpcId: !ImportValue VPCName
          GroupDescription: Allow SSH from Internet
          SecurityGroupIngress:
            - IpProtocol: tcp
              FromPort: 22
              ToPort: 22
              CidrIp: 0.0.0.0/0
            - IpProtocol: tcp
              FromPort: 8081
              ToPort: 8080
              CidrIp: 0.0.0.0/0
          Tags:
            - Key: Name
              Value: WebServerSG
    
    Outputs:
      MySecurityGroup:
        Value: !Ref MySecurityGroup
        Export: 
          Name: SecurityGroupName
    
    마지막으로 다음 템플릿으로 EC2 인스턴스를 시작합니다.
    ec2.yml
    AWSTemplateFormatVersion: 2010-09-09
    Parameters:
      KeyName:
        Description: The EC2 Key Pair
        Type: "AWS::EC2::KeyPair::KeyName"
      EC2AMIId:
        Description: AMI ID
        Type : String
        Default: ami-01748a72bed07727c
    
    Resources: 
      WebServer:
        Type: AWS::EC2::Instance
        Properties:
          KeyName: !Ref KeyName
          ImageId: !Ref EC2AMIId
          InstanceType: t2.micro
          SubnetId: !ImportValue SubnetName
          SecurityGroupIds:
            - !ImportValue SecurityGroupName
          Tags:
            - Key: Name
              Value: WebServer
    
    위의 세 템플릿에서 CloudFormation 스택을 작성한 후 이전에 기록된 구조를 작성할 수 있습니다.
    템플릿에 대한 자세한 설명을 생략할 수 있도록 허락해 주십시오.

    EC2에 Docker 설치


    환경 구축이 완료되면 제작된 EC2에 Docker를 설치합니다.
    (이번에는 사용하지 않았지만 docker-compose도 설치되어 있습니다.)
    다음 명령을 사용하여 통일적으로 설치할 것이다.
    sudo yum update -y && \
    sudo amazon-linux-extras install -y docker && \
    sudo usermod -a -G docker ec2-user && \
    sudo systemctl start docker.service && \
    sudo systemctl status docker.service && \
    sudo systemctl enable docker.service && \
    sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose && \
    sudo chmod +x /usr/local/bin/docker-compose && \
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    
    여기, & & & AND 연산자연결 명령을 통해 명령이 성공한 후에 다음 명령을 실행하는 동작을 실현할 수 있다.
    \줄 바꿈을 나타냅니다.
  • 이하에서yum 증가.
  • sudo yum update -y
    
  • 아래에 docker를 설치합니다.
  • sudo amazon-linux-extras install -y docker
    
    Amazon Linux에는 아마존-Linux-extras라는 독립 포장 관리 소프트웨어가 있는데 자주 사용된다.
  • 다음에ec2-user를 docker 그룹에 추가합니다.이렇게 하면ec2-user는 docker 서비스를 실행할 수 있습니다.
  • 확인
    sudo usermod -a -G docker ec2-user
    
    /etc/group 후 추가docker:x:992:ec2-user를 알 수 있습니다.
    또한,ec2-user를 통해 조합 확인 후
    $ groups
    ec2-user adm wheel systemd-journal docker
    
    에서 보듯이, 우리는 네가 docker그룹에 속한다는 것을 안다.
    usemod를 실행하지 않습니다.ec2-user에서 docker 명령을 사용할 때 다음과 같은 오류가 발생할 수 있습니다.(docker 서비스가 시작됨)
    $ docker images
    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json": dial unix /var/run/docker.sock: connect: permission denied
    
  • Docker 서비스를 시작하여 상태를 확인합니다.
  • sudo systemctl start docker.service
    sudo systemctl status docker.service
    
  • 다음 명령을 통해 docker의 시작을 ON으로 설정하고 EC2를 다시 시작하면 Docker도 시작 상태가 됩니다.
  • sudo systemctl enable docker.service
    
  • 다음 명령을 사용하여 docker-compose에 설치 & 권한 변경을 실시합니다.
  • sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose && \
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    
    아래 참조
    https://docs.docker.jp/compose/install.html#linux-compose
    위의 명령을 EC2의 사용자 데이터로 설명하면 EC2 인스턴스를 시작하면서 docker를 설치할 수도 있습니다.
    ec2.yml(수정 후)
    AWSTemplateFormatVersion: 2010-09-09
    Parameters:
      KeyName:
        Description: The EC2 Key Pair
        Type: "AWS::EC2::KeyPair::KeyName"
      EC2AMIId:
        Description: AMI ID
        Type : String
        Default: ami-01748a72bed07727c
    
    Resources: 
      WebServer:
        Type: AWS::EC2::Instance
        Properties:
          KeyName: !Ref KeyName
          ImageId: !Ref EC2AMIId
          InstanceType: t2.micro
          SubnetId: !ImportValue SubnetName
          SecurityGroupIds:
            - !ImportValue SecurityGroupName
          Tags:
            - Key: Name
              Value: WebServer
          UserData:
            Fn::Base64: |
              #!/bin/bash
              sudo yum update -y && \
              sudo amazon-linux-extras install  -y docker && \
              sudo usermod -a -G docker ec2-user && \
              sudo systemctl start docker.service && \
              sudo systemctl status docker.service && \
              sudo systemctl enable docker.service && \
              sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose && \
              sudo chmod +x /usr/local/bin/docker-compose && \
              sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    
    이 템플릿을 사용하면 docker의 리눅스 환경을 언제든지 사용할 수 있습니다.

    WordPress 시작


    상기 Docker 명령을 이용할 수 있기 때문에 Docker 명령을 시도하기 시작합니다.
  • docker 이미지 보이기
  • $ docker images 
    REPOSITORY   TAG     IMAGE ID   CREATED   SIZE
    
  • 도커 용기 보이기(-a에서 정지된 용기 포함)
  • $ docker ps -a 
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    
    특히pull이 docker 이미지도 아니고 시작한 것도 아니기 때문에 아무것도 보이지 않습니다.
  • MySQL을 시작하는 Docker 컨테이너
  • docker run --name mysql_db -e MYSQL_ROOT_PASSWORD=passwd -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=passwd -d mysql:5.7.21
    
    docker run 명령을 사용하여 시작 상태에서 mysql 용기를 만듭니다.
    -- name 옵션에서 컨테이너 이름을 mysql로 설정합니다.db에서 -e 옵션을 통해 MySQL의 환경 정보를 설정합니다.
    MySQL 버전을 5.7로 변경해야 합니다.
  • WordPress를 시작하는 Docker 컨테이너
  • docker run --name wp_site --link mysql_db:mysql -p 8080:80 -e WORDPRESS_DB_HOST=mysql_db:3306 -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=passwd -d wordpress
    
    MySQL 용기와 같이 docker run 명령을 사용하여 시작 상태에서WordPress 용기를 만듭니다. -EC2의 8080 포트를 컨테이너의 80 포트에 p 옵션으로 바인딩링크 옵션을 사용하여 WordPress 컨테이너를 MySQL 컨테이너에 연결합니다.
    -- 링크 옵션은 기존 기능으로 권장하지 않는다.
    https://docs.docker.jp/v17.06/engine/userguide/networking/default_network/dockerlinks.html
    원래 사용자 정의 네트워크를 사용하는 것을 추천했다고 한다.

  • 브라우저에서 http:/{EC2 인스턴스의 공용 IP]에 액세스: 8080.

  • 일본어를 선택하고


  • WordPress 웹 사이트의 설정을 수행합니다.


  • WordPress 설치가 완료되었습니다.


  • 상기 설정에 근거하여 로그인


  • WordPress의 관리 화면을 표시합니다.


  • 매우 간단하게 WordPress 사이트를 구축했습니다!
  • 총결산


    WordPress의 Docker 이미지를 사용하면 WordPress 사이트를 간단하게 구축할 수 있습니다.
    Word Press뿐만 아니라 다양한 Docker 이미지가 존재하기 때문에 시도해 보면 흥미롭다.
    이번에는 기존의 Docker 이미지를 활용해서 다음에 제가 직접 Docker 이미지를 만들어서 시작할 때까지 하고 싶어요.

    좋은 웹페이지 즐겨찾기