ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AWS EC2에 Docker 설치 & 개발환경 구축
    개발도구 2021. 5. 26. 00:39

    AWS ec2 서버에 docker를 설치하고 Apache-MySQL-PHP 스택의 컨테이너 구축 

     

     

    $ df -h

    현재 디스크 공간 확인 

     

    $ sudo apt get

    apt 모듈로 docker 설치할거라 일단 업데이트

     

    몇 가지 설치할 유틸

    $ sudo apt install apt-transport-https

     

    $ sudo apt install ca-certificates

     

    $ sudo apt install curl

    특정 웹사이트에서 데이터를 다운받고싶을때 사용

    $ sudo apt install software-properties-common

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

    도커 설치를 위해 gpg 내용을 다운로드받고 apt 기능을 위한 리스트에 리다이렉트

    $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

    도커를 레포지터리에서 다운받기때문에 apt 리스트에 주소 추가. 우분투 버전에 맞는 도커 사용

    $ sudp apt update

    apt 다시 업데이트

     

     

     

    도커 설치

    $ apt-cache policy docker-ce
    $ sudo apt install docker-ce

     

    도커는 자동으로 시스템 서비스에 등록된다. 

     

    systemd 명령어로 실행중인 docker 서비스 확인하기 

    root@ip-172-00-00-000:/# sudo systemctl status docker
    ● docker.service - Docker Application Container Engine
         Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: >
         Active: active (running) since Tue 2021-05-25 16:02:50 UTC; 25s ago
    TriggeredBy: ● docker.socket
           Docs: https://docs.docker.com
       Main PID: 33819 (dockerd)
          Tasks: 8
         Memory: 42.1M
         CGroup: /system.slice/docker.service
                 └─33819 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/conta>

     

    hello world 이미지를 docker 에서 컨테이너로 실행하기

    $ docker pull hello-wolrd

    pull 명령으로 docker 서버에서 이미지 다운

    $ docker images 

    이미지 확인

    $ docker run hello-world

    컨테이너로 만들어서 실행 

    root@ip-172-00-00-000:/# sudo docker pull hello-world
    Using default tag: latest
    latest: Pulling from library/hello-world
    b8dfde127a29: Pull complete
    Digest: sha256:5122f6204b6a3596e048758cabba3c46b1c937a46b5be6225b835d091b90e46c
    Status: Downloaded newer image for hello-world:latest
    docker.io/library/hello-world:latest
    root@ip-172-00-00-000:/# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
    hello-world   latest    d1165f221234   2 months ago   13.3kB
    root@ip-172-00-00-000:/# docker run hello-world
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

     

    위의 3줄의 명령만으로 현재 서버 위에 또 하나의 hello-world 서버가 생성되어 동작하고 작업을 마친것이다.

     

    $ docker ps -a

    동작했던 모든 컨테이너 출력

     

    root@ip-172-000-00-000:/# ps -a
        PID TTY          TIME CMD
      34878 pts/3    00:00:00 sudo
      34879 pts/3    00:00:00 systemctl
      34880 pts/3    00:00:00 pager
      35061 pts/3    00:00:00 ps
    root@ip-172-00-00-000:/# docker ps -a
    CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS PORTS     NAMES
    ff34820bc0b2   hello-world   "/hello"   6 minutes ago   Exited (0) 6 minutes ago           sweet_lumiere
    root@ip-172-00-00-000:/# docker rm ff34820bc0b2
    ff34820bc0b2

     

    컨테이너를 지워도 이미지는 남아있어서 run명령으로 언제든 실행 가능

     

     

    Dockerfile 작성해보기

     

    $ sudo vi Dockerfile

    도커 파일은 항상 이름을 Dockerfile로 지음

    다음과 같이 작성 

    FROM ubuntu:20.04  # server image는 ubunutu 20.04를 사용
    ARG DEBIAN_FRONTEND=noninteractive    # 모듈 설치시 상호작용 방지기능 
    MAINTAINER Wimes <dev.wimes@gmail.com> # Dockerfile 작성자
    
    # image가 올라갔을 때 수행되는 명령어들
    RUN apt-get update
    # -y 옵션을 넣어서 무조건 설치가 가능하도록 한다.
    RUN apt-get install -y apache2 # install Apache web server (Only 'yes')
    
    # apache가 기본적으로 80포트를 사용하기 때문에 expose를 이용해 apache server로 접근이 가능하도록 한다.
    EXPOSE 80 # Open HTTP Port
    
    # 명령어가 다 수행이 되고나면 도커는 곧바로 종료가 되기 때문에 apache가 항상 실행중인 상태로 만들어준다.
    # apachectl을 foreground(즉, deamon)상태로 돌아가도록 한다.
    CMD ["apachectl", "-D", "FOREGROUND"]

     

    작성한 도커파일을 이미지로 빌드

    $ sudo docker build -t <dockerfile(레포지터리) 이름> .

    (-t는 : 태그. example 이름 명시해준거

    . (점)는 컨테이너가 빌드될 경로를 설정한다. 현재 디렉토리에 빌드하겠다

     

     

    도커 이미지 확인 

    $ docker images

     

     

    생성한 이미지를 컨테이너로 실행하기 

    $ sudo docker run -p 80:80 <dockerfile명>

    -p {hostPort}:{container port}

    아파치 컨테이너의 80번 포트와 호스트의 80번 포트 연동

    (EC2 서버와 example 컨테이너 연결)

     

     

    root@ip-172-00--00-000:/home/ubuntu/example# docker run -p 80:80 example
    AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress thismessage

    아파치 서버가 정상 작동한다.

     

    웹으로 접속시 사용중인 클라우드 서버의 보안그룹의 인바운드 규칙 수정할것(방화벽)

    80번 http 포트 열기 

     

    http://public ip의 80번 포트 접속시 아파치 우분투 기본 페이지가 나온다.

     

     

     

    실행중인 모든 도커 컨테이너 종료

    docker rm -f `docker ps -a -q`

    -f : 무조건 삭제

     

     

    도커 이미지 삭제하기

    docker rmi -f <이미지 id>

     

     

    도커 컨테이너에 PHP 개발환경 구축하기

     

    Dockerfile을 다음과 같이 수정 

    FROM ubuntu:20.04   
    ARG DEBIAN_FRONTEND=noninteractive
    MAINTAINER findaw <qkrdpwls1836@gmail.com>  
    
    RUN apt-get update
    RUN apt-get install -y apache2   # install Apache Web Server (Only 'yes')
    RUN apt-get install -y software-properties-common
    RUN add-apt-repository ppa:ondrej/php  # For Installing PHP 5.6
    RUN apt-get update
    RUN apt-get install -y php5.6
    
    # 아파치가 기본적으로 80번 포트를 사용하기 때문에 expose를 이용해
    # 아파치 서버로 접근이 가능하도록한다
    EXPOSE 80   
    
    # 명령어가 다 수행이 디고나면 도커는 곧바로 종료되기때문에 apache가 항상 실행중인
    # 상태로 만들어준다. apachectl을 foreground(즉, demon)상태로 돌아가도록 한다.
    CMD ["apachectl", "-D", "FOREGROUND"]
    
    

     

     

    레포지터리에 있는 도커파일을 이미지로 다시 빌드

    $ docker build -t <레포지터리 이름>

     

     

    도커 컨테이너 실행 및 아파치 경로 마운트

    mount는 장치를 특정 위치에 연결시켜주는것을 말한다. 

    여기선 디렉토리를 다른 경로에 연결시켜준다는 뜻

    (디스크 등을 추가할때 리눅스 운영체제는 PnP가 자동으로 안되서 직접 설정 해줘야한다.)

    $ docker run -p 80:80 -v /home/ubuntu/example/html:/var/www/html <이미지 이름>

    -v : 볼륨 옵션으로 경로 마운트

    var/www/html 은 PHP 소스코드가 위치할 기본 경로이다.

    호스트 경로(/home/ubuntu/example/html) 과 aws ec2 경로(/var/www/html) 를 마운트

    호스트 경로에 파일을 추가하면 실행중인 컨테이너 내부 경로에 파일을 넣은것과 같은 효과를 준다 

     

     

    https://public ip:80 으로 접속하면 다음과 같은 화면이 로드된다.

    호스트 경로 이동

    $ cd /home/ubuntu/example/html

     

     

    index.php 작성

    $ sudo vi index.php

    다음과 같이 작성

    <?php phpinfo() ?>

     

     

    다시 접속하면 php 정보가 출력된다.

    컨테이너 안에 추가된것과 같은 효과

     

    이렇게 서버 환경을 설정하고 빌드한 이미지는 언제든 활용할 수 있다.

    $ docker run -p 81:80 -v /home/ubuntu/example/html:/var/www/html <이미지 이름>

    https://public ip:81 

    해당 명령어로 컨테이너를 다시 생성하면 81번 포트로 접속할 수 있다.(ec2 보안그룹에서 81번 포트 열기)

    (호스트 포트:아파치 컨테이너상의 포트 연결)

    즉 Docker를 사용하면 하나의 서버에서 여러개의 컨테이너를 생성하여 각 포트에 할당하는식으로

    여러 서비스를 간단히 생성하고 배포 관리할 수 있다.

     

     

     

    MySQL 컨테이너 실행하기

     

    docker hub 내에 기본적으로 mysql이 있기때문에 이미지를 바로 컨테이너로 실행 가능

    $ docker run -d -p 9876:3306 -e MYSQL_ROOT_PASSWORD=<비밀번호> mysql:5.6

    3306 은 mysql의 기본 포트이다.

    MYSQL_ROOT_PASSWORD는 mysql 로그인에 사용할 비밀번호를 입력

     

     

    $ docker exec -it <컨테이너 id> /bin/bash

    bash 로 도커 컨테이너 접속 효과

    컨테이너 id는 방금 run한 mysql 컨테이너 id

     

    mysql 실행

    mysql -u root -p

     

    설정한 비밀번호 입력

    이따가 확인용으로 쓸 TEST 데이터베이스 생성 

    exit 명령으로 다시 호스트로 돌아오기

    root@ip-172-00-00-000:/# docker exec -it 31eb5a9abafc /bin/bash
    root@31eb5a9abafc:/# mysql -u root -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 8.0.25 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2021, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> CREATE DATABASE TEST;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> show databases
        -> ;
    +--------------------+
    | Database           |
    +--------------------+
    | TEST               |
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.01 sec)
    
    mysql> exit
    Bye
    root@31eb5a9abafc:/# exit
    exit
    root@ip-172-00-00-000:/#

     

     

     

    컨테이너 안에 설치되어 있는 mysql 접속하기

     

    docker inspect <컨테이너 id>

    컨테이너 정보를 출력하여 mysql 이 실행중인 컨테이너의 ip 주소 확인 

     

     

    AWS ec2 서버에 mysql 설치

    $ sudo apt install mysql-client-core-8.0

     아까는 docker hub의 mysql 이미지를 컨테이너로 실행했던것임

     

     

    컨테이너에 포함되어있는 mysql에 접속 

    $ mysql -u root -p --host 172.17.0.2 --port 3306

     

     

    아까 이미지 실행할때 호스트의 9876포트와 컨테이너의 3306 포트를 연결했기때문에 다음고 같은 명령으로도

    mysql 컨테이너에 접속가능

    $ mysql -u root -p --host 127.0.0.1 --port 9876

    localhost ip를 입력하고 9876 포트로 mysql을 실행해도 정상적으로 동작함 

     

     

    docker 컨테이너는 삭제 생성이 빈번하기 때문에 일반적으로 db 서버로서 사용하지 않는다.

    디비는 데이터가 보존해야하므로 영구적으로 기록이 가능해야한다.

     

     

    use mysql
    CREATE USER 'test'@'%' IDENTITYFIED BY 'password';

    test 유저 만들기

     

    GRANT ALL PRIVILEGES ON *.* TO 'test'@'%'

    test 계정에 권한을 주고 외부에서 접속가능하게하기

     

    권한 적용

    FLUSH PRIVILEGES

     

    mysql 컨테이너 재시작

    docker restart <컨테이너 id>

     

    AWS ec2 보안그룹 인바운드 편집해서 9876포트 열기

     

     

    db 클라이언트 프로그램으로 AWS ec2 컨테이너의 mysql 접속하기

    HeidiSQL 프로그램으로 접속해보기

    호스팅 서버의 public ip 와 설정한 mysql이 실행중인 port 번호 입력 후 test 유저로 접속

     

    이전에 만든 TEST DB가 있는것을 확인. 접속 완료

     

     

     

     

     

    PHP컨테이너와 MySQL 컨테이너 연동

     

     

     

     

     

    AWS RDS 서비스로 DB 구축

     

     

     

     

    GitHub에 Docker 프로젝트 올리기 

     

     

     

     

     

     

Designed by Tistory.