[Docker] EC2에 Docker 설치, MySQL 연결

늦잠·2024년 5월 29일
0

목표 : EC2 서버에 배포한 웹 프로젝트에 도커로 DB 적용

도커(Docker)는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있도록 돕는 오픈 소스 플랫폼이다. 도커는 컨테이너 기반의 가상화 기술을 활용하여 애플리케이션과 그 의존성들을 하나의 패키지로 묶어, 어디서나 동일하게 실행될 수 있도록 보장한다. 이를 통해 개발자는 애플리케이션의 실행 환경을 신경 쓰지 않고 코드 작성에 집중할 수 있다.



EC2 서버에 Docker 설치

웹 프로젝트를 배포한 EC2 서버에 접속한다. 서버 os는 ubuntu를 사용했다.

Ubuntu에 도커를 설치하는 방법은 도커 공식 문서에 잘 설명되어있다.
https://docs.docker.com/engine/install/ubuntu/


$ for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

1) 여러 비공식 도커 패키지가 설치되어 있다면 삭제한다.


# Add Docker's official GPG key:
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

# Add the repository to Apt sources:
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

2) 도커의 apt 리파지토리를 세팅한다.
이게 다 뭐야


$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3) apt-get을 통해 도커를 설치한다.

$ sudo docker run hello-world

다음 명령어로 도커가 제대로 설치되었는지 확인해 본다.


제대로 설치되었으면 다음과 같은 출력이 나온다.



MySQL 컨테이너 생성

도커 컨테이너(Docker Container)는 도커에서 핵심적인 개념으로, 독립된 가상환경과 여기서 실행되는 애플리케이션이다.

도커 이미지(Docker Image)컨테이너를 생성하는 틀이다.


docker run --name [컨테이너 이름] -e MYSQL_ROOT_PASSWORD=[비밀번호] -d -p 3306:3306 mysql:latest

다음 명령어를 실행하여 MySQL 컨테이너를 생성하고 실행하자.
명령어를 더 세세하게 살펴보자.

(실행 전 기존 MySQL이 실행 중이라면 정지. 정지 방법은 아래 결과에)


  • docker run :
    runpull, create, start의 기능을 모두 가지고 있는 명령어이다.
    run을 통해 1) 이미지를 다운받고(pull), 2) 이미지로부터 컨테이너를 생성하며(create), 3) 생성한 컨테이너를 실행한다(start).

  • --name :
    컨테이너의 이름을 지정한다.

  • -e :
    환경 변수를 설정한다. MySQL을 실행할 때, root 사용자의 비밀번호를 설정해야 하기 때문에 이 옵션을 사용해야 한다.

  • -d :
    컨테이너를 백그라운드에서 실행하고, 컨테이너 ID를 출력한다.

  • -p :
    포트 번호를 지정한다. 3306:3306는 호스트는 3306 포트로 이 컨테이너와 통신하고, 컨테이너도 컨테이너 내부의 독자적인 포트 중 3306 포트로 호스트로 통신한다는 뜻이다.
    앞이 호스트의 포트, 뒤가 컨테이너의 포트이다.

  • mysql:latest :
    다운받을 이미지이다. mysql 이미지에서 latest 버전을 다운받아 컨테이너를 생성하게 된다.


$ docker ps

run 명령어를 실행한 후 다음 명령어로 실행 중인 컨테이너 목록을 확인할 수 있다. -a 옵션을 추가하면 실행 중이지 않은 컨테이너 목록도 확인한다.


CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS        PORTS                                                  NAMES
e5d8b8209e2a   mysql:latest   "docker-entrypoint.s…"   20 hours ago   Up 20 hours   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   simple-mysql

생성된 MySQL 컨테이너가 잘 실행되고 있음을 확인할 수 있다.


 $ docker stop <제어_명령어> <컨테이너_이름_or_ID>

다음 명령어를 통해 컨테이너를 제어할 수 있다.

  • stop :
    컨테이너 정지.

  • start :
    정지되어있는 컨테이너 시작.

  • restart
    실행 중인 컨테이너 재시작.



컨테이너 접속

컨테이너에 접속하는 방법으론 크게 두 가지,
1) run을 통해 컨테이너가 실행될 때 접속하거나,
2) 이미 실행중인 컨테이너에 exec 명령어를 통해 접속하는 방법이 있다.

1번 방법으로 테스트해본 결과 MySQL 접속이 잘 안됐으니 2번으로 하겠다.


$ docker exec -it [컨테이너 이름 or ID] bash
  • exec :
    exec실행중인 컨테이너새로운 명령어를 실행할 때 사용한다.

  • -it :
    이 옵션은 -i 옵션과 -t 옵션이 합쳐진 옵션이다.

    • -i :
      명령 실행 후 키보드 입력을 받는다.
    • -t :
      문서에선 컨테이너에 수도-TTY를 할당, 즉 TTY 장치가 제공하는 입출력 기능에 접근 가능하게 되는 옵션이라 설명한다.
      ex) -t 옵션 없이 -i 옵션만 사용한 후 비밀번호를 입력한다면, 원래는 비밀번호를 입력할 때 콘솔창에서 입력한 비밀번호를 가려주지만 TTY 기능이 없어서 비밀번호가 그대로 노출된다.
      (솔직히 감이 잘 안온다. 그냥 -it는 같이 쓰자)
  • bash :
    exec으로 실행할 명령어.bash 명령어를 실행해 셸에 진입한다.


bash-5.1# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.4.0 MySQL Community Server - GPL

Copyright (c) 2000, 2024, 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>

이후엔 컨테이너를 생성할 때 적용한 root 비밀번호로 MySQL에 접속, 웹 프로젝트에 필요한 DB나 유저를 생성하면 된다.


결과

서버에서 생성한 MySQL 컨테이너가 웹 프로젝트와 잘 작동하나 확인해보자.

$ service mysql stop

우선 확인을 위해 기존 MySQL을 정지한다.

$ mysql -u root -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

정지되어 MySQL에 접속할 수 없다.

이후 컨테이너를 실행한 후 swagger를 통해 DB에 데이터를 넣는다.

exec 명령어를 통해 컨테이너 안에서 확인해보면 잘? 들어가는 것을 확인할 수 있다.
끝!


참고

profile
피카

0개의 댓글