반응형

알고리즘 공부를 위해서 읽은 책입니다.

알고리즘 도감 (그림으로 배우는 알고리즘 26)이라는 책입니다.

각종 필수 알고리즘(데이터 구조 / 그래프 / 정렬 등)들을 그림으로 설명을 해줍니다.

다른 파트들도 괜찮은데, 개인적으로 정말 괜찮다 싶은 파트는 보안 파트였습니다. 개발 시작 당시 공개키-개인키 관련 지식들에 대해서 인터넷에 글로 된 지식들을 배우며 미심쩍은 부분이 많았었습니다. 그 당시 지금의 책을 봤으면 조금 더 쉽게 이해를 했겠구나 라는 생각이 듭니다.

 

책 내용을 보시게 되면 코드 내용은 한 줄도 없습니다. 하지만 알고리즘 코드를 보기 전에 알고리즘에 대한 이해는 필수입니다. 이런 이해를 돕기 위해서 알고리즘 학습을 또는 개발을 처음 시작하신다면 추천하는 책입니다. 알고리즘을 정말 이해하기 쉽게 설명이 되어 있습니다 :)

 

지금의 책으로 기반 지식을 쌓고 알고리즘 책들과 문제들을 하나 둘 배우신다면 효과적으로 알고리즘 학습을 이해하실 수 있으리라 생각이 됩니다. 처음부터 너무 어려운 책을 보거나 두꺼운 책을 보시게 된다면 끝까지 책을 못 볼 경우가 발생합니다. 그렇기에 쉬운 책부터 하나 둘 끝까지 학습하셨으면 하는데요. 책을 3권 4권 읽었는데 앞에 30장 50장만 읽었다면 리스트, 큐 파트만 학습을 하시게 된 겁니다. 끝까지 읽음으로써 모든 개념들을 한 바퀴 학습하시면 더 큰 의미가 있겠습니다.

반응형
반응형

앞 포스트에서는 도커 컴포즈가 무엇이고 어떻게 스크립트를 작성하는지 알아봤습니다. 도커 컴포즈에 대해서 잘 모르겠다 싶으시면 앞의 포스트를 확인해주세요. https://junlab.tistory.com/219

 

[docker] 도커 컴포즈란? 예제 및 기본 사용법 (docker-compose)

도커 컴포즈를 알아보기 위해서는 기본적인 도커의 사용 이유와 예제 및 구동 방법을 알고 있으셔야 됩니다. 기본 내용은 앞의 게시물을 확인해주세요 :) - https://junlab.tistory.com/216 [docker] 도커 사

junlab.tistory.com

이번 포스트에서는 도커 컴포즈를 활용하여 젠킨스를 구동하도록 하겠습니다.

젠킨스 구동을 위해서 스크립트를 하나 만들어주세요.

1. docker-compose.yml

version: "3"
services:
  master:
    container_name: master
    image: jenkinsci/jenkins:2.150.1-slim
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkinse_home

앞전의 기본 스크립트에서 못 본 volumes가 있습니다.

volumes

호스트의 jenkine_home 디렉터리를 젠킨스 컨테이너의 /var/jenkinse_home에 공유할 수 있는 구문입니다.

Dockerfile의 COPY 명령어는 복사기능이지만, docker-compose volumes는 공유를 합니다.

 

명령어를 통해서 컨테이너를 구동하겠습니다.

docker-compose pull
docker-compose up

2. localhost:8080 접속

컨테이너 설치 중 스크립트를 보시게 되면 다음과 같은 모습이 있습니다.

중간에 패스워드가 존재하는데 패스워드를 복사하여 입력해주세요

 

다음으로 Install suggested plugins를 클릭하여 젠킨스 설치를 진행해주세요.

위의 설치 화면이 끝나고 설치가 완료되지 않은 패키지 항목이 존재한다고 합니다.

그럼 Retry를 누르지 않고 그냥 설치를 진행해주시면 아래의 완료된 모습을 보실 수 있습니다.

 

3. 슬레이브 젠킨스 컨테이너 생성

젠킨스를 사용할 때는 흔히, 2개의 서버로 운영을 합니다.

마스터 : 관리기능이나 작업 실행 지시

슬레이브 : 작업을 실제로 진행

마스터가 슬레이브와 데이터를 주고받을 수 있도록 ssh 키를 생성하겠습니다.

 

컨테이너가 실행 중인 상태에서 아래 명령어를 입력해주세요.

docker container exec -it master ssh-keygen -t rsa -C ""

 

docker exec -it master bash 명령어를 통해서 /var/jenkins_home/.ssh/ 경로로 이동 후 id_rsa.pub를 확인해주세요.

docker exec -it master bash
cd /var/jenkins_home/.ssh/ 
cat id_rsa.pub

 

위의 명령어를 통해서 공개키 값을 확인 후에 yml파일에 slave를 만들겠습니다.

version: "3"
services:
  master:
    container_name: master
    image: jenkinsci/jenkins:2.150.1-slim
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkinse_home
    links:
      - slave01

  slave01:
    container_name: slave01
    image: jenkinsci/ssh-slave
    environment:
      - JENKINS_SLAVE_SSH_PUBKEY= ssh-rsa AA...

 

links: master에 slave01에 대한  링크를 설정했습니다. master에서 slave01이라는 이름으로 슬레이브를 찾아갈 수 있습니다.

다시 정리를 하자면

1. ssh 공개키 생성

2. 젠킨스 환경변수인 JENKINS_SLAVE_SSH_PUBKEY 추가

3. links 추가

 

slave컨테이너를 추가했으니 compose 명령어를 통해서 컨테이너를 구동하겠습니다.

docker-compose up -d
docker-compose ps

 

이상으로 master와 slave 컨테이너 2개가 정상적으로 생성된 모습을 보실 수 있습니다.

도커 컴 포즈 및 젠킨스 세팅 방법을 학습했으니 필요에 따라서 젠킨스 학습을 더욱 진행을 했으면 좋겠습니다.

감사합니다.

반응형
반응형

도커 컴포즈를 알아보기 위해서는 기본적인 도커의 사용 이유와 예제 및 구동 방법을 알고 있으셔야 됩니다.

기본 내용은 앞의 게시물을 확인해주세요 :) - https://junlab.tistory.com/216

 

[docker] 도커 사용 이유, 심플 예제 및 구동 (기본 사용법)

프로젝트 빌드를 위해서 도커를 굉장히 많이 사용합니다. 대략적인 명령어를 활용하여 구동만 시킬 줄 알지 도커 관련하여 기본기가 너무 부족한 걸 느꼈습니다. 이제는 도커에 대해서 조금은 �

junlab.tistory.com

 

일반적인 시스템은 단일 애플리케이션으로 구동이 되지 않습니다. 여러 개의 애플리케이션이 서로 의존성 있게 구성되어 시스템이 이뤄져 있습니다. 그렇다면 흔히 하나의 컨테이너가 하나의 애플리케이션을 담당한다고 하면 여러 개의 컨테이너가 필요로 합니다. 이때 필요한 기술이 도커 컴포즈(Docker Compose)입니다. 도커 컴포즈는 yaml 포맷으로 작성되며 여러 개의 컨테이너의 실행을 한 번에 관리를 할 수 있게 해 줍니다.

 

앞의 게시물 예제 기반으로 root 위치에 도커 컴포즈를 위한 파일을 하나 만들겠습니다.

 

1. docker-compose.yml

version: "3"
services:
  echo:
    image: example/echo:latest
    ports:
      - 9000:8080

version

docker-compose.yml 내용을 해석하기 위한 문법 버전 - 3 버전은 안전 버전입니다.

 

echo

services 아래의 echo는 컨테이너 이름입니다. 즉, echo는 하나의 컨테이너입니다.

 

image

도커 이미지

 

ports

포트 포워딩

 

도커 컴포즈 실행을 위해 아래 명령어를 실행시켜주세요.

docker-compose up

docker container run 명령어로 실행시킨 것과 같이 동일하게 실행이 됩니다.

 

-d 옵션을 주고 백그라운드에서 실행을 시킬 수도 있고 다음으로 컨테이너를 종료시키겠습니다.

docker-compose up -d
docker-compose ls
docker-compose down

yml파일에 명시된 컨테이너들은 down 명령어를 통해서 한 번에 종료시킬 수 있습니다.

 

도커 컴포즈에 대해서 간략하게 알아봤습니다.

다음은 젠킨스를 예제를 통해서 여러 컨테이너를 만들어보고 학습을 하도록 하겠습니다.

감사합니다.

 

p.s)

학습은 도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문을 보고 학습했습니다 :)

반응형
반응형

프로젝트 빌드를 위해서 도커를 굉장히 많이 사용합니다.

대략적인 명령어를 활용하여 구동만 시킬 줄 알지 도커 관련하여 기본기가 너무 부족한 걸 느꼈습니다.

이제는 도커에 대해서 조금은 더 알아야 될 때까 왔습니다.

책을 보고 공부를 하며 정리를 하겠습니다.

 

책은 도커/쿠버네티스를 활용한 컨테이너 실전 입문 책을 보고 공부했습니다 :)

도커 공부가 필요하신 분은 한 권 구입을 하시는 것도 추천드립니다.

 

도커를 사용하는 이유

- 변화하지 않는 실행 환경 확보를 위해서

- 코드를 통한 실행 환경 구축 및 애플리케이션 구성

- 실행 환경과 애플리케이션의 일체화로 이식성 향상

 

즉, 애플리케이션을 개발하면서 변화 없는 동일한 환경 구성을 할 수 있다!!

똑같은 애플리케이션을 구동하더라도 사용자마다 서버마다 환경이 다르다. 이 문제를 도커로 같은 실행환경으로 만들 수 있다.

 

도커 이미지 및 도커 컨테이너

- 도커 이미지: 컨테이너를 구성하는 파일 시스템과 실행할 애플리케이션 설정을 하나로 합친 것을 뜻함. 컨테이너를 생성하기 위한 템플릿.

- 도커 컨테이너: 도커 이미지를 기반으로 애플리케이션이 실행되는 상태.

 

2개의 용어를 숙지해주세요.

 

도커 실행 예제

1. main.go

package main

import (
	"fmt"
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		log.Println("received request")
		fmt.Fprintf(w, "Hello Docker!!")
	})

	log.Println("start server")
	server := &http.Server{Addr: ":8080"}
	if err := server.ListenAndServe(); err != nil {
		log.Println(err)
	}
}

go언어로 작성이 되었지만 어려운 내용은 없습니다. 8080으로 요청을 받는 서버입니다. 요청을 받게 되면 received request와 Hello Docker!! 문구가 출력됩니다.

 

2. Dockerfile

FROM golang:1.9

RUN mkdir /echo
COPY main.go /echo

CMD ["go", "run", "/echo/main.go"]

도커 이미지를 만들어 봤습니다. main.go파일과 같은 위치에 만들어 주세요.

각각의 명령들을 살펴보도록 하겠습니다.

 

FROM

도커 이미지의 베이스입니다. 우리는 go 언어를 사용하기 때문에 golang을 명시해줍니다.

FROM에 명시된 이미지는 도커 허브(Docker Hub)에 등록되어 있는 이미지입니다.

 

RUN

도커 이미지가 실행될 때 컨테이너 안에서 실행할 명령입니다.

스크립트의 명령에 따라 컨테이너 안에서는 /echo 디렉터리가 만들어집니다.

 

COPY

호스트의 파일이나 디렉터리를 도커 컨테이너로 복사합니다.

 

CMD

컨테이너 안에서 실행할 프로세스를 지정합니다.

RUN명령어는 애플리케이션의 업데이트 및 배치를 위해서 이미지를 빌드할 때 실행됩니다.

CMD는 애플리케이션 자체를 실행하는 명령어로 컨테이너가 시작될 때 한 번만 실행됩니다.

즉, 위의 CMD 명령어를 통해서 " go run /echo/main.go " 명령이 실행됩니다.

명령을 공백을 나눈 배열로 명시해주세요.

 

이상 도커를 사용하기 위한 스크립트의 내용입니다.

 

위의 내용을 기반으로 도커 구동

1. 다음으로 도커 이미지를 빌드하겠습니다.

docker image build -t example/echo:latest

docker image build -t example/echo:latest .

-t 옵션을 통해서 example/echo:latest라는 이미지명을 지정합니다. 이미지명을 지정하지 않으면 이미지명이 해시값만 만들어져 구분이 어렵습니다. :latest도 생략이 가능하며 생략 시 latest가 붙습니다.

실행 명령어를 수행하면 dockerfile에 명시된 명려들이 순차적으로 실행됩니다.

 

2. 생성(빌드)된 도커 이미지를 확인하겠습니다.

docker image ls

위의 명령을 실행하면 현재 자신의 컴퓨터에 생성된 도커 이미지를 확인할 수 있습니다.

 

3. 빌드까지 정상적으로 되었으니 도커 컨테이너를 실행하겠습니다.

docker container run example/echo:latest
or
# -d 옵션: 백그라운드 실행
docker container run -d example/echo:latest

4. 다음 명령어를 통해서 실행 중인 도커 컨테이너를 확인할 수 있습니다.

docker container ls

5. 서버가 동작하니 8080으로 요청을 해보겠습니다.

8080으로 요청을 했더니 연결이 거절됐습니다.

컨테이너 밖에서는 컨테이너 포트를 바로 사용할 수 없습니다.

밖에서 온 요청을 컨테이너 안에 있는 애플리케이션으로 전달을 해줘야 합니다. 즉, 포트 포워딩을 해주셔야 됩니다.

 

6. 도커 실행을 중지하고 호스트 포트 9000을 컨테이너 포트 8080으로 연결하겠습니다.

# container_id는 ls 명령어를 통해서 확인
docker container stop [container_id]

# -p옵션: 포트 포워딩 지정
docker container run -d -p 9000:8080 example/echo:latest

 

7. 포트 포워딩이 되었으니 9000 포트로 접속을 다시 하겠습니다 :)

9000 포트로 접속을 했더니 서버로부터 이상 없이 응답을 받았습니다.

 

이상 도커의 기본 스크립트와 구동방법을 알아봤습니다.

도움이 되셨으면 좋겠습니다.

감사합니다.

반응형
반응형

안녕하세요.

장고에서 jwt 인증 방법을 활용하여 회원가입 및 로그인 구현을 해보겠습니다.

기존에는 쿠키-세션에 유저 정보가 있는데요. 쿠키를 사용해서 유저를 식별합니다.

이를 통해서 로그인 여부를 알 수 있습니다.

기존의 방법은 rest api에 적합하지 않고 리액트에서는 쿠키를 관리하지 않아 인증 메커니즘을 변경시켜주셔야 됩니다.

우리는 jwt 인증 방식으로 사용자 인증을 진행하겠습니다.

jwt는 javascript web token의 약자입니다.

즉, 사용자에게 토큰을 발행해서 인증이 된 사용자인지 판별 하는 것입니다.

어렵지 않으니 하나씩 하나씩 변경을 해주시면 되겠습니다.

 

장고에서는 jwt 사용을 위해서 패키지를 제공해줍니다. 아래와 같이 설치해주세요.

1) djangorestframework-jwt 설치

pip install djangorestframework-jwt

2) 세팅 파일에 다음과 같은 인증을(코드를) 추가

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}

이 2가지만 해주시면 jwt 사용은 가능합니다.

 

다음으로 로그인과 회원가입을 위한 rest api를 만들어 보겠습니다.

이 내용도 패키지가 제공이 되어 정말 심플하게 구현이 가능합니다.

 

3) django-rest-auth 설치

pip install django-rest-auth

4) 세팅 파일에 INSTALLED_APPS에 필요로 하는 app 추가

INSTALLED_APPS = (
    ...,
    'allauth',
    'allauth.account',
    'rest_auth.registration',
)

5) jwt 인증 사용을 위한 sesstion 및 기본 인증 주석 처리

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        #'rest_framework.authentication.SessionAuthentication',
        #'rest_framework.authentication.BasicAuthentication',
    ),
}

6) 기본 설정

#ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_REQUIRED = False

#ACCOUNT_EMAIL_VERIFICATION = "mandatory"
ACCOUNT_EMAIL_VERIFICATION = "none"

REST_USE_JWT = True
ACCOUNT_LOGOUT_ON_GET = True

 

7) URL 추가

path("rest-auth/", include('rest_auth.urls')),
path("rest-auth/registration/", include('rest_auth.registration.urls')),

마지막으로 URL을 설정해주시면 됩니다.

우리는 JWT 세팅과 회원가입과 로그인을 위한 rest  api도 만들었습니다.

테스트를 진행하겠습니다.

 

* 회원가입

회원가입이 되고 토큰이 생성되는 모습을 볼 수 있습니다.

 

* 로그인

로그인이 성공되고 token이 만들어집니다.

사용자는 이후에 우리의 서버에 접속하기 위해서는 아래처럼 헤더에 token을 갖고 시도를 해야 접속을 할 수 있습니다.

 

감사합니다.

 

* 참고 사이트

- djangorestframework-jwt

https://jpadilla.github.io/django-rest-framework-jwt/

 

- django rest auth

https://django-rest-auth.readthedocs.io/en/latest/index.html

반응형

+ Recent posts