솔솔

[Docker] Docker 명령어 본문

나의보물들/Docker

[Docker] Docker 명령어

솔솔하네 2024. 9. 29. 21:07
반응형

🍀 Docker?


Docker

Docker는 애플리케이션을 컨테이너라는 격리된 환경에서 실행하고 관리할 수 있게 해주는 오픈 소스 플랫폼. 이 플랫폼은 애플리케이션과 그 종속성을 함께 패키징하여, 개발 환경과 운영 환경 간의 차이를 줄이고, 소프트웨어를 더 쉽게 배포할 수 있게 해줌.

 

Docker의 컨테이너 (Container)

애플리케이션 코드와 모든 필요한 라이브러리, 종속성을 포함하는 가벼운 실행 환경. 컨테이너는 가상 머신보다 훨씬 더 경량이고 실행 속도가 빠름.

 

Docker의 이미지 (Image)

컨테이너를 생성하는 데 필요한 모든 파일 시스템과 애플리케이션 코드가 포함된 읽기 전용 템플릿. 이미지는 여러 레이어로 구성되어 있으며, 각각의 레이어는 변경된 부분만 저장됨. 이미지는 Docker Hub와 같은 레지스트리에서 공유하고 배포할 수 있음.

 

 

🍀 Docker의 장점


환경 일관성

Docker 컨테이너는 어디서나 동일한 방식으로 실행됨. 개발, 테스트, 배포 환경 간의 차이를 줄여줌.

 

경량화

컨테이너는 가상 머신보다 훨씬 가볍고 빠름. 여러 개의 컨테이너를 동시에 실행할 수 있음.

 

확장성

필요에 따라 컨테이너를 쉽게 추가하거나 제거할 수 있어, 애플리케이션을 쉽게 확장하고 관리할 수 있음.

 

신속한 배포

새로운 애플리케이션 버전을 빠르게 배포할 수 있으며, 롤백도 쉽게 수행할 수 있음.

 

 

🍀 컨테이너 이미지 검색 및 다운로드


1. 이미지 검색

  • Docker Hub에서 원하는 이미지를 검색할 때 사용
docker search IMAGE

 

  • 예시
username@servername:~$ docker search nginx
NAME                              DESCRIPTION                                     STARS     OFFICIAL
nginx                             Official build of Nginx.                        20238     [OK]
nginx/nginx-ingress               NGINX and  NGINX Plus Ingress Controllers fo…   94
nginx/nginx-prometheus-exporter   NGINX Prometheus Exporter for NGINX and NGIN…   43
nginx/unit                        This repository is retired, use the Docker o…   63
nginx/nginx-ingress-operator      NGINX Ingress Operator for NGINX and NGINX P…   2
  • NAME : 검색된 이미지 이름. 저장소 소유자/이미지 이름
  • DESCRIPTION : 이미지에 대한 설명
  • STARS : 해당 이미지를 내려 받은 사용자에게 받은 평가 횟수
  • OFFICIAL :  [OK] 가 있으면 해당 이미지는 공식 이미지라는 의미

 

2. 이미지 다운로드

  • Docker Hub에서 원하는 이미지를 내려받을 때 사용
docker pull IMAGE[:TAG]
  • 예시
docker pull nginx
docker pull nginx:1.21
docker pull nginx:stable
  • docker pull IMAGE : 태그를 지정하지 않으면 기본적으로 latest 태그가 적용되어 최신 이미지를 다운로드 됨
  • docker pull IMAGE[:TAG] : 태그는 이미지의 버전이나 상태를 구분하기 위한 식별자로 지정된 태그 버전의 이미지를 다운로드함. 
  • docker pull IMAGE:stable : stable 태그는 일반적으로 해당 이미지의 안정화된 버전을 의미

 

 

🍀 컨테이너 이미지의 레이어 히스토리 확인


  • Docker 이미지가 어떻게 만들어졌는지, 어떤 명령어들이 실행되었는지, 각 레이어의 크기와 생성된 시점 등을 볼 수 있음.
docker history IMAGE

 

  • 예시
username@servername:~$ docker history nginx
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
39286ab8a5e1   6 weeks ago   CMD ["nginx" "-g" "daemon off;"]                0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   STOPSIGNAL SIGQUIT                              0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   EXPOSE map[80/tcp:{}]                           0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   ENTRYPOINT ["/docker-entrypoint.sh"]            0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   COPY 30-tune-worker-processes.sh /docker-ent…   4.62kB    buildkit.dockerfile.v0
<missing>      6 weeks ago   COPY 20-envsubst-on-templates.sh /docker-ent…   3.02kB    buildkit.dockerfile.v0
<missing>      6 weeks ago   COPY 15-local-resolvers.envsh /docker-entryp…   336B      buildkit.dockerfile.v0
<missing>      6 weeks ago   COPY 10-listen-on-ipv6-by-default.sh /docker…   2.12kB    buildkit.dockerfile.v0
<missing>      6 weeks ago   COPY docker-entrypoint.sh / # buildkit          1.62kB    buildkit.dockerfile.v0
<missing>      6 weeks ago   RUN /bin/sh -c set -x     && groupadd --syst…   113MB     buildkit.dockerfile.v0
<missing>      6 weeks ago   ENV DYNPKG_RELEASE=2~bookworm                   0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   ENV PKG_RELEASE=1~bookworm                      0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   ENV NJS_RELEASE=1~bookworm                      0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   ENV NJS_VERSION=0.8.5                           0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   ENV NGINX_VERSION=1.27.1                        0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   LABEL maintainer=NGINX Docker Maintainers <d…   0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      6 weeks ago   /bin/sh -c #(nop) ADD file:d13afefcc2b0b02b5…   74.8MB

 

 

 

🍀 컨테이너 실행하기


  • Docker 컨테이너를 실행하기 위해 사용하는 명령어
docker run [OPTIONS] IMAGE

 

  • 예시
# 백그라운드에서 실행
# 이름이 mynginx인 컨테이너를 생성
# 호스트의 8080 포트를 컨테이너의 80 포트로 연결
# my_volume 볼륨에 컨테이너의 /usr/share/nginx/html 디렉터리에 마운트하여 Nginx 컨테이너를 실행
docker run -d --name mynginx -p 8080:80 -v my_volume:/usr/share/nginx/html nginx

 

[주요 OPTIONS들]

  • -d (Detached mode) : 컨테이너를 백그라운드에서 실행. 옵션 생략 시 컨테이너 내부에서 실행되는 애플리케이션의 상태가 화면에 표시되고 화면에서 빠져나오기 위해 Ctrl+C 입력 시 애플리케이션뿐만 아니라 컨테이너도 함께 중단 됨. 계속 작동해야되는 서버나 데이터베이서는 백그라운드에서 작동되게 해야 함.
  • -p (Port mapping) : 호스트와 컨테이너 간의 포트를 매핑,
  • --name (Container name) : 컨테이너에 이름을 지정.
  • -v (Volume) : 호스트와 컨테이너 간의 디렉터리를 공유.
  • -e (Environment variables) : 컨테이너에 환경 변수를 설정.

[그리고 OPTIONS]

  • --restart 옵션은 Docker 컨테이너가 종료되었을 때 재시작 정책을 설정하는 옵션
docker run --restart [POLICY] IMAGE
  • POLICY: 컨테이너의 재시작 정책
  • no (기본값): 컨테이너가 종료되었을 때 자동으로 재시작하지 않음.
  • always: 컨테이너가 종료될 때마다 항상 재시작. 수동으로 멈추지 않는 한, 컨테이너는 종료되자마자 재시작.
  • on-failure: 컨테이너가 비정상적인 오류(종료 코드가 0이 아님)로 종료되었을 때 재시작. 추가로 몇 번까지 재시도할지 지정할 수 있음.
  • unless-stopped: 컨테이너가 수동으로 중지되지 않는 한 항상 재시작. 수동으로 멈춘 컨테이너는 시스템 재부팅 시 자동으로 시작되지 않음.

* 작동 중인 컨테이너의 설정 변경은 할 수 없음 : https://dar0m.tistory.com/243

 

[DevOps] 컨테이너의 이해 : 왜 컨테이너가 중요해졌을까?

Immutable Infrastructure (변경 불가능한 인프라) 탄생 배경 mutable Infrastructure (변경 가능한 인프라) 우리는 윈도우즈나 맥을 사용하면서 보안, 안정성 그리고 성능 등의 이유로 OS(운영체제)를 자주 업

dar0m.tistory.com

 

 

 

🍀 컨테이너의 목록 확인


  • 현재 실행 중인 Docker 컨테이너의 목록을 확인하는 데 사용
docker ps [OPTIONS]

 

  • 예시
username@servername:~$ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED      STATUS      PORTS                                                  NAMES
fc56fcb69471   jenkins/jenkins:lts-jdk17   "/usr/bin/tini -- /u…"   2 days ago   Up 2 days   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 50000/tcp   myjenkins
  • CONTAINER ID: 컨테이너의 고유 ID.
  • IMAGE: 해당 컨테이너가 기반으로 하는 Docker 이미지 이름.
  • COMMAND: 컨테이너 시작 시 실행된 명령어.
  • CREATED: 컨테이너가 생성된 시간.
  • STATUS: 컨테이너의 현재 상태.
  • PORTS: 컨테이너의 포트 매핑 정보.
  • NAMES: 컨테이너에 지정된 이름.

[주요 OPTIONS들]

  • -a 또는 --all : 실행 중이지 않은 정지된 컨테이너를 포함하여 모든 컨테이너를 표시.
  • -n: 최근의 n개의 컨테이너를 표시
  • -f 또는 --filter: 특정 조건으로 컨테이너 목록을 필터링. 컨테이너 실행 목록이 많을 시 유용하게 사용.
username@servername:~$ docker ps -f "name=jenkins"
CONTAINER ID   IMAGE                       COMMAND                  CREATED      STATUS      PORTS                                                  NAMES
fc56fcb69471   jenkins/jenkins:lts-jdk17   "/usr/bin/tini -- /u…"   2 days ago   Up 2 days   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 50000/tcp   myjenkins

 

 

 

🍀 컨테이너의 로그 확인


  • 특정 Docker 컨테이너의 로그를 확인하는 데 사용
docker logs [OPTIONS] CONTAINER

 

  • 예시
username@servername:~$ docker logs myjenkins
Running from: /usr/share/jenkins/jenkins.war
webroot: /var/jenkins_home/war
2024-09-27 08:05:40.651+0000 [id=1]     INFO    winstone.Logger#logInternal: Beginning extraction from war file
2024-09-27 08:05:41.448+0000 [id=1]     WARNING o.e.j.s.handler.ContextHandler#setContextPath: Empty contextPath
2024-09-27 08:05:41.501+0000 [id=1]     INFO    org.eclipse.jetty.server.Server#doStart: jetty-10.0.20; built: 2024-01-29T20:46:45.278Z; git: 3a745c71c23682146f262b99f4ddc4c1bc41630c; jvm 17.0.12+7
2024-09-27 08:05:41.693+0000 [id=1]     INFO    o.e.j.w.StandardDescriptorProcessor#visitServlet: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
...

 

[주요 OPTIONS들]

  • -f 또는 --follow: 로그를 실시간으로 지속해서 출력
  • --tail: 로그의 마지막 몇 줄만 표시

 

 

🍀 그 외 명령어


  • 컨테이너의 Bash 쉘에 접속
docker exec -it [container id | container name] bash
  • 컨테이너 내부에 명령어 실행
docker exec [container id | container name] sh -c '명령어'
username@servername:~$ docker exec myjenkins sh -c 'cat /etc/os-release'
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
  • 컨테이너 정지
docker stop [container id | container name]
  • 컨테이너 삭제
docker rm [container id | container name]
  • 이미지 삭제
docker rmi IMAGE

 

 

 

🍀 Docker의 디스크 공간을 확보하는 방법


  • 중지된 컨테이너 삭제
docker container prune
  • 사용하지 않는 이미지 삭제
docker image prune
  • 사용하지 않는 네트워크 삭제
docker network prune
  • 사용하지 않는 볼륨 삭제
docker volume prune
  • Docker의 모든 불필요한 리소스를 한 번에 정리
docker system prune
  • 현재 사용 중인 Docker 리소스의 상태를 확인
docker system df
username@servername:~$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          7         1         2.465GB   1.995GB (80%)
Containers      1         1         3.446MB   0B (0%)
Local Volumes   7         1         1.186GB   535.4MB (45%)
Build Cache     17        0         55.48MB   55.48MB

 

 

🍀 Docker CLI Reference Docs


 

https://docs.docker.com/reference/cli/docker/

 

docker

 

docs.docker.com