코딩 개발일지

docker의 기본 (사용법 / port forwarding / Dockerfile) 본문

AI 본 교육/AI 12주차

docker의 기본 (사용법 / port forwarding / Dockerfile)

호기호 2023. 11. 1. 00:43

ssh란 : 네트워크 상에 존재하는 다른 컴퓨터에 접근하거나 파일을 업/다운로드 하는 등의 작업을 할 수 있는 프로토콜

 

ssh 연결 하는법

1. git bash 실행

2. pem파일 있는 곳으로 이동

3. ssh -i pem파일이름 ubuntu@Public IPv4 address

4. sudo apt update

(aws에 로그인 후 ssh에 연결하면, sudo apt update 무조건 먼저 해주기 !!!!)


※ docker 명령어 앞에는 무조건 sudo 붙여야 정상 작동함 !!!! ※

docker : 다양한 어플리케이션을 컨테이너 환경에서 테스트 및 배포할 수 있는 소프트웨어 플랫폼

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

docker 사용법

1. sudo apt update 이후에 sudo apt install docker.io -y : 패키지 설치

2. sudo docker --version : 설치 확인

3. sudo docker run -d -p 80:80 httpd:latest : 컨테이너 생성

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를 사용해 접속합니다.

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

이름과 같이, 외부에서 서버의 특정 포트에 접근했을 때 지정한 서비스로 전달해 주는 것을 의미함

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

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

docker 컨테이너는 컨테이너가 종료될 때 변경된 데이터는 모두 초기화 된다는 특징을 가지고 있다.

volume 옵션을 사용해 데이터를 보존시킬 수 있다.

  • docker volume
    docker 엔진이 관리하는 volume을 생성하는 방식
    docker volume 방식을 사용해 생성된 volume은 host의 /var/lib/docker/volumes/ 경로에 저장됨
    docker에서 가장 권장하는 방식
  • bind mount
    docker volume 방식과 매우 유사함
    docker container를 생성할 때 사용자가 지정한 경로에 데이터가 저장됨
    docker 엔진의 관리를 받지 않는 영역이기 때문에 사용자가 직접 파일을 추가/수정/삭제 할 수 있다.
    이 방식은 운영에 영향을 미칠 수 있기 때문에 docker volume 방식이 더 권장됨

Dockerfile 이란?

docker 의 이미지를 직접 생성하기 위한 용도로 작성하는 파일.

 

Dockerfile을 작성할 때는 기본이 되는 이미지를 지정한 후,

특정 패키지를 설치하거나 파일을 추가하는 등의 작업을 통해 사용자가 직접 이미지를 빌드하고 사용할 수 있다

FROM python:3.9.15

# .pyc 파일을 생성하지 않도록 설정합니다.
ENV PYTHONDONTWRITEBYTECODE 1

# 파이썬 로그가 버퍼링 없이 즉각적으로 출력하도록 설정합니다.
ENV PYTHONUNBUFFERED 1

# /app/ 디렉토리를 생성합니다.
RUN mkdir /app/

# /app/ 경로를 작업 디렉토리로 설정합니다.
WORKDIR /app/

# main.py 파일을 /app/ 경로로 복사합니다.
COPY ./main.py /app/

컨테이너를 두 개 이상 띄울 수도 있다.

depends_on 옵션을 사용해 컨테이너간 실행 순서를 컨트롤 할 수 있다.

주석처리된 부분을 꼭 잘 읽어보길 바란다.

version: '3.8'

services:
  example1:
    container_name: example1
    image: 'httpd:latest'
    ports:
      - 80:80
    depends_on:
      - example2 # 해당 컨테이너보다 먼저 실행되어야 하는 컨테이너를 지정합니다.
    restart: always
    
  example2: # 서비스 이름이 동일하면 컨테이너가 정상적으로 생성되지 않을 수 있습니다.
    container_name: example2 # 컨테이너 이름이 동일하면 컨테이너 생성 시 에러가 발생합니다.
    build: .
    entrypoint: sh -c "python3 main.py"
    
    restart: always