프로토콜 계층
TCP (IP를 TCP로 보완한다.)
TCP 특징
UDP ( User Datagram Protocol)
Port (항구)
URI?
URI 개념아래 URL과 URN이 존재한다.
URN은 거의 쓰이지 않음.
https 443이 http 80보다 더 안전하다.
+추가내용
IP: 컴퓨터의 ‘IP주소’에 대해서는 한번쯤 들어보셨죠? 컴퓨터의 IP주소는 말그대로 ‘Address(주소)’입니다. 이 프로토콜에서는 메시지가 목표로 하는 컴퓨터에 잘 도착하도록 해주는 역할을 합니다. (배달)
TCP: IP의 상위 프로토콜입니다. 컴퓨터의 위치를 찾아서 메시지를 전달했다면, 그 메시지를 확인해야겠죠? 네트워크 상에서 메시지를 전달할 때, 한번에 메시지를 전달하기 보다, 작은 단위(패킷)으로 쪼개서 메시지를 전달합니다. TCP는 전달받은 패킷들을 재조립하고, 손상되거나 손실된 패킷이 있다면, 재요청합니다.
HTTP: HTTP는 TCP의 상위 프토콜입니다. 메시지 전체를 확인했다면, 이제 그 메시지를 해석해야 합니다. HTTP에는 Reques Methods, data type등 원하는 메시지를 전달하기 위한 여러 규칙들이 있습니다
클라이언트 서버 구조
무상태 프로토콜 (stateless)
HTTP 메세지
가장 중요한 것은 리소스식별!
리소스란?
쿼리스트링이란?
URL의 뒤에 입력 데이터를 함께 제공하는 가장 단순한 데이터 전달 방법
주로 GET방식에 쓰인다.
< API 설계 예시 >
회원 관리
100번대
쿠키
외워서 쓸 필요가 없고 HTTP를 읽을 때 눈에 익숙하기 위함.
목표
- docker를 사용할 경우 다양한 어플리케이션을 쉽고 빠르게 배포할 수 있다.
- 컨테이너는 각각 독립적인 환경에서 구동되기 때문에 안정적인 운영이 가능하다.
- docker 이미지를 통해 동일한 환경을 가진 컨테이너를 쉽게 생성하고 관리할 수 있다.
- 가상 머신에서 윈도우를 설치할 때, 윈도우 ISO를 사용해 설치하는 것처럼 docker 컨테이너는 docker 이미지를 기반으로 생성된다.
- 이미지는 docker 컨테이너가 생성될 때 실행되는 실행파일, 설정 등을 가지고 있다. 예를 들어, docker postgresql 이미지는 컨테이너가 실행됐을 때 postgresql을 실행시키기 위한 패키지들이 기본적으로 설치되어 있다.
ssh 연결하기
ssh -i 퍼블릭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 패키지를 다시 설치해주세요
sudo docker --version
도커 버전이 출력되는지 확인합니다.
Docker version 20.10.12, build 20.10.12-0ubuntu2~20.04.1 - 정상
command not found: 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
sudo docker exec -it $container_id /bin/bash
$containser_id : sudo docker ps를 쳤을 때 확인되는 container_id를 입력합니다.
/bin/bash : 컨테이너에 접속할 때 사용되는 쉘을 입력합니다.
이미지에 따라 /bin/bash라는 쉘이 존재하지 않을 수 있는데, 이 경우에는 /bin/sh를 사용해 접속합니다.
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를 하고 난 뒤에 아래와 같이 해줘야 해결이 되었다. 그냥 하면 안되더라.. 왜그런지 의문.
sudo docker ps -a
# docker에 존재하는 컨테이너 목록을 확인합니다.sudo docker rm -f
$container_id # 컨테이너의 실행중 여부와 관계 없이 강제로 삭제합니다.
services:
example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
container_name: example # 컨테이너 이름을 지정합니다.
image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정합니다.
restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.
sudo docker compose up -d
up : docker-compose.yml 파일을 읽어 정의된 서비스들을 실행시킵니다.
-d : 컨테이너를 데몬(백그라운드)으로 실행시킵니다.
sudo docker compose stop
sudo docker compose down
sudo docker ps -a
해주면 stop 된건 보이는데 down 된건 보이지 않는다.
그 이유는 stop 명령어는 중지상태로 만드는 것이고, 이는 docker compose start 명령어로 다시 실행가능하며, down 명령어는 컨테이너 자체가 삭제되어 다시 실행시키려면 docker compose up 명령어를 사용하여 컨테이너를 다시 생성해야 된다.
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이 해주는 역할
docker volume 종류
1. docker volume (주로 사용) - host의 /var/lib/docker/volumes/
경로에 저장.
2. bind mount - 사용자가 지정한 경로에 데이터가 저장. docker 엔진의 관리를 받지 않음. 사용자가 직접 파일을 추가/수정/삭제 가능. 설정파일 혹은 소스코드를 프로젝트와 서버가 공유할 때.
3. tmpfs mount - 휘발성 메모리인 RAM에 데이터를 저장. 파일로 저장하면 안되는 민감한 정보를 다룰 때 사용.
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
# 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.
sudo docker volume ls
sudo docker volume inspect ubuntu_example_http_code
sudo docker volume prune