Docker 구성 요소
- docker daemon을 docker engine이라고 부른다.
- Docker Image와 Docker Container는 1 : N 관계이다.
- Docker Image
- Docker에서 사용하는 가장 기본적인 단위
- 컨테이너를 생성할 때 필요한 요소로, 컨테이너의 목적에 맞는 바이너리와 의존성이 설치되어 있다.
- 여러 개의 계층으로 된 바이너리 파일로 존재한다.
- 저장소 이름/이미지 이름:이미지 태그로 구성된다.
- Pull/Push 시에 저장소 이름을 생략하면 기본 저장소인 도커 허브로 인식한다.
- 도커 이미지 태그를 생략하면 최신 리버전을 뜻하는 lastest로 인식한다.
- Docker Container
- Docker에서 사용하는 가장 기본적인 단위
- 호스트와 다른 컨테이너로부터 격리된 시스템 자원과 네트워크를 사용하는 프로세스
- 이미지는 읽기 전용으로 사용하여 변경 사항은 컨테이너 계층에 저장한다.
- 컨테이너에서 무엇을 하든 이미지는 영향을 받지 않는다.
* Docker File -> Build -> Docker Image -> Run -> Docker Container
- Image Repository
- 도커 이미지를 관리하고 공유하기 위한 서버 애플리케이션
- public -> dockerhub, QUAY...
- private -> AWS ECR, Docker Registry...
Docker Container Life Cycle
- Running
- create 명령어 -> start 명령어 통한 실행
- run 명령어를 통한 실행
- Paused
- pause 명령어를 통한 일시정지 상태
- unpause 명령어를 통한 실행 상태로 변경
- Stopped
- stop 명령어를 통한 중지 상태
- start 명령어를 통한 실행 상태로 변경
- Deleted
- Stopped 상태에서 rm 명령어를 통한 제거
- create 명령어로 생성된 상태에서 rm 명령어를 통한 제거
- docker create/run 명령어 모두 이미지가 없을 경우 자동으로 pull을 수행하여 이미지를 다운받는다.
Docker 명령어
- docker run [옵션] [이미지] [컨테이너 내에서 실행할 명령어]
- 컨테이너 시작 명령어
- 옵션
- -i: 호스트의 표준 입력을 컨테이너와 연결
- -t: TTY 할당
- --rm: 컨테이너 실행 종료 후 자동 삭제
- -d: 백그라운드 모드로 실행
- --name: 컨테이너 이름 지정
- -p: 호스트 - 컨테이너 간의 포트 바인딩
- -v: 호스트 - 컨테이너 간 볼륨 바인딩
- docker ps [옵션]
- 실행 중인 컨테이너 상태 확인 명령어
- 옵션
- -a: 전체 컨테이너 상태 확인
- -a: 전체 컨테이너 상태 확인
- docker inspect [container]
- 컨테이너 상세 정보 확인
- 컨테이너 상세 정보 확인
- docker pause [container]
- 컨테이너 일시중지 명령어
- 컨테이너 일시중지 명령어
- docker unpause [container]
- 컨테이너 일시중지 해제 명령어
- 컨테이너 일시중지 해제 명령어
- docker stop [container]
- 컨테이너 종료 명령어 (SIGTERM 시그널 전달)
- 안전하게 컨테이너 종료
- docker kill [container]
- 컨테이너 강제 종료 명령어 (SIGKILL 시그널 전달)
- 강제 컨테이너 종료
- docker stop $(docker ps -aq)
- 모든 컨테이너 종료 명령어
- 모든 컨테이너 종료 명령어
- docker rm [옵션] [container]
- 컨테이너 삭제 명령어
- 옵션
- -f: 컨테이너 강제 종료 후 삭제
- docker container prune
- 중지된 모든 컨테이너 삭제
- 중지된 모든 컨테이너 삭제
- docker exec [container] [command]
- 실행 중인 컨테이너에 명령어를 실행한다.
Entrypoint / Command
- Entrypoint
- 도커 컨테이너가 실행할 때 고정적으로 실행되는 스크립트 혹은 명령어
- 생략할 수 있으며, 생략될 경우 Command에 지정된 명령어로 수행된다.
- Command
- 도커 컨테이너가 실행할 때 수행할 명령어
- Entrypoint에 지정된 명령어에 대한 인자 값
- 둘 다 지정할 경우
- [Entrypoint] [Command] 형태로 명령어가 실행된다.
- docker run --entrypoint echo ubuntu hello world
- echo: Entrypoint
- hello world: Command
- 최종 실행: echo hello world => hello world 출력
Docker 환경변수
- docker container를 실행할 때 container 내로 필요한 변수, 파일을 주입할 수 있는 방법
- -e: 환경 변수 넘기기
- docker run -i -t -e MY_VAR=test ubuntu bash
- echo $MY_VAR: test 출력
- docker run -i -t -e MY_VAR=test ubuntu bash
- --env-file: 파일 넘기기
- test.env 파일 내에 환경변수 지정(MY_VAR=test)
- docker run -i -t - -env-file ./test.env ubuntu bash
- echo $MY_VAR: test 출력
- 환경 변수 설정을 통해 config 설정을 변경할 수 있도록 공식 이미지 문서에 나와 있다.
Docker Network
- container를 실행할 때 network를 설정하지 않으면 기본적으로 docker0을 사용한다.
- docker0: 도커 엔진에 의해 기본 생성되는 브릿지 네트워크, veth와 eth 간의 다리 역할을 한다.
- docker0: 도커 엔진에 의해 기본 생성되는 브릿지 네트워크, veth와 eth 간의 다리 역할을 한다.
- 컨테이너 포트 노출
- 컨테이너의 포트를 호스트의 IP:PORT와 연결하여 서비스를 노출한다.
- docker run -p [HOST IP:PORT] : [CONTAINER PORT] [container]
- HOST IP를 생략하면 0.0.0.0:PORT로 연결된다.
- Expose / Publish
- Expose 옵션은 그저 문서화 용도이다. 실제로 바인딩되지 않는다.
- Publish 옵션은 실제 포트를 바인딩한다.
- Docker Network Driver
- docker network ls 명령어를 통해 container가 사용 중인 driver를 확인할 수 있다.
- driver 종류
- bridge
docker network create --driver=bridge [network name]으로 생성해서 사용할 수 있다.
docker run --network=[network name] --net-alias=[domain name] 명령어를 사용해서 지정할 수 있다.
--net-alias 옵션은 내부 도메인을 생성한다. - host: docker가 제공하는 network를 사용하는 것이 아닌 host network에 붙어서 사용한다. 포트 연결 없이 바로 사용이 가능한다.
- none: network 기능이 필요 없을 때 사용하거나 커스텀 network를 사용해야 할 때 사용한다.
- overlay
- bridge
- --net [driver] 명령어로 driver를 설정할 수 있다.
Docker Volume
- 볼륨을 설정하지 않고 Container 내에서 파일 작업을 진행하면, Container 삭제 시 해당 파일은 사라진다.
- 호스트 볼륨
- 호스트의 디렉토리를 컨테이너의 특정 경로에 마운트 한다.
- 호스트 디렉토리 내의 파일이 지정된 컨테이너의 디렉토리로 덮어 씌워진다.
- docker run -v [host 경로]:[container 경로]
- 볼륨 컨테이너
- 특정 컨테이너의 볼륨 마운트를 공유할 수 있다.
- 연결된 컨테이너의 마운트 정보를 사용할 수 있다.
- docker run --volumes-from [container]
- 도커 볼륨
- 도커가 제공하는 볼륨 관리 기능을 활용하여 데이터를 보존한다.
- 기본적으로 /var/lib/docker/volumes/${volume-name}/_data에 데이터가 저장된다.
- docker volume create --name [volume name]
- docker run -v [volume name]:/var/lib/mysql
- 읽기 전용 볼륨 연결
- 볼륨 연결 설정에 :ro 옵션을 통해 읽기 전용 마운트 옵션을 설정할 수 있다.
- docker run -v [volume name]:/usr/share/nginx/html:ro
Docker Log
- Log 출력의 표준: STDOUT / STDERR
- 출력된 로그 쌓아서 Logging Driver를 사용하여 처리할 수 있다.
- Logging Driver 종류
- none
- local
- json-file
- syslog
- awslogs
- 명령어
- docker logs [container]: 전체 로그 확인
- docker logs --tail 10 [container]: 마지막 로그 10줄 확인
- docker logs -f [container]: 실시간 로그 스트림 확인
- docker logs -f -t [container]: 로그마다 타임스탬프 표시
- 호스트 운영체제의 로그 저장 경로
- logging driver를 json-file로 설정했을 경우
- cat /var/lib/docker/containers/${CONTAINER_ID} 경로에서 ${CONTAINER_ID}-json.log 파일로 확인할 수 있다.
- cat /var/lib/docker/containers/${CONTAINER_ID} 경로에서 ${CONTAINER_ID}-json.log 파일로 확인할 수 있다.
- logging driver를 json-file로 설정했을 경우
- 로그 용량 제한하기
- 로그 용량은 기본적으로 설정되어 있지 않기 때문에 반드시 설정해야 하는 옵션 중 하나이다.
- 컨테이너 단위로 로그 용량을 제한할 수 있지만, 도커 엔진에서 기본 설정을 진행할 수 있다.
- docker run --log-driver=[logging driver] --log-opt max-size=3m --log-opt max-file=5
Docker Demon 디버깅
- docker system info
- docker 시스템 정보 출력
- docker 시스템 정보 출력
- docker events
- streaming 형식으로 docker에서 발생하는 Event를 확인할 수 있다.
- streaming 형식으로 docker에서 발생하는 Event를 확인할 수 있다.
- docker system df
- docker의 디스크 사용량을 확인할 수 있다.
- docker의 디스크 사용량을 확인할 수 있다.
- docker system prune
- 중지된 컨테이너, 사용 중이지 않은 네트워크 등을 제거해서 저장 공간을 확보할 수 있다.
- 중지된 컨테이너, 사용 중이지 않은 네트워크 등을 제거해서 저장 공간을 확보할 수 있다.
- docker stats
- 각각의 컨테이너 별로 사용 중인 CPU, Memory 등의 정보를 확인할 수 있다.
'Docker' 카테고리의 다른 글
[Docker] docker-compose (0) | 2022.11.14 |
---|---|
[Docker] Dockerfile (0) | 2022.11.11 |
[Docker] 도커란? (0) | 2022.09.17 |