Network & Server Factory

개인 공부 기록

DevOps/Docker

[Docker] Docker 설치와 자주 쓰는 명령어 정리

1nfra 2026. 9. 29. 07:45
Ubuntu에 Docker를 설치하는 방법부터 이미지·컨테이너 명령, docker run 옵션, docker commit, Dockerfile 명령어, 디스크 정리까지 자주 찾아보는 내용을 한 글에 모았습니다. 개념 설명은 시리즈 본편에 맡기고, 이 글은 필요할 때 펼쳐 보는 레퍼런스로 씁니다.

컨테이너부터 Kubernetes까지 시리즈의 부록입니다. 명령이 왜 그렇게 동작하는지는 [Docker] 컨테이너 개념 정리부터 차례로 보면 되고, 전체 순서는 시리즈 목차에 있습니다. 명령과 출력은 Docker Engine 29, Ubuntu 24.04 기준입니다.

1. Ubuntu에 Docker 설치

설치 방법은 두 가지입니다. 운영 서버는 Docker 공식 apt 저장소를 등록해서 설치하고, 테스트용 VM처럼 빨리 써 보기만 할 때는 설치 스크립트를 씁니다. 공식 문서 기준 지원 버전은 Ubuntu 26.04, 24.04, 22.04 LTS입니다.

1.1 이전 패키지 제거

Ubuntu 기본 저장소의 docker.io나 podman-docker가 깔려 있으면 공식 패키지와 충돌하므로 먼저 지웁니다. 설치된 것이 없으면 아무것도 지우지 않고 끝납니다.

sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 \
  docker-doc docker-buildx podman-docker containerd runc | cut -f1)

1.2 공식 apt 저장소로 설치 (권장)

Docker의 GPG 키와 저장소를 등록한 뒤 패키지를 설치합니다. 이렇게 설치하면 이후에는 apt upgrade로 Docker도 함께 업데이트됩니다.

# GPG 키 등록
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 저장소 등록
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

# 설치
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

설치되는 패키지는 각각 다음 역할을 합니다.

패키지 역할
docker-ce Docker 데몬(dockerd)
docker-ce-cli docker 명령
containerd.io 실제로 컨테이너를 띄우는 containerd와 runc
docker-buildx-plugin docker build에 쓰이는 BuildKit 빌더
docker-compose-plugin docker compose 명령 (5편)

1.3 설치 스크립트로 빠르게 설치 (테스트용)

get.docker.com 스크립트는 OS를 감지해서 위 과정을 한 번에 실행합니다. 편하지만 항상 최신 버전을 설치하고 버전을 고를 수 없어서, 공식 문서도 테스트·개발 환경에서만 쓰라고 안내합니다. curl ... | sh로 바로 실행하기보다 내려받은 뒤 --dry-run으로 무엇을 할지 먼저 보는 편이 안전합니다.

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh --dry-run   # 실행할 명령만 출력
sudo sh get-docker.sh

1.4 설치 확인

sudo systemctl status docker --no-pager
sudo docker version
sudo docker run --rm hello-world

docker version에 Client와 Server가 모두 나오면 CLI와 데몬이 정상적으로 연결된 것입니다. Server 부분에서 오류가 나면 데몬이 떠 있지 않은 것이니 systemctl status docker로 상태를 확인합니다. hello-world가 "Hello from Docker!"를 출력하면 이미지 받기부터 컨테이너 실행까지 모두 동작하는 것입니다. Ubuntu에서는 설치하면 부팅 시 자동 시작이 기본으로 켜집니다.

1.5 sudo 없이 쓰기

docker 명령은 /var/run/docker.sock 소켓으로 데몬에 요청을 보내는데, 이 소켓은 root와 docker 그룹만 쓸 수 있습니다. 사용자를 docker 그룹에 넣으면 sudo 없이 쓸 수 있습니다.

sudo usermod -aG docker $USER
newgrp docker            # 또는 로그아웃 후 다시 로그인
docker run --rm hello-world

docker 그룹은 사실상 root 권한입니다. 컨테이너에 호스트의 /를 마운트하면 호스트 파일을 마음대로 바꿀 수 있기 때문입니다. 여러 사람이 쓰는 서버라면 그룹에 넣을 사용자를 최소로 하고, 격리가 더 필요하면 Rootless 모드를 검토합니다.

2. 명령 구조

docker 명령은 docker [대상] [동작] 형태입니다. 예전부터 쓰던 짧은 명령(docker ps, docker images, docker rmi)도 그대로 동작하고, 대상을 앞에 붙인 긴 명령과 결과가 같습니다. 이 글에서는 손에 익은 짧은 명령을 주로 쓰고, 짧은 형태가 없는 명령만 긴 형태로 적습니다.

짧은 명령 긴 명령 하는 일
docker ps docker container ls 실행 중인 컨테이너 목록
docker run docker container run 컨테이너 생성 + 실행
docker rm docker container rm 컨테이너 삭제
docker images docker image ls 이미지 목록
docker rmi docker image rm 이미지 삭제

옵션은 전부 외울 필요가 없습니다. docker run --help처럼 명령 뒤에 --help를 붙이면 그 명령의 옵션이 모두 나옵니다.

3. 이미지 명령

작업 명령
이미지 목록 docker images
레지스트리에서 받기 docker pull nginx:alpine
(태그를 생략하면 latest)
Docker Hub에서 검색 docker search nginx
태그 붙이기 docker tag nginx:alpine myrepo/nginx:v1
레지스트리 로그인 / 올리기 docker login
docker push myrepo/nginx:v1
상세 정보 docker image inspect nginx:alpine
레이어별 생성 기록 docker history nginx:alpine
이미지 삭제 docker rmi nginx:alpine
tar 파일로 저장 / 불러오기 docker save -o nginx.tar nginx:alpine
docker load -i nginx.tar

docker rmi는 그 이미지로 만든 컨테이너가 남아 있으면 삭제를 거부합니다. 멈춘 컨테이너도 마찬가지입니다.

$ docker rmi nginx:alpine
Error response from daemon: conflict: unable to delete nginx:alpine (must be forced)
- container 68dd8c4f2f47 is using its referenced image 8a6bac31549a

docker rmi -f를 쓰면 삭제된 것처럼 보이지만 실제로는 태그만 떼어 내고, 컨테이너는 그대로 돌아가며 이미지도 이름 없는 상태로 남습니다. 이미지를 지우려면 컨테이너부터 지우는 것이 순서입니다. 한 이미지에 태그가 여러 개면 rmi는 태그를 하나씩 떼고, 마지막 태그를 뗄 때 이미지가 지워집니다.

save와 load는 인터넷이 막힌 서버로 이미지를 옮길 때 씁니다. 레이어와 태그가 tar 파일 하나에 그대로 담깁니다.

4. 컨테이너 명령

컨테이너는 만들어지고(Created), 실행되고(Running), 멈추고(Exited), 삭제되는 상태를 거칩니다. docker run은 create와 start를 한 번에 하는 명령이고, 멈춘 컨테이너는 쓰기 계층을 그대로 가지고 있어서 다시 start하면 전에 바꾼 파일이 남아 있습니다.

docker run은 create와 start를 합친 명령이고, 컨테이너는 rm 전까지 쓰기 계층을 유지합니다

4.1 상태 바꾸기

작업 명령
만들고 바로 실행 docker run -d --name web nginx:alpine
만들기만 docker create --name web nginx:alpine
시작 / 중지 / 재시작 docker start web
docker stop web
docker restart web
강제 종료 docker kill web
일시 정지 / 재개 docker pause web
docker unpause web
삭제 docker rm web
실행 중이어도 강제 삭제 docker rm -f web
이름 바꾸기 docker rename web web-old

docker stop은 먼저 SIGTERM을 보내 앱이 스스로 정리하고 끝낼 시간을 주고, 10초 안에 끝나지 않으면 SIGKILL로 강제 종료합니다. docker kill은 기다리지 않고 바로 SIGKILL을 보냅니다. 앱이 요청을 처리하던 중일 수 있으니 평소에는 stop을 쓰고, 기다리는 시간은 docker stop -t 30 web처럼 늘릴 수 있습니다.

4.2 목록과 상태 보기

작업 명령
실행 중인 컨테이너 docker ps
멈춘 컨테이너까지 전부 docker ps -a
ID만 출력 docker ps -aq
로그 보기 docker logs web
최근 100줄부터 로그 따라가기 docker logs -f --tail 100 web
CPU, 메모리 사용량 docker stats
(한 번만 보려면 --no-stream)
컨테이너 안 프로세스 docker top web
포트 매핑 확인 docker port web
바뀐 파일 목록 docker diff web
전체 설정(JSON) docker inspect web

docker inspect는 IP, 마운트, 재시작 정책처럼 컨테이너의 모든 설정을 JSON으로 보여 줍니다. 결과가 길어서 -f로 필요한 값만 뽑아 쓰는 경우가 많고, docker ps도 --format으로 원하는 칸만 출력할 수 있습니다.

docker inspect -f '{{.State.Status}}' web
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' web
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'

4.3 컨테이너 안에서 작업하기

docker exec -it web sh                                # 실행 중인 컨테이너에서 셸 열기
docker exec web cat /etc/nginx/nginx.conf             # 명령 하나만 실행
docker cp web:/etc/nginx/nginx.conf ./nginx.conf      # 컨테이너 → 호스트
docker cp ./index.html web:/usr/share/nginx/html/     # 호스트 → 컨테이너

docker exec -it web /bin/bash를 습관처럼 쓰면 alpine이나 distroless처럼 가벼운 이미지에서는 bash가 없어 executable file not found 오류가 납니다. 이때는 sh를 씁니다.

docker attach는 새 프로세스를 만들지 않고 컨테이너의 메인 프로세스(PID 1) 입출력에 바로 연결합니다. 여기서 Ctrl+C를 누르면 메인 프로세스가 끝나 컨테이너가 멈추므로, -it로 띄운 컨테이너에서 빠져나올 때는 Ctrl+P, Ctrl+Q를 차례로 누릅니다. 셸 작업은 대부분 exec가 안전합니다.

5. docker run 자주 쓰는 옵션

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
옵션 설명
-d, --detach 백그라운드에서 실행하고 컨테이너 ID 출력
-i, --interactive 표준 입력(STDIN)을 열어 둠
-t, --tty 가상 터미널 할당. 셸을 쓸 때 -it로 함께 씀
-a, --attach STDIN, STDOUT, STDERR 중 연결할 스트림 지정
--name 컨테이너 이름 지정. 없으면 임의 이름이 붙음
--rm 컨테이너가 끝나면 자동 삭제
-e, --env
--env-file
환경 변수 설정 / 파일에서 읽기
-p, --publish 호스트 포트:컨테이너 포트 연결 (4편)
-P, --publish-all EXPOSE된 포트를 모두 호스트의 임의 포트에 연결
-v, --volume
--mount
볼륨이나 호스트 폴더 연결 (4편)
--network 연결할 네트워크 지정 (4편)
-w, --workdir 컨테이너 안 작업 폴더
-u, --user 실행할 사용자 (예: 1000:1000)
--restart 재시작 정책: no, on-failure, always, unless-stopped
--memory, --cpus 메모리, CPU 사용 상한
--entrypoint 이미지의 ENTRYPOINT 덮어쓰기
--privileged 호스트 장치 접근을 포함한 거의 모든 권한 부여. 꼭 필요할 때만 사용

옵션을 조합한 예시입니다.

# nginx를 백그라운드로 띄우고 호스트 8080 → 컨테이너 80 연결
docker run -d --name web -p 8080:80 nginx:alpine

# 서버가 재부팅돼도 다시 뜨고, 메모리 256MB · CPU 0.5개로 제한
docker run -d --name web --restart unless-stopped \
  --memory 256m --cpus 0.5 -p 8080:80 nginx:alpine

# 잠깐 셸만 써 보고 나오면 삭제
docker run --rm -it ubuntu:24.04 bash

--restart always와 unless-stopped는 둘 다 컨테이너가 죽으면 다시 올리고 데몬이 재시작될 때도 다시 올립니다. 차이는 docker stop으로 직접 멈춘 컨테이너입니다. always는 데몬이 재시작되면 이것도 다시 올리고, unless-stopped는 멈춘 그대로 둡니다.

6. docker commit으로 이미지 만들기

docker commit은 컨테이너의 쓰기 계층을 새 레이어로 굳혀 이미지로 저장합니다(레이어 구조는 2편 참고). ubuntu 컨테이너에 apache2를 설치해 commit으로 이미지를 만들고, 같은 이미지를 Dockerfile로 만드는 방법과 비교해 봅니다.

6.1 컨테이너에서 직접 설치

docker run -it --name base ubuntu:24.04 bash

컨테이너 셸에서 apache2를 설치하고 빠져나옵니다. 설치 중 시간대 같은 질문에 멈추지 않도록 DEBIAN_FRONTEND=noninteractive를 붙입니다. bash가 메인 프로세스라 exit하면 컨테이너는 Exited 상태가 되지만, 설치한 파일은 쓰기 계층에 남아 있습니다.

apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y apache2
exit

6.2 commit으로 이미지 저장

docker diff base | head          # 바뀐 파일 확인 (A 추가, C 변경, D 삭제)
docker commit -m "install apache2" base my-apache:commit
docker images my-apache
docker run --rm my-apache:commit apache2ctl -v

마지막 명령에서 Apache 버전이 나오면 새 이미지에 apache2가 들어 있는 것입니다. -c 옵션을 쓰면 CMD, ENV 같은 설정도 함께 바꿔서 저장할 수 있습니다.

docker commit -c 'CMD ["apache2ctl", "-D", "FOREGROUND"]' base my-apache:commit

6.3 Dockerfile과 비교

commit은 결과만 남고, Dockerfile은 만드는 과정이 파일로 남습니다

commit으로 만든 이미지는 결과만 있고 과정이 남지 않습니다. docker history my-apache:commit으로 보면 새 레이어가 bash 한 줄로만 기록되어 있어서, 누가 무엇을 설치했는지 이미지만 보고는 알 수 없습니다. 같은 내용을 Dockerfile로 적으면 파일을 Git에 두고 리뷰할 수 있고, 언제든 똑같이 다시 빌드할 수 있습니다.

FROM ubuntu:24.04
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends apache2 \
 && rm -rf /var/lib/apt/lists/*
CMD ["apache2ctl", "-D", "FOREGROUND"]
docker build -t my-apache:v1 .

commit은 장애가 난 컨테이너 상태를 그대로 떠서 분석하거나 잠깐 실험할 때 정도로 쓰고, 운영에 쓰는 이미지는 Dockerfile로 만듭니다.

6.4 실습 정리

docker rm base
docker rmi my-apache:commit my-apache:v1

7. Dockerfile 명령어 한눈에 보기

Dockerfile은 위에서 아래로 한 줄씩 실행되고, 명령어는 대소문자를 구분하지 않지만 관례상 대문자로 씁니다. 빌드 캐시, CMD와 ENTRYPOINT 조합, 멀티 스테이지 빌드는 3편에서 자세히 다루고, 여기서는 명령어만 정리합니다.

명령어 설명
FROM 베이스 이미지 지정. 멀티 스테이지에서는 FROM 이미지 AS 이름
RUN 빌드 중 명령 실행. 결과가 레이어로 남음
COPY 빌드 컨텍스트의 파일을 이미지로 복사
ADD COPY 기능에 더해 로컬 tar 자동 압축 해제, URL·Git 저장소 받기
WORKDIR 이후 명령이 실행될 폴더. 없으면 만듦
ENV 환경 변수. 빌드 중과 컨테이너 실행 중 모두 적용
ARG 빌드할 때만 쓰는 변수 (docker build --build-arg로 전달)
LABEL 이미지 메타데이터 (작성자, 버전 등)
USER 이후 명령과 컨테이너를 실행할 사용자
EXPOSE 앱이 쓰는 포트를 문서로 표시. 실제로 여는 것은 -p
VOLUME 익명 볼륨을 붙일 경로 지정
CMD 컨테이너 시작 시 기본 명령. docker run 뒤에 명령을 주면 덮어씀
ENTRYPOINT 컨테이너 시작 시 항상 실행할 명령. CMD는 인자로 전달됨
HEALTHCHECK 컨테이너가 정상인지 주기적으로 확인할 명령
SHELL RUN, CMD의 셸 형식에 쓸 셸 변경

작성자 정보에 쓰던 MAINTAINER는 더 이상 권장되지 않아(deprecated) LABEL로 대신합니다. ADD는 tar를 자동으로 풀어 버리는 등 동작이 예상과 다를 수 있어서, 로컬 파일을 복사할 때는 COPY를 기본으로 씁니다.

nginx 이미지에 정적 페이지를 넣는 간단한 예시입니다.

FROM nginx:alpine
LABEL org.opencontainers.image.authors="1nfra"
COPY index.html /usr/share/nginx/html/
EXPOSE 80
HEALTHCHECK --interval=30s --timeout=3s \
  CMD wget -qO- http://127.0.0.1/ || exit 1
docker build -t my-nginx:v1 .
docker run -d --name my-nginx -p 8080:80 my-nginx:v1
docker ps    # 30초쯤 지나면 STATUS에 (healthy) 표시

CMD를 적지 않았는데도 nginx가 뜨는 것은 베이스 이미지인 nginx:alpine에 이미 CMD가 들어 있기 때문입니다. 베이스 이미지의 CMD, ENTRYPOINT, EXPOSE, ENV는 그대로 물려받습니다.

8. 디스크 정리와 일괄 삭제

이미지를 받고 빌드를 반복하다 보면 /var/lib/docker가 금방 커집니다. 지우기 전에 무엇이 공간을 쓰는지 먼저 확인합니다.

$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          12        3         4.21GB    3.02GB (71%)
Containers      5         3         12.3MB    1.1MB (8%)
Local Volumes   4         2         820MB     310MB (37%)
Build Cache     58        0         1.9GB     1.9GB

RECLAIMABLE이 지금 쓰이지 않아서 지워도 되는 용량입니다. 빌드를 자주 하는 서버는 이미지보다 Build Cache가 더 큰 경우도 많습니다.

8.1 prune으로 안 쓰는 것만 지우기

명령 지우는 대상
docker container prune 멈춘 컨테이너
docker image prune 태그가 없는(dangling) 이미지
docker image prune -a 컨테이너가 쓰지 않는 모든 이미지
docker volume prune 컨테이너에 연결되지 않은 익명 볼륨
docker volume prune -a 연결되지 않은 모든 볼륨 (이름 있는 볼륨 포함)
docker network prune 쓰지 않는 사용자 정의 네트워크
docker builder prune 빌드 캐시
docker system prune 멈춘 컨테이너, 안 쓰는 네트워크, dangling 이미지, 빌드 캐시
docker system prune -a --volumes 위 항목 + 안 쓰는 모든 이미지 + 익명 볼륨

볼륨에는 데이터가 들어 있어서 기본적으로 지우지 않습니다. Docker 23부터 volume prune은 익명 볼륨만 지우고, DB 데이터처럼 이름을 붙인 볼륨까지 지우려면 -a를 붙여야 합니다. system prune --volumes도 익명 볼륨만 지웁니다.

prune은 모두 확인 질문을 먼저 하고, -f를 붙이면 묻지 않고 바로 지웁니다. 기간 조건을 주면 최근 것은 남겨 둘 수 있습니다.

# 만든 지 7일(168시간)이 지난 안 쓰는 이미지만 삭제
docker image prune -a --filter "until=168h"

8.2 모든 컨테이너와 이미지 한 번에 지우기

테스트 서버를 깨끗하게 비울 때는 ID 목록을 뽑아 삭제 명령에 넘깁니다. 호스트의 모든 컨테이너와 이미지가 지워지므로 운영 서버에서는 실행하지 않습니다.

# 모든 컨테이너 삭제 (실행 중인 것도 강제로)
docker rm -f $(docker ps -aq)

# 모든 이미지 삭제
docker rmi -f $(docker images -q)

docker ps -aq는 모든 컨테이너의 ID만, docker images -q는 모든 이미지의 ID만 출력합니다. 지울 대상이 없으면 "requires at least 1 argument" 오류가 나는데 무시해도 됩니다. 볼륨과 빌드 캐시까지 전부 비우려면 컨테이너를 지운 뒤 docker system prune -af --volumes와 docker volume prune -af를 이어서 실행합니다.

9. 전체 명령 요약

docker --help에 나오는 명령을 용도별로 묶었습니다.

분류 명령 설명
컨테이너 실행 run 새 컨테이너를 만들어 실행
create 새 컨테이너 생성(실행하지 않음)
start / stop 멈춘 컨테이너 시작 / 실행 중인 컨테이너 중지
restart 컨테이너 재시작
kill 실행 중인 컨테이너 강제 종료
pause / unpause 컨테이너 프로세스 일시 중지 / 재개
wait 컨테이너가 멈출 때까지 기다린 뒤 종료 코드 출력
rm / rename 컨테이너 삭제 / 이름 변경
update 실행 중인 컨테이너의 자원 제한, 재시작 정책 변경
컨테이너 조회 ps 컨테이너 목록
logs 컨테이너 로그
inspect Docker 객체의 상세 정보(JSON)
top 컨테이너 안에서 실행 중인 프로세스
stats 컨테이너 리소스 사용량 실시간 보기
port 컨테이너 포트 매핑
diff 컨테이너 파일시스템의 변경 사항
events 데몬의 실시간 이벤트
컨테이너 작업 exec 실행 중인 컨테이너에서 명령 실행
attach 메인 프로세스의 표준 입출력에 연결
cp 컨테이너와 호스트 사이에 파일·폴더 복사
commit 컨테이너의 변경 사항으로 새 이미지 생성
export 컨테이너 파일시스템을 tar로 내보내기
이미지 images 이미지 목록
pull / push 레지스트리에서 이미지 받기 / 올리기
build Dockerfile로 이미지 빌드
tag 이미지에 새 태그 붙이기
rmi 이미지 삭제
history 이미지의 레이어별 생성 기록
save / load 이미지를 tar로 저장 / tar에서 불러오기
import tar 파일(export 결과)로 이미지 생성
search Docker Hub에서 이미지 검색
레지스트리·시스템 login / logout 레지스트리 로그인 / 로그아웃
info 데몬과 시스템 전체 정보
version Client, Server 버전 정보
system df / prune 디스크 사용량 확인 / 안 쓰는 객체 정리

export/import와 save/load는 비슷해 보이지만 다릅니다. export는 컨테이너의 파일시스템을 레이어 없이 한 덩어리로 내보내서 CMD 같은 설정과 레이어 기록이 사라지고, save는 이미지를 레이어와 설정 그대로 저장합니다. 이미지를 옮길 때는 save/load를 씁니다.

10. 정리

  • 운영 서버는 공식 apt 저장소로 설치하고, get.docker.com 스크립트는 테스트 환경에서만 씁니다.
  • docker 그룹은 root 권한과 같으므로 꼭 필요한 사용자만 넣습니다.
  • 컨테이너는 rm 전까지 쓰기 계층을 유지하고, 이미지는 그 이미지를 쓰는 컨테이너부터 지워야 삭제됩니다.
  • stop은 SIGTERM을 보내고 기다렸다가 종료하고, kill은 바로 SIGKILL로 종료합니다.
  • commit은 실험이나 장애 상태 보존용으로만 쓰고, 이미지는 Dockerfile로 만듭니다.
  • 공간 정리는 docker system df로 확인한 뒤 prune을 쓰고, 이름 있는 볼륨은 -a를 붙여야 지워집니다.

참고

728x90
서울
--:--:--
-전체 글
-카테고리
오늘 방문