docker
도커를 사용하는 이유
- 애플리케이션 개발과 배포가 쉬워진다.
도커 컨테이너 내부에서 여러 애플리케이션을 설치해도 호스트 OS에는 영향이 없다.
*호스트 OS란 컴퓨터에 직접 설치된 운영체제를 의미한다.
*도커는 전체 OS를 따로 설치하지 않고, 호스트 OS의 터널을 공유한다. 그래서 도커는 훨씬 빠르고 가볍다.
*도커는 호스트 OS위에서 실행되는 어플리케이션(도구)이다.
[호스트 OS와 도커의 관계: 위에서 아래로]
1. [실제 컴퓨터: 물리머신]
2. [호스트 OS: ex. Ubuntu, Windows, macOS]
3. [Docker Engine: ex. 도커 데몬, 도커 CLI]
4. [Docker Container들]
- 도커를 사용하면 어떤 서버에 올리더라도 같은 환경으로 구성된 컨테이너로 동작하기 때문에 표준화된 배포를 구성할 수 있다.
*개발 환경과 운영 환경의 차이로 인한 어플리케이션 실행 문제를 도커 컨테이너 기반의 배포로 해결할 수 있다.
*도커는 어플리케이션과 어플리케이션에 필요한 모든 환경(라이브러리 등)을 하나의 컨테이너 이미지에 패키징함.
*패키징된 이미지를 어디에 올리든 동일하게 동작한다. 외부 서버의 설정에 영향을 받지 못한다.
docker 명령어/단어 관련 정리
1. 도커 버전 (간략하게) 확인하기 - 터미널에 명령하기
docker --version
Docker version 27.5.1, build 9f9e405
2. 도커의 자세한 정보 확인하기: docker info
3. 도커 클라이언트와 도커 데몬의 관계
도커 클라이언트와 도커 데몬은 도커의 핵심 구성 요소로 클라이언트-서버 구조로 동작한다.
# 도커 클라이언트 실행: 아래와 같은 명령어를 입력할 경우(엔터까지 침) 도커 클라이언트 프로그램이 실행됨.
# -> docker run이 도커 클라이언트를 실행시키는 명령어
# -> docker: 도커 클라이언트 프로그램, run: 클라이언트에게 "컨테이너 하나 실행해줘" 라는 요청,
# nginx: 실행할 컨테이너의 이미지이름
# docker run 만 단독으로 입력시 에러남, docker run 다음에는 반드시 실행할 이미지 이름이 필요하다.
# 도커 클라이언트 프로그램은 백그라운드에서 실행중인 도커 데몬(dockerd) 에게 요청을 보낸다.
# "nginx 이미지를 받아서 (이미지로부터) 컨테이너 하나 만들어서 실행시켜라"
# 로컬에 nginx 이미지가 없으면 docker hub에서 다운로드 -> 컨테이너 생성 -> 컨테이너 실행
# 정리: 터미널 -> [docker 명령어 실행] -> 도커 클라이언트 프로그램 실행 -> docker daemon -> 실제 작업 수행
docker run nginx
docker run 이미지이름: docker run은 도커 클라이언트 프로그램을 실행시키고,
docker run 뒤에 적은 이미지이름을 docker daemon에게 요청한다(이미지이름을 기반으로 컨테이너를 생성해주세요).
4. docker images: 도커에 있는 이미지가 리스트로 나온다.
# docker image 빌드할 때
# Dockerfile을 빌드하면 docker image가 생성된다
# 현재 디렉토리(.)의 Dockerfile을 기반으로 myapp이라는 이름의 이미지를 생성한다.
# -t 옵션을 사용하여 도커 이미지 이름과 태그를 입력할 수 있다.
docker build -t myapp:latest .
# docker hub(도커 이미지 저장소)에서 이미지를 가져올 때
docker pull postgres
# docker image 목록을 볼 때(현재 로컬에 저장된 docker 이미지를 목록으로 표시한다.)
docker images
# docker image 삭제할 때(myapp:latest 이미지를 로컬 저장소에서 삭제한다)
# rmi: remove image, rm은 docker container 삭제시
docker rmi myapp:latest
# docker container 아이디는 모두 작성할 필요 없이 식별 가능한 자릿수까지만 입력해도 된다.
#--------컨테이너 실행(RUN)
# myapp:latest 이미지를 기반으로 컨테이너를 실행해라
# -p옵션은 호스트의 8080포트를 컨테이너의 80포트에 매핑한다.
# host port 번호는 한정적이고(ex. 8080), docker 내부의 port 번호는 어떤 걸 사용해도 상관 없다.
# -d옵션은(detached mode) 컨테이너를 백그라운드에서 실행한다.
# 터미널을 컨테이너에 붙잡히지 않고, 컨테이너가 백그라운드에서 계속 실행된다.
docker run -d -p 8080:80 myapp:latest
# docker container 내부 접속할 때,
# -i(interactive): 컨테이너 표준 입력을 열어둔다.
# 이 옵션을(-i) 사용하면 컨테이너 내부에서 사용자 입력을 받을 수 있다.
# -t(tty): 가상 터미널을 할당한다. 이 옵션을 사용하면 컨테이널 내부에서 터미널을 사용할 수 있다.
docker exec -it 컨테이너_아이디 /bin/bash
# 실행중인 container 목록 보기(status가 up인 컨테이너)
docker ps
5. docker ps[docker container ls]: 도커가 현재 실행중인 컨테이너의 리스트(목록)를 출력한다.
STATUS가 UP인 경우가 현재 실행중인 컨테이너를 의미한다.
6. docker ps -a[docker container ls -a]을 통해서 현재 실행중이지 않은 컨테이너의 목록까지 출력된다
(종료된 컨테이너 포함, 현재 실행중인 컨테이너 목록까지 알 수 있음)
7. docker image prune: 사용하지 않는 이미지는 삭제
→ 태그가 붙지 않는 이미지는(태그가 붙지 않는 이미지와 반대 개념: 실행중인 컨테이너 또는 태그가 붙어있는 이미지) 모두 삭제
8. docker system prune: 사용하지 않는 이미지, 네트워크, 캐시 등 전체 시스템 리소스중 사용하지 않는 것들을 정리한다.
9. docker image: 어플리케이션과 그 실행에 필요한 모든 것을 포함하는 읽기 전용 템플릿이다.
도커 이미지에는 코드, 런타임, 라이브러리, 환경 변수, 구성 파일 등이 포함된다. 컨테이너는 이미지를 기반으로 생성된다.
10. docker container: docker image를 실행한 상태가 docker container다.
어플리케이션이 실행되는 동적인 환경이다. 하나의 시스템에서 여러 개의 컨테이너를 독립적으로 실행시킬 수 있다.
11. Dockerfile: 도커 이미지를 생성하기 위한 스크립트다.
12. 도커와 가상머신: 도커 컨테이너는 애플리케이션만 실행하고, 운영 체제의 핵심부분은 공유하므로(커널 공유)
가상머신보다 훨씬 빠르게 시작할 수 있다. 도커는 리눅스 커널을 사용하여 작동하므로 리눅스 운영체제에서 가장 잘 작동한다.
윈도우나 맥 같은 다른 운영체제에서는 호환성 문제가 있을 수 있고, 리눅스 커널을 에뮬레이션하는 방식으로(윈도우즈 또는 맥OS에서는
도커를 실행시키기 위해 리눅스 환경을 구성해야 한다는 의미(가상 머신 실행)) 작동해야 하기 때문에 성능이 저하될 수 있다.
도커 이미지
- 도커 이미지는 .jar(자르 파일)과 같이 실행되지 않는 OS다.
- 도커 컨테이너 서비스를 위한 도커 이미지는 Container 런타임에 필요한 바이너리,
라이브러리 및 설정 값 등을 포함하고, 변경되는 상태 값을 보유하지 않고(stateless), 변하지 않는다(immutable, Read-Only)
- docker image는 docker registry/hub 에서 다운받는다(도커 이미지는 docker registry/hub 라는 특정 저장소에 저장되어 있다).
docker hub(공개된 도커 이미지 저장소)에서 도커 이미지를 다운 받고(pull),
다운받은 이미지를 기반으로 컨테이너를 생성한다(run)
docker hub에 도커 이미지를 올려놓는 과정은 docker file을 통해서 이미지를 만들고(build),
만든 이미지를 docker registry/hub에 올릴 수도 있다(push).
push하지 않고, 내 컴퓨터에서 생성된 이미지를 기반으로 컨테이너를 생성하여(run) 실행할 수 있다.
도커 컨테이너
도커 이미지와 도커 컨테이너의 관계: 도커 이미지는 도커 컨테이너에 대한 OS, application, library 등등의 정보를 담고 있다.
도커 컨테이너는 도커 이미지를 실행한 상태, 1개의 이미지로부터 N개의 컨테이너를 생성할 수 있는 1:N의 관계다.
컨테이너의 상태에는 실행중인 상태(Running), (잠깐) 중지인 상태(Paused), 멈춘 상태(Stopped)가 존재한다.
docker run 도커이미지이름 명령어는 도커 이미지로부터 도커 컨테이너를 생성하고(create),
생성된 도커 컨테이너를 실행하고(start), 실행중인 도커 컨테이너 안으로 들어가고(attache)를
순차적으로 실행하는 명령어다.
정리: run은 create/start/attach를 순차적으로 실행하는 명령어다.
도커의 생애주기
docker create 또는 run을 명령할 경우 우선 docker가 생성된다.
docker start를 하게되면 docker가 start인 상태가 되고 → 도커가 실행중인 상태로 전환된다(running)
running 상태에서 docker pause 명령어를 실행하면 paused의 상태가 된다.
그리고 running 상태에서 docker kill 등의 명령어가 실행되면 docker의 상태가 stopped로 변한다.
GitHub와 AWS를 연동하여 CI/CD 구성하기
docker compose
다중 컨테이너 docker application을 정의하고, 실행하기 위한 도구다.
docker-compose.yml 파일 하나로 애플리케이션의 서비스, 네트워크, 볼륨 등을 정의할 수 있다.
# docker-compose.yml 파일에 정의된 서비스를 빌드하고, 시작한다.
# -d 옵션을 주면 백그라운드에서 실행된다.
docker compose up -d
# 실행중인 모든 서비스를 중지하고, 컨테이너, 네트워크, 볼륨 등을 정리한다.
docker compose down
'[부트캠프] kdt 심화 과정' 카테고리의 다른 글
도커 실습(2) (0) | 2025.04.23 |
---|---|
4계층, JPA와 리플렉션, JPA auditing 기술 (1) | 2025.04.21 |
2025년 4월 7일 (0) | 2025.04.07 |
MSA(Microservice Architecture)_컨피그 서버(Config Server) (0) | 2025.03.13 |
MSA(Microservices Architecture) 서킷브레이커 (0) | 2025.03.12 |