지난 포스팅에서는 네이버 증권 데이터를 수집하기 위한 내용으로 작성하였다. 앞으로는 Docker 환경에서 카프카와 mysql 이미지를 빌드(build) 하여 데이터 수집 및 데이터 저장을 하기 위한 환경 구축하는 내용으로 포스팅 하려고 한다.
2024.08.31 - [Toy Project] - [프로젝트명 : 미정] ETL 구축하기 - ① 데이터 수집
2024.09.02 - [Toy Project] - [프로젝트명 : 미정] ETL 구축하기 - ② 데이터 수집
첫 번째 발행글에서 말했듯이, 이번 프로젝트의 목표는 Docker를 활용한 ETL 구축이다. 이번에 Docker를 처음 접하였기 때문에 생활코딩(이고잉)님의 Docker 입문 강의를 듣고 시작하였다. 만약 이 글을 있는 분들 중 Docker가 어떤 것인지 잘 모르겠다면, 생활코딩님의 Docker 강의를 들어 보는 것을 추천한다. 총 8개의 강좌로 구성되어 있고, 러닝타임 약 40분 밖에 되질 않으니 시간을 투자해서 꼭 들어보길 바란다. (생활코딩님 감사합니다)
https://www.youtube.com/watch?v=Ps8HDIAyPD0
생활코딩님의 강의를 들은 내용을 기반으로 Docker에 대해서 정리를 잘한 블로그가 있어 공유를 하고, 개념적인 부분에 대해서 간략하게 정리를 하고, 본 프로젝트에서 Docker환경을 어떻게 구축을 했는지, 환경을 구축하면서 발생했었던 애로사항 및 이슈, 그리고 그 문제들을 해결한 방법들에 대해서 포스팅을 이어나가도록 하겠다.
https://spacebike.tistory.com/41
[Docker] 생활코딩 도커 입문수업 정리
도커 소개 컴퓨터에서 어떤 애플리케이션을 만들기 위해서는 운영체제에 웹 서버나 데이터베이스 같은 소프트웨어를 깔아야 한다. 이러한 소프트웨어를 설치하는 일은 귀찮고 까다로운 일이다
spacebike.tistory.com
1. Docker 소개
우리가 어떤 애플리케이션을 만든다고 하면, 운영체제에 웹 서버나 데이터베이스 같은 소프트웨어를 설치를 해야하는데, 이러한 소프트웨어를 설치하는 일은 귀찮고 까다로운 일이다. 짧은 개발 경험을 더듬어 생각해보면, 한번에 제대로 잘 설치되었던 적은 거의 없었던 것 같다. (linux os 설치도 여러번 설치를 했었던 것 같고,, 그나마 최근에 집에서 virtual box를 이용해서 linux를 설치할때도.. 적절한 linux 버전과.. iso를 찾아서 설치하고,, 또... window 내에서 ubunte를 설치를 하는 경우에도 window 버전이라던지... 생각대로 한번에 되었던 적은 없었던 것 같다...)

한 대의 컴퓨터 안에서 각각의 앱을 실행시키고, 각각의 앱은 격리된 환경에서 실행.
이때, 운영체제가 설치된 컴퓨터를 주인이라는 뜻에서 Host라고 부르고, host에서 실행되는 각각의 격리된 실행 환경을 Container라고 부른다. 각 Container 에는 운영체제 전체가 설치된 것이 아니라, 앱을 실행시키기 위한 필요 라이브러리와 실행파일들로 구성되어 있음.
이렇게 실행되면 얼마나 좋을까?
1. 이미 존재하는 운영체제를 공유하니까 무엇인가를 설치할 필요가 없고
2. 운영체제가 하나니까 속도가 느려지지도 않는다
3. 운영체제를 다시 설치할 필요가 없으니 시간을 절약할 수 있고
4. 저장장치의 용량도 아낄 수 있다
Linux OS 에는 이런 앱 실행 방법이 내장되어 있는데, 이러한 기술을 Contianer 라고 부르고, Container 기술을 이용해서 이런 걸 쉽게 해주는 소프트웨어가 대표적으로 Docker 이다.
Docker : 부두에서 컨테이너를 다루는 노동자들을 의미
2. Docker 설치
Docker와 가은 Container 기술은 Linux OS의 기술임
- Docker 위에서 돌아가는 Container 그리고 Container 안에서 돌아가는 앱들은 Linux OS에서 돌아가는 App 임

설치는 아래 링크를 통해서 본인의 운영체제에 맞게 설치하면 된다.
https://docs.docker.com/get-docker/
Get Docker
Download and install Docker on the platform of your choice, including Mac, Linux, or Windows.
docs.docker.com
3. 이미지 Pull
아래 사진은 Docker에 대해서 이해하기 쉽게 비교한 사진이다.
왼쪽은 우리가 어떤 프로그램을 설치하고 실행시키는 일련의 과정을 도식화한 것이고,
오른쪽은 Docker에서 이미지를 다운받고, 실행시키는 일련의 과정을 도식화한 것이다.
즉, 우리가 어떤 프로그램을 다운 받는다. (Docker에서는 그것을 image 라고 부른다.)
프로그램을 실행시키면 Process 가 동작하는데, Docker에서는 그것을 Container라고 부른다.

실제로 docker 명령어 혹은 다운 받은 Docker Desktop에서 이미지를 Pull 하는 방법은 다음과 같다.
httpd를 레지스트리로 부터 다운로드 받으려면 아래 명령어를 cmd에서 입력한다.
$ docker pull httpd
이미지를 잘 다운로드 받았는 지 확인하려면 다음 명령어를 입력
$ docker images
REPOSITORY에 httpd가 보이면 잘 다운로드 받은 것이다.

이는 docker desktop에서도 확인가능하다.

4, Container Run
Docker 명령어 run 을 통해 Image를 실행시켜서 컨테이너를 만들 수 있다.
https://docs.docker.com/engine/reference/commandline/run/
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- IMAGE: 실행시키고 싶은 이미지의 이름
- [COMMAND]: 컨테이너 안에서 실행시키고 싶은 명령어
- []는 생략해도 되는 내용
httpd를 실행시켜 컨테이너를 만들고 싶으면 다음의 명령어를 입력하면 된다.
$ docker run httpd
실행시킨 컨테이너를 목록을 보고 싶은 경우
$ docker ps
하나의 이미지는 여러 개의 컨테이너를 만들 수 있음
$ docker run --name ws2 httpd
- --name은 컨테이너의 이름을 지정하는 옵션
- 컨테이너의 이름을 ws2로 지정
새로운 컨테이너가 만들어졌을 것임. 이를 확인하려면
$ docker ps
실행시킨 컨테이너를 끄고 싶을 때
$ docker stop ws2
아래의 명령어를 입력해보면 위에서 끈 컨테이너는 확인할 수 없음
$ docker ps
그렇다면 삭제가된걸까? 그렇진 않다. 아래의 명령어를 입력하면 stop시킨 ws2도 화면에 나타난다.
$ docker ps -a
stop 했다고 컨테이너를 삭제 시킨 건 아님
컨테이너를 다시 켜고 싶다면
$ docker start ws2
중지 시켰던 컨테이너를 다시 실행시킴
그러나 아까와는 다르게 로그가 뜨지 않음
log 명령어로 로그를 확인할 수 있다.
$ docker logs ws2
컨테이너를 삭제할 때
$ docker rm ws2
실행중인 컨테이너를 삭제하려 하면 에러가 발생한다.
실행중인 컨테이너는 바로 삭제할 수 없음.
컨테이너를 stop하고 rm해야 한다.
바로 삭제하고 싶으면
$ docker rm --force ws2
이미지를 지우고 싶으면
$ docker rmi httpd
5. Docker 네트워크
5-1. Docker가 없이 웹 서버를 사용하는 방법

두 대의 컴퓨터가 필요. 하나의 컴퓨터에는 브라우저, 다른 컴퓨터에는 웹 서버가 설치되어 있다.
웹 브라우저에서 주소를 입력하고 엔터를 누르면 웹 브라우저는 80번 포트로 example.com에 접속한다.
80번 포트에는 웹 서버가 대기중이기 때문에 웹 서버로 요청이 전달됨.
웹 서버는 파일 시스템의 지정된 경로에서 index.html을 찾음
index.html 파일을 읽어서 웹 브라우저에게 index.html을 전달한다.
5-2. Docker를 이용해서 웹 서버를 사용하는 방법

도커를 사용하면 웹 서버가 컨테이너에 설치됨.
컨테이너가 설치된 운영체제는 도커 Host라 부름. 하나의 도커 Host에는 여러 개의 도커 Container가 설치될 수 있음
컨테이너와 Host 모두 독립적인 실행 환경이기 때문에 각자 독립적인 포트와 파일 시스템을 가지고 있음
호스트와 컨테이너의 포트를 연결해주는 작업이 필요. 이를 포트 포워딩(port forwarding)이라 함.
$ docker run -p 80:80 httpd
- 앞의 80은 Host의 포트, 뒤의 80은 컨테이너의 포트
- Host의 80번으로 들어온 신호가 컨테이너의 80번 포트로 전송
6. 호스트와 컨테이너의 파일시스템 연결
docker 안의 파일을 직접 수정했었음
컨테이너 안에서 index.html 파일을 직접 수정했는 데 컨테이너가 사라지면 어렵게 작업한 내용이 물거품이 됨.

컨테이너의 /usr/local/apache2/htdocs/ 디렉토리와 host의 /Desktop/htdocs 디렉토리를 연결하고 host 쪽에서 수정이 일어났을 때 그것이 컨테이너 파일 시스템에 연동이 되면 컨테이너가 날라가도 소스코드가 host에 남아있기 때문에 보다 안전하게 개발할 수 있다. 파일 버전 관리도 용이함
7. Docker 기본 명령어
- docker build: Dockerfile을 사용해 이미지를 생성합니다.
- docker pull: 레지스트리에서 이미지를 다운로드합니다.
- docker run: 이미지를 기반으로 컨테이너를 생성하고 실행합니다.
- docker ps: 현재 실행 중인 컨테이너 목록을 표시합니다.
- docker stop: 실행 중인 컨테이너를 중지합니다.
- docker rm: 컨테이너를 삭제합니다.
- docker rmi: 이미지를 삭제합니다.
'Toy Project' 카테고리의 다른 글
[프로젝트명 : 미정] ETL 구축하기 - ② 데이터 수집 (0) | 2024.09.02 |
---|---|
[프로젝트명 : 미정] ETL 구축하기 - ① 데이터 수집 (1) | 2024.08.31 |