오늘은 Docker CICD를 하기 위해서
DOCKER에 대한 개념
Docker CLI
Dockerfile에 대한 이론 수업이 있었다.
Docker
- 개념 및 특징
- 프로그램(S/W), 데이터 등을 각각 독립된 환경에 격리시키는 기능을 제공하는 S/W
- 상호 간섭 X
- 업데이트 이슈 X → 컨테이너 교체하면 마무리
- 구조 (기존 OS 위 S/W/ ↔ OS 위 docker 위에 container 구조로 )
- 프로그램 (nginx(웹서버),fastapi(WAS),MySQL(디비),데이터(HTML,XLS,…)
컨테이너, 컨테이너, . . . .→ 차후 cicd 진행시 도커 허브에서 다운로드 하여 컨테이너 교체 - → 도커 허브상에 업로드 (오피셜 이미지→인스턴스 → 커스텀 → 이미지 → 도커허브 업로드)
- → 차후 cicd 진행시 도커 허브에서 다운로드하여 컨테이너 교체
- 도커 (도커 엔진 + 리눅스 기반 운영체계 + 기타 S/W) ↔ ec2 인스턴스 유형이 상위스펙
---
OS (윈도우, 맥, 리눅스, . . .) → aws ec2에서 ubuntu이미지로 생성
---
하드웨어 (CPU, RAM, SSD, RAN, . . .) → AWS EC2에서 t3.micro, 볼륨
- 프로그램(S/W), 데이터 등을 각각 독립된 환경에 격리시키는 기능을 제공하는 S/W
Docker CLI
Docker Client 툴로 대체는 가능함
- 기본
- 도커 명령어 = docker 1차 명령어(2차 명령어가 유일한 이름을 사용하면 생략 가능) 2차 명령어 옵션
- docker container run
- = docker run
- run 명령어는 오직 container 명령어 다음에만 나온다 → 고로 container 명령어 생략 가능함
- docker version
- 클라이언트, 서버측에 채택한 아키텍쳐 확인
C:\Users\Dell3571>docker version
Client:
Version: 28.5.1
API version: 1.51
Go version: go1.24.8
Git commit: e180ab8
Built: Wed Oct 8 12:19:16 2025
OS/Arch: windows/amd64
Context: desktop-linux
Server: Docker Desktop 4.48.0 (207573)
Engine:
Version: 28.5.1
API version: 1.51 (minimum version 1.24)
Go version: go1.24.8
Git commit: f8215cc
Built: Wed Oct 8 12:17:24 2025
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.27
GitCommit: 05044ec0a9a75232cad458027ca83437aae3f4da
runc:
Version: 1.2.5
GitCommit: v1.2.5-0-g59923ef
docker-init:
Version: 0.19.0
GitCommit: de40ad0
- Docker system info
- 도커상 실행환경, 컨테이너 현황정보, 이미지 개수, 등등 시스템 정보 제공
C:\Users\Dell3571>docker system info
Client:
Version: 28.5.1
Context: desktop-linux
Debug Mode: false
Plugins:
ai: Docker AI Agent - Ask Gordon (Docker Inc.)
Version: v1.9.11
Path: C:\Program Files\Docker\cli-plugins\docker-ai.exe
buildx: Docker Buildx (Docker Inc.)
Version: v0.29.1-desktop.1
Path: C:\Program Files\Docker\cli-plugins\docker-buildx.exe
cloud: Docker Cloud (Docker Inc.)
Version: v0.4.39
Path: C:\Program Files\Docker\cli-plugins\docker-cloud.exe
compose: Docker Compose (Docker Inc.)
Version: v2.40.2-desktop.1
Path: C:\Users\Dell3571\.docker\cli-plugins\docker-compose.exe
debug: Get a shell into any image or container (Docker Inc.)
Version: 0.0.44
Path: C:\Program Files\Docker\cli-plugins\docker-debug.exe
desktop: Docker Desktop commands (Docker Inc.)
Version: v0.2.0
Path: C:\Program Files\Docker\cli-plugins\docker-desktop.exe
extension: Manages Docker extensions (Docker Inc.)
Version: v0.2.31
Path: C:\Program Files\Docker\cli-plugins\docker-extension.exe
init: Creates Docker-related starter files for your project (Docker Inc.)
Version: v1.4.0
Path: C:\Program Files\Docker\cli-plugins\docker-init.exe
mcp: Docker MCP Plugin (Docker Inc.)
Version: v0.24.0
Path: C:\Users\Dell3571\.docker\cli-plugins\docker-mcp.exe
model: Docker Model Runner (Docker Inc.)
Version: v0.1.42
Path: C:\Program Files\Docker\cli-plugins\docker-model.exe
sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc.)
Version: 0.6.0
Path: C:\Program Files\Docker\cli-plugins\docker-sbom.exe
scout: Docker Scout (Docker Inc.)
Version: v1.18.3
Path: C:\Program Files\Docker\cli-plugins\docker-scout.exe
Server:
Containers: 3
Running: 3
Paused: 0
Stopped: 0
Images: 3
Server Version: 28.5.1
Storage Driver: overlayfs
driver-type: io.containerd.snapshotter.v1
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
CDI spec directories:
/etc/cdi
/var/run/cdi
Discovered Devices:
cdi: docker.com/gpu=webgpu
Swarm: inactive
Runtimes: runc io.containerd.runc.v2 nvidia
Default Runtime: runc
Init Binary: docker-init
containerd version: 05044ec0a9a75232cad458027ca83437aae3f4da
runc version: v1.2.5-0-g59923ef
init version: de40ad0
Security Options:
seccomp
Profile: builtin
cgroupns
Kernel Version: 6.6.87.2-microsoft-standard-WSL2
Operating System: Docker Desktop
OSType: linux
Architecture: x86_64
CPUs: 20
Total Memory: 15.46GiB
Name: docker-desktop
ID: 30b581b6-5701-4f12-a20b-2757fadcc468
Docker Root Dir: /var/lib/docker
Debug Mode: false
HTTP Proxy: http.docker.internal:3128
HTTPS Proxy: http.docker.internal:3128
No Proxy: hubproxy.docker.internal
Labels:
com.docker.desktop.address=npipe://\\.\pipe\docker_cli
Experimental: false
Insecure Registries:
hubproxy.docker.internal:5555
::1/128
127.0.0.0/8
Live Restore Enabled: false
- docker system df
- 현재 설치된 도커상의 이미지, 컨테이너, 볼륨, 캐시 등에 공간, 개수 등의 정보 제공
- 도커를 설치하고자 하는 ec2 인스턴스에 대한 스펙 조절 가능
C:\Users\Dell3571>docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 3 3 5.802GB 1.297GB (22%)
Containers 3 3 1.297GB 0B (0%)
Local Volumes 1 1 280.4MB 0B (0%)
Build Cache 0 0 0B 0B
- docker system df -v
- 각 구성원들(이미지,컨테이너)에 대한 구체적, 상세한 정보 조회
C:\Users\Dell3571>docker system df -v
Images space usage:
REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS
node latest 7a78e83b764b 4 weeks ago 1.64GB 0B 1.638GB 1
python latest 78ad0471881f 5 weeks ago 1.61GB 0B 1.61GB 1
mysql latest 135bc87cce14 7 weeks ago 1.26GB 0B 1.258GB 1
Containers space usage:
CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS NAMES
62ba92057429 python "python3" 0 558MB 2 weeks ago Up About an hour python
355a434ee672 node "docker-entrypoint.s…" 0 738MB 2 weeks ago Up About an hour node
1a985ccc1de6 mysql:latest "docker-entrypoint.s…" 1 45.1kB 3 weeks ago Up About an hour mysql
Local Volumes space usage:
VOLUME NAME LINKS SIZE
4ffa3eba9616b700c9caf390fe4e793ed6445ee263f71c668523622f3e56d00e 1 280.4MB
Build cache usage: 0B
CACHE ID CACHE TYPE SIZE CREATED LAST USED USAGE SHARED
- 기타 명령 리스트

docker image
image
- 컨테이너 (실제 운영(구동)하는 대상) 생성을 위한 원재료
- 출처 : 도커 허브(오피셜(신뢰할 수 있다), 개인/단체 등) or 커스텀 이미지(도커 허브, 파일(.tar)
- docker hub (무료)
- hub.docker.com
- 회원가입 → 로그인
- 도커 스토어(유료)
- 유료 이미지 제공
- sw 회사, 개인(인증된) 등 도커로 환경 s/w등을 세팅하여 판매함 → 제품
- docker에서 공식적 검증 인증 통과된 제품만 판매
- 이미지 명령어
- docker hub (무료)

- docker image (docker 1차 명령어, 2차 명령어, 옵션, . . .)
docker image COMMAND --help
C:\Users\Dell3571>docker iamge COMMAND --help
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Common Commands:
run Create and run a new container from an image
exec Execute a command in a running container
ps List containers
build Build an image from a Dockerfile
bake Build from a file
pull Download an image from a registry
push Upload an image to a registry
images List images
login Authenticate to a registry
logout Log out from a registry
search Search Docker Hub for images
version Show the Docker version information
info Display system-wide information
Management Commands:
ai* Docker AI Agent - Ask Gordon
builder Manage builds
buildx* Docker Buildx
cloud* Docker Cloud
compose* Docker Compose
container Manage containers
context Manage contexts
debug* Get a shell into any image or container
desktop* Docker Desktop commands
extension* Manages Docker extensions
image Manage images
init* Creates Docker-related starter files for your project
manifest Manage Docker image manifests and manifest lists
mcp* Docker MCP Plugin
model* Docker Model Runner
network Manage networks
plugin Manage plugins
sbom* View the packaged-based Software Bill Of Materials (SBOM) for an image
scout* Docker Scout
system Manage Docker
trust Manage trust on Docker images
volume Manage volumes
Swarm Commands:
swarm Manage Swarm
Commands:
attach Attach local standard input, output, and error streams to a running container
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
export Export a container's filesystem as a tar archive
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes
Global Options:
--config string Location of client config files (default
"C:\Users\Dell3571\.docker")
-c, --context string Name of the context to use to connect to the
daemon (overrides DOCKER_HOST env var and
default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host string Daemon socket to connect to
-l, --log-level string Set the logging level ("debug", "info",
"warn", "error", "fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default
"C:\Users\Dell3571\.docker\ca.pem")
--tlscert string Path to TLS certificate file (default
"C:\Users\Dell3571\.docker\cert.pem")
--tlskey string Path to TLS key file (default
"C:\Users\Dell3571\.docker\key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Run 'docker COMMAND --help' for more information on a command.
For more help on how to use Docker, head to https://docs.docker.com/go/guides/
Docker image 명령 1
# docker image pull [옵션] 이미지명 [:태그명]
docker image pull ubuntu
C:\Users\Dell3571>docker image pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
20043066d3d5: Pull complete
Digest: sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
docker image ls
C:\Users\Dell3571>docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest c35e29c94501 4 weeks ago 117MB
node latest 7a78e83b764b 4 weeks ago 1.64GB
python latest 78ad0471881f 5 weeks ago 1.61GB
mysql latest 135bc87cce14 7 weeks ago 1.26GB
docker image inspect ubuntu
C:\Users\Dell3571>docker image inspect ubuntu
[
{
"Id": "sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54",
"RepoTags": [
"ubuntu:latest"
],
"RepoDigests": [
"ubuntu@sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54"
],
"Parent": "",
"Comment": "",
"Created": "2025-10-16T19:23:03.839116531Z",
"DockerVersion": "",
"Author": "",
"Architecture": "amd64",
"Os": "linux",
"Size": 29734095,
"GraphDriver": {
"Data": null,
"Name": "overlayfs"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:e8bce0aabd687e9ee90e0bada33884f40b277196f72aac9934357472863a80ae"
]
},
"Metadata": {
"LastTagTime": "2025-11-17T01:34:14.152302072Z"
},
"Descriptor": {
"mediaType": "application/vnd.oci.image.index.v1+json",
"digest": "sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54",
"size": 6688
},
"Config": {
"Cmd": [
"/bin/bash"
],
"Entrypoint": null,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Labels": {
"org.opencontainers.image.ref.name": "ubuntu",
"org.opencontainers.image.version": "24.04"
},
"OnBuild": null,
"User": "",
"Volumes": null,
"WorkingDir": ""
}
}
]
docker search (nginx)
# stars 순으로 검색되는 순서 상위 3개만 출력 ->어차피 오피셜만 씀
docker search nginx --limit 3
# 삭제 -> cicd 시 새로운 이미지를 내려 받을때 -> 기존 이미지 삭제
# compose 명령에서 자동으로 처리함
docker image rm ubuntu
# 이미지를 모두 강제로 삭제 (컨테이너 중단 후)
docker image rm --all(or -a) --force(or -f)
Docker image 명령 1
# 로그인 (계정 필요, 로그인후 세션 필요)
docker login
# 컨테이너(원본 이미지를 기반 커스텀됨)로부터 이미지 생성
# nginx을 pull 하여서 -> 컨테이너 구성 -> 컨테이너기반 이미지 바로 생성
# docker run : 이미지 pull, 컨테이서 생성, 컨네이터 가동
docker run -d -p 80:80 --name my_nginx nginx
----
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
e2f8e296d9df: Pull complete
52bc359bcbd7: Pull complete
320b0949be89: Pull complete
d7ecded7702a: Pull complete
9def903993e4: Pull complete
266626526d42: Pull complete
d921c57c6a81: Pull complete
Digest: sha256:1beed3ca46acebe9d3fb62e9067f03d05d5bfa97a00f30938a0a3580563272ad
Status: Downloaded newer image for nginx:latest <= 여기까지 image pull 로그
c7fc90467ea42db8238a90b00ce9d0900d97fd3de891405390c252297d075337 <= 컨테이너 생성 로그
# 참고 : 접속 확인 http://127.0.0.1/
# 이미지 생성
docker image tag 이미지명 <도커허브상사용자명>/커스텀한이미지명:버전
docker image tag nginx edu2ucoc/nginx_v:1.0
# push
docker image push edu2ucoc/nginx_v:1.0
# 로그아웃 -> 도커 클라이언트 프로그램도 로그아웃됨
docker logout
Docker container
- 이미지를 기반으로 스냅샷을 생성 → 이것이 컨테이너 이다

기본 명령어


자주 사용하는 명령어
# ubuntu 설치
# -itd : 입력, 출력, 백그라운드 가동
docker run -itd --name my-ubuntu ubuntu
---
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
20043066d3d5: Pull complete
Digest: sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54
Status: Downloaded newer image for ubuntu:latest
56f1d765da211727104a766daa1873118b019bac19bb8b398b4117c967f40385
# 현재 컨테이너 목록 확인 -> 구동중, 구동중에 pause 인 컨테이너만 노출
docker container ps
# 접속 (호스트 PC(윈도우, 맥)에서 컨테이너로 직접 접속)
# bash쉘을 가동시켜서 리눅스 입출력 연결
docker exec -it my-ubuntu bash
---
root@56f1d765da21:/# pwd
/
root@56f1d765da21:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@56f1d765da21:/# exit
exit
도커 클라이언트에서 컨테이너 클릭 > Exec 선택 > 동일한 결과임

# nginx 컨테이너 생성 및 가동
docker run -d -p 80:80 --name my_nginx nginx
# 로그 확인
docker logs my_nginx
# /etc/nginx/conf.d/default.conf 설정 파일임을 확인 했음
# my_nginx 내부로 진입
docker exec -it my_nginx bash
----
root@c7fc90467ea4:/# cat /etc/nginx/conf.d/default.conf
server {
listen 80;
listen [::]:80;
server_name localhost; # 도메인 기재 -> 요청이오면 해당 도메인으로 프록시
# 80으로 요청 => 8000으로 포워딩 처리
# 가상 호스트 처리 -> apache, nginx 등 해결
#access_log /var/log/nginx/host.access.log main;
# 루트 디렉토리 -> 홈페이지 위치 (정적위치)
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# 홈페이지 확인 (기본 페이지)
root@c7fc90467ea4:/# cd /usr/share/nginx/html
root@c7fc90467ea4:/usr/share/nginx/html# ls
50x.html index.html
root@c7fc90467ea4:/usr/share/nginx/html# cat index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
docker network
- Network
- 컨테이너간 네트워크를 구성하여 상호 통신 가능함. (내부 IP / 컨테이너등 통신 가능)
- 주요 명령
# 네트워크 종류
docker network ls
---
NETWORK ID NAME DRIVER SCOPE
f383d4200fe9 bridge bridge local <- 기본값 (미지정시)
c287dbe0579e host host local
5d479648890e none null local
# 네트워크 생성 (특정 컨테이너들을 위한)
# web, was, db등을 하나의 네트워크로 구성시 활용할 수 있음
docker network create --driver=bridge web_network
# 특정 컨테이너의 상세 정보중 네트워크 부분 확인 -> 필터링 생략
docker container inspect my_python
[
{
"Id": "6e23a71d3ea363d826cfac41f32a322038fc4681fd41d003f12e3ec9b012347d",
"Created": "2025-11-17T04:30:14.528292432Z",
"Path": "python3",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2001,
"ExitCode": 0,
"Error": "",
"StartedAt": "2025-11-17T04:30:14.634654893Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:e3a6ccbe44d9cbfa4f107f238a0e95fa70e0d084e87689222e951d062ac89854",
"ResolvConfPath": "/var/lib/docker/containers/6e23a71d3ea363d826cfac41f32a322038fc4681fd41d003f12e3ec9b012347d/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/6e23a71d3ea363d826cfac41f32a322038fc4681fd41d003f12e3ec9b012347d/hostname",
"HostsPath": "/var/lib/docker/containers/6e23a71d3ea363d826cfac41f32a322038fc4681fd41d003f12e3ec9b012347d/hosts",
"LogPath": "/var/lib/docker/containers/6e23a71d3ea363d826cfac41f32a322038fc4681fd41d003f12e3ec9b012347d/6e23a71d3ea363d826cfac41f32a322038fc4681fd41d003f12e3ec9b012347d-json.log",
"Name": "/my_python",
"RestartCount": 0,
"Driver": "overlayfs",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "bridge",
"PortBindings": {
"8000/tcp": [
{
"HostIp": "",
"HostPort": "8000"
}
]
},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"ConsoleSize": [
13,
116
],
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "private",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": [],
"BlkioDeviceWriteBps": [],
"BlkioDeviceReadIOps": [],
"BlkioDeviceWriteIOps": [],
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": null,
"PidsLimit": null,
"Ulimits": [],
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/interrupts",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware",
"/sys/devices/virtual/powercap"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": null,
"Name": "overlayfs"
},
"Mounts": [],
"Config": {
"Hostname": "6e23a71d3ea3",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"8000/tcp": {}
},
"Tty": true,
"OpenStdin": true,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"PYTHON_VERSION=3.14.0",
"PYTHON_SHA256=2299dae542d395ce3883aca00d3c910307cd68e0b2f7336098c8e7b7eee9f3e9"
],
"Cmd": [
"python3"
],
"Image": "python",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {},
"StopTimeout": 1
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "ae08f376982ff4a99fc42e38dd6f5de75c0a86a1c0fc4aac8c8a59fed00b0ff0",
"SandboxKey": "/var/run/docker/netns/ae08f376982f",
"Ports": {
"8000/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8000"
},
{
"HostIp": "::",
"HostPort": "8000"
}
]
},
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "0fb7d5aa6123a3ee06471bece97bbaa9d44926a33f88e090dc0dd76833c0a31d",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "3e:90:eb:a0:45:03",
"Networks": {
"bridge": { <- 기본적으로 bridge에 연결되어 있음
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"MacAddress": "3e:90:eb:a0:45:03",
"DriverOpts": null,
"GwPriority": 0,
"NetworkID": "f383d4200fe9fb8884f6cc22bd61dddb448cdd8427916f0283d32c700cdf3d12",
"EndpointID": "0fb7d5aa6123a3ee06471bece97bbaa9d44926a33f88e090dc0dd76833c0a31d",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"DNSNames": null
}
}
},
"ImageManifestDescriptor": {
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"digest": "sha256:9b33fec6649fbdd14950fb5ac008539742771a18897acd7c1a2be81898a179f5",
"size": 2318,
"annotations": {
"com.docker.official-images.bashbrew.arch": "amd64",
"org.opencontainers.image.base.digest": "sha256:abc4730fc7a89473a814b6d11287d05357a1e581dc8ad070ff0ca16cc19dca2e",
"org.opencontainers.image.base.name": "buildpack-deps:trixie",
"org.opencontainers.image.created": "2025-10-08T21:22:33Z",
"org.opencontainers.image.revision": "a83345bce8e75b407f283511dc3128b2062d8c1e",
"org.opencontainers.image.source": "https://github.com/docker-library/python.git#a83345bce8e75b407f283511dc3128b2062d8c1e:3.14/trixie",
"org.opencontainers.image.url": "https://hub.docker.com/_/python",
"org.opencontainers.image.version": "3.14.0-trixie"
},
"platform": {
"architecture": "amd64",
"os": "linux"
}
}
}
]
# 새로운 네트워크를 컨테이너에게 연결
docker network connect web_network my_python
# 연결 확인
docker container inspect my_python
------
중략
"Networks": {
"bridge": {
중략..
"GlobalIPv6PrefixLen": 0,
"DNSNames": null
},
"web_network": { <- 신규 추가
"IPAMConfig": {},
"Links": null,
"Aliases": [],
"MacAddress": "96:7a:82:14:ef:77",
"DriverOpts": {},
"GwPriority": 0,
"NetworkID": "75828ac890c0ce78d9cdcff045e3121f0219ea04330c28ec3ac0ca04b96cfcf1",
"EndpointID": "7a3fed11cbf85872bea769c588e1d50bd41567e8884e947c2b2aa497ef05b741",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"DNSNames": [
"my_python",
"6e23a71d3ea3"
]
}
중략
# 네트워크 연결 해제
docker network disconnect web_network my_python
# 네트워크 삭제
docker network rm web_network
# 네트워크 다시 조회
docker network ls
NETWORK ID NAME DRIVER SCOPE
f383d4200fe9 bridge bridge local
c287dbe0579e host host local
5d479648890e none null local
Docker volume
- 특징
- 컨테이너의 라이프사이클과 별개로 운영됨.
- 컨테이너가 삭제되어도 데이터는 유지됨
- 독립영역
- 여러 컨테이너와 공유 가능
- 호스트 os(윈도우, 맥)과 공유 가능
- 컨테이너의 라이프사이클과 별개로 운영됨.
- 종류
- (*)볼륨 마운트
- 도커 엔진 내부에 위치 (리눅스 경로법)
- (*)바인드 마운트
- 호스트 os에 위치(호스트 OS 경로를 따름)
- 메모리 마운트
- 호스트 os가 리눅스 일때만 가능
- 호스트 os가 리눅스 일때만 가능
- (*)볼륨 마운트
- 주요 명령어
# 볼륨 관련 명령어
docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove unused local volumes
rm Remove one or more volumes
# 볼륨 목록 확인
docker volume ls
# 볼륨 생성
docker volume create my_vol
# 볼륨 상세 정보 확인
docker volume inspect my_vol
[
{
"CreatedAt": "2025-11-17T05:10:36Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/my_vol/_data", <- 도커 엔진상에 존재하는 리눅스 경로
"Name": "my_vol",
"Options": null,
"Scope": "local"
}
]
볼륨 마운트 예시
# 컨테이너 생성시 볼륨 지정. 나중에 추가 불가.
# ... -v <볼륨명>:<컨테이너상의 특정 위치>:<읽기전요, 읽고쓰기>
# 지정하지 않으면 적당한 이름(해시값)으로 생성이됨
docker run -itd --name my_ubuntu_vol -v my_vol:/home ubuntu
# 컨테이너 접속
docker exec -it my_ubuntu_vol bash
root@eafac76c63fd:/# cd home
root@eafac76c63fd:/home# ls
ubuntu
root@eafac76c63fd:/home# echo "hello docker" > t.txt
root@eafac76c63fd:/home# ls
t.txt ubuntu
root@eafac76c63fd:/home# exit
exit
- 이후 컨테이너를 삭제해도, t.txt 파일은 유지됨.
- 이후 새로운 컨테이너를 만들고, 해당 볼륨으로 my_vol을 지정하면, t.txt 파일 확인 할 수 있음
(*)바인드 마운트 예시
# -v <호스트 OS상 경로>:<컨테이너상 경로>:<권한>
# 현재 경로를 pwd 명령으로 획득 ps ->${pwd}, bash->$(pwd)
# cmd에서는 풀경로만
docker run --name my_node -p 4000:3000 -itd -v C:\Users\Dell5371\Desktop\projects:/home/js node
# power 쉡
docker run --name my_node2 -p 4001:3000 -itd -v ${pwd}:/home/js node
# bash 쉘
docker run --name my_node3 -p 4002:3000 -itd -v $(pwd):/home/js node
Dockerfile
- 개념
- https://docs.docker.com/engine/reference/builder/
- 용도 : 컨테이너 1개에 대한 디테일한 설정 구성
- 컨테이너 내부에서 작동해야할 세팅값, 환경변수, 명령어 등등..
- 이미지를 기반으로 파일 생성, 복사, 이동, 빌드, 배포등
- 명령어 목록

- 특정 폴더(프로젝트)에는 Dockerfile 이라는 이름의 파일이 1개만 존재
- step 1
- 프로젝트/step1/Dockerfile
- step 1
# 베이스 이미지 설정
# FROM 이미지명
# FROM 이미지명:태그
# FROM 이미지명@다이제스트(해시값)
# 이미지 생성법
# docker build -t 이미지명:태그명 도커파일경로(명령어 작동 위치 기준)
# docker build -t test_ubuntu:1.0 ./step1
FROM ubuntu
cicd> docker build -t test_ubuntu:1.0 ./step1
[+] Building 0.4s (5/5) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 337B 0.0s
... 중략 ...
=> => unpacking to docker.io/library/test_ubuntu:1.0 0.0s
cicd> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
..중략..
test_ubuntu 1.0 9ab01e059651 4 weeks ago 117MB <- 확인됨
..중략..
- step 2
- 프로젝트/step2/Dockerfile
# ADD (파일/디렉토리 추가), COPY (파일 복사) 명령
# 이미지가 생성될때 컨테이너가 추가될때, 파일, 디렉토리를 추가하는 기술
# 제외하고 싶은 파일이 있다-> .dockerignore
# ADD : 특정경로, URL상에 존재하는 파일/디렉토리 원하는 위치에 저장(추가)
# URL은 다운로드 해서 진행, 압축파일은 압축 해제하여 저장
# COPY : 파일만 카피. 파일명 변경 가능
FROM ubuntu
# 압축 파일을 컨테이너로 ADD
ADD web.tar /home/
# URL 다운로드 후 추가
ADD https://raw.githubusercontent.com/ultralytics/yolov5/master/requirements.txt /home/requirements.txt
# 파일 추가 -> 파일명 변경
ADD readme.md /home/readme2.MD
# 특정 파일 추가 (패턴 적용) -> .dockerignore에 의해서 무시됨
ADD po*.txt /home/
# 특정 패턴 추가
# ? : 문자 1개 -> t1.txt만 추가됨
ADD t?.txt /home/
# WORKDIR 지정
WORKDIR /usr/app
# 현재위치의 모든 내용을 작업 디렉토리로 복사 -> 소스코드 복사할때 활용
COPY . .
# .dockerignore
po*.txt
이미지 생성 -> 컨테이너 생성 -> 컨테이너 접속 -> 파일 확인
# 이미지 생성
docker build -t test_ubuntu:1.2 ./step2
# 컨테이너 생성
docker run -itd --name test_ubuntu_dockerfile test_ubuntu:1.2
----
7bd5c1ceee7b1f5f66ae55adf366eb3bd5a3c98f13fd708dbdb3e996d69b9b09
# 컨테이너 접속
docker exec -it test_ubuntu_dockerfile bash
# workdir내 목록 확인 -> COPY 명령 확인
root@7bd5c1ceee7b:/usr/app# ls
Dockerfile readme.md t1.txt t12.txt web.tar
# /home 목록 확인 -> ADD 명령 확인
root@7bd5c1ceee7b:/usr/app# ls /home/
1.txt 2.txt readme2.MD requirements.txt t1.txt ubuntu