본문 바로가기
해피 코딩/Docker

Docker 기초 이해하기

by happy-coding 2024. 9. 30.

Docker

  • 목표
🔥 Docker에 대한 이론과 명령어를 공부하고 간단한 실습을 진행해 보자!

[ Docker ]

  • 애플리케이션을 쉽게 만들고, 테스트하고, 배포할 수 있게 도와주는 소프트웨어 플랫폼입니다.
  • 애플리케이션을 컨테이너라는 가볍고 이식성 있는 패키지로 실행할 수 있습니다.

[ 주요 특징 ]

  • 컨테이너화: 애플리케이션과 필요한 모든 것을 하나의 패키지로 묶어 어디서든 실행할 수 있습니다.
  • 경량: Docker는 운영 체제의 커널을 공유하므로, 가상 머신보다 훨씬 가볍고 빠르게 실행됩니다.
  • 이식성: Docker 컨테이너는 어디서든 동일하게 실행됩니다.
  • 확장성: Docker를 사용하면 여러 개의 컨테이너를 효율적으로 관리하고 쉽게 확장할 수 있습니다.

[ 주요 키워드 ]

  • 이미지: 애플리케이션과 모든 실행에 필요한 파일을 포함한 읽기 전용 템플릿
  • 컨테이너: 이미지를 실행하여 동작하는 애플리케이션 인스턴스
  • Dockerfile: 이미지를 생성하기 위한 명령어가 담긴 스크립트 파일
  • Docker Hub: 이미지를 저장하고 공유하는 중앙 저장소
  • 볼륨: 컨테이너 데이터를 지속적으로 저장하는 메커니즘
  • 네트워크: 컨테이너 간의 통신을 관리하는 방식

[ Docker 명령어 ]

이미지 관련 명령어
  • 이미지 빌드 (Build) : docker build -t myapp:latest .
      • 현재 디렉토리의 Dockerfile을 기반으로 myapp이라는 이름의 이미지를 생성합니다.
      •  -t  옵션을 사용하여 이미지의 이름(myappp)과 태그(latest)를 입력할 수 있습니다.
  • 이미지 가져오기: docker pull postgres
    • Docker Hub에서 해당 이미지를 가져오기
  • 이미지 목록 보기: docker images
  • 이미지 삭제: docker rmi myapp:latest
    • myapp:latest 이미지를 로컬 저장소에서 삭제합니다

Docker Container 관련 명령어

📌 컨테이너 아이디는 모두 작성할 필요 없이 식별 가능한 자릿수까지만 입력

  • 컨테이너 실행: docker run -d -p 8080:80 myapp:latest
    • myapp:latest 이미지를 사용하여 컨테이너를 실행합니다.
    •  -d  옵션은 백그라운드에서 실행되도록 하고, 이 옵션을 사용하면 터미널을 컨테이너에 붙잡히지 않고, 컨테이너가 백그라운드에서 계속 실행됩니다.
    •  -p 옵션은 호스트의 8080 포트를 컨테이너의 80 포트에 매핑합니다.
  • 컨테이너 내부 접속: docker exec -it 컨테이너_아이디 /bin/bash
    • 자주 사용하는 명령어 중 하나임으로 기억해 두면 좋을 거 같습니다.
  • 현재 실행 중인 컨테이너 목록 보기: docker ps
  • 모든 컨테이너 목록 보기: docker ps -a
  • 마지막으로 실행된 컨테이너 보기: docker ps -al
  • 컨테이너 시작: docker start 컨테이너_아이디
  • 컨테이너 중지: docker stop 컨테이너_아이디
  • 컨테이너 삭제: docker rm 컨테이너_아이디

[ 실습 1 ]

🤔 PC에 3개의 포트가 존재하고, 그림과 같이 호스트 포트와 컨테이너 포트가 매핑되어 있을 때, 빨간색 부분과 초록색 부분의 문제점을 비교해 보자. 

 

  • 호스트 포트와 컨테이너 포트가 잘못 매핑된 경우: 빨간색
  • 호스트 포트와 컨테이너 포트가 제대로 매핑된 경우: 초록색
💁
- 빨간색 부분의 문제점
호스트의 포트는 동일하지 않고 하나씩 존재하기 때문에 도커 내부의 컨테이너와 바인딩(연결)을 할 때, 호스트 하나가 하나의 컨테이너에 바인딩(연결) 될 수 있다.
- 초록색 부분이 문제없는 이유
도커 내부의 컨테이너는 각각 독립적으로 격리되어 있기 때문에 컨테이너 포트의 번호가 같아도 호스트 포트가 다르다면 상관없다.

[ 실습 2 ]

  • Docker를 사용하여 실제로 실습해 보자!!
컨테이너 실행하기
docker run -d --name postgres-sample \
  -p 5433:5432 \
	-e POSTGRES_USER=admin1 \
	-e POSTGRES_PASSWORD=admin2 \
	-e PGDATA=/var/lib/postgresql/data/pgdata \
	-v ${로컬_바인딩_폴더}:/var/lib/postgresql/data:z \
	postgres

  • 🚨 에러 발생 1

  • 문제 해결
    • ' \ '뒤에 공백이 있는 것을 발견 

  • 🚨 에러 발생 2
    •  "/postgres-sample" 이미 사용 중인 컨테이너라고 한다.
    •  "docker ps"를 통하여 실행중인 컨테이너 확인
      • 실행중인 컨테이너가 없는 것을 볼 수 있다.

  • "docker ps -a"를 통하여 모든 컨테이너 목록 확인
    •  "/postgres-sample"의 NAME을 가진 컨테이너를 볼 수 있다.


🤔 그렇다면 이 문제를 어떻게 해결할 수 있을까?
💁 방법 1.
새로운 이름의 컨테이너 생성
💁 방법 2.
기존에 존재하던 컨테이너 삭제 후 새로 만들고자 하는 컨테이너 재생성
  • 방법 1. 을 통하여 문제를 해결해 보도록 하자!!

  • 문제 해결
    • 새로운 이름의 컨테이너가 생성되고 실행된 모습을 볼 수 있다.


[ 실습 2-1 ]

  • 새로운 이름의 컨테이너와, 새로운 바인딩 폴더 생성
  • 실습 2. 에서 이미 만들어둔 호스트 포트(5433)를 사용하여 새로운 컨테이너 만들기

 

  • 🚨 에러 발생 3
    • 5433 포트가 존재
    • 호스트의 포트는 동일하지 않고 하나씩 존재하기 때문에 도커 내부의 컨테이너와 바인딩(연결)을 할 때, 호스트 하나가 하나의 컨테이너에 바인딩(연결) 될 수 있다.

  • "docker ps -a"를 통하여 모든 컨테이너 목록 확인
    • 새로운 이름의 컨테이너가 생성된 모습을 볼 수 있지만,
    • 해당 포트(5433)가 이미 존재하기 때문에 PORTS가 생성되지 않은 모습을 볼 수 있다. 


  • 문제 해결
    •  "postgres-sample2"를 삭제 후 재생성
    • 새로운 호스트 번호(5434)로 사용중인 컨테이너 포트(5432)에 바인딩
      • 도커 내부의 컨테이너는 각각 독립적으로 격리되어 있기 때문에 컨테이너 포트의 번호가 같아도 호스트 포트가 다르다면 상관없다.

  • 정리: 호스트 포트는 같으며 안되며, 컨테이너 포트는 독립적으로 격리되어 있기 때문에 같아도 된다.

이로써 도커의 이론과 명령어 그리고 호스트 포트와 컨테이너 포트의 관계를 알아보았다.

 

읽어주셔서 감사합니다 😊

'해피 코딩 > Docker' 카테고리의 다른 글

[CS 운영체제] 가상 머신과 컨테이너  (3) 2024.12.14