Today I Learned D - 55

손상훈·2022년 11월 16일
0

< 프로젝트 전 마지막 장고 심화강의 복습 >

1주차 HTTP와 웹의 동작 방식

1강 DRF OT

2강 1주차 소개

  • postman을 이용하여 request,response를 손쉽게 체킹

3강 프론트엔드와 백엔드를 나눈다는 의미

  • 불편함 (댓글을 작성하거나 글 작성했을 때 웹페이지가 새로고침이 됨.)
  • 전체를 새로고침 할 필요없이 부분적으로 업데이트 가능.
  • 프론트엔드를 별개로. 자바스크립트로만.
  • JSON을 쓰기위해 restframework 사용.

4강 포스트맨으로 살펴보는 인터넷

  • 포스트맨 설치
  • 워크스페이스 (프로젝트별로 만들어주기)
  • 포스트맨을 이용하여 다양한 http 요청들을 보낼 수 있음.
  • async fuction??
    async function 선언은 AsyncFunction객체를 반환하는 하나의 비동기 함수를 정의합니다. 비동기 함수는 이벤트 루프를 통해 비동기적으로 작동하는 함수로, 암시적으로 Promise를 사용하여 결과를 반환합니다.

5강 HTTP 웹의 요청흐름 살펴보기

  1. DNS 조회 (도메인 네임 시스템)
  • address ip
  1. HTTP 요청 메시지 작성
  • GET,POST,PUT,PATCH,DELETE
  1. Socket 라이브러리를 통해서 전달
  2. TCP/IP 작성되고 이 안에 HTTP 메시지가 포함

프로토콜 계층

  • 어플리케이션 > Socket Library > TCP > IP > LAN > 인터넷

- TCP/IP 역할에 대해서 따로 공부하기 (면접질문예상)

TCP/IP 자세히

라우팅이란?

TCP (IP를 TCP로 보완한다.)

  • 출발지 port와 목적지 port 정보
  • 전송제어와 순서
  • 검증 정보 등이 실린다.

TCP 특징

  • 연결지향 TCP 3 way handshake를 통해 연결이 된지를 먼저 확인한다.
  • 데이터 전달을 보증한다.
  • 순서를 보장한다.
  • 신뢰할 수 있어서 현재 대부분 TCP를 사용한다.

UDP ( User Datagram Protocol)

  • 기능이 거의 없고
  • TCP기능들이 없다
  • IP와 유사한데 포트와 체크섬만 추가됐다.
  • 어플리케이션에서 추가 작업이 필요
  • 원하는 기능들을 추가해서만들 수 있는 하얀 도화지 같은 프로토콜.

Port (항구)

  • 한 컴퓨터에서 게임, 화상통화, 웹브라우저를 다 킬 수가 있다.
  • 0~65535
  • 0~1023은 잘 알려진 포트로 사용하지 않는게 좋다.
  • 포트는 같은 IP내에서 프로세스 구분을 해줄 수가 있다.

URI?
URI 개념아래 URL과 URN이 존재한다.
URN은 거의 쓰이지 않음.
https 443이 http 80보다 더 안전하다.

+추가내용

IP: 컴퓨터의 ‘IP주소’에 대해서는 한번쯤 들어보셨죠? 컴퓨터의 IP주소는 말그대로 ‘Address(주소)’입니다. 이 프로토콜에서는 메시지가 목표로 하는 컴퓨터에 잘 도착하도록 해주는 역할을 합니다. (배달)
TCP: IP의 상위 프로토콜입니다. 컴퓨터의 위치를 찾아서 메시지를 전달했다면, 그 메시지를 확인해야겠죠? 네트워크 상에서 메시지를 전달할 때, 한번에 메시지를 전달하기 보다, 작은 단위(패킷)으로 쪼개서 메시지를 전달합니다. TCP는 전달받은 패킷들을 재조립하고, 손상되거나 손실된 패킷이 있다면, 재요청합니다.
HTTP: HTTP는 TCP의 상위 프토콜입니다. 메시지 전체를 확인했다면, 이제 그 메시지를 해석해야 합니다. HTTP에는 Reques Methods, data type등 원하는 메시지를 전달하기 위한 여러 규칙들이 있습니다

6강 HTTP 메세지 구조와 기초

클라이언트 서버 구조

  • request와 response 구조

무상태 프로토콜 (stateless)

  • 서버가 클라이언트 상태를 보존하지 않는다.
  • 한 점원이냐 매번 다른 점원이냐
  • 중간에 다른 점원으로 바뀐다고 생각.
  • 무상태는 응답서버를 쉽게 바꿀수 있음.
  • 세션 로그인은 상태가 있다. 최소한으로만 사용한다는 개념.

HTTP 메세지

  • 요청메시지와 응답메시지는 조금 다르다.

가장 중요한 것은 리소스식별!
리소스란?

  • 회원이라는 개념자체가 리소스. 이것이 URI에 매핑되는 것.
  • 거기에 하는 행위가 메소드로 하는 것.
  • 리소스와 행위를 분리하는 것이 Restful API

쿼리스트링이란?
URL의 뒤에 입력 데이터를 함께 제공하는 가장 단순한 데이터 전달 방법
주로 GET방식에 쓰인다.

< API 설계 예시 >
회원 관리

  • GET /members > 회원목록
  • POST /members > 회원등록
  • GET /members{id} > 회원조회
  • PATCH,PUT,POST /members/{id} > 회원수정
  • DELETE /members/{id} > 회원삭제

7강 HTTP 상태코드

100번대

  • 요청수신되어 처리중 (거의 사용x)
    200번대
  • 요청 정상 처리
    300번대
  • 리다이렉트할 때쓰임
    400번대 (중요)
  • 클라이언트 오류, 400 요청 내용 다시 검토, 401 인증안됨, 403 권한이 없다 404 리소스가 없다. ex) url 잘못됨.
    500번대
  • 서버 에러 , 500 서버 내부 문제, 503 서버가 일시 과부하

8강 HTTP 헤더

  • HTTP 전송에 필요한 모든 부가정보
    메시지 바디의 내용, 바디의 크기, 압축, 인증, 요청 클라이언트, 캐시 관리등

쿠키

  • HTTP는 무상태 연결이기에 상태를 매번 보내줘야 한다.
    모든 요청과 링크에 사용자 정보를 포함해야 된다는 단점도 있다.
    이를 해결하기 위해 쿠키가 도입됨.

외워서 쓸 필요가 없고 HTTP를 읽을 때 눈에 익숙하기 위함.


< 2주차 docker를 설치하고 활용해보기 >

목표

  • docker에 대해 이해하고, 작업 환경을 구축할 수 있다.
  • docker을 활용해 컨테이너를 생성하고 관리할 수 있다.

docker란?

  • django, db, web server 등 다양한 어플리케이션을 컨테이너 환경에서 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다.

- docker를 사용하는 이유

- docker를 사용할 경우 다양한 어플리케이션을 쉽고 빠르게 배포할 수 있다.
- 컨테이너는 각각 독립적인 환경에서 구동되기 때문에 안정적인 운영이 가능하다.
- docker 이미지를 통해 동일한 환경을 가진 컨테이너를 쉽게 생성하고 관리할 수 있다.

- docker 이미지란?

- 가상 머신에서 윈도우를 설치할 때, 윈도우 ISO를 사용해 설치하는 것처럼 docker 컨테이너는 docker 이미지를 기반으로 생성된다.
- 이미지는 docker 컨테이너가 생성될 때 실행되는 실행파일, 설정 등을 가지고 있다. 예를 들어, docker postgresql 이미지는 컨테이너가 실행됐을 때 postgresql을 실행시키기 위한 패키지들이 기본적으로 설치되어 있다.

3강 기초 활용

ssh 연결하기
ssh -i pem.pemubuntu@pem파일_이름.pem ubuntu@퍼블릭IPv4주소

Windws OS) ssh -i my_ubuntu.pem ubuntu@3.35.51.160

- 패키지 설치

sudo apt install docker.io -y
만약 아래와 같은 에러가 발생한다면
E: Package 'docker.io' has no installation candidate
sudo apt update 명령어 실행 후 docker 패키지를 다시 설치해주세요

- docker 설치 확인

sudo docker --version 도커 버전이 출력되는지 확인합니다.
Docker version 20.10.12, build 20.10.12-0ubuntu2~20.04.1 - 정상
command not found: docker 와 같은 문구가 출력될 경우 docker가 설치되었는지 확인해야 합니다.

- docker 컨테이너 생성하기

sudo docker run -d -p 80:80 httpd:latest
run : 이미지를 사용해 컨테이너를 실행시킵니다.
-d : 컨테이너를 데몬(백그라운드)으로 실행시킵니다.
80:80 : 80번 포트로 접속했을 때 컨테이너에 접근할 수 있도록 포트포워딩 설정을 해줍니다.
httpd:latest : httpd의 가장 최신 이미지를 사용해 컨테이너를 생성합니다.

- 실행중인 컨테이너 확인하기

sudo docker ps # 실행중인 컨테이너 목록 확인하기
CONTAINER ID : 컨테이너가 가지고 있는 고유한 id
IMAGE : 컨테이너가 생성될 때 사용된 이미지
COMMAND : 컨테이너가 생성될 때 실행되는 명령어
CREATED : 생성 후 경과 시간
STATUS : 컨테이너 상태
PORTS : 사용중인 포트

sudo docker ps -a
-a : 중지된 컨테이너 목록까지 포함해서 모두 확인하기

- 다운받은 이미지 확인하기

sudo docker images

REPOSITORY : 이미지 저장소 이름

TAG : 이미지 버전

IMAGE ID : 이미지의 고유한 id

CREATED : 이미지 생성일(마지막 업데이트 일)

SIZE : 이미지 용량

- 컨테이너 내부로 들어가보기

sudo docker exec -it $container_id /bin/bash
$containser_id : sudo docker ps를 쳤을 때 확인되는 container_id를 입력합니다.
/bin/bash : 컨테이너에 접속할 때 사용되는 쉘을 입력합니다.
이미지에 따라 /bin/bash라는 쉘이 존재하지 않을 수 있는데, 이 경우에는 /bin/sh를 사용해 접속합니다.


4강 docker compose란

  • docker 컨테이너를 더 편하게관리해주는 것.

< docker-compose 설치하기 >

exit - 나가는 명령어.

sudo mkdir -p /usr/lib/docker/cli-plugins
/usr/lib/docker 경로에 cli-plugins라는 디렉토리를 생성합니다.
-p : 만약 상위 디렉토리가 없다면 함께 생성합니다.

sudo curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 -o /usr/lib/docker/cli-plugins/docker-compose
github에 release 된 docker-compose 파일을 /usr/lib/docker/cli-plugins/ 경로에 다운로드 받습니다.v2.11.2는 docker-compose의 버전이며, 최신 버전은 여기서 확인 가능합니다.

sudo chmod +x /usr/lib/docker/cli-plugins/docker-compose
다운받은 docker-compose 파일에 실행 권한을 부여해 줍니다.

sudo docker compose version
docker-compose가 정상적으로 설치되었는지 확인합니다.
Docker Compose version v2.11.2 정상적으로 설치 된 경우 버전이 출력됩니다.

명령어 붙여넣기를 하고싶다면?
ctrl+v를 하고 난 뒤에 아래와 같이 해줘야 해결이 되었다. 그냥 하면 안되더라.. 왜그런지 의문.

5강 docker-compose로 컨테이너 생성하기

docker 컨테이너 삭제하기

  • sudo docker ps -a # docker에 존재하는 컨테이너 목록을 확인합니다.
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    54445308314d httpd:latest "httpd-foreground" 23 hours ago Up 23 hours 0.0.0.0:80->80/tcp, :::80->80/tcp sweet_engelbart

sudo docker rm -f $container_id # 컨테이너의 실행중 여부와 관계 없이 강제로 삭제합니다.

docker-compose.yml 작성해보기

  • version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.

services:
example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
container_name: example # 컨테이너 이름을 지정합니다.
image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정합니다.
restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.

컨테이너 실행시켜보기

  • docker compose 명령어는 docker-compose.yml 파일이 존재하는 자리에서 실행해야 합니다.

sudo docker compose up -d
up : docker-compose.yml 파일을 읽어 정의된 서비스들을 실행시킵니다.
-d : 컨테이너를 데몬(백그라운드)으로 실행시킵니다.

컨테이너 stop 명령어

sudo docker compose stop

컨테이너 down 명령어

sudo docker compose down

sudo docker ps -a 해주면 stop 된건 보이는데 down 된건 보이지 않는다.
그 이유는 stop 명령어는 중지상태로 만드는 것이고, 이는 docker compose start 명령어로 다시 실행가능하며, down 명령어는 컨테이너 자체가 삭제되어 다시 실행시키려면 docker compose up 명령어를 사용하여 컨테이너를 다시 생성해야 된다.


6강 컨테이너 포트 포워딩 설정하기

  • 생성한 컨테이너를 외부에서 접근할 수 있도록 포트포워딩 설정을 해줌.

포트 포워딩(port forwarding)이란?

  • 예를 들어 특정 컨테이너의 포트포워딩 설정을 80:8000과 같이 해줬다면, 외부에서 80 포트로 접속했을 때 해당 컨테이너의 8000번 포트로 접속하겠다는 의미입니다.

< docker-compose.yml >

version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.

services:
example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
container_name: example # 컨테이너 이름을 지정합니다.
image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정합니다.
ports: # 포트포워딩을 설정해줍니다.
- 80:80 # 외부에서 80 포트로 접속했을 때 컨테이너의 80 포트로 연결해줍니다.
restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.

컨테이너 실행시켜보기
sudo docker compose up -d

컨테이너 로그 확인하기
sudo docker compose logs

  • 실시간으로 확인하려면 뒤에 -f붙여주기


    7강 volume을 사용해 데이터 보존하기

  • docker 컨테이너는 종료될 때 변경된 데이터는 모두 초기화 되는 특징을 가지고 있어 volume을 사용해 보존시키즌 방법.

volume을 사용하지 않으면??
컨테이너 접속방법 sudo docker exec -it example /bin/bash
이후 echo "test" >> /usr/local/apache2/htdocs/index.html
테스트 문구 추가.

volume이 해주는 역할

  • volume은 컨테이너에 저장되는 데이터의 일부를 host와 공유해주는 역할을 한다.
  • host에 저장된 데이터는 사용자가 직접 삭제하지 않는 이상 유지되며 컨테이너가 종료되더라도 유실되지 않는다.

docker volume 종류
1. docker volume (주로 사용) - host의 /var/lib/docker/volumes/경로에 저장.
2. bind mount - 사용자가 지정한 경로에 데이터가 저장. docker 엔진의 관리를 받지 않음. 사용자가 직접 파일을 추가/수정/삭제 가능. 설정파일 혹은 소스코드를 프로젝트와 서버가 공유할 때.
3. tmpfs mount - 휘발성 메모리인 RAM에 데이터를 저장. 파일로 저장하면 안되는 민감한 정보를 다룰 때 사용.

volume은 언제 사용될까?

  • 주로 컨테이너 간 파일을 공유하거나 중요도가 높은 파일들을 사용자가 쉽게 수정/삭제 하지 못하도록 할 때 주로 사용.

docker-compose.yml (docker volume)

version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.

volumes: example_http_code: {} # docker volume을 정의합니다.

services: example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
container_name: example # 컨테이너 이름을 지정합니다.
image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정합니다.
ports: # 포트포워딩을 설정해줍니다.
- 80:80 # 외부에서 80 포트로 접속했을 때 컨테이너의 80 포트로 연결해줍니다.
volumes: # volume을 성정해줍니다.
- example_http_code:/usr/local/apache2/htdocs/ # 정의한 volume의 mount할 경로를 지정합니다.
restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.

volume 설정 확인하기

volume 목록보기

  • sudo docker volume ls
    volume의 이름으로 설정 정보 확인하기
  • sudo docker volume inspect ubuntu_example_http_code
    (ubuntu_example_http_code = $volume_name 볼륨네이밍이다.)

사용하지 않는 docker volume 삭제하기

  • 데이터가 지속적으로 쌓이기 때문에 리소스 낭비가 생길 수 있어 주기적으로 정리해줘야 좋음.
  • sudo docker volume prune
profile
< 코린이의 코딩모험기 >

0개의 댓글

관련 채용 정보