Development Study/Backend

[Docker] 도커는 뭐하는 고래일까? + EC2에서 Docker 띄워보기 실습

  • -
728x90

Docker는 백엔드와 프론트엔드, 어떤 유형의 애플리케이션에서도 사용할 수 있는 도구입니다. 

Docker는 운영 체제 수준에서 가상화를 제공하는 플랫폼이며, 개발자가 애플리케이션과 그 의존성을 '컨테이너'라는 패키지로 묶어서 배포할 수 있게 해줍니다.

이 컨테이너는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 애플리케이션이 실행되는 데 필요한 모든 것을 포함하므로, 이를 사용하여 애플리케이션을 신속하게 구축하고 배포할 수 있습니다.

이번 글에서는 이 Docker에 대해 알아보도록 하겠습니다.

도움이 되었으면 좋겠습니다.

 

AWS Series

 

[Learn About AWS] Series

이 글은 AWS 수업 시간에 진행되는 내용들을 담아 둔 시리즈이다 상반기동안 업데이트 할 예정이며 최대한 위에있는 이미지처럼 웃으면서 할 것이다 [이론] [Computer Science] 네트워크 기초 익혀먹

time-map-installer.tistory.com

 


 

Docker란 무엇일까?

Docker는 애플리케이션과 그 실행 환경을 컨테이너라는 패키지로 묶어서 배포하고 실행하는 소프트웨어 플랫폼입니다. 

이는 "어디서나 빌드하고, 배포하고, 실행할 수 있는" 소프트웨어를 가능하게 하는 강력한 도구입니다. 

 

마치 고래등에 올려진 컨테이너 박스들처럼 프로그램과 실행에 필요한 것들을 컨테이너에 Shipping합니다.

그리고 손쉽게 이동해서 어디서나 간단하게 실행할 수 있는 도구와 환경을 제공하죠.

또한 오픈 소스 플랫폼입니다.

 

Docker는 Linux 커널을 기반으로 하므로 Linux 환경에서 동작하게 됩니다.

 

컨테이너에 대해 이해하고 싶다면?

 

민첩한 클라우드 환경 구성 필수품 ‘컨테이너’ (1) - 데이터넷

가상화 기술과도 유사한 개념인 컨테이너는 애플리케이션 실행에 필요한 파일과 라이브러리(lib)를 패키지화한 후, 필요할 때마다 이를 실행시켜 동일한 환경을 이용할 수 있도록 하는 역할을

www.datanet.co.kr

 

Docker와 가상 머신(Virtual Machines)의 차이점

Docker와 전통적인 가상 머신(VM)의 주요 차이점을 이해하려면, 다음과 같은 구조를 생각해 볼 수 있습니다. 


가상 머신은 애플리케이션과 필요한 바이너리 및 라이브러리 뿐만 아니라, 각기 별도의 운영체제를 포함하고 있습니다. 

반면 Docker는 애플리케이션과 필요한 바이너리 및 라이브러리만을 포함하며, 호스트의 운영체제 위에서 동작합니다. 

이는 컨테이너의 이동성을 향상시키며, 더욱 가볍고 빠르게 동작하게 합니다.

 

Docker 아키텍처

Docker 아키텍처는 다음과 같이 구성되어 있습니다. 

 

Docker vs VMs - 시작시간, 오버헤드 차이

가상머신과 Docker 컨테이너는 시작 시간과 오버헤드 면에서 차이가 있습니다. 

 

먼저, 시작시간의 차이를 살펴보겠습니다.

가상 머신은 운영체제를 포함하므로, CPU, 메모리, 하드 디스크 등의 하드웨어를 가상화하고 OS를 부팅하는 데 시간이 걸립니다. 

반면, Docker 컨테이너는 OS가 이미 실행 중이며, 프로세스 시작만 필요하므로 더 빠르게 시작할 수 있습니다.

다음은 오버헤드입니다.

가상 머신은 응용 프로그램을 운영 체제 위에서 실행하며, 하드웨어 가상화에서는 가상화된 하드웨어와 하이퍼바이저를 통해 처리를 수행합니다. 이러한 과정은 물리적 시스템에 비해 추가적인 처리 시간, 즉 오버헤드를 발생시킵니다. 

반면, 컨테이너형 가상화는 커널을 공유하고 각각의 프로세스가 작업을 수행하므로, 그 오버헤드는 거의 없거나 전혀 없습니다. 

따라서 일반 프로세스가 작업을 수행하는데 걸리는 시간과 크게 다르지 않습니다.

 

Docker Hub

Docker는 Docker Hub라는 퍼블릭 레지스트리를 제공합니다. 

이는 수많은 Docker 이미지를 찾아볼 수 있는 곳으로, 사용자들이 소프트웨어를 컨테이너화해서 공유하는 플랫폼입니다. 

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

 

컨테이너 사용 명령어

Docker는 다양한 명령어를 사용하여 컨테이너를 관리합니다. 

이는 컨테이너의 생성, 시작, 정지, 삭제 등의 작업을 포함합니다. 

이러한 도커의 기본적인 이해와 함께, 도커를 이용해 더욱 효율적이고 안전한 개발 환경을 구축할 수 있습니다.

 

아래에는 많이 사용하는 예시 명령어 8개를 모아두었습니다.

 

1. `-d`

이 옵션은 컨테이너를 "분리된" 모드로 실행합니다.

즉, 컨테이너는 백그라운드에서 실행되고 터미널의 제어권은 즉시 사용자에게 반환됩니다.

 

2. `-p`

이 옵션은 컨테이너의 네트워크 포트를 호스트에 바인딩합니다.

포맷은 `-p <host-port>:<container-port>`입니다.

예를 들어 `-p 8080:80`은 컨테이너의 80번 포트를 호스트의 8080번 포트에 바인딩합니다.

 

3. `-v`

이 옵션은 컨테이너의 파일 시스템에 볼륨을 마운트합니다.

예를 들어, `-v /host/dir:/container/dir`은 호스트의 `/host/dir` 디렉토리를 컨테이너의 `/container/dir` 디렉토리에 연결합니다.

 

4. `-e`

이 옵션은 컨테이너 내의 환경 변수를 설정합니다. 예를 들어, `-e VAR=VALUE`은 컨테이너 내에서 `VAR`라는 이름의 환경 변수를 `VALUE` 값으로 설정합니다.

 

5. `--name`

이 옵션은 컨테이너에 이름을 부여합니다.

이 이름은 Docker CLI를 통해 컨테이너를 참조하는데 사용할 수 있습니다.

 

6. `--rm`

이 옵션은 컨테이너가 종료된 후에 자동으로 컨테이너를 제거합니다.

이는 일회성 작업에서 유용하며 디스크 공간을 절약할 수 있습니다.

 

7. `-it`

이 옵션은 컨테이너와 대화형으로 통신할 수 있게 합니다.

`-i`와 `-t`를 결합한 옵션으로, `-i`는 STDIN을 연결하고, `-t`는 TTY를 할당합니다.

이를 통해 컨테이너의 셸에 직접 입력할 수 있게 됩니다.

 

8. `--link`

이 옵션은 두 컨테이너 사이에 연결을 생성합니다.

하지만 이 옵션은 이제는 사용되지 않으며, 대신 네트워크를 사용하여 컨테이너를 연결하는 것이 권장됩니다.

 


 

실습1 - Docker 만들어서 띄워보기

우리는 AWS에서 Docker를 띄워볼 겁니다!

우선 EC2에 접속해봅시다. EC2를 생성하는 방법은 아래에서 확인해보세요

 

[Learn About AWS] 1회차 실습내용 정리

AWS Series [Learn About AWS] Series time-map-installer.tistory.com What is EC2? EC2는 무엇일까? EC2 - Elastic Compute Cloud 가상 서버 기능을 제공하는 클라우드 서비스 AWS의 물리적 서버를 가상화 기술을 이용하여 사용

time-map-installer.tistory.com

 

 

1. Repository 인덱스 갱신하기

먼저, Ubuntu의 패키지 인덱스를 업데이트해야 합니다. 이는 다음 명령을 통해 가능합니다.

sudo apt update

이 명령어는 우분투의 패키지 저장소 인덱스를 업데이트합니다.

새로운 버전의 패키지를 얻거나 패키지 설치를 위해 반드시 수행해야 합니다.

 

2. 도커 다운로드를 위한 필요한 패키지 설치

도커를 설치하기 전에, 몇 가지 필요한 패키지들이 있습니다.

sudo apt install apt-transport-https ca-certificates curl software-properties-common

이 명령어들은 Docker 설치에 필요한 패키지를 설치합니다. 

apt-transport-https는 https를 통한 패키지 다운로드를 가능하게 하고, 

ca-certificates는 SSL 기반의 웹사이트로의 안전한 접속을 도와줍니다. 

curl은 URL에서 데이터를 전송받는 도구이며, 

software-properties-common은 스크립트 유틸리티를 제공하여 소프트웨어 저장소를 추가하고 관리하는데 도움을 줍니다.

 

3. Curl 명령어로 Docker의 GPG 키 다운받기

이제 Docker의 official GPG 키를 추가해야 합니다.

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

Docker의 공식 GPG 키를 다운로드하고 apt 패키지 관리자의 신뢰 키 목록에 추가합니다.

이는 Docker 패키지가 올바른 출처에서 제공되었는지를 확인하는데 사용됩니다.

 

4. Docker repository 추가하기

Docker repository를 시스템에 추가합니다.

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update

Docker 저장소를 시스템의 APT 소스 목록에 추가합니다.

$(lsb_release -cs)는 현재 운영체제의 출시 코드명을 출력합니다.

이렇게 함으로써 Docker 저장소를 자동으로 현재 우분투 버전에 맞춰 업데이트합니다.

추가 후에는 패키지 목록을 다시 업데이트합니다.

 

5. Docker 설치하기

이제 Docker를 설치할 준비가 되었습니다.

sudo apt install docker-ce

이 명령어는 Docker CE (Community Edition)을 설치합니다. 

이 버전은 일반 사용자들을 위해 무료로 제공되며, 개인적인 목적 또는 개발 환경에서 사용하기 좋습니다.

Docker가 정상적으로 설치되었는지 확인하기 위해 아래 명령을 실행합니다.

sudo systemctl status docker

 

6. Hello World 이미지 받기

Docker가 정상적으로 설치되었다면, 'hello-world' 이미지를 받아봅시다.

sudo docker pull hello-world

docker pull 명령어는 Docker Hub에서 'hello-world' 이미지를 다운로드합니다.


받은 이미지 목록을 확인하기 위해 아래 명령을 실행합니다.

sudo docker images

docker images는 현재 시스템에 있는 Docker 이미지 목록을 출력합니다.


Hello World 이미지를 실행해봅시다.

sudo docker run hello-world

docker run 명령어는 'hello-world' 이미지를 실행합니다.

 

실행한 Docker 컨테이너들의 목록을 확인합니다.

sudo docker ps -a

docker ps -a는 실행된 모든 컨테이너를 출력합니다

 

필요하지 않은 컨테이너를 삭제합니다. 컨테이너ID는 `docker ps -a` 명령어를 통해 확인할 수 있습니다.

sudo docker rm <컨테이너ID>

docker rm 명령어는 특정 컨테이너를 삭제하며

 

마지막으로, 현재 Docker 이미지 목록을 다시 확인합니다.

sudo docker images

docker images는 다시 현재 시스템의 Docker 이미지 목록을 출력합니다.

 

이 실습을 통해 Docker를 설치하고, 이미지를 받아서 실행하고, 컨테이너를 관리하는 방법을 배웠습니다.

 


 

실습2 - EC2에서 Docker를 사용한 MySQL 설치 & 관리해보기

이번에는 Docker 세팅을 모두 마치고 MySQL을 설치하고 관리해보는 실습을 해보겠습니다.

1. 도커 버전 확인

docker -v

 

Docker가 이미 설치되어 있고 동작 중인지 확인하기 위해 사용합니다.

2. MySQL 5.6 버전을 다운로드

sudo docker pull mysql:5.6

 

Docker Hub에서 MySQL 5.6 버전의 이미지를 다운로드합니다.

3. Docker 이미지 확인

sudo docker images

현재 시스템에 있는 Docker 이미지 목록을 출력합니다.

4. MySQL Docker 컨테이너 생성 및 실행

sudo docker run --name mysql-lecture -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:5.6

MySQL을 실행하는 Docker 컨테이너를 생성하고 백그라운드에서 실행합니다.

여기서는 컨테이너의 이름을 "mysql-lecture"로 설정하고, MySQL의 root 사용자 비밀번호를

<password>(ex. 1234)로 설정하며, 호스트의 3306 포트를 컨테이너의 3306 포트에 바인딩합니다.

5. Docker 컨테이너 리스트 출력

sudo docker ps -a

현재 도커 컨테이너의 상태를 확인합니다.

6. MySQL Docker 컨테이너 시작/중지/재시작

# MySQL Docker 컨테이너 중지
sudo docker stop mysql-lecture
# MySQL Docker 컨테이너 시작
sudo docker start mysql-lecture
# MySQL Docker 컨테이너 재시작
sudo docker restart mysql-lecture

컨테이너를 시작하거나 중지하거나 재시작합니다.

7. MySQL Docker 컨테이너 접속

sudo docker exec -it mysql-lecture /bin/bash
root@dc557b92f573:/# mysql -u root -p
Enter password:

'mysql-lecture' 컨테이너에 bash 쉘로 접속하고, MySQL에 root 사용자로 로그인합니다.

8. DB, User 생성하기, User 권한주기

CREATE DATABASE 디비명;
CREATE USER '유저명'@'%' IDENTIFIED BY '비밀번호';
GRANT ALL PRIVILEGES ON 디비명.* TO '유저명'@'%';
flush privileges;

MySQL에서 데이터베이스를 생성하고 사용자를 생성한 후 해당 사용자에게 모든 권한을 부여합니다.
+ 한 줄씩 실행하면서 자신만의 유저명과 비밀번호를 만들어보세요

예시

CREATE DATABASE testdb;
CREATE USER 'tuser'@'%' IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES ON testdb.* TO 'tuser'@'%';
flush privileges;

 

9. IP로 바로 컨테이너 MySQL로 접속해보기

# 컨테이너 ip 확인
sudo docker inspect <컨테이너ID>
# 컨테이너 MYSQL로 바로 접속하기( 바로 mysql 터미널로 접속됨 )
mysql -u root -p -h 172.17.0.2 --port 3306

'docker inspect'로 컨테이너의 IP 주소를 확인하고, MySQL 클라이언트로 해당 IP의 MySQL에 접속합니다.

+ 접속하기 전에 7번의 첫째 줄을 참고해서 접속하시면 됩니다.
+ 컨테이너ID는 ubuntu 환경으로 넘어온 후 sudo docker ps -a를 통해 확인해보실 수 있습니다.

 

10. 외부에서 Mysql 접속해 보기

이때 host는 EC2 인스턴스의 퍼블릭 IPv4 DNS를 사용합니다.
user는 위에서 만들었던 <유저명>(tuser)을 사용합니다.

password는 위에서 만들었던 <비밀번호>(1234)를 사용합니다.

포트는 위에서 열었던 8088을 사용하되, EC2 인스턴스의 보안 그룹 -> 인바운드 규칙 -> 8088 추가 작성 후 저장한 뒤 실행합니다.

유형은 Anywhere-IPv4를 선택해줍니다.

그리고 Toad, MySQL Workbench 등을 이용하여 접속해봅니다.

 

11. 컨테이너, 이미지 모두 삭제 후 port 설정 연습하기

sudo docker stop <컨테이너ID>

우선, 삭제하기 전에 실행을 멈추어야 합니다.

 

sudo docker rm <컨테이너ID>

 

그럼 이제 사라진 docker의 모습을 볼 수 있습니다.

 

sudo docker image rm <ImageID>

이미지를 지우려면 다음과 같이 입력하면 됩니다.

+ 혹시모르니 지우는 건 하나씩 하는 걸 추천합니다. 잘못지웠다가 지우면 안될 것 까지 지우면 안되잖아요?

 

sudo docker run --name mysql-lecture -e MYSQL_ROOT_PASSWORD=<password> -d -p 8088:3306 mysql:5.6

기존 컨테이너와 이미지를 삭제한 후, 호스트의 8088 포트를 컨테이너의 3306 포트에 바인딩하여 MySQL 컨테이너를 다시 실행합니다.

12. AWS EC2 보안 그룹에서 8088 port 를 열어줍니다

AWS EC2 콘솔에서 해당 EC2 인스턴스의 보안 그룹 설정을 수정하여 8088 포트를 열어줍니다.

 


 

실습 번외편 - 재밌는 패키지 다운받아서 써보기

이번에는 figlet, lolcat, cowsay 패키지를 다운받아서 문자열을 입력받아

무지개색 아스키 아트 동물을 출력하는 재밌는 실습을 해보도록 할게요!

1. **figlet 패키지 다운로드**

sudo apt-get install figlet

figlet은 텍스트를 아스키 아트로 변환하는데 사용되는 유틸리티입니다.

2. **lolcat 패키지 다운로드**

sudo apt-get install lolcat

lolcat은 출력된 텍스트에 무지개색을 입히는 유틸리티입니다.

3. **cowsay 패키지 다운로드**

sudo apt-get install cowsay

 

cowsay는 문자열을 입력받아 그를 말하는 아스키 아트 동물을 출력하는 프로그램입니다.

4. **cowsay 사용해보기**

cowsay Hi!

입력한 문자열인 "Hi!"를 말하는 기본 cow(소) 그림을 출력합니다.

5. **cowsay에 다른 동물 그림 적용해보기**

cowsay -f dragon-and-cow Hi!

"-f" 옵션을 사용해 "dragon-and-cow" 그림으로 문자열 "Hi!"를 말하게 합니다.

"/usr/share/cowsay/cows" 디렉토리에는 다양한 동물 그림이 있습니다.

6. **cowsay와 lolcat 함께 사용해보기**

cowsay -f dragon-and-cow Hi! | lolcat

cowsay의 출력 결과를 lolcat으로 보내서 무지개색으로 출력합니다.

7. **cowsay와 lolcat의 다양한 옵션 사용해보기**

cowsay -f dragon-and-cow Hi! | lolcat -a -s 500

"-a" 옵션으로 lolcat의 애니메이션 효과를 활성화하고, "-s" 옵션으로 애니메이션 속도를 500으로 설정합니다.

이렇게 하면 무지개색 애니메이션이 느리게 이동하면서 출력됩니다.

 


 

후기

후... 

기지개를 펴니 개운하네요 드디어 끝났습니다. 재밌었어요

 


End

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.