솔솔
[Docker] Docker 명령어 본문
🍀 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
'나의보물들 > Docker' 카테고리의 다른 글
[Docker] No space left on device 에러 (0) | 2024.10.14 |
---|---|
Docker로 MySQL 데이터 덤프 만들고 다른 컨테이너에 복원하기 (4) | 2024.09.27 |