이지은님의 블로그
250409 - Docker 관련 개념: docker, container, Dockerhub, image 본문
▷ 오늘 배운 것
docker에 대해 세션, 강의에 대한 내용을 정리해보았다. 추후 볼륨 및 compose에 대해서도 포스팅 예정이다.
<<목차>>
1. Docker 개념
1) Docker란?
2) docker를 써야하는 이유
3) 컨테이너(container)
4) 도커(docker)
5) Dockerhub
2. ECR
1) ECR(Amazon Elastic Container Registry)
3. Docker 문법
1) 이미지 다운로드
2) 이미지를 사용하여 컨테이너 생성
1. Docker 개념
1) Docker란?
Docker는 소프트웨어 개발과 배포를 도와주는 컨테이너(Container) 기술
도커를 사용하여 애플리케이션을 빌드, 배포, 실행하는 과정을 쉽게 관리할 수 있음
2) docker를 써야하는 이유
1️⃣ 내 로컬에서는 잘 되는데, 서버에서는 안될까? 에 대한 문제 해결(일관성)
-> 컨테이너화(Containerization): 항상 동일한 환경을 제공
-> 도커 이미지를 사용하여 개발 환경을 서버와 동일하게 유지 가능
=> "한 번 설정하면 어디서나 동일하게 실행 가능”
=> 이식성: 특정 프로그램을 다른 곳으로 쉽게 옮겨서 설치 및 실행할 수 있는 특성
2️⃣ VM(가상 머신)의 경우 리소스 사용량 높아 오버헤드 발생
3️⃣ 개발부터 배포까지 일관된 환경 제공
-> 개발, 테스트, 운영 환경을 동일하게 유지
-> Dockerfile을 사용해 어떤 환경에서도 동일한 실행 결과 보장
4️⃣ 빠른 배포와 확장성
-> 이미지를 만들어 배포하면 한줄 명령어로 실행 가능
-> 컨테이너 확장성
-> Kubernetes 등과 결합하여 자동 확장(Scaling) 및 복구 가능
5️⃣ CI/CD와 연계
-> CI/CD (Jenkins, GitHub Actions 등)와 결합해 자동 빌드 & 배포 가능
-> 개발자가 동일한 도커 이미지를 사용하여 일관된 환경에서 개발 가능
6️⃣ 매번 귀찮은 설치 과정을 일일이 거치지 않아도 된다.
7️⃣ 항상 일관되게 프로그램을 설치할 수 있다. (버전, 환경 설정, 옵션, 운영 체제 등)
8️⃣ 각 프로그램이 독립적인 환경에서 실행되기 때문에 프로그램 간에 서로 충돌이 일어나지 않는다.
3) 컨테이너(container)
컨테이너란?
애플리케이션이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 코드와 모든 종속성을 패키징하는 소프트웨어의 표준 단위
- 하나의 호스트 운영체제(Host OS) - 여러 개의 애플리케이션 —> 도커(Docker)를 통해 실행
- 각 애플리케이션은 서로 분리된 상태이지만, 공통된 운영체제(Host OS) 를 공유
- 호스트(host) 컴퓨터: 컨테이너를 포함하고 있는 컴퓨터
- 컨테이너의 독립: 디스크, 네트워크(IP, Port)
컨테이너의 장점
- 운영체제(OS)를 공유하므로 경량
- 실행 속도가 빠름 (VM보다 오버헤드가 적음)
- 배포와 확장이 용이함
4) 도커(docker)
도커란?
컨테이너 필요한 기능을 거의 모두 제공하는 플랫폼
- 애플리케이션 구동에 필요한 환경 설정 관련 절차를 도커 파일에 작성 및 빌드 -> 도커이미지가 생성 및 실행 -> 도커 컨테이너 생성
- 도커 컨테이너에 설정된 프로그램, 데이터 등이 실제 컴퓨팅자원 위에서 돌아가게 됨
1️⃣ 도커 파일
: 패키지, 환경변수설정 등을 기록한 파일.
2️⃣ 도커 이미지
: 어떤 환경으로 세팅할건지 설정하고 저장하여 들고다니는 개념. 도커 컨테이너를 생성하기 읽기 전용 템플릿
- 프로그램을 실행하는 데 필요한 설치 과정, 설정, 버전 정보 등을 포함
- 자신의 도커 이미지 게시 가능
- 컨테이너 실행에 필요한 파일과 설정값, 데이터 등을 포함된 상태값이며 불변함
- 하나의 이미지에서 여러개의 컨테이너를 생성가능하며, 컨테이너의 상태와는 별개로 이미지 존재
3️⃣ 도커 컨테이너
- 컨테이너는 실행 가능한 이미지 인스턴스
- 도커 API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동, 삭제 가능
- 컨테이너를 하나 이상의 네트워크에 연결하거나 컨테이너에 스토리지를 연결하거나 현재 상태를 기반으로 새 이미지를 생성
- 컨테이너가 실행시키면 도커이미지에 설정된 프로그램, 데이터 등이 실제 컴퓨팅자원과 연결.
5) Dockerhub
Docker Hub Container Image Library | App Containerization
Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.
hub.docker.com
사람들이 올려놓은 이미지가 저장되어 있는 곳으로 pull을 통해 이미지를 다운로드 할 수 있다.
$ docker pull nginx # Nginx 이미지 다운로드
$ docker pull nginx:stable-perl # Nginx 이미지의 stable-perl 태그를 설정해 다운로드
2. ECR
1) ECR(Amazon Elastic Container Registry)
: AWS에서 제공하는 Docker 이미지 저장소(Docker Hub와 같은 역할)
로컬에서 빌드한 Docker 이미지를 ECR에 업로드하면, AWS의 다른 서비스(ECS, EKS 등)에서 쉽게 가져와 사용할 수 있음
비교 항목 | AWS ECR | Docker Hub |
저장소 위치 | AWS 내 S3 기반 | 퍼블릭 클라우드 |
보안 | AWS IAM 인증 필요 | 퍼블릭/프라이빗 설정 가능 |
속도 | AWS 내에서 빠른 Pull | 글로벌 접근성 |
통합성 | 통합성 | 통합성 |
3. Docker 문법
1) 이미지 다운로드
$ docker pull nginx # Nginx 이미지 다운로드
$ docker image ls # 이미지 리스트 확인
$ docker run --name webserver -d -p 80:80 nginx # nginx이미지를 webserve 이름으로 백그라운드 실행
1️⃣ 이미지 다운로드
$ docker pull [이미지명]
Dockerhub에서 저장된 이미지를 다운로드
2️⃣ 이미지 리스트 확인
$ docker image ls
$ docker image ls -a
이미지 리스트 확인
docker image ls: 현재 사용 가능한 이미지만 표시
docker image ls -a: 태그가 없거나 중간에 생성된 모든 이미지 포함하여 표시
REPOSITORY | 이미지 이름(이미지명) |
TAG | 이미지 태그명 |
IMAGE ID | 이미지 ID |
CREATED | 이미지가 생성된 날짜 (다운받은 날짜 X) |
SIZE | 이미지 크기 |
3️⃣ 이미지 삭제
$ docker image rm [이미지 ID 또는 이미지명]
$ docker image rm -f [이미지 ID 또는 이미지명]
컨테이너에서 사용하고 있지 않은 이미지만 삭제가 가능하다.
-f: 강제삭제 옵션
전체 이미지 삭제
$ docker image rm $(docker images -q)
$ docker image rm -f $(docker images -q)
2) 이미지를 사용하여 컨테이너 생성
1️⃣ 컨테이너 생성 및 실행
$ docker create nginx
$ docker start [컨테이너명 또는 컨테이너 ID]
이미지를 바탕으로 컨테이너 생성 및 실행
$ docker run [이미지명(:태그명)] # 포그라운드
$ docker run -d [이미지명(:태그명)] # 백그라운드
이미지를 바탕으로 컨테이너를 생성, 실행까지 한번에 수행가능
$ docker run -d -p [호스트 포트]:[컨테이너 포트] [이미지명(:태그명)]
-p: 호스트의 포트와 컨테이너의 포트 연결
2️⃣ 컨테이너 조회
$ docker ps # 실행중인 컨테이너 조회
$ docker ps -a # 모든 컨테이너 조회
3️⃣ 컨테이너 중단 및 삭제
$ docker stop [컨테이너 ID]
$ docker kill [컨테이너 ID]
$ docker rm [컨테이너 ID]
$ docker rm -f [컨테이너 ID]
전체 컨테이너 삭제
$ docker rm $(docker ps -qa)
$ docker rm -f $(docker ps -qa)
4️⃣ 컨테이너 로그 조회
$ docker logs [실행되고 있는 컨테이너 ID] # 기존 로그 조회
$ docker logs -f [실행되고 있는 컨테이너 ID] # 실시간 + 기존 로그 조회
$ dokcer logs --tail [로그 끝부터 표시할 줄 수] [컨테이너 ID 또는 컨테이너명] # 최근 로그 조회
$ docker logs --tail 0 -f [컨테이너 ID 또는 컨테이너명] # 실시간 + 기존 로그 조회 X