인프런 만우절 이벤트로 1100원에 저렴하게 구매할 수 있어서 복습할 겸 들어봤다.
2편으로 나눠서 정리할 예정이다.
도커의 개념
개념 정리
도커 : 컨테이너 엔진
컨테이너 : 애플리케이션 런타임에 필요한 리소스만 가상화한 기술
- 리소스 공유 : 컨테이너는 호스트 OS와 리소스를 공유 (CPU, Memory 등)
- 리소스 격리 : 디스크(저장공간), 네트워크(IP, Port) 등은 각 컨테이너 별로 고유
이미지 : 도커에서 컨테이너를 실행 시키기 위한 필요한 컨테이너의 이미지
다운로드
https://www.docker.com/get-started/
현업에서 자주 사용하는 Docker CLI
pull : 이미지 다운로드
pull 명령어를 사용해 우리는 도커 허브로부터 컨테이너 이미지를 다운로드 받을 수 있다.
도커 허브 : 컨테이너 이미지 저장소 (https://hub.docker.com)
태그 : 이미지의 특정 버전(릴리즈)을 표현
- docker pull 이미지명:태그명
- docker pull 이미지명 (태그명 생략시 자동으로 latest 버전 설치)
image ls, image rm : 이미지 조회, 삭제
image ls 명령어를 사용해 설치된 컨테이너 이미지를 조회할 수 있다.

image rm 명령어를 사용해 설치된 컨테이너 이미지를 삭제할 수 있다.
- docker image rm 이미지ID (이미지ID 대신 이미지명:태그명도 가능)
- docker image rm $(docker images -q) (컨테이너에서 사용하고 있지 않은 이미지 모두 삭제)
- docker image rm -f 이미지ID (중단된 컨테이너에서 사용하고 있는 이미지여도 강제 삭제)
- docker image rm -f $(docker images -q)
create, start, run : 컨테이너 설치+생성, 실행, 설치+생성+실행
create 명령어를 사용해 컨테이너를 생성할 수 있다.
컨테이너 생성 과정에서 컨테이너 이미지가 로컬에 다운로드 되어있지 않으면 자동으로 도커 허브에서 설치
- docker create 이미지명
- created 상태는 컨테이너가 생성만 되고 아직 동작하고 있지 않은 상태
start 명령어를 사용해 생성된 컨테이너를 실행할 수 있다.
- docker start 컨테이너ID
- Up 상태는 컨테이너가 동작되고 있는 상태
run 명령어를 사용해 pull, create, start 를 한 번에 진행할 수 있다.
- docker run 이미지명 (포그라운드 실행)
- docker run -d 이미지명 (백그라운드 실행)
- docker run -d -p 호스트PORT:컨테이너PORT 이미지명 (백그라운드로 호스트와 컨테이너 포트를 매핑해 실행)
- docker run --name 컨테이너이름 -d -p 호스트PORT:컨테이너PORT 이미지명 (컨테이너 이름을 설정하고, 백그라운드로 호스트와 컨테이너 포트를 매핑해 실행)
ps, stop, kill, rm : 컨테이너 조회, 중지, 강제중지, 삭제
ps 명령어를 사용해 컨테이너를 조회할 수 있다.
- docker ps (현재 실행 중인 컨테이너만 조회)
- docker ps -a (생성되어 있는 모든 컨테이너 조회)
stop 명령어를 사용해 컨테이너를 중지할 수 있다.
- docker stop 컨테이너ID (컨테이너ID 대신 컨테이너명 도 가능)
kill 명령어를 사용해 컨테이너를 강제중지할 수 있다.
- docker kill 컨테이너ID (컨테이너ID 대신 컨테이너명 도 가능)
rm 명령어를 사용해 중지되어 있는 컨테이너를 삭제할 수 있다.
- docker rm 컨테이너ID (컨테이너ID 대신 컨테이너명 도 가능)
- docker rm $(docker ps -qa) (중지되어 있는 모든 컨테이너 삭제)
- docker rm -f (실행되어 있는 컨테이너라도 강제 삭제)
logs : 컨테이너 로그 조회
logs 명령어를 사용해 컨테이너의 로그를 조회할 수 있다.
- docker logs --tail 숫자 컨테이너ID (최근 로그 n만큼 출력)
- docker logs -f 컨테이너ID (실시간 로그 출력)
- docker logs --tail 0 -f 컨테이너ID (기존 로그 제외, 지금부터 발생하는 실시간 로그 출력)
exec -it : 실행 중인 컨테이너 내부 접속
exec -it 명령어를 통해 실행 중인 컨테이너 내부에 접속할 수 있다.
- docker exec -it 컨테이너ID bash (bash 쉘로 접속)
데이터 영속성을 보장하기 위한 Docker Volume
컨테이너의 핵심 포인트는 기존 컨테이너를 수정하는 것이 아니라, 새로운 버전의 컨테이너를 새롭게 실행하는 것에 초점이 맞춰져 있다는 것이다.
따라서 기본적으로 데이터 영속성이 보장되지 않는다.
이로 인해 발생하는 문제로는 DB 컨테이너의 데이터들도 함께 사라진다는 것이다.
이러한 문제점을 극복하는 기능이 Docker Volume 이고, 호스트OS 마운트 혹은 볼륨 파일 생성 중 택1하여 이 기능을 사용할 수 있다.
앞으로 아래에서 DB와의 연결을 DBeaver 프로그램을 활용해 테스트할 것이다.
Docker로 MySQL 실행
-v 플래그를 통해 docker volume을 매핑할 수 있다.
- docker run -e MYSQL_ROOT_PASSWORD=패스워드 -d -p 호스트포트:컨테이너포트 -v 호스트경로:/var/lib/mysql mysql (-v 옵션을 통해 호스트와 컨테이너 DB 파일이 저장된 디렉터리 마운트)
- 주의: 최초의 컨테이너 실행 시 패스워드가 DB 데이터에 저장되므로 마운트한 경우, 다시 컨테이너 실행할 때는 최초의 비밀번호로 입력해야 한다.
- 주의 : 호스트 디렉터리에 다른 파일이 있을 경우, 컨테이너보다 호스트의 디렉터리가 우선 순위가 높아 덮어씌워지므로 빈 디렉터리로 유지해야 한다.
DBeaver로 테스트 시 아래와 같은 화면이 출력되어야 한다.

Docker로 PostgreSQL 실행
- docker run -d -p 호스트포트:컨테이너포트 -e POSTGRES_PASSWORD=패스워드 -e PGDATA=/var/lib/postgresql/data/pgdata -v 호스트경로:/var/lib/postgresql/data postgres
Docker로 MongoDB 실행
- docker run -e MONGO_INITDB_ROOT_USERNAME=몽고DB루트사용자명 -e MONGO_INITDB_ROOT_PASSWORD=몽고DB루트패스워드 -p 호스트포트:컨테이너포트 -v 호스트경로:/data/db -d mongo
Dockerfile를 활용한 컨테이너 이미지 생성
Dockerfile의 개념
Dockerfile : 도커 이미지를 빌드할 때 사용하는 파일
도커 파일 내부 요소 : FROM, COPY, ENTRYPOINT, RUN, EXPOSE
- docker build -t [이미지명]:[태그명] [도커파일경로]
FROM : 베이스 이미지 생성
FROM 은 베이스 이미지(초기 이미지)를 지정할 때 사용한다.
- FROM [이미지명]
- FROM [이미지명]:[태그명]
COPY : 파일 복사(이동)
COPY 는 호스트 파일을 복사해서 컨테이너로 전달한다.
- COPY [도커 파일 상대 경로 기준 복사할 파일의 경로] [복사될 컨테이너의 경로]
- 주의 : 1) ~ 2)는 다른 표현
- 1) COPY test /test : / 디렉터리의 하위 파일인 test 로 저장
- 2) COPY test /test/ : /test 디렉터리의 하위 파일인 test로 저장
- 꿀팁 : .dockerignore 파일을 사용해 COPY 명령어 무시 가능
ENTRYPOINT : 컨테이너 시작 시 실행되는 명령어
ENTRYPOINT 는 컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어이다.
- ENTRYPOINT ["명령어", "명령어"]
- 꿀팁 : ENTRYPOINT [”/bin/bash”, “-c”, “sleep 500”] 행을 추가해 컨테이너가 생성 후 바로 종료되지 않도록 수정해 컨테이너 이미지가 정상적으로 빌드된 게 맞는지 디버깅할 수 있다.
RUN : 이미지 생성 과정에서 사용할 명령문 실행
RUN 은 ‘이미지 생성 과정’에서 필요한 명령어를 실행 시킬 때 사용한다.
- RUN [명령문]
- 주의 : COPY 는 RUN이 정상적으로 실행된 이후 생성된 이미지를 기반으로 컨테이너 생성한 직후에 실행되는 명령어
WORKDIR : 작업 디렉터리를 지정
WORKDIR 로 작업 디렉터리를 지정할 수 있다.
즉, 모든 작업(RUN, CMD, ENTRYPOINT, COPY, ADD)들이 작업 디렉터리 하위에서 진행된다.
이를 통해 컨테이너 내부 파일과 도커 파일이 수행하는 작업 파일 간 섞이는 것을 방지할 수 있다.
- WORKDIR [작업 디렉터리로 사용할 절대 경로]
EXPOSE : 컨테이너 내부에서 사용 중인 포트 표시하는 역할
EXPOSE 는 컨테이너 내부에서 어떤 포트로 프로그램을 실행하는지 표시한다.
단순 표시의 역할만 수행하므로, 별도로 사용하지 않아도 동작에 영향은 없다.
- EXPOSE [포트번호]
Dockerfile 예시
구름 팀 미션 제출 파일(HTML, CSS)을 NGINX 컨테이너화해 테스트했다.
테스트 내용
- .dockerignore
- Dockerfile (FROM, WORKDIR, COPY, ADD, RUN, ENTRYPOINT, CMD, EXPOSE)
테스트 방법
- curl localhost 를 통해 정상적으로 nginx 웹 서버 동작 여부 확인
- docker exec -it 컨테이너ID bash 후 cat cmdTestResult.txt 입력해서 아래와 같은 문구가 정상적으로 출력되는지 확인
깃허브 코드
https://github.com/baobabnamu/docker_practice
'Tech > [Container] Docker' 카테고리의 다른 글
비전공자도 이해할 수 있는 Docker (2) (0) | 2025.04.03 |
---|---|
Flask API Server Dockerized (0) | 2022.11.17 |
Docker-Compose를 활용한 NestJS Dockerized (Mac M1) (0) | 2022.05.22 |
Docker-Compose를 활용한 MySQL 8.0.28 구축 (Mac M1) (0) | 2022.05.18 |