728x90
반응형

1. 프로젝트를 만든다.

$ django-admin startproject apiServer

 

2. settings.py 파일에 rest_framework 를 추가해준다.

settings.py

ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
]

 

3. 새 마이그레이션을 생성하고 슈퍼유저를 생성해준다.

$ python3 manage.py makemigrations
$ python3 manage.py migrate
$ python3 manage.py createsuperuser

 

4. 앱을 하나 만들어준다. ( 이름은 상관없습니다. )

$ python3 manage.py startapp chwideukapp

 

5. apiServer 폴더 안 settings.py 에 만든 앱을 추가해준다.

/apiServer/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'chwideukapp'
]

 

6. 새로 만든 앱의 models.py 파일을 수정해준다.

 

/chwideukapp/models.py

from django.db import models


class ChwideukModel(models.Model):
    title = models.CharField(max_length=70, default='')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

 

7. 새 마이그레이션을 생성한다.

$ python3 manage.py makemigrations
$ python3 manage.py migrate

 

8. serializers.py 파일을 만든다.

/chwideukapp/serializers.py

from rest_framework import serializers
from .models import ChwideukModel


class ChwideukSerializer(serializers.ModelSerializer):
    class Meta:
        model = ChwideukModel
        fields = ['title']

 

9. views.py 파일을 수정해준다. 

from rest_framework.views import APIView
from rest_framework.response import Response


class ChwideukRouter(APIView):
    def get(self, request):
        return Response({'success': True})

    def post(self, request):
        return Response({'success': False})

 

10. apiServer 폴더의 urls.py에 방금 만든 라우터를 추가해준다.

from django.contrib import admin
from django.urls import include, path

from chwideukapp.views import ChwideukRouter


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/chwideuk/', ChwideukRouter.as_view())
]

 

11. 서버를 시작하고 postman으로 실험해보았다. ( 서버 포트는 8000, 로컬 포트는 8001 입니다 )

 

이제 API 서버와 라우터는 만들었으니 다음 포스트에서는 Selenium을 사용해보겠다.

728x90
반응형
728x90
반응형

웹 크롤러의 종류는 많다고 한다. 나는 그 중 동적 클롤러인 Selenium을 택했다.

정적 크롤링은 말 그대로 정적인 페이지에서 사용 가능하며 동적 크롤링은 로그인 등 동적으로 데이터가 바뀌는 사이트에 적합하다.

 

전 포스트에서 REST API 를 만들 땐 맥북에 파이참으로 만들었지만 이번엔 AWS에 서버를 만들고 VSCode 로 원격접속해서 

다시 처음부터 만들어보기로 했다.

 

아래는 무료 서버를 진짜 빠르고 간단하게 만드는 방법 

 

AWS LightSail(1) - 인스턴스 생성하기

정말 빠르게 AWS LightSail로 인스턴스를 만들어보자. Lightsail에 관하여 https://lightsail.aws.amazon.com/ls/docs/ko_kr/all 1. aws 사이트에 회원가입, 로그인을 하고 Lightsail 서버를 찾아서 들어간다. 2...

typo.tistory.com

 

Selenium은 크롬 브라우저 기반으로 실행되기 때문에 크롬과 크롬 드라이버가 필요하다. 

1. 필요한 패키지를 설치한다.

$ sudo apt-get update
$ sudo apt-get install -y unzip xvfb libxi6 libgconf-2-4

 

자바를 8버전 이상으로 설치한다.

$ sudo apt-get install default-jdk

 

2. 크롬을 설치한다.

$ sudo curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add
$ sudo echo "deb [arch=amd64]  http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list
$ sudo apt-get -y update
$ sudo apt-get -y install google-chrome-stable

 

 

3. 내 크롬의 버전을 확인하고 아래 사이트에 들어가서 크롬드라이버의 버전을 확인한다.

$ google-chrome --version

 

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 104, please download ChromeDriver 104.0.5112.20 If you are using Chrome version 103, please download ChromeDriver 103.0.5060.53 If you are using Chrome version 102, please download ChromeDriver 102.0.5005.61

chromedriver.chromium.org

 

4. 맨 앞 숫자가 크롬 버전과 같은지 확인한 후 크롬 드라이버를 설치하고 압축을 해제한다.

$ wget https://chromedriver.storage.googleapis.com/[버전입력]/chromedriver_linux64.zip
$ unzip chromedriver_linux64.zip

 

5. 시스템 구성을 위해 크롬 드라이버를 이동 및 권한을 부여해준다.

$ sudo mv chromedriver /usr/bin/chromedriver
$ sudo chown root:root /usr/bin/chromedriver
$ sudo chmod +x /usr/bin/chromedriver

 

6. Selenium 서버를 설치 후 실행한다.

$ wget https://selenium-release.storage.googleapis.com/3.141/selenium-server-standalone-3.141.0.jar
$ xvfb-run java -Dwebdriver.chrome.driver=/usr/bin/chromedriver -jar selenium-server-standalone-3.141.0.jar

 

7. 파이썬을 설치한다. 

$ sudo apt-get install python3

 

8. 파이썬 가상환경을 위해 패키지를 설치 후 가상환경을 만들어준다.

$ apt-get install python3-venv
$ python3 -m venv example

 

9. 장고와 djangorestframework를 설치한다.

$ apt install python3-pip
$ pip3 install django
$ pip3 install djangorestframework markdown

 

 

728x90
반응형
728x90
반응형

파이썬 웹 크롤러가 종류가 많다고 한다. 나는 그 중에 Scrapy를 선택했다.

자세한 내용은 아래 사이트에 들어가보면 볼 수 있다.

 

https://docs.scrapy.org/en/latest/#

 

Scrapy 2.6 documentation — Scrapy 2.6.1 documentation

© Copyright 2008–2022, Scrapy developers. Revision 23537a0f. Last updated on May 26, 2022.

docs.scrapy.org

 

1. 먼저 scrapy 를 설치한다.

$ pip install scrapy

 

2. 스크래피 프로젝트를 생성한다.

$ scrapy startproject scrapy_project

 

3. spiders 폴더 안에 파이썬 파일을 만들어준다.

scrapy_project/scrapy_project/spiders/example.py

import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    start_urls = [
        'http://www.example.com/'
    ]

    def parse(self, response):
        url = response.url
        title = response.css('h1::text').get()
        print(f'URL is: {url}')
        print(f'Title is: {title}')

 

4. spider 폴더 경로로 이동하여 아래 명령어를 실행해보자.

$ scrapy runspider example.py

 

5. 결과를 확인한다.

 

6. 추가로 settings.py 파일에 아래 내용을 추가하면 좋다.

CONCURRENT_REQUESTS = 1    
DOWNLOAD_DELAY = 0.25  # 250ms 기다림 
HTTPCACHE_ENABLED = True  # cache 기능 사용
728x90
반응형
728x90
반응형

이번엔 우리가 새로운 라우터를 만들어보자. 아래 명령어 한 줄로 손쉽게 앱을 하나 만들 수 있다.

$ python manage.py startapp api_server

 

 

1. 먼저 Model을 수정해준다.

/api_server/models.py

from django.db import models


class APIServer(models.Model):
    title = models.CharField(max_length=70, default='')
    link = models.URLField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

 

2 pythonProject 폴더 안 settings.py에 api_server 앱을 추가해준다.

/pythonProject/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'api_server'
]

 

3. 새 마이그레이션을 생성한다.

$ python manage.py makemigrations
$ python manage.py migrate

 

4. Serializer 세팅을 위해 아래와같이 파일을 만든다.

/api_server/serializer.py

from rest_framework import serializers
from .models import APIServer


class APIServerSerializer(serializers.ModelSerializer):
    class Meta:
        model = APIServer
        fields = ['title']
Serializer 는 queryset 과 model instance 같은 것들을 쉽게  JSON 또는 XML 의 데이터 형태로 렌더링 할 수 있게 해줍니다. 우리는 APIServer 모델을 serialize 해줘야 하기 때문에 ModelSerializer를 사용합니다.

 

5. views 파일을 수정해준다.

/api_server/views.py

from rest_framework import viewsets
from .serializers import APIServerSerializer
from .models import APIServer


class APIServerRouter(viewsets.ModelViewSet):
    queryset = APIServer.objects.all()
    serializer_class = APIServerSerializer

 

rest_framework 의 viewset 을 사용하면 CRUD 로직을 짜지 않아도 사용 가능하게 해준다.

 

6. pythonProject 폴더의 urls.py 파일을 수정해준다.

/pythonProject/urls.py

from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from api_server.views import APIServerRouter

router = routers.DefaultRouter()
router.register('apiserver', APIServerRouter)

urlpatterns = [
    path('admin/', admin.site.urls),

    path('', include(router.urls)),

    path('api-auth/', include('rest_framework.urls'))
]

 

7. 서버를 시작해 8000번 포트를 켜보자.

 

8. /apiserver 경로로 들어가보면 GET 과 POST 메소드를 GUI로 사용할 수 있다.

(GET, POST, GET/[id], PUT/[id], DELETE/[id])

728x90
반응형
728x90
반응형

자세한 내용은 아래 사이트에서 확인할 수 있다.

https://www.django-rest-framework.org/

 

Home - Django REST framework

 

www.django-rest-framework.org

 

1. 필요한 패키지를 설치한다.

$ pip install djangorestframework markdown

 

2. settings.py 파일과 urls.py 파일을 수정해준다.

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
]

 

urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),

    path('api-auth/', include('rest_framework.urls'))
]

 

3. 다시 파이썬을 실행해주고 아래 주소로 가보자.

 

/api-auth/ 로 가보면 djangorestframework 에서 지원해주는 login, logout 기능이 있다는 것을 확인할 수 있다.

이번엔 login 경로까지 가보자.

 

 

이렇게 화면이 뜨는 것을 볼 수 있다.

 

/admin 경로로 들어가면 아래와 같은 화면이 뜨는 것도 볼 수 있는데

아래 명령어로 슈퍼유저를 생성 후 비밀번호를 설정 한 후에 들어갈 수 있다.

$ python manage.py createsuperuser

 

혹시나 비밀번호를 잊어버린 경우 비밀번호를 초기화 해주자

$ python manage.py cangepassword admin

 

다시 admin으로 들어가서 로그인을 해보면

이렇게 성공적으로 로그인된 화면을 볼 수 있다.

728x90
반응형
728x90
반응형

웹 스크래핑 전용 api 서버를 만들고 싶어졌다.

자바스크립트보다는 파이썬이 웹 스크래핑에 유용하다 하여 Django 서버를 만들게 되었다.

 

웹 크롤링과 웹 스크래핑의 차이점은?
웹 크롤링과 웹 스크래핑은 모두 정보를 추출해온다는 데서는 공통점을 지닙니다.
하지만 '타켓 웹 페이지의 유무'와 '중복 제거(deduplication)의 실행 여부'에서 차이가 납니다.
웹 크롤링은 특정 웹 페이지를 목표로 하지 않습니다. 일단 탐색부터 하고, 정보를 가져오죠. '선탐색 후추출'입니다. 반면 웹 스크래핑을 할 때는 목표로 하는 특정 웹페이지가 있습니다.우리가 원하는 정보를 어디서 가져올지 타겟이 분명하고, 그 타겟에서 정보를 가져오죠. 그래서 '선결정 후추출'입니다.
또, 웹 크롤링에서는 중복 제거가 필수적입니다. 중복되거나 불필요한 정보를 가져와서 분류를 더 어렵게 할 필요는 없으니까요. 도서관의 책이 개별적으로 구분되는 색인이 있는 것처럼 웹 크롤링도 수집한 웹 페이지가 중복되지 않도록 서로 다른 색인을 남깁니다. 그래서 웹 크롤링을 웹 인덱싱(web indexing)이라고도 부릅니다.
반면 웹 스크래핑에서는 중복 제거가 필수는 아닙니다. 중복된 정보를 가지고 있을 필요는 없지만, 그렇다고 꼭 필수적으로 하는 일도 아니죠.

 

1. 파이썬을 설치한다.

https://www.python.org/downloads/ 

 

Download Python

The official home of the Python Programming Language

www.python.org

 

2. 파이썬 개발 환경을 위해 파이참을 설치한다.

https://www.jetbrains.com/ko-kr/pycharm/download/#section=mac

 

다운로드 PyCharm: JetBrains가 만든 전문 개발자용 Python IDE

 

www.jetbrains.com

 

3. 파이참에 New Project 를 클릭해서 프로젝트를 만들어준다.

 

4. 터미널에서 django를 설치한다.

$ pip install django

 

5. django-admin 명령어로 django 프로젝트를 만들어준다.

$ django-admin startproject apiServer .

 

6. 아래 명령어로 서버를 실행해본다.

$ python manage.py runserver

 

8000 포트에 서버가 작동하고 있는 것을 확인할 수 있다. 아래 url을 눌러보면

 

 

이렇게 잘 뜨는 것을 확인할 수 있다.

728x90
반응형
728x90
반응형

Let's Encrypt로 받는 인증은 90일에 한 번씩 갱신을 해주어야 한다.

 

Let's Encrypt로 인증받는 방법은 4가지가 있다.

  1. webroot : 사이트 디렉토리 내에 인증서 유효성을 확인할 수 있는 파일을 업로드하여 인증서를 발급하는 방법
    . 실제 작동하고 있는 웹서버의 특정 데렉토리의 특정 파일 쓰기 작업을 통해서 인증
    . 이 방식의 장점은 nginx를 중단시킬 필요가 없음.
    . 이 방법의 단점은 인증 명령에 하나의 도메인 인증서만 발급 가능
  2. 웹서버
    . Nginx나 아파치와 같은 웹서버에서 직접 SSL 인증을 실시하고 웹서버에 맞는 SSL세팅값을 부여
    . 발급이나 갱신을 위해 웹서버를 중단시킬 필요가 없음
    . 인증서 갱신 시 상황에 맞게 세팅을 자동으로 업데이트
    . 사용자가 세팅을 변경할 수 있지만 자동 업데이트 시 반영되지는 않음
  3. Standalone : 사이트 작동을 멈추고 이 사이트의 네크워킹을 이용해 사이트 유효성을 확인해 Let’s Encrypt SSL 인증서를 발급하는 방식
    . 80포트로 가상 staandalone 웹서버를 띄워 인증서를 발급
    . 이 방식은 동시에 여러 도메인을 발급 받을 수 있음
    . 그렇지만 인증서 발급 전에 Nginx를 중단하고 발급 완료 후 다시 Nginx를 시작해야 함
  4. DNS : 도메인을 쿼리해 확인되는 TXT 레코드로 사이트 유효성을 확인하는 방법
    . 와일드 카드 방식으로 인증서를 발급 가능
    . 이 방법은 당연하게도 서버 관리자가 도메인 DNS를 관리/수정할 수 있어야 하며
    . 인증서 갱신 시마다 DNS에서 TXT값을 변경해야 하므로
    외부에서 TXT 레코드를 입력할 수 있도록 DNS가 API를 제공하는 경우만 갱신 과정을 자동으로 처리(클라우두플레어 API가 대표적인 사례)

여기서 설명할 방법은 webroot를 이용한 방법이다.

 

1. certbot ( letsencrypt ) 설치해준다

$ sudo apt-get install certbot

 

2. 폴더를 만들어준다. 

$ mkdir -p /var/www/letsencrypt/.well-known/acme-challenge

 

3. 아래 명령어로 파일을 만들고 내용을 추가해준다.

$ vi /etc/nginx/snippets/letsencrypt.conf

letsencrypt.conf

location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}

4. nginx 를 설정해준다. 

https://typo.tistory.com/entry/nginx-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EB%B0%A9%ED%99%94%EB%B2%BD-%EA%B5%AC%EC%84%B1

 

nginx 설치 및 방화벽 구성(http)

1. 먼저 업데이트를 실행 후 nginx를 설치해준다. $sudo apt update $sudo apt install nginx 2. 방화벽을 설정해준다. $sudo ufw allow 'Nginx Full' $sudo ufw status 3. 설정 파일을 확인해준다. $vi /etc/ngin..

typo.tistory.com

 

5. nginx 설정에 아래와 같이 include를 추가해준다.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    server_name [도메인이름];

    include /etc/nginx/snippets/letsencrypt.conf;

    location / {
        return 301 https://[도메인이름]$request_uri;
        expires epoch;
        # return 301 아래에 expires epoch; 을 붙여주는 것은 301 리다이렉트가 캐싱되지 않도록 하기 위함
    }

}

 

6. 서버를 킨 상태에서 인증서를 발급한다.

$ certbot certonly --webroot --webroot-path=/var/www/letsencrypt  -d 사이트명

 

결과화면

 

7. 위 사진을 보고  pem의 위치를 알아두고 nginx 설정파일에 다음과 같이 추가해준다.

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name [도메인이름];

        location / {
                proxy_pass http://localhost:3000;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
                return 301 https://[도메인이름]$request_uri;
                expires epoch;
                # return 301 아래에 expires epoch; 을 붙여주는 것은 301 리다이렉트가 캐싱되지 않도록 하기 위함
        }

}

server {

        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        server_name [도메인이름];

        include /etc/nginx/snippets/letsencrypt.conf;

        ssl_certificate /etc/letsencrypt/live/[도메인이름]/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/[도메인이름]/privkey.pem;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 1440m;
        ssl_buffer_size 8k;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_stapling on;
        ssl_stapling_verify on;

        access_log  /var/log/nginx/web.access.log;
        error_log /var/log/nginx/web.error.log;

        location / {
                proxy_pass http://localhost:3000;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }
}

 

도메인이 여러개일 경우 server를 여러개 만들어준다.

8. nginx 를 재시동 하고 서버를 켜보면 !!

$ sudo systemctl restart nginx

 

 

자물쇠가 잘 생긴 것을 볼 수 있다.

 

이외의 명령어들

 

- 인증서 남은 기간 확인

$ certbot certificates

 

- 제대로 갱신이 되는지 확인

$ certbot renew --dry-run

 

- 자동 갱신 명령어 입력

$ certbot renew

 

- 크론탭을 이용한 예약 명령어

$ vi /etc/crontab
0 0 1 * * /usr/bin/certbot renew --renew-hook="서비스재시작명령어"
728x90
반응형
728x90
반응형

1. 컨테이너를 배포할 때 주의할 점

  • 바인드마운트를 개발환경에서는 써도되지만 배포환경에서는 쓰면 안된다.
  • 컨테이너화된 앱의 개발 및 최종 제품 생산을 위해 react 빌드 단계 등 배포 되기 전에 코드를 최적화 하는 행위가 필요하다.
  • 다중 컨테이너 프로젝트를할 때 여러 호스트, 리모트 머신에 걸쳐 어떻게 분할해야되는지 알아야 한다.
  • 개발환경과 배포환경에서는 run 명령어의 플래그가 다르게 적용된다.

2. Dockerhub에 접속해서  repository를 만든다. 

 

3. 로컬 호스트 머신에 .dockerignore 파일을 추가한다.

/.dockerignore

node_modules
Dockerfile
*.pem

 

4. 로컬 호스트 머신에 Dockerfile 파일을 추가한다.

/Dockerfile

FROM node

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 80

 

5. 이미지를 빌드한다.

$ docker build -t node-dep-example .

 

6. 만든 이미지에 도커 허브에 올린 repository 이름과 같게끔 태그를 달아준다.

$ docker tag node-dep-example gsjung06/teepo-example-1

 

7.  Docker 에 로그인하여 이미지를 push 한다.

$ docker login
$ docker push gsjung06/teepo-example-1

 

 

8. 원격 서버에서 ( AWS 등 ) docker 를 설치하고 컨테이너를 실행 해준다. 

$ docker run -d --rm -p 80:80 gsjung06/teepo-example-1

 

 

 

728x90
반응형
728x90
반응형

1. Docker Compose 란?

  1. 'docker build'와 'docker run' 명령을 대체할 수 있는 도구
  2. Dockerfile을 대체하지 않는다. 함께 작동한다.
  3. 이미지나 컨테이너를 대체하지 않는다.
  4. 다수의 호스트에서 다중 컨테이너를 관리하는데는 적합하지 않다.

 

2. Docker Compose를 쓰는 이유?

기본적으로 터미널에서 도커 명령으로 할 수 있는 것들을 service(컨테이너) 로 관리할 수 있다.

  • 포트 정의
  • 환경변수 정의
  • 볼륨 정의
  • 네트워크 정의

 

3. 사용하기

프로젝트 루트 파일에 docker-compose.yaml 파일을 생성해준다.

 

 ( https://docs.docker.com/compose/compose-file 참조 )

 

/docker-compose.yaml

version: "3.8"
service:
	mongodb:
		# 이미지
		image: 'mongo'
        
		# 볼륨
		volumes:
			- data:/data/db
            
		# 환경변수
		environmnet:
			MONGO_USERNAME: max
            
		# 환경변수 파일일 경우
		env_file:
			- ./env/mongo.env
            
		# 네트워크
		networks:
			- goals-net
	backend:
    	
	frontend:

 

4. Linux에 Docker Compose 설치

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
$ docker-compose --version

 

5. Docker Compose up

아래 명령어를 입력하면 이미지를 빌드하고 컨테이너를 실행해준다.

-d 플래그를 붙여 detached 모드에서 실행할 수도 있다.

$ docker-compose up

 

6. Docker Compose down

아래 명령어를 입력하면 모든 컨테이너가 삭제되고 디폴트 네트워크와 모든 것이 종료된다.

-v 플래그를 추가해 볼륨도 삭제할 수 있다.

$ docker-compose down

 

 

7. Backend file, Frontend file 컴포징

version: "3.8"
service:
	mongodb:
    	...
	backend:
		
		# 이미지 빌드
		build: ./backend
		
		# 도커 파일 직접 명시할 때 ( 파일 이름이 Dockerfile이 아닐 때 )
		# build:
		#	context: ./backend
		#	dockerfile: Dockerfile
		#	args:	
		#		some-arg: 1
		
		# 포트지정
		ports:
			- '80:80'	
		
		# 볼륨지정		
		volumes:		
			- logs:/app/logs	
			- ./backend:/app	
			- /app/node_modules	
		
		# 환경 변수 파일	
		env_file:
			- ./env/backend.env
				
		# 의존성 추가
		depends_on				
			- mongodb
						
		
		
	frontend:
    
		# 이미지 빌드
		build: ./frontend
        
		# 포트지정
		ports:
			- '80:80'	

		# 볼륨지정		
		volumes:		
			- ./frontend/src:/app/src

		# it 플래그
		stdin_open: true
		tty: true
        
		# 의존성 추가
		depends_on
			- mongodb
728x90
반응형
728x90
반응형

1. Network 생성

$ docker network create goals-net

 

2. MongoDB 컨테이너 시작

$ docker run --name mongodb \
 -e MONGO_ROOT_USERNAME=root \ <- 몽고db 아이디
 -e MONGO_ROOT_PASSWORD=secret \ <- 몽고db 비밀번호
 -v data:/data/db \ <- 몽고db 바인드 마운트
 --rm \ <- 컨테이너 중지 시 삭제
 -d \ <- detached 모드
 --network goals-net \ <- 네트워크 활성화
 mongo

 

3. NodeJS 이미지 빌드

$ docker build -t goals-node .

 

4. NodeJS 컨테이너 시작

$ docker run --name goals-backend \
 -e MONGODB_USERNAME=max \ <- 환경설정 추가(db아이디)
 -e MONGODB_PASSWORD=secret \ <- 환경설정추가(db비밀번호)
 -v logs:/app/logs \ <- 컨테이너 로그 바인딩 마운트
 -v /Users/abc/def/gh:/app \ <- 하드 드라이브 내 코드 바인딩 마운트
 -v /app/node_modules \
 --rm \
 -d \
 --network goals-net \ 
 -p 80:80 \ <- 포트 포워딩
 goals-node

 

5. ReactJS 컨테이너 시작

$ docker run --name goals-frontend \
 -v /Users/abc/def/gh/frontend/src:/app/src \ <- src 소스코드 바인딩 마운트
 --rm
 -d
 -p 3000:3000 \
 -it \ <- 개발자 모드로 실행
 goals-react

 

 

728x90
반응형

+ Recent posts