지난번 포스팅에서 도커로 만든 컨테이너를 활용해서 mysql db 서버를 간단하게 구축해보았다. 이번 포스팅에서는 도커를 조금 더 다양하게 사용하는것을 포스팅 해보려고 한다.
Nginx 는 웹 서버 소프트웨어로 주로 HTTP서버로사용된다. 그 외에도 리버스 프록시,로드밸런서 등의 역할을 하지만 해당 실습에서는 웹 서버 역할로 활용해 보겠다.
# 1. 80번 포트를 사용하는 컨테이너 생성
> docker run -it -p 80:80 --name web-test ubuntu:22.04
# 2. nginx 설치
> apt update
apt install nginx -y
위처럼 80번포트를 오픈한 web-test를 만든 후 nginx를 설치 및 활성화를 시켜주면, nginx 기본 구성화면으로 구성된 해당 ip주소로 접속할수있다.
이번에는 컨테이너 위에 jupyter 환경을 작게 구성하기 위해 미니콘다를 활용해보겠다.
# web-test3 컨테이너 생성
> docker run -it -p 81:80 --name web-test3 ubuntu:22.04
# 미니콘다 설치
> wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
sh Miniconda3-latest-Linux-x86_64.sh
# 콘다 초기화후 적용
> cd ~/miniconda3/bin
./conda init
source ~/.bashrc
# 쥬피터 설치 후 서버오픈
> conda install jupyter
jupyter notebook --ip=0.0.0.0 --port=80 --allow-root
컨테이너 80 내부포트에 쥬피터 서버를 연결시키고 호스트는 81번 포트로 접근을 한다. 즉 주소창에 ip:81 를 주소창에 입력하면 쥬피터 서버에 접근 가능하다.
Dockerfile을 만들고 명령어를 구성해 이미지로 빌드하면 더쉽게 서버 환경을 만들 수 있다. 먼저 docker라는 폴더를 만들고 그 폴더위 Dockerfile을 생성한 후 아래와 같이 내용을 구성한다.
이후 아래와 같은 명령어로 현재 Dockerfile 로 구성된 이미지를 만들고 이 이미지를 기반으로 컨테이너를 실행한다.
# 이미지로 빌드
docker build -t ict-img:0.1 .
# 이미지 기반으로 컨테이너 실행
docker run -itd --name ict0731 -v /home/ict/workspace:/workspace -p 8888:8888 ict-img:0.1
위 사진처럼 컨테이너는 정상적으로 작동하고 있고, 쥬피터 서버또한 잘 들어가지는것을 확인할 수 있다.
"도커(Docker)"에서 "볼륨(Volume)"은 컨테이너와 호스트 시스템 간의 데이터를 저장하고 공유하는 저장소 이다. 컨테이너 두개가 이 저장소를 참조하게끔 해서 파일을 공유하는것을 간단하게 구현해보겠다.
# 1. 볼륨 만들기
docker volume create --name myvol
# 2. 컨테이너 만들기 ubuntu:22.04이미지 기반 컨테이너 2개 만들어서 myvol과 마운트
docker run -it --name vol-test1 -v myvol:/root ubuntu:22.04
docker run -it --name vol-test2 -v myvol:/root ubuntu:22.04
위 코드를 입력하면 myvol 이름의 볼륨과 vol-test1,vol-test2 컨테이너가 만들어진다.
위 사진처럼 'hi' 라는 텍스트가 담긴 test.txt 파일을 vol-test1 컨테이너에서 만들고 vol-test2 컨테이너에서 이 내용을 조회해보면 파일이 나오는것을 확인할 수 있다. myvol 볼륨을 참고하는 두 컨테이너끼리 파일 공유가 가능하다.
LB는 클라이언트 접속량이 많은 경우 이를 여러 대의 동일 웹 서버 등에 분산시켜 요청 처리를 하는 방법으로 부하 분산을 위한 필수 네트워크 기술이다.
php와 apache로 기본 웹 서버를 구성하고 Nginx는 클라이언트 요청을 각 컨테이너로 전달해주는 proxy서버 역할을 한다. 구조는 위와같고, 구현을 하기 위해 Dockerfile과 php파일을 아래와 같이 구성한다.
이후 아래와 같이 도커를 실행해 총 3개의 컨테이너를 만들어주고 , nginx.conf 파일을 수정 후 재시작 해준다.
# 도커 실행
docker run -itd -p 5001:80 \ # 포트 80에 매핑
-h nginx-lb01 \ # 컨테이너 호스트명 nginx-lb01
-v ./lb01:/var/log/apache2 \ # lb01 디렉토리 마운트
-e SERVER_PORT=5001 \ # 환경 변수 설정
--name=nginx-lb01 \ # 컨테이너 이름을 nginx-lobl
phpserver:0.1 # 실행할 도커 이미지 이름
docker run -itd -p 5002:80 \
-h nginx-lb02 \
-v ./lb02:/var/log/apache2 \
-e SERVER_PORT=5002 \
--name=nginx-lb02 \
phpserver:0.1
docker run -itd -p 5003:80 \
-h nginx-lb03 \
-v ./lb03:/var/log/apache2 \
-e SERVER_PORT=5003 \
--name=nginx-lb03 \
phpserver:0.1
# sudo vim /etc/nginx/nginx.conf)
http {
upstream backend-lb {
server 127.0.0.1:5001;
server 127.0.0.1:5002;
server 127.0.0.1:5003;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
# 연결 프락시 정보
location / {
proxy_pass http://backend-lb;
}
}
}
# nginx 재시작
sudo service nginx restart
그러면 아래 처럼 정상적으로 구현되는것을 볼 수 있다.
이번 포스팅에서는 Docker 와 nginx를 활용해 간단한 웹서버 , 미니콘다 서버 , lb 구성 등을 구현해 보았다. 다음 포스팅에서는 이제 k8s를 설치하고 기본적으로 사용해보는 내용들을 다뤄볼 예정이다.