카테고리 없음

[새싹 금천 5기] Docker 실습 및 명령어 정리 (이노그리드_기업맟춤형 클라우드 인재 양성 캠프)

z00h 2025. 6. 17. 01:30

 

 

Dockerfile이란 ?

도커 이미지를 빌드하는데 필요한 명령어를 순서대로 기술한 텍스트 파일이다.

 

 

DockerFile 기본 지시어

지시어(Instruction)
의미
FROM
베이스 이미지 지정
RUN
베이스 이미지에 새로운 레이어를 추가해 커맨드를 실행하고, 결과를 빌드 이미지에 반영
CMD
컨테이너를 시작할 때 실행할 커맨드를 설정
LABEL
이미지에 레이블을 설정
EXPOSE
컨테이너에서 공개하는 포트 번호 설정
ENV
환경 변수 설정
ADD
이미지에 파일 복사 (압축 파일의 경우 압축을 해제한 후 복사)
COPY
이미지에 파일 복사
ENTRYPOINT
컨테이너를 시작할 때 실행할 커맨드 설정
VOLUME
볼륨이 마운트될 위치를 설정
USER
커맨드를 실행할 사용자 ID 설정
WORKDIR
커맨드를 실행할 작업 디렉터리를 설정
ARG
빌드 시에만 사용되는 변수 설정
ONBUILD
이 이미지를 베이스 이미지로 사용하여 이미지를 빌드할 때 실행할 커맨드 설정
STOPSIGNAL
컨테이너를 중지시킬 때의 시그널 번호를 설정
HEALTHCHECK
헬스체크를 위한 커맨드 설정
SHELL
기본으로 사용할 쉘을 지정

 

Docker 이미지 빌드 흐름

도커 이미지는 Dockerfile컨텍스트(Context) 를 기반으로 빌드된다

 

컨텍스트란?(Context)

  • 기본적으로 Dockerfile이 위치한 폴더
  • 해당 폴더의 모든 파일이 도커 빌드에 참조 가능
  • 도커는 이 컨텍스트 내 파일만 COPY/ADD 가능

 

 

Go 기반 컨테이너 애플리케이션 개발

 

애플리케이션 개발을 위해 작업 디렉터리 생성

c:\>mkdir c:\docker\go

c:\>cd c:\docker\go

c:\docker\go>code .

/* 8080 포트로 HTTP 요청을 대기하다가, /로 요청이 들어오면 Hello Docker!!!를 응답 */

/* 프로그램의 진입점인 main 패키지를 지정 */
package main

/* 표준 입출력과 문자열 형식을 처리하는 Go 패키지,
   로그를 출력하기 위한 패키지,
   HTTP 서버와 클라이언트 관련 기능을 제공하는 패키지를 임포트 */
import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        log.Println("received request")
        fmt.Fprintf(w, "Hello Docker!!")
    })


    log.Println("start server")
    server := &http.Server{Addr: ":8080"}
    if err := server.ListenAndServe(); err != nil {
        log.Println(err)
    }
}

 

 

 

개발 환경에서 애플리케이션을 실행 및 동작 확인

  • go 다운로드 및 설치

https://go.dev/dl/

 

 

 

C:\Users\myanj> cd c:\docker\go

c:\docker\go> go run main.go

2025/06/16 10:05:09 start server

 

 

 

C:\Users\joo97> curl http://localhost:8080/

Hello Docker!! ← 8080포트로 요청시 출력

애플리케이션을 도커를 이용하여 컨테이너화

도커 이미지 생성

FROM golang:1.24.4				# 베이스 이미지를 지정 ⇒ docker.io/library/golang:1.24.4
RUN  mkdir -p /docker/go			# 베이스 이미지를 이용해 실행한 컨테이너 내부에 /docker/go 디렉터리를 생성
COPY main.go /docker/go/			# 호스트에 main.go 파일을 컨테이너 내부의 /docker/go 디렉터리 아래로 복사
CMD  ["go", "run", "/docker/go/main.go"]	# 만들어진 이미지를 컨테이너화했을 때 실행할 명령

 

 

 

 

c:\docker\go> docker image build -t example/echo:latest .

→ 도커 이미지 생성

  1. 디렉터리 생성
  2. 호스트에 파일을 컨테이너로 복사
  3. 이미지로 저장

 

 

 

c:\docker\go> docker container run -d -p 9090:8080 example/echo

→ 이미지를 이용해서 컨테이너를 실행

c:\docker\go> docker container ls

→ 컨테이너 실행 확인

 

 

 

 

테스트 c:\docker\go> curl http://localhost:9090/

 

 

 

 

 

Docker run 명령어 주요 옵션 정리

옵션
이름(모드)
설명
-a
attach 모드
컨테이너 실행 시 터미널에 붙어서(포그라운드) 실행됨. 로그 확인 용이하나 호스트 작업 불가
-d
detach 모드
컨테이너를 백그라운드에서 실행함. 호스트에서 다른 작업 가능
-e
환경변수 설정
컨테이너 내부에서 사용할 환경변수를 전달. ex: -e DB_URL=...
-i
interactive
호스트 입력을 컨테이너로 전달 (stdin 유지), -t와 같이 주로 사용됨
-t
tty (터미널 연결)
컨테이너에 터미널 출력을 공유 (터미널 화면을 인터페이스로 제공)
--name
컨테이너 이름 지정
컨테이너에 직접 이름 부여, 지정하지 않으면 랜덤 이름 생성
-p
포트 포워딩
호스트:컨테이너 포트 연결. 예: -p 9090:8080 → 호스트 9090포트를 컨테이너 8080포트에 연결
--rm
자동 삭제
컨테이너가 종료되면 자동 삭제. 테스트나 임시 실행에 유용
-v
볼륨 마운트
호스트와 컨테이너 간 디렉토리 공유, 데이터 영속성 유지 가능

 

 

 

컨테이너 이미지를 도커허브를 통해 배포

C:\Users\joo97> docker image push example/echo:latest

c:\docker\go> docker image tag example/echo:latest z00h/echo:latest

→ 이미지 이름에 repository 명을 본인의 도커 허브 사용자명 입력(이미지 이름에 repository 명을 본인의 도커 허브 사용자 명으로 변경)

 

 

c:\docker\go> docker image push z00h/echo:latest

→ 도커 허브에 등록

 

c:\docker\go> docker container run -d -p 8080 --name echoFromDockerHub --rm z00h/echo:latest

→ 도커 허브의 이미지로 컨테이너 실행

 

 

 

 

컨테이너 내부 전달 명령어

docker container exec echoMulti curl http://localhost:8080

구분
설명
docker container exec
실행 중인 컨테이너 내부에서 명령어를 실행할 때 사용하는 명령어
echoMulti
명령어를 실행할 대상 컨테이너의 이름 또는 ID
curl http://localhost:8080
컨테이너 내부에서 실행할 명령어. 즉, 컨테이너 안에서 해당 주소로 요청 보내는 것

 

 

 

Docker 컨테이너 및 이미지 명령어

[컨테이너 쉘 접속]

 

방법1.

attach: 컨테이너와 표준 입출력 연결

  • docker container attach <컨테이너명>

 

방법2.

exec -it: 컨테이너 쉘 진입 (권장)

  • docker container exec -it <컨테이너명> /bin/bash

 

[컨테이너 내부 확인]

  • ls /docker/go # 디렉토리/파일 목록 확인
  • cat /docker/go/main.go # 코드 내용 출력
  • ps -ef | grep go # 실행 중인 Go 프로세스 확인

 

[쉘 종료]

  • exit # 컨테이너 쉘에서 나와 호스트로 복귀

 

[컨테이너 관리]

  • docker container ls # 실행 중인 컨테이너 목록
  • docker container ls -a # 모든 상태(중지 포함)의 컨테이너 목록
  • docker container stop <ID> # 컨테이너 중지
  • docker container start <ID> # 중지된 컨테이너 시작

※ --rm 옵션으로 실행된 컨테이너는 종료 시 자동 삭제된다.

 

 

[컨테이너 삭제]

  • docker container rm <ID> # 중지 상태일 경우 삭제 가능
  • docker container rm -f <ID> # 실행 중인 컨테이너 강제 삭제

 

PowerShell로 모든 컨테이너 일괄 강제 삭제

  • docker container rm -f $(docker container ls -a -q)

 

[이미지 조회]

  • docker image ls # 이미지 목록 조회
  • docker image ls -q # 이미지 ID만 출력

 

PowerShell로 모든 이미지 강제 삭제

  • docker image rm -f $(docker image ls -q