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 |
---|