Docker 기초

KHS·2025년 2월 19일

이 글은 LG CNS AM Camp 1기에서 수강한 내용을 정리한 글입니다.

Docker 기초


Docker

참고자료

이재홍의 언제나 최신 도커
도커 공식 문서

🧪 실습: 도커 기초 실습

🔗 실습 코드

디렉토리실습 설명
goDockerfile을 이용한 도커 이미지 빌드
ROOT도커 허브에서 이미지 가져오기 & 컨테이너-호스트 간 파일 복사
webserverDockerfile 작성 시 유의사항 (우분투 컨테이너에 아파치 웹 서버 설치 - 사용자 입력과 백그라운드 프로세스 이슈)
layerDockerfile 작성 시 유의사항 (이미지 크기 이슈)
buildpattern빌더 패턴
multistagebuild다단계 빌드
cmd_entrypointCMD 지시어와 ENTRYPOINT 지시어의 차이
envENV 지시어
gugudan구구단 출력 프로그램을 실행하는 이미지 생성 실습
docker_composeDocker compose 실습

Docker 시작하기

  • Docker Desktop 설치
  • Docker Hub 가입
  • Docker 실행 확인
    C:\Windows\System32> docker version
  • 도움말
    C:\Users\user> docker help
    C:\Users\user> docker container --help
    C:\Users\user> docker container ls --help

Dockerfile을 이용한 도커 이미지 빌드

  • Dockerfile

    • 도커 이미지를 생성(빌드)하는데 필요한 명령어를 순서대로 기술한 텍스트 파일
    • 이미지 빌드 명령어: docker build, docker builder build, docker image build, docker buildx build (권장)
  • 도커 이미지 생성 과정

    • 소스코드 작성
    • Dockerfile 작성
    • 이미지 빌드: c:\docker\go> docker buildx build [<옵션>] <Dockerfile 경로>
      • 옵션 -t example/echo:latest: 이미지 이름을 지정 (<저장소명>/<이미지명>:<태그>)
    • 컨테이너 실행: c:\docker\go> docker container run [<옵션>] <이미지명> [<명령>] [<인자>]
      • 옵션 -d: 컨테이너를 detach 모드로 실행
      • 옵션 -p 8282:8080: 포트 바인딩 (<호스트 포트번호>:<컨테이너 내부 포트번호> - 호스트 포트 미지정 시 가용 포트번호 자동지정)
      • 옵션 --name <컨테이너명>: 컨테이너 이름을 지정
      • 옵션 --rm: 컨테이너 안의 프로세스가 종료되면 컨테이너 자동 삭제
  • 도커 허브에 이미지를 등록하기/가져오기

    • repository 이름을 본인의 도커 허브 계정으로 변경: c:\docker\go> docker image tag example/echo:latest <도커 허브 계정명>/echo:latest
    • 도커 허브에 이미지 등록: c:\docker\go> docker image push <도커 허브 계정명>/echo:latest
    • 도커 허브에 등록된 이미지를 가져와 실행하기: c:\docker\go> docker container run [<옵션>] <도커 허브 계정명>/echo:lates
      • 로컬에 이미지가 존재하지 않을 시: docker image pulldocker container createdocker container start 순서로 실행
  • 도커 컨테이너 삭제하기

    • docker container rm [<옵션>] <컨테이너 식별자>
      • 컨테이너 식별자: 컨테이너ID 또는 컨테이너명
      • 옵션 -f: 강제 삭제
    • 모든 상태의 컨테이너 강제 삭제: docker container rm -f $(docker container ls -aq)
  • 다양한 도커 컨테이너 명령 및 옵션

    • 이미지 목록 보기: docker image ls
    • 컨테이너 목록 보기: docker container ls
      • 옵션 -a: 모든 상태의 컨테이너 조회
      • 옵션 -q: 컨테이너ID만 출력
    • 컨테이너 동작 확인: curl http://localhost:<연결된 호스트 포트번호>
    • 컨테이너 로그 확인 : docker container logs <컨테이너 식별자>
    • 컨테이너 내부의 쉘로 접속: docker container attach <컨테이너 식별자>
    • 컨테이너 내부에 명령어를 전달해서 실행: docker container exec [<옵션>] <컨테이너 식별자> <명령> [<인자>]
      • 옵션 -i: 표준입력 활성화
      • 옵션 -t: TTY 모드(pseudo-TTY) 사용
    • 컨테이너 내부의 디렉터리나 파일을 호스트로 복사: docker container cp <컨테이너명>:<경로> <호스트 경로>
    • 호스트의 파일을 컨테이너 내부로 복사: docker container cp <호스트의 파일> <컨테이너명>:<경로>

    컨테이너 내부에 /bin/bash가 실행된 결과
    <현재 로그인한 사용자 계정>@<호스트명>:/<디렉터리>$

    • 호스트명: 컨테이너ID와 동일
    • 디렉터리: WORKDIR에 설정된 디렉터리
    • $ 또는 #: 일반 사용자 또는 루트 사용자
      set | grep HOSTNAME: 컨테이너 실행 시 HOSTNAME을 컨테이너ID로 설정
      exit: 내부 쉘에서 나오기
  • Dockerfile 작성 시 유의사항

    • 사용자 입력이 발생하지 않도록 해야 함
    • 포그라운드 프로세스로 실행되도록 해야 함
    • 도커 이미지 크기가 커지지 않도록 유의
      • 명령어를 묶어서 실행 ⇒ RUN 지시어를 가급적 많이 사용하지 않음 ⇒ 최종 결과만 레이어로 기록
      • 불필요한 도구를 설치하지 않음: 개발/디버깅용 도구, 캐시/로그 파일 등
  • 빌더 패턴

    • 생성과 실행을 분리
  • 다단계 빌드 Dockerfile (multi-state build) (교재 151p 참고)

    • FROM 절이 여러 개
    • 가독성 향상을 위해 AS 절을 이용해서 별칭을 부여하는 것도 가능

Dockerfile의 지시어 살펴보기

  • RUN, CMD, ENTRYPOINT 지시어에서 명령어를 기술하는 방법

    • exec form : 쉘을 통하지 않고 명령어를 직접 실행 (권장)
      • 예: CMD ["go", "run", "/goapp/main.go"]
    • shell form : 쉘 명령어를 사용하는 일반적인 명령어 실행 방식
      • 예: CMD go run /goapp/main.go
  • COPY vs ADD

    • COPY: 호스트 로컬의 파일만 이미지에 추가할 수 있음
    • ADD: 외부 URL 및 tar 파일에서도 파일을 추가할 수 있음 (tar 파일의 경우 자동으로 묶음을 해제해서 추가)
  • CMD vs ENTRYPOINT

    • entrypoint가 설정되지 X: cmd에 설정된 명령어를 그대로 실행
    • entrypoint가 설정됨: cmd는 entrypoint의 인자(arguments)의 기능을 수행
    • --entrypoint 옵션을 이용해서 컨테이너를 실행 시: Dockerfile의 ENTRYPOINT 설정을 무시하고 강제로 다른 값을 설정
  • ENV

    • Dockerfile에서 사용할 환경변수를 지정
    • --e 옵션을 이용해서 컨테이너를 실행 시: 실행 시점에서 옵션을 통해 전달된 새로운 값으로 환경변수가 설정됨


데이터 관리


참고자료

도커 공식 문서: storage

Volume

  • 볼륨 생성: docker volume create <볼륨명>
    • 그외 ls, rm, inspect 등
  • 생성한 볼륨을 사용하는 컨테이너를 실행: docker run -v <볼륨명>:<컨테이너의 디렉터리> <이미지명>
  • 컨테이너를 실행할 때 -v 옵션으로 존재하지 않는 볼륨을 지정 ⇒ 볼륨이 자동으로 생성

bind mount

  • 바인드 마운트: docker run -v <호스트의 디렉터리>:<컨테이너의 디렉터리> <이미지명>


Docker 네트워크


  • 종류

    • bridge
      • 도커 컨테이너가 기본적으로 연결되는 네트워크
      • 내부 IP 주소 할당 및 컨테이너 간 통신을 지원
    • host
      • 컨테이너가 호스트의 네트워크 스택을 공유하므로 호스트와 동일한 네트워크에서 실행
    • none
      • 네트워크 연결을 생성하지 않고, 컨테이너는 완전히 격리된 상태로 실행
    • overlay
      • 멀티 호스트 환경에서 컨테이너간 통신을 가능하게 하는 도커 네트워크
      • 여러 도커 호스트 간에 컨테이너를 연결하고, 컨테이너 간의 통신을 지원
  • 명령

    • 네트워크 생성: docker network create --driver=<네트워크 종류> <네트워크명>
    • 네트워크 연결: docker network connect <네트워크명> <컨테이너명>
    • 컨테이너를 시작할 때 사용할 네트워크를 지정: docker container run --net=<네트워크명> <이미지명>


Docker Compose


docker-compose.yaml 파일 구조

명령

  • 실행: docker compose up [<옵션>]
    • 옵션 --scale <서비스명>=N: N개의 <서비스명> 컨테이너를 동시에 실행
  • 중지: docker compose down [<옵션>]

0개의 댓글