1. WORKDIR
# WORKDIR 작업 디렉토리로 사용할 절대 경로 : 작업 디렉토리 지정
이후 등장하는 RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉토리 기준으로 실행
작업 디렉토리를 지정하는 이유는 Dockerfile 을 통해 생성되는 파일들을 특정 폴더에 정리하는 것이 추후 관리가 쉽기 때문이다.
만약 WORKDIR 을 쓰지 않으면 컨테이너 내부에 존재하는 기존 파일들과 뒤섞인다.
컨테이너도 미니 컴퓨터와 같기 때문에, 컨테이너 내부 폴더를 깔끔하게 관리해야 한다.
# 예시
WORKDIR /usr/src/app
2. 예제
1) app.txt, src, config.json 파일 만들기
- Windows PowerShell
PS C:\Users\admin> mkdir docker-workdir
디렉터리: C:\Users\admin
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2026-05-17 오후 10:33 docker-workdir
docker-workdir 경로에 Dockerfile, app.txt, config.json, src 폴더 생성
2) Dockerfile 만들어서 이미지 생성 및 컨테이너 실행
#1 WORKDIR 안 썼을 때 파일이 어떻게 구성되는지 확인
- docker-practice/Dockerfile
FROM ubuntu
COPY ./ ./
# 디버깅용 코드
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
- Windows PowerShell
PS C:\Users\admin> cd docker-workdir
PS C:\Users\admin\docker-workdir> ls
디렉터리: C:\Users\admin\docker-workdir
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2026-05-17 오후 10:36 src
-a---- 2026-05-17 오후 10:36 0 app.txt
-a---- 2026-05-17 오후 10:36 0 config.json
-a---- 2026-05-17 오후 10:37 95 Dockerfile
PS C:\Users\admin\docker-workdir> docker build -t my-server .
[+] Building 2.2s (8/8) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 132B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:latest 1.3s
=> [auth] library/ubuntu:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 215B 0.0s
=> CACHED [1/2] FROM docker.io/library/ubuntu:latest@sha256:f3d28607ddd78734bb7f71f117f3c6706c666b8b76cbff7c9ff6e5718d46ff64 0.1s
=> => resolve docker.io/library/ubuntu:latest@sha256:f3d28607ddd78734bb7f71f117f3c6706c666b8b76cbff7c9ff6e5718d46ff64 0.1s
=> [2/2] COPY ./ ./ 0.1s
=> exporting to image 0.4s
=> => exporting layers 0.2s
=> => exporting manifest sha256:524deacc495a51bd545503e076ea9ff93840f2ff1b83263c738c074af61c4052 0.0s
=> => exporting config sha256:6ad5564528ccbe4597068cbf56b68c5df0c085f984335a8a6a9303851e0c22e9 0.0s
=> => exporting attestation manifest sha256:927b4fc1e17270ab6d1f4a54fcdc435641f32f226ffe214298b30296b52913be 0.1s
=> => exporting manifest list sha256:d63e6a4daf7726cfc7bf295b8e277927edb4922cdc0d5e0d5717762106c80a59 0.0s
=> => naming to docker.io/library/my-server:latest 0.0s
=> => unpacking to docker.io/library/my-server:latest 0.0s
View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/327vdstdm6fv3j1htkeya3fj5
PS C:\Users\admin\docker-workdir> docker image ls
i Info → U In Use
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
my-jdk17-server:beta 18e650b59b52 682MB 212MB
my-jdk17-server:latest 09a2803e5d8e 682MB 212MB U
my-node-server:latest 9a1e49574c81 1.77GB 442MB U
my-server:latest d63e6a4daf77 157MB 41.6MB
PS C:\Users\admin\docker-workdir> docker run -d my-server
74060a87cb0dd6fed6fff7f3e236836a5d06b5f2f54fd04d930601ab880c9d3f
PS C:\Users\admin\docker-workdir> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
74060a87cb0d my-server "/bin/bash -c 'sleep…" 6 seconds ago Up 5 seconds zen_mcclintock
PS C:\Users\admin\docker-workdir> docker exec -it 7406 bash
root@74060a87cb0d:/# ls
Dockerfile app.txt bin boot config.json dev etc home lib lib64 media mnt opt proc root run sbin src srv sys tmp usr var
root@74060a87cb0d:/# exit
exit
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug 7406
Learn more at https://docs.docker.com/go/debug-cli/
#2 WORKDIR 썼을 때 파일이 어떻게 구성되는지 확인
- docker-practice/Dockerfile
FROM ubuntu
WORKDIR /my-dir
COPY ./ ./
# 디버깅용 코드
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
- Windows PowerShell
PS C:\Users\admin\docker-workdir> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
74060a87cb0d my-server "/bin/bash -c 'sleep…" 2 minutes ago Up 2 minutes zen_mcclintock
11b4c5adcc08 cb8d00dbe5f5 "/bin/bash -c 'sleep…" 27 hours ago Exited (137) 27 hours ago awesome_lalande
10b3825e00f9 my-node-server "/bin/bash -c 'sleep…" 4 days ago Exited (0) 4 days ago pensive_ride
e8f1ab86997c my-jdk17-server "/bin/bash -c 'sleep…" 4 days ago Exited (0) 4 days ago tender_ride
PS C:\Users\admin\docker-workdir> docker rm -f 7406
7406
PS C:\Users\admin\docker-workdir> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11b4c5adcc08 cb8d00dbe5f5 "/bin/bash -c 'sleep…" 27 hours ago Exited (137) 27 hours ago awesome_lalande
10b3825e00f9 my-node-server "/bin/bash -c 'sleep…" 4 days ago Exited (0) 4 days ago pensive_ride
e8f1ab86997c my-jdk17-server "/bin/bash -c 'sleep…" 4 days ago Exited (0) 4 days ago tender_ride
PS C:\Users\admin\docker-workdir> docker build -t my-server .
[+] Building 1.8s (8/8) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 151B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:latest 0.8s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [1/3] FROM docker.io/library/ubuntu:latest@sha256:f3d28607ddd78734bb7f71f117f3c6706c666b8b76cbff7c9ff6e5718d46ff64 0.1s
=> => resolve docker.io/library/ubuntu:latest@sha256:f3d28607ddd78734bb7f71f117f3c6706c666b8b76cbff7c9ff6e5718d46ff64 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 226B 0.0s
=> [2/3] WORKDIR /my-dir 0.1s
=> [3/3] COPY ./ ./ 0.1s
=> exporting to image 0.5s
=> => exporting layers 0.3s
=> => exporting manifest sha256:b44d9d64c881f4eb7ec719d0d1e2112959c48881f577c26d0108ab69b8591603 0.0s
=> => exporting config sha256:532b990f9a16f602c1571a6f07b1248f04150e9c7998ba5ced16b2fd1dfc2d2a 0.0s
=> => exporting attestation manifest sha256:d27a9fd23cb7f751e7fab1bef365cf24573427d3fc060e9ae103d053598263f8 0.1s
=> => exporting manifest list sha256:c8dad74bef6b8db0c28fa7d01724f432e1f0cd68211891360c1d209e4d2bc374 0.0s
=> => naming to docker.io/library/my-server:latest 0.0s
=> => unpacking to docker.io/library/my-server:latest 0.1s
View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/tgrdklxwuap8bk5q34u32l0py
PS C:\Users\admin\docker-workdir> docker image ls
i Info → U In Use
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
my-jdk17-server:beta 18e650b59b52 682MB 212MB
my-jdk17-server:latest 09a2803e5d8e 682MB 212MB U
my-node-server:latest 9a1e49574c81 1.77GB 442MB U
my-server:latest c8dad74bef6b 157MB 41.6MB
PS C:\Users\admin\docker-workdir> docker run -d my-server
47c438563cdb3237baca2c013b86c8a7ac49d41eaf871e0e386da6629623ae16
PS C:\Users\admin\docker-workdir> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47c438563cdb my-server "/bin/bash -c 'sleep…" 8 seconds ago Up 8 seconds nice_matsumoto
PS C:\Users\admin\docker-workdir> docker exec -it 47c4 bash
root@47c438563cdb:/my-dir# ls
Dockerfile app.txt config.json src
root@47c438563cdb:/my-dir# cd ..
root@47c438563cdb:/# ls
bin boot dev etc home lib lib64 media mnt my-dir opt proc root run sbin srv sys tmp usr var
root@47c438563cdb:/# exit
exit
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug 47c4
Learn more at https://docs.docker.com/go/debug-cli/
비전공자도 이해할 수 있는 Docker 입문/실전| JSCODE 박재성 - 인프런 강의
현재 평점 4.9점 수강생 14,472명인 강의를 만나보세요. 비전공자 입장에서도 쉽게 이해할 수 있고, 실전에서 바로 적용 가능한 Docker 입문/실전 강의를 만들어봤습니다! Docker 기본 개념, Spring Boot를
www.inflearn.com
'강의 실습 > 비전공자도 이해할 수 있는 Docker 입문 실전' 카테고리의 다른 글
| [실습] 백엔드 프로젝트(Nest.js)를 Docker로 실행시키기 (0) | 2026.05.19 |
|---|---|
| EXPOSE : 컨테이너 내부에서 사용 중인 포트를 문서화하기 (0) | 2026.05.18 |
| RUN : 이미지를 생성하는 과정에서 사용할 명령문 실행 (0) | 2026.05.16 |
| [실습] 백엔드 프로젝트(Spring Boot) 프로젝트를 Docker로 실행시키기 (0) | 2026.05.15 |
| ENTRYPOINT : 컨테이너가 시작할 때 실행되는 명령어 (0) | 2026.05.15 |
댓글