74DAYS) [Cloud] 배포 컨테이너 - Docker

nacSeo (낙서)·2023년 2월 2일
0

◉ 학습목표

1. Docker가 무엇이고, 왜 필요한지 알 수 있다.
2. Docker CLI 명령어를 사용해서 이미지를 생성/수정/배포하고 컨테이너를 생성/삭제할 수 있다.
3. 1개와 2개의 Docker Image를 각각 다룰 수 있다.
  1. Docker

⦿ 학습내용

☞ 컨테이너 기술 방식의 장점

✔︎ 실행 환경에 구애받지 않고 애플리케이션 실행 가능
✔︎ 의존성 충돌 문제 해결

  • 개발과 배포 환경 일치
    • 개발팀의 문제
      • OS에 상관없이 즉시 애플리케이션 실행 환경을 만들 수 있음
      • 개발을 컨테이너 위에서 진행할 경우, 모든 개발팀이 동일한 환경 하에 개발 가능
    • 배포 시의 문제
      • Amazon Web Service의 EC2 상 도커를 설치
      • 또는, 도커 컨테이너를 EC2 서버에서 실행할 수 있게하는 서비스인 ECS를 이용하여 보다 쉽게 애플리케이션 배포 가능
  • 수평 확장을 쉽게 해줌
    • 실행 환경을 일치시켜주기 때문에, 서버 증설에 활발히 활용
  • 각 서버에 새로운 내용을 배포하기 쉽게 해줌
    • 수평 확장이 쉽기 때문

☞ 컨테이너의 격리성

✔︎ 프로세스

  • 특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스 가능
  • 컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에게 영향 줄 수 ❌

✔︎ 네트워크

  • 기본으로 컨테이너 하나에 하나의 IP 주소 할당

✔︎ 파일 시스템

  • 컨테이너 안에서 사용되는 파일 시스템은 구획화되어 있음
  • 해당 컨테이너에서의 명령이나 파일 등 액세스 제한 가능

☞ 컨테이너 🆚 VM

✔︎ 공통점

  • 프로세스, 네트워크, 파일 시스템을 격리할 수 있다는 장점 공유

✔︎ 차이점

  • 작동 원리

✔︎ VM (가상 머신)

  • 만들고 실행하는 과정이 많은 컴퓨터 자원을 필요로 함
  • 이용하기 위해서 VM 위에 운영체제반드시 설치해야 함

✔︎ 도커 (컨테이너 기술)

  • 한 호스트 컴퓨터에 여러 개의 컨테이너를 띄워도 크게 컴퓨터에 무리 ❌
  • 보통 애플리케이션 단위로 만들어져 있음
  • 각 컨테이너는 호스트 OS의 커널(Kernel, OS의 핵심 기능을 구현한 프로그램)을 공유

☞ Docker 핵심 키워드

✔︎ 컨테이너

  • 애플리케이션이 의존성, 네트워크 환경, 파일 시스템에 구애받지 않고, 도커라는 기술 위에(격리된 환경 안에) 실행될 수 있도록 만든 애플리케이션 상자

✔︎ 이미지

  • 실행되는 모든 컨테이너는 이미지로부터 생성
  • 애플리케이션 및 애플리케이션 구성을 함께 담아놓은 템플릿으로, 이를 이용해 즉시 컨테이너를 만들 수 있음
  • 이미지를 이용해 여러 컨테이너 생성 가능 (애플리케이션의 수평 확장 가능)
  • 기본 이미지(base image)부터 변경 사항을 추가/커밋해서 또 다른 이미지 생성 가능

✔︎ 레지스트리

  • 이미지는 레지스트리에 저장
  • 대표적 이미지 레지스트리 : Docker Hub, Amazon ECR
  • 도커 CLI에서 이미지를 이용해 컨테이너를 생성할 때, 호스트 컴퓨터에 이미지가 존재하지 않으면, 기본 레지스트리로부터 다운로드
  1. Docker CLI

⦿ 학습내용

☞ 이미지 구분


✔︎ 레지스트리 (Registry)

  • 도커 이미지를 관리하는 공간
  • 지정하지 않으면, 도커 허브(Docker Hub)를 기본 레지스트리로 설정
  • Docker Hub, Private Docker Hub, 회사 내부용 레지스트리 등으로 나뉨

✔︎ 레포지토리 (Repository)

  • 레지스트리 내에 도커 이미지가 저장되는 공간
  • 이미지 이름이 사용되기도 함
  • GitHub의 레포지토리와 유사

✔︎ 태그 (Tag)

  • 같은 이미지도 버전 별로 다를 수 있음
  • 해당 이미지를 설명하는 버전 정보를 주로 입력
  • 지정하지 않으면, latest 태그를 붙인 이미지를 가져옴

☞ Docker CLI 명령어

✔︎ 이미지 불러오기

docker image pull [레지스트리]/[레포지토리]:[태그]
  • image pull : 레지스트리에 이미지 혹은 레포지토리를 가져옴

✔︎ 이미지 실행 (이미지 → 컨테이너)

docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • {container} run
    • 컨테이너 실행
  • [OPTIONS]
    • -name : 컨테이너 이름 할당
  • [COMMAND]
    • 초기 컨테이너 수행 시 수행되는 명령어
  • [ARG...]
    • COMMAND에 넘겨질 파라미터

✔︎ 모든 컨테이너의 리스트 출력

docker container ps -a
  • {container} ps
    • 컨테이너의 리스트 출력
  • a
    • Default로는 실행되는 컨테이너지만, 종료된 컨테이너를 포함하여 모든 컨테이너 출력

✔︎ 컨테이너 삭제

docker container rm 컨테이너_이름
  • {container} rm : 컨테이너를 지칭해서 삭제

✔︎ image 용량 확인

docker image ls

✔︎ 하나의 이미지를 받아와, 컨테이너로 실행하고, 컨테이너와 관련 리소스를 삭제하는 3가지 방법 한 번에 실행

docker container run --name 컨테이너_이름 --rm [COMMAND] [ARG]

✔︎ it

  • -i, -t를 동시에 사용한 옵션
  • 사용자와 컨테이너 간 인터렉션(interaction)이 필요하면 사용
  • 출력되는 화면을 사용자가 지속적으로 보기 위해 사용
  • 예시
docker container run -it --rm danielkraic/asciiquarium:latest
- `danielkraic`라는 사람이 올린 이미지 `asciiquarium` 실행

✔︎ -p

  • 로컬호스트의 포트와 컨테이너의 포트를 연결
  • 예시
docker container run --name 컨테이너_이름 -p 818:80 httpd
- 818 포트 : 로컬호스트 포트
- 80 : 컨테이너 포트

✔︎ -d

  • 컨테이너를 백그라운드에서 실행

✔︎ 로컬 호스트에 있는 파일을 컨테이너에 전달

  • 예시
   //src/main/resources/templates
   docker container cp ./ 컨테이너_이름:/usr/local/apache2/htdocs/

   //src/main/resources/static
   docker container cp ./ 컨테이너_이름:/usr/local/apache2/htdocs/
- 현재 폴더의 파일을 뒤 경로에 복사

✔︎ 컨테이너 내부 터미널 접속 방법

docker exec -it 컨테이너_이름 bash
- 컨테이너 내부 터미널 접속 가능
- 컨테이너 오작동 시 원인 찾을 때 사용

☞ Docker 이미지 만들기

✔︎ 구동한 Docker Container를 이미지로 만드는 방법

  • 구동한 Docker Container를 commit
docker container commit 컨테이너_이름 이미지_이름
  • 생성된 이미지를 900 포트에서 웹 서버로 구동
docker run --name 컨테이너_이름 -p 900:80 이미지_이름
  • 127.0.0.1:900 또는 localhost:900으로 웹 서버 정상 작동 여부 확인

✔︎ Docker Image 빌드를 위한 파일인 Dockerfile 로 만드는 법

  • Dockerfile을 작성해 알맞는 경로에 저장
  • 예시
    FROM httpd:2.4
    COPY {웹 서버 실행에 필요한 파일의 경로 1} /usr/local/apache2/htdocs/ # 띄어쓰기에 유의하여 작성합니다.
    COPY {웹 서버 실행에 필요한 파일의 경로 2} /usr/local/apache2/htdocs/
  • docker build : Dockerfile로 도커 이미지 파일 생성
  • 예시
    # --tag 는 name:tag 형식으로 이미지를 생성할 수 있습니다.
    # 지정한 경로에 있는 Dockerfile을 찾아서 빌드합니다.
    docker build --tag my_pacman:2.0 . # "."을 명령어에 꼭 포함해야 합니다! 
  • 생성된 이미지를 이용해 901 포트에서 웹 서버 구동
docker run --name 컨테이너_이름 -p 901:80 이미지_이름
  • 127.0.0.1:901 또는 localhost:901을 통해 웹 서버 작동 여부 확인
  1. Docker 이미지 다루기

⦿ 학습내용

☞ 한개의 Docker Image 다루기

✔︎ Quiz1

  • sebcontents/part1:latest 이미지 이용
  • 아파치 웹 서버 이미지 (httpd) 기반
  • 이미지를 바탕으로 컨테이너 생성
  • 주어진 소스 코드를 클론하여 게임 실행

✔︎ Quiz2

  • docker exe 명령어를 통해 실습 진행
  • 컨테이너_이름 부분에는 quiz1 실습 참고
  • 접속하기
docker exe -it 컨테이너_이름 bash
  • 루트 디렉토리로 이동
cd /
  • 루트 디렉토리에 data 폴더 존재 확인
ls
  • data 폴더로 이동하여 quiz2.txt 파일 존재 확인
ls
  • nano 텍스트 에디터 설치
apt update
apt install nano
  • exit 명령어를 통해 종료 가능

☞ 두 개의 Docker Image 다루기

✔︎ docker-compose CLI

  • docker-compose.yaml에 정의된 이미지를 컨테이너로 실행
docker-compose up
- -d 옵션과 함께 사용하면, 컨테이너를 백그라운드로 실행 가능
  • docker-compose.yaml에 정의된 이미지를 이용해 실행된 컨테이너 종료
docker-compose down
  • 특정 이미지만 컨테이너로 실행
docker-compose up {특정 이미지}

✔︎ Quiz3

  • docker-compose.yaml 또는 docker-compose.yml 파일 생성 (터미널 위치 무관)
  • yaml 파일이 있는 위치에서 docker-compose up -d 명령어를 통해 yaml 파일 실행
  • localhost:8080 또는 127.0.0.1:8080에서 실행된 화면 실행

◉ 느낀 점

☞ 정보처리기사를 준비할 때 Docker, 쿠버네티스라는 개념들을 정의로만 알고 있었는데 내가 직접 사용해볼 수 있는 기회였다. 컨테이너 기술은 현업에서도 많이 사용한다고 알고 있었고, 오늘의 학습 경험이 큰 도움이 될 수 있을 것 같다 :) 확실히 코드스테이츠의 커리큘럼 코스가 현업 위주로 잘 짜여져 있는 것 같아 만족!!!

배포 과정이 조금 복잡하게도 느껴질 수 있지만, 내일 자동화를 공부하면서 좀 더 손쉽게 배포할 수 있도록 숙련시켜야겠다 😤

◉ 내일의 키워드

・ 배포 자동화 (Automated Deployment)
・ AWS Pipeline
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글