현재 ec2 상황은 아래의 모든게 만족됐다고 가정하자.

더보기

 

목표는 다음과 같다. 

ㅋㅋ발그림ㅋㅋㅋ엌ㅋㅋㅋㅋ..

젠킨스는 나중에 따로 정리하겠다. (여기서 칠 명령어를 젠킨스에 입력해놓으면 해주니까..)

 

backend나 frontend나 큰 흐름은 아래와 같다.

(window나 맥 등 로컬에 도커데스크탑을 설치하자... 어렵지 않으니 생략. )

1. 로컬에서 도커 이미지 빌드

2. 로컬에서 도커 이미지를 도커 허브에 푸시

3. ec2에서 도커이미지를 풀

4. ec2에서 도커이미지 실행

 

frontend를 도커를 통해 ec2에 띄워보자

위의 그림을 보듯 frontend를 띄운 도커는 nginx가 필요하다. nginx를 base image로 받아오고, 받아온 nginx의 기존 설정을 내가 원하는대로 바꿔야한다. nginx 설정파일부터 만들어보자. 

어디다 만들든 크게 상관은 없지만 밑에 작성한 Dockerfile을 그대로 복사해서 사용할거라면 프로젝트의 프론트엔드 폴더 최상단에 만들자.

1. 로컬에서 프로젝트 프론트엔드 폴더의 최상단에 default.conf 작성 (nginx 설정파일)

#default.conf
server{
    listen 80;
    location / { 
        root /app/build;
	index index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
}



2. 로컬에서 프로젝트 프론트엔드 폴더의 최상단에 Dockerfile을 작성한다. 

FROM nginx #base이미지로 nginx를 받아온다.
RUN mkdir /app #컨테이너 내부에 app이라는 폴더를 만든다.
WORKDIR /app #워크디렉토리를 설정한다.
RUN mkdir ./build  #컨테이너 내부에 build라는 폴더를 생성한다.
ADD ./build ./build #프로젝트 폴더에 있는 build라는 폴더를 컨테이너 내부에 생성한 build 폴더에 복사한다.
RUN rm /etc/nginx/conf.d/default.conf #받아온 nginx 내부에 기존 설정값을 제거한다. 
COPY ./default.conf /etc/nginx/conf.d #만들어둔 nginx 설정값을 받아온 nginx의 설정값으로 대체한다.
EXPOSE 80 #80포트 사용
CMD ["nginx","-g", "daemon off;"] #nginx 실행

3. npm run build를 통해 css, html등 정적인 파일을 생성한다. 

프론트엔드 폴더 상단에서 

npm run build

4. docker image 빌드하기 

docker build --tag frontend .

뒤에 . 은 현재 폴더의 dockerfile을 빌드하겠다는 뜻으로 빌드하려는 dockerfile의 경로를 입력하자.

tag는 생성되는 이미지의 이름과 태그를 설정할것이다. 

이름만 설정할 경우 자동으로 tag는 latest로 설정된다.

frontend 라는 이미지가 빌드 된걸 확인해보려면

$ docker images

명령어로 확인할 수 있다.

 

5. docker 이미지 푸시하기 

docker tag [ image name or Tag ] [ docker hub ID 혹은 private registry ip:port ]/[ push image이름 ]

ex) docker tag frontend jodong2/frontend

를 통해 태그를 달고, 아래와 같은 명령어로 docker hub에 푸시하자.

docker push [이미지 이름:태그]

ex) docker push jodong2/frontend

 

6. ec2에서 docker image pull 받기

이전에 mysql을 설치했던 과정과 똑같다.

ec2의 ubuntu환경에서 다음 명령어를 실행하자.

$ docker pull [ docker hub ID 혹은 private registry ip:port ]/[ push image이름 ]

ex) docker pull jodong2/frontend

 

7.ec2에서 docker image 실행하기 

위의 목표 예시 발 그림을 보면 frontend는 host 의 xxxx port를 사용할 것이다. 

frontend의 nginx 설정 파일을 보면 80 포트를 받고 있다.

그러므로 -p옵션을 통해 xxxx port와 컨테이너의 80포트를 연결해야한다. 

$ docker run -d --name {container name} -p xxxx:80 [ docker hub ID 혹은 private registry ip:port ]/[ push image이름 ]

ex) docker run -d --name front -p xxxx:80 jodong2/front

 

8. ec2에서 도커 컨테이너 확인하기 

docker ps

 

 

 

Backend는 다음 포스팅에 :)

 


 

 

왜 Front는 nginx가 하나 더 필요할까?

spring의 경우 was로 tomcat이 있기 때문에 상관없지만 프론트의 경우 build된 정적파일을 처리할 수 서버가 따로 없다. ec2에 nginx가 있지만 도커를 활용해 띄운다면 내부에 별도의 서버가 필요하고 이때 proxy server로 nginx를 활용한 것이다.

 

 

왜 도커를 사용하여 띄울까?

docker 안쓰고 서버에다가 버전에 맞는 jdk설치하고 jar 파일 가져와서 실행하면 되는거 아니야?

된다. 불편할 뿐이다. 많고 많은 불편한 이유가 있겠지만 나에게 와닿은 예시는 수평확장에 대한 예시였다. 

꼭 수평확장 문제뿐만이 아니니 공부한다는 생각으로라도 도커를 사용해보자.

 

이전에 부스트캠프 ai tech에서 했던 프로젝트 중에 팀원들 모두 합쳐서 6대의 서버가 팀에 부여됐다. 

모두 동일한 작업을 처음부터 진행해가며 환경이 얼추 비슷했고 마지막엔 거의 비슷한 환경이 구성됐다. 근데 만약 도커를 사용하지 않았고, 하나의 서버에 openCV 설치가 제대로 되지 않았으며, 해당 library를 사용하는 함수를 호출한다면, 그 서버는 에러를 보여줄 것이다. 16.6%확률로 실패하는 기능이 있다면 가용성 측면에서 말도 안되는 서비스고 이걸 테스트하기 위해서 6대의 서버를 전부 테스트해야한다. 불편할게 확실하니 이거 확인하는 툴도 이미 만들어져있겠지만.... 7번째 서버가 추가되면 모든 환경을 처음부터 다시 구성해야한다. 

하지만 도커는 같은 환경을 보장한다. 7번째 8번째 서버가 추가된다해도, 손쉽게 똑같은 환경에서 서비스를 동작시킬 수 있다. 

 

금속활자로 책을 순식간에 동일한 컨디션의 동일한 모양으로 찍어낼 수 있는데 한 글자씩 붓으로 적고 있진 않은가 생각해보자 ㅠ

 

 

아래 블로그에 정리가 너무 잘돼있다. 저장해놓고 정독해야지.

https://www.44bits.io/ko/post/why-should-i-use-docker-container

 

왜 굳이 도커(컨테이너)를 써야 하나요? - 컨테이너를 사용해야 하는 이유

컨테이너는 서버 애플리케이션을 배포하고 서버를 운영하는 표준적인 기술이 되어가고 있습니다. 하지만 처음 사용해본다면 그 장점이 잘 와닿지 않을 수도 있습니다. 왜 굳이 도커 컨테이너를

www.44bits.io

 

2023.02.11 - [Web/Dev(ML)Ops] - ubuntu에서 도커 설치하기

 

ubuntu에서 도커 설치하기

$ sudo apt-get update apt-get update는 설치된 패키지를 업데이트하는 것이 아닌 설치 가능한 패키지 리스트를 업데이트 하는 것이다. repository 설정 $ sudo apt-get install ca-certificates curl gnupg lsb-release $ curl -f

dongineer.tistory.com

docker는 설치 됐다고 가정.

 

mysql 설치

원하는 버전을 8.0.30부분에 넣어준다. 기입하지 않으면 최신버전 이미지 가져옴.

$ sudo docker pull mysql:8.0.30

mysql 실행

$ sudo docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD={비밀번호} --name {컨테이너 이름} mysql:8.0.30 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  • d : (detach) daemon으로 실행
    • 백그라운드에서 컨테이너 실행, 
  • p : HOST OS의 3306포트 : 컨테이너 내부 3306 포트
    • 호스트와 컨테이너 포트포워딩
  • e : MYSQL_ROOT_PASSWORD 설정.
  • name : 컨테이너 이름
  • mysql:8.0.30 : 이미지 이름

mysql 컨테이너 확인

$ sudo docker exec -it {컨테이너 이름} bash 
$ mysql -u root -p 

password : {설정한 MYSQL_ROOT_PASSWORD 입력}
  • -i, --interactive
    • 표준 입력(stdin)을 활성화하며, 컨테이너와 연결되어 있지 않더라도 표준 입력을 유지
    • 보통 이 옵션을 사용하여 Bash 에 명령을 입력
  • -t, --tty
    • TTY 모드(pseudo-TTY)를 사용
    • Bash를 사용하려면 이 옵션을 설정
    • 이 옵션을 설정하지 않으면 명령을 입력할 수는 있지만, 셸이 표시되지 않음

 

Nginx 설치

$ sudo apt install Nginx 

certbot을 통한 인증서 발급

$ apt-get install python3-certbot-nginx 
$ certbot certonly --nginx -d {myDomainName} 

/etc/letsencrypt/live/{myDomainName}/

  • cert.pem
  • chain.pem
  • fullchain.pem
  • privkey.pem

4개의 파일이 존재하는지 확인

Nginx

$ touch /etc/nginx/conf.d/{원하는 이름}.conf
$ sudo vim /etc/nginx/conf.d/{원하는 이름}.conf
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/html;
    server_name example.com www.example.com;
}
$ nginx -t
$ sudo service nginx restart

 

$ sudo vim /etc/nginx/sites-available/{원하는 이름}.conf

server {
  listen 80; #80 port(HTTP)로 받을때
  server_name <도메인 주소>; # 없을경우 localhost
  return 301 https://<도메인 주소>$request_uri;
}
server {
  listen 443 ssl http;
  server_name <도메인 주소>;

  # ssl 인증서 적용하기
  ssl_certificate /etc/letsencrypt/live/<도메인 주소>/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/<도메인 주소>/privkey.pem;

  location / {
    proxy_pass http://localhost:3000;
  }

  location /api { # location 이후 특정 url을 처리하는 방법을 정의
    proxy_pass http://localhost:8081; # Request에 대해 어디로 리다이렉트하는지
    proxy_redirect off;
    charset utf-8;

    proxy_http_version 1.1;
  }
}

location, proxy_pass에서 각 마지막 위치의 슬래쉬 여부에 따라 꼬일 수 있으니 파악하고 사용하기.
~^ 등의 표현식 제공

sites-enabled에 심볼릭 링크 생성

$ sudo ln -s /etc/nginx/sites-available/{원하는 이름}.conf /etc/nginx/sites-enabled

테스트 후 실행

$ sudo nginx -t

$ sudo service nginx start
# 설정을 변경했다면 꼭 sudo service nginx restart를 진행해주자...

https://docs.openvidu.io/en/2.19.0/deployment/ce/on-premises/

 

OpenVidu Docs

OpenVidu is deployed in production as a set of Docker containers managed with Docker Compose. You can deploy OpenVidu in any modern Linux distribution. You need root permissions to deploy OpenVidu. The recommended folder to install OpenVidu is /opt. Every

docs.openvidu.io

{} 내부에 있는 부분은 상황에 맞게 적어주세요.

 

$ sudo su
$ cd /opt
$ curl https://s3-eu-west-1.amazonaws.com/aws.openvidu.io/install_openvidu_latest.sh | bash

# latest를 원하지 않는다면 원하는 버전 latest자리에 기입
$ cd /opt/openvidu
$ vim .env

.env

 

DOMAIN_OR_PUBLIC_IP={myDomainName} #개인의 발급 받은 domain이 있다면 적어주자
OPENVIDU_SECRET={mySecret} #뭘 적든 자유
# CERTIFICATE_TYPE의 경우 letsencrypt를 통해 인증 받았다면 letsencrypt를 적고 밑에 이메일을 적어주자.
HTTP_PORT= {사용가능한 포트}
HTTPS_PORT= {사용가능한 포트}
포트 번호를 설정하는 부분이 있는데 사용가능한 포트를 기입하고 저장하자.
$ ./openvidu start

$ # = /opt/openvidu/openvidu start
실행 후 ctrl+c를 통해 백그라운드에서 실행할 수 있다. 

실행 후 브라우저에서 {기입했던 myDomanName}:{기입했던 사용가능한 포트}로 확인할 수 있다. 
$ ./openvidu stop

 

 

 

$ sudo apt-get update

apt-get update는 설치된 패키지를 업데이트하는 것이 아닌 설치 가능한 패키지 리스트를 업데이트 하는 것이다.

repository 설정

$ sudo apt-get install ca-certificates curl gnupg lsb-release

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Docker Engine 설치

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

docker community edition, docker clie, containerd.io 설치

 

http://containerd.io란?

설치 확인

$ docker --version

Docker-compose 설치

$ sudo apt install jq

jq란? 리눅스에서 .json파일의 내용을 검색할 때 사용하는 툴.

$ VERSION=$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | jq .name -r)

$ DESTINATION=/usr/local/bin/docker-compose

$ sudo curl -L https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-$(uname -s)-$(uname -m) -o $DESTINATION

$ sudo chmod 755 $DESTINATION

설치 확인

$ docker-compose -v

+ Recent posts