오늘의 인기 글
최근 글
최근 댓글
Today
Total
11-15 01:02
관리 메뉴

우노

[Docker] AWS EC2에서 Docker를 이용한 Apache 웹서버 구축 본문

DevOps/Docker

[Docker] AWS EC2에서 Docker를 이용한 Apache 웹서버 구축

운호(Noah) 2020. 10. 3. 17:13

AWS란?

  • AWS(Amazon Web Service)는 아마존닷컴의 클라우딩 컴퓨팅 사업부이다. 현재 클라우드 분야에서 세계1위의 점유율을 차지하고 있다.
  • 간단하게 말하자면 컴퓨터의 모든 기능을 AWS를 이용해 직접 서버나 컴퓨터를 구매하지 않고 간단하게 구현할 수 있다.

EC2란?

  • Elastic Compute Cloud — 줄여서 EC2라고 한다.
  • EC2는 AWS 서비스의 핵심으로써 사용자는 아마존의 가상컴퓨터를 임대받아 그 위에 자신만의 컴퓨터 프로그램을 실행해 원하는 기능을 컴퓨터를 따로 살 필요 없이 필요한 성능, 용량만큼 간단하게 구축할 수 있다.
  • 이 서비스는 CPU사용량(연산횟수)으로 결제하는 것이 아닌 인스턴스를 켜 놓은 시간을 기준으로 결제하는 구조다.

EC2 인스턴스 생성

  • AWS 에 접속 후 지역은 Asia Pacific(Tokyo) ap-northeast-1 로 설정

  • AWS EC2 콘솔로 들어가 인스턴스 시작을 눌러 인스턴스 생성을 시작한다.

  • AMI 선택

    • 인스턴스를 시작하는 최초의 설정(운영체제, 애플리케이션 서버, 애플리케이션)을 의미하며 이를 이미지라고 한다.
    • Amazon Linux 2 AMI (HVM), SSD Volume Type 를 선택한다.
  • 인스턴스 유형 선택

    • 프리티어인 t2.micro 선택
  • 인스턴스 세부 정보 구성

    • 따로 건드릴 옵션이 없다면 넘어간다.
  • 스토리지 추가

    • 만약 당신이 더 많은 저장 공간이 필요하다면 초기설정보다 크기를 더 늘려주면 된다.
    • 하지만 우리가 만들 인스턴스는 많은 저장 공간이 필요 없으므로 그냥 넘어간다.
  • 태그 추가

    • 인스턴스가 어떤 역할인지 누가 관리하는지 메모해 두는 것이다.
    • 필요 없다면 넘어간다.
  • 보안 그룹 구성

    • 인스턴스의 트래픽을 제어하는 방화벽 규칙을 구성하는 단계이다.
    • Default로는 SSH 22번 포트가 열려 있다.
    • 외부에서 EC2 Instance로 접근 가능하도록 포트를 추가로 열어준다.
      • Type : HTTP
      • Port range : 80
      • Source : Anywhere
    • 인스턴스 생성 후에도 수정이 가능하다.
    • 설명 작성 시 한글이면 인스턴스 생성이 안 되니 꼭 영어로 작성해주자.
  • 키페어 생성

    • 마지막으로 이 인스턴스의 비밀번호와 같은 키 페어를 지정 해준다.
    • 기존에 존재하는 키페어를 사용하거나 새로 생성할 수 있다.
    • pem key는 인스턴스에 접속 할 수 있는 유일한 키이므로 자신이 잘 기억하고 관리할 수 있는 공간에 저장해 둔다.
    • 재발급의 과정이 매우 복잡하니 꼭 잘 관리하자.
    • 이 인스턴스에 접근 할 때 필요한 키 페어를 지정 한 후 인스턴스를 시작하면 인스턴스가 구동되기 시작한다.

EC2 Instance 접속

  • EC2 Instance에 접속하는 방법은 EC2 Instance Connect, Session Manager, SSH Client가 있다.

  • SSH Client로 접속

    • SSH 클라이언트를 연다.

    • 인스턴스 생성 시 발급한 개인 키 파일을 찾는다.

    • 개인 키 파일의 권한을 수정한다.

        chmod 400 capstone.pem
    • 개인키와 Public DNS를 사용하여 인스턴스에 연결한다.

        ssh -i "capstone.pem" ec2-user@ec2-54-168-186-158.ap-northeast-1.compute.amazonaws.com
  • 패키지 업데이트

      sudo yum update -y

Docker 설치 및 실행

  • Docker 설치

    • 아래 명령 실행 후 재접속

        sudo yum update -y
      
        sudo yum install docker -y
      
        sudo service docker start
      
        sudo usermod -a -G docker ec2-user
  • Docker 설치 확인

    • 설치되어 있는 이미지 확인

        docker search ubuntu

Apache Dockerfile 작성

  • Container는 Dockerfile → image → container 의 구조로 생성됩니다.

  • 따라서 Dockerfile부터 작성 해야합니다.

    • 도커파일은 항상 Dockerfile이라는 이름을 가지고 있어야합니다.

        cd ~
        mkdir apache-dockerfile && cd apache-dockerfile
        vim Dockerfile
    • Dockerfile 내부

        # server image는 ubunutu 18.04를 사용
        FROM ubuntu:18.04 
        # Dockerfile 작성자
        MAINTAINER Wimes <yms04089@kookmin.ac.kr> 
      
        # image가 올라갔을 때 수행되는 명령어들
        # -y 옵션을 넣어서 무조건 설치가 가능하도록 한다.
        RUN \
            apt-get update && \
            apt-get install -y apache2
      
        # apache가 기본적으로 80포트를 사용하기 때문에 expose를 이용해 apache server로 접근이 가능하도록 한다.
        EXPOSE 80 
      
        # 컨테이너가 생성 된 이후에 내부의 아파치 서버는 항상 실행중인 상태로 만들어준다.
        # apachectl을 foreground(즉, deamon)상태로 돌아가도록 한다.
        CMD ["apachectl", "-D", "FOREGROUND"]

생성한 Dockerfile을 Image로 빌드

  • docker image의 이름은 apache-image이고 현재 경로(.) 에서 수행하도록 합니다.

      docker build -t apache-image .
  • image 빌드 확인

    • docker images 명령어를 통해 확인합니다.

        docker images

웹에 띄울 html 파일 생성

  • 보통 웹으로 띄울 html 파일을 아파치 서버에 추가하고 싶을 땐

  • Dockerfile의 ADD / COPY를 통해 호스트의 파일을 아파치 서버 옮기는 명령어를 작성 후 빌드합니다.

  • 하지만 이렇게 하면 호스트의 html 파일과 아파치 서버의 html 파일이 동기화 되어 있지 않기 때문에 매번 build를 해줘야합니다.

  • 우리는 그럴 시간이 없습니다.

  • 따라서 도커 볼륨을 사용해 호스트의 html 파일을 만들어놓고, 도커 컨테이너에서 그 파일에 접근해서 사용하는 방법으로 동기화 할 것입니다.

  • 우선 호스트에 index.html 파일을 생성 및 수정합니다.

      cd ~
      mkdir html && cd html
      vi index.html
      Hello world

image 로 Container 생성

  • 이제 컨테이너 생성 시 도커 볼륨을 통해 host와 도커 컨테이너의 html 폴더를 동기화 하겠습니다.

      docker run --name apache-container -d -p 80:80 -v ~/html/:/var/www/html apache-image
    • --name : 컨테이너 이름
    • -d : 백그라운드모드로 실행
    • -p : [호스트포트][컨테이너포트] 포트 연결
    • -v : 로컬과 컨테이너 파일 연동

접속 확인

  • EC2 Instance의 Public DNS를 80번 포트로 접속해 접속을 확인합니다.
Comments