1. Docker [ 프론트엔드 개발자 관점 ]
Docker를 사용하면 명령어 한 줄로 어떤 컴퓨터에든 MySQL을 에러 없이 설치하고 실행할 수 있게 됩니다.
그 외 장점
- 매번 귀찮은 설치 과정을 일일이 거치지 않아도 됩니다.
- 항상 일관된 프로그램 설치 가능합니다.
- 각 프로그램이 독립적인 환경에 실행합니다.
IP와 Port 의 개념
IP: 네트워크 상에서의 특정 컴퓨터를 가리키는 주소
port: 한 컴퓨터 내에서 실행되고 있는 특정 프로그램의 주소
브라우저는 주소를 입력하면 디폴트로 80번 포트로 보내게끔 되어있습니다.
도커라이징
애플리케이션을 Docker 컨테이너에서 실행될 수 있도록 준비하는 과정입니다.
Docker는 애플리케이션과 그에 필요한 모든 종속성(라이브러리, 설정 파일 등)을 포함한 패키지를 만들어서 어디서든 일관되게 실행될 수 있게 합니다.
도커라이징의 주요 단계
- Dockerfile 작성: 애플리케이션을 컨테이너화하기 위해 필요한 모든 명령어를 포함한 Dockerfile을 작
- 이미지 빌드: Dockerfile을 바탕으로 Docker 이미지를 빌드
- 컨테이너 실행: 빌드된 이미지를 기반으로 컨테이너를 실행
- 테스트 및 배포: 컨테이너가 예상대로 작동하는지 확인한 후, 다양한 환경에 배포할 수 있다. Docker를 사용하면 로컬 개발 환경에서부터 테스트 서버, 생산 환경까지 일관된 방식으로 배포할 수 있다.
도커라이징 장점
- 이식성: 컨테이너는 모든 종속성을 포함하므로 환경에 상관없이 일관되게 동작합니다.
- 격리: 각 애플리케이션은 별도의 컨테이너에서 실행되므로 서로의 영향을 받지 않습니다.
- 확장성: 컨테이너는 쉽게 확장하고 배포 가능합니다.
- 효율성: 가상 머신에 비해 더 가볍고 빠릅니다.
결론적으로 도커라이징은 애플리케이션을 컨테이너화하여 개발, 테스트, 배포를 더 쉽고 일관되게 만들기 위한 과정
“왜” 이미지 빌드 인가
"빌드"라는 용어는 소프트웨어 개발에서 애플리케이션을 준비하고 구성하는 과정을 의미입니다.
Docker에서의 이미지 빌드 역시 이 원칙을 따루릅니다.
- 빌드: 소스 코드와 종속성 등을 바탕으로 실행 가능한 소프트웨어를 만드는 과정. Docker에서는 Dockerfile을 기반으로 애플리케이션과 그 종속성을 포함하는 Docker 이미지를 만드는 과정.
- 왜 빌드라고 하는가?: 이 과정은 단순히 파일을 압축하는 것이 아닌, 애플리케이션과 모든 필수 구성 요소를 포함하여 실행 가능한 상태로 준비하는 작업이기 때문. Docker 이미지를 생성할 때는 여러 단계가 있으며, 각 단계에서 파일을 복사하고 종속성을 설치하며, 최종적으로 실행 가능한 이미지를 만들기 때문에 "빌드"라는 용어가 사용됩니다.
- 빌드 과정의 의미:
- 구성: 애플리케이션을 구성하는 파일, 설정, 종속성을 모아서 하나의 실행 가능한 단위로 만드는 과정.
- 준비: 소스 코드와 환경을 조합하여, 실제로 실행할 수 있는 형태로 준비하는 과정.
- 패키징: 실행 가능한 소프트웨어를 패키지화하여 배포 가능한 형태로 만드는 과정.
"빌드"라는 용어는 소스 코드와 종속성을 조합하여 실행 가능한 상태로 준비하는 과정에 사용. Docker에서는 이 과정을 통해 Docker 이미지를 생성하고, 이 이미지를 바탕으로 컨테이너를 실행합니다.
Nginx 란?
Nginx란 여러 기능을 가진 서버 중 하나.
- 웹 서버 (HTML 웹 페이지를 렌더링 시키는 역할)
로드 밸런싱리버스 프록시
리액트 앱 배포 시 NGINX의 역할
- 정적 파일 서빙:
- React 앱을 빌드하면 브라우저가 실행할 수 있는 HTML, CSS, JavaScript 파일로 변환. 이 정적 파일들을 사용자가 웹사이트에 접속할 때마다 제공하는 게 필요한데, NGINX는 정적 파일을 효율적으로 서빙하는 역할을 합니다.
- 예를 들어, 사용자가 example.com에 접속하면 NGINX는 index.html을 제공하고 그 이후 React 앱이 실행합니다.
- 리버스 프록시:
- 만약 React 앱이 백엔드(Node.js, Django 등) API와 통신해야 한다면 NGINX가 클라이언트의 요청을 백엔드 서버로 프록시해준다. 이렇게 하면 클라이언트와 서버 간의 통신을 원활하게 할 수 있고, 요청을 백엔드로 안전하게 전달합니다.
- 예를 들어 사용자가 example.com/api/data로 요청을 보내면 NGINX가 이를 받아서 백엔드 서버로 전달하는 역할을 합니다.
- 로드 밸런싱:
- 큰 규모의 애플리케이션에서는 여러 대의 서버에 요청을 분산시켜야 할 때가 있다. NGINX는 여러 서버로 트래픽을 나눠주는 로드 밸런서로 동작할 수 있습니다.
- 예를 들어, 트래픽이 많은 사이트에서 NGINX가 서버 A와 서버 B로 요청을 적절히 분배하여 서버 과부하를 방지할 수 있습니다.
리액트 개발자 관점에서 NGINX는 언제 등장할까?
- 배포 단계: 로컬에서 개발할 때는 NGINX를 신경 쓸 필요가 없지만 실제 로 웹 서버에 React 앱을 배포할 때 NGINX가 중요한 역할을 한다. AWS, DigitalOcean 등에서 배포할 때 NGINX 설정을 통해 React 앱을 효율적으로 서비스할 수 있습니다.
- 리버스 프록시 설정: React 앱이 백엔드와 통신하는 경우 NGINX에서 API 요청을 백엔드로 프록시해주는 설정을 할 수 있습니다. 이 과정에서 CORS 문제도 해결할 수 있습니다.
NGINX는 프론트엔드 개발자가 직접적으로 많이 다루지는 않지만 배포나 서버 설정에서 만나게 되는 툴입니다.
리액트로 만든 앱을 실제로 사용자에게 서비스할 때 중요한 역할을 하는 것입니다.
2. 도커 볼륨
도커 컨테이너에서 데이터를 영속적으로 저장하기 위한 방법입니다.
볼륨은 컨테이너 자체의 저장 공간을 사용하지 않고 호스트 자체의 저장 공간을 공유해서 사용하는 형태. 컨테이너를 통째로 갈아끼우는 방식으로 교체를 하는데 이러한 특징 떄문에 기존 컨테이너를 새로운 컨테이너로 교체하면 기존 컨테이너내부에 있던 데이터도 같이 삭제됩니다.
만약 컨테이거나 MySQL 을 실행시키는 컨테이너였다면 그 안에 저장되어있던 데이터도 삭제됩니다.
따라서 컨테이너 내부에 저장된 데이터가 삭제되면 안되는 경우에는 볼륨이라는 개념을 활용해야 합니다.
docker-mysql/mysql_data/ (호스트 컴퓨터 위치)
var/lib/mysal (컨테이너 내부에서의 주소값)
Docker 컨테이너에서 MySQL 데이터가 저장되는 경로인 /var/lib/mysql에서 var와 lib는 리눅스 파일 시스템의 디렉토리 구조에서 중요한 부분입니다.
- /var: "Variable"의 약자로, 변화하는 데이터를 저장하는 디렉토리. 시스템이 실행되면서 지속적으로 변경되는 파일들이 저장. 예를 들어, 로그 파일, 캐시 데이터, 이메일, 그리고 데이터베이스 파일 등이 여기에 들어갑니다.
- /lib: "Library"의 약자로, 시스템이 작동하는 데 필요한 기본적인 라이브러리 파일들이 있는 곳. 이 디렉토리에는 프로그램이 실행되는 동안 필요한 라이브러리 파일이나 모듈들이 있다. 다만 여기서 /var/lib는 주로 응용 프로그램들이 실행되면서 저장하는 가변 데이터를 위한 경로로 사용됩니다.
따라서 /var/lib/mysql은 MySQL 데이터베이스의 데이터 파일들이 저장되는 위치.
도커 볼륨이라는 것을 사용해서 컨테이너에 저장하지 않고 호스트의 저장 공간에 따로 저장해놓습니다.
볼륨을 사용하는 명령어
docker run -v [호스트 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지명]:[태그명]
[호스트 디렉토리 절대경로]에 디렉토리가 이미 존재할 경우, 호스트의 디렉토리가 컨테이너의 디렉토리를 덮어 씌웁니다.
Docker - 도커 볼륨
시작하세요! 도커/쿠버네티스 책 정리글입니다.
kkminseok.github.io
docker run -e MYSQL_ROOT_PASSWORD=password123 -d -p 3306:3306 -v
/Users/tree/Documents/docker-mysql
docker run -e MYSQL_ROOT_PASSWORD=password123 -d -p 3306:3306 -v
/Users/tree/Documents/docker-mysql/mysql_data:/var/lib/mysql mysql
호스트의 이름을 빌려서 / 이 곳에 있는 경로와 공유해서 사용.
MySql 띄워보기
docker run -e MYSQL_ROOT_PASSWORD=password123 -d -p 3306:3306 mysql
컨테이너에 들어가보기
docker exec -it 297 bash
접속 명령어
mysql -u root -p
보충설명
mysql -u root -p 명령어에서 -u와 -p는 MySQL 클라이언트에 로그인할 때 사용하는 옵션
- u (user): 로그인할 사용자 이름을 지정하는 옵션. 여기서는 root 사용자를 지정하고 있다.
- p (password): 비밀번호를 입력할 수 있도록 프롬프트를 표시하는 옵션.
- p 뒤에 비밀번호를 바로 입력하지 않으면, 명령 실행 후에 비밀번호 입력을 요구하는 프롬프트가 나타남.
이 명령어는 MySQL에 root 사용자로 접속하고, 비밀번호 입력을 요구하는 프롬프트를 띄우겠다는 의미.
mysql> show databases;
볼륨 사용
docker exec -it 424(id) 로 들어가기
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
❌❌❌ 주의!! ❌❌❌❌
빈 디렉토리, 혹은 존재하지 않은 디렉토리로 사용할 것
3. 실습 : Nginx 로 웹 띄우기
docker pull nginx
잘 다운받아졌는지 확인해보기
docker image ls
포트 80을 사용 중인 프로세스를 확인
sudo lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
com.docke 79616 tree 70u IPv6 0x7bb8614eb74b43e1 0t0 TCP *:http (LISTEN)
중지
sudo kill <PID>
docker run --name webserver -d -p 80:80 nginx
6add4c66618156d164fe9a437c818899490220a6748b09889237825cce062dc1 (<- 컨테이너의 ID)
예를 들어, 이 컨테이너 ID를 사용하여 해당 컨테이너의 로그를 확인하거나, 상태를 점검하거나, 컨테이너를 중지하는 등의 작업을 할 수 있다. ID는 UUID 형식으로, 각 컨테이너에 대해 고유합니다.
접속
<http://localhost>
❓ 왜 80:80으로 열었는데 포트 안붙여도 접속이 가능한것일까 ?
docker run --name webserver -d -p 80:80 nginx 명령어로 Docker 컨테이너를 실행하면, 호스트 시스템의 포트 80이 컨테이너의 포트 80과 연결됩니다. 즉, 호스트 시스템의 포트 80으로 들어오는 요청이 컨테이너의 포트 80으로 전달됩니다.
- 포트 80은 기본 HTTP 포트: 웹 브라우저는 기본적으로 포트 80을 사용하여 HTTP 요청을 보냅니다. 따라서 http://localhost라고 입력하면 자동으로 포트 80으로 요청을 보내게 됩니다.
- 포트 매핑: p 80:80 옵션은 호스트 시스템의 포트 80을 컨테이너의 포트 80과 매핑합니다. 즉, 컨테이너의 웹 서버가 포트 80에서 서비스를 제공하므로, 브라우저가 포트 80으로 요청을 보내면 컨테이너의 웹 서버가 응답하게 됩니다.
결론적으로, http://localhost로 접속할 때 포트를 명시하지 않더라도,브라우저가 기본적으로 포트 80을 사용하기 때문에 문제없이 접근할 수 있습니다.
❓Docker 의 포트 맵핑 과정은 왜 필요한 것일까 ?
Docker에서 포트 매핑은 컨테이너 내부의 서비스(예: 웹 서버)와 호스트 컴퓨터가 통신할 수 있도록 해주는 중요한 과정입니다. 이를 통해, 컨테이너 내부에서 실행되는 애플리케이션을 외부(호스트 또는 인터넷)에서 접근할 수 있게 됩니다.
명령어 docker run --name webserver -d -p 80:80 nginx에서 포트 매핑이 이루어지는 이유를 설명하자면:
포트 매핑 (p 80:80):
- 첫 번째 숫자 80: 호스트 컴퓨터의 포트 번호입니다. 즉, 이 경우 호스트(당신의 Mac이나 다른 서버)의 80번 포트를 의미합니다.
- 두 번째 숫자 80: 컨테이너 내부에서 NGINX 웹 서버가 사용하는 포트 번호입니다. 기본적으로 NGINX는 컨테이너 안에서 80번 포트에서 동작합니다.
포트 매핑이 필요한 이유:
- 외부 접근 허용: 컨테이너 내부의 애플리케이션(여기서는 NGINX 웹 서버)은 기본적으로 외부에서 접근할 수 없습니다. 포트 매핑을 통해 호스트의 포트를 컨테이너의 포트에 연결하면, 외부에서 호스트의 IP 주소와 포트 번호로 접근할 수 있게 됩니다.
- 예를 들어, http://localhost:80을 입력하면 호스트의 80번 포트로 요청이 전송되고, 그 요청이 컨테이너 내부의 NGINX로 전달됩니다.
- 컨테이너 격리: Docker는 컨테이너를 서로 격리시켜 실행합니다. 포트 매핑을 하지 않으면, 컨테이너 내부의 서비스는 외부(호스트 시스템 또는 다른 네트워크)와 통신할 수 없으므로, 포트 매핑을 통해 호스트와 컨테이너 간 연결을 설정합니다.
- 다른 포트 사용 가능: 포트 매핑은 호스트의 포트와 컨테이너 내부의 포트를 다르게 설정할 수도 있습니다. 예를 들어 p 8080:80으로 하면, 외부에서 http://localhost:8080으로 요청하면 컨테이너 내부의 80번 포트에서 NGINX가 그 요청을 처리하게 됩니다.
결론: 포트 매핑은 외부(인터넷 또는 로컬)에서 컨테이너 내부의 서비스로 접근할 수 있도록 해주는 방법입니다.