[새싹 금천 5기] Docker 실습 및 명령어 정리 (이노그리드_기업맟춤형 클라우드 인재 양성 캠프)
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 다운로드 및 설치

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 .
→ 도커 이미지 생성

- 디렉터리 생성
- 호스트에 파일을 컨테이너로 복사
- 이미지로 저장
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