We are Architect

15단계로 배우는 Docker와 쿠버네티스: 컨테이너 첫걸음(5) 본문

Docker

15단계로 배우는 Docker와 쿠버네티스: 컨테이너 첫걸음(5)

the best infra 2024. 12. 30. 17:58

 

* Hello world 실행

  • 코딩을 처음 할 때 보통 'Hello world'부터 시작한다. 컨테이너에도 'Hello world' 를 출력해 주는 컨테이너가 존재한다.
  • 도커 이미지는 운영체와 소프트웨어를 담고 있는 컨테이너 실행 이전 상태의 파일이다.
  • 이미지는 리포지터리:태그 로 식별된다.
  • cmd 창을 켜고 docker run hello-world를 입력해 보자.

안에는 도커 커맨드 동작에 대한 내용을 설명하고 있다.
컨테이너 생성 및 동작 방식

 

* 이미지 다운로드 

  • 이번에는 이미지를 다운로드 받아보자.
  • 대상은 ceontos:7이다.
  • 명령어는 docker pull ceontos:7이다.

 

 

* 컨티에너 실행 

  • 받아온 이미지를 컨테이너로 만든 다음에 bash로 접속해 보자.
  • 명령어는 docker run -it --name test centos:7 bash이다.
    • 이때 -i는 키보드 입력을 컨테이너 입력에 연결하는 옵션.
    • -t는 터미널을 통해 조작하는 옵션
    • --name 은 컨테이너에 이름을 부여하는 옵션.
    • bash는 쉘은 bash로 지정하겠다는 옵션.
    • 쉘 상태에서 나가려면 exit or Ctrl + C

 

 

* 컨테이너 상태 출력

  • docker ps -a 를 사용하면 모든 상태의 컨테이너를 볼 수 있다.
  • 그냥 docker ps를 사용하면 실행 중인 컨테이너만 볼 수 있다.

 

 

* 로그 출력 

  • 정지 상태인 컨테이너는 삭제될 때까지 남아 있으며, 실행 중 발생한 표준 출력과 표준 에러 출력을 간직하고 있다.
  • 추가 적로 -f 를 사용하면 실시간으로 발생하는 로그를 볼 수 있다.
  • 사용방법은 docker logs <컨테이너명 or ID>

 

 

* 컨테이너 정지

  • 컨테이너를 정지하는 법은 세 가지가 존재.
    • 컨테이너의 PID=1 인 프로세스가 종료 > bash 프로세스는 pid가 1로 지정되어 있음. 
    • docker stop 컨테이너 이름 or ID
    • docker kill 컨테이너 이름 or ID
  • 아래 상황처럼 별도의 커맨드가 없으면 그냥 종료해 버린다. 

bash 쉘로 접속이 되었으면 컨테이너가 실행됨
PID가 1인 bash

 

 

* 컨테이너 재기동

  • 실행이 종료된 컨테이너들은 다시 재기동시킬 수 있다. 
  • 명령어는 다음과 같다. docker start -it test1 bash
  • 근데 이번에는 신기하게도 bash로 접속을 안 해 있어도 시작이 되었다. 
  • 컨테이너는 start 명령어를 받으면 이전에 실행되었던 상태로 돌아가려고 한다.
  • 컨테이너는 start 명령어를 받았을 때 이전에 실행된 PID 1 프로세스의 상태를 복원하려고 시도를 한다.
  • 그래서 컨테이너가 계속해서 실행 중 일수 있었던 것이다.

test1 이라는 컨테이너를 재기동

 

 

* 컨테이너의 변경 사항을 리포지터리에 저장

  • 가동한 컨테이너 안에 여러 프로그램을 더 다운로드할 수 있다. 그리고 해당 컨테이너를 이미지로 만들 수 있다.
  • 우선 그러기 위해서는 centos7 컨테이너 안에 git을 다운받아야 하는데 얼마전 centos7 지원을 레드헷이 종료해 버려서 이제는 yum을 사용 못하는 줄 알았지만 리포지터리 만 변경하면 다운로드를 할 수 있을 줄 알았으나... 그냥 다른 이미지를 사용하기로 했다.
  • 로키 리눅스 이미지를 사용해 보자.
    • docker run -it --name test2 rockylinux/rockylinux:latest /bin/bash 명령어를 입력.
    • dnf install -y git 로 git 을 설치해 보자.
    • 그리고 docker commit test2 rockylinux:git-addtion 으로 컨테이너를 이미지로 저장해 보자.
    • 이러면 변경사항이 저장된 컨테이너를 다시 이미지로 변환해서 사용할 수 있다!

 

 

* 이미지를 원격 리포지터리에 보관

  • 해당 이미지를 이제는 docker hub라는 원격 저장소에 보내 보자.
  • 우선 docker login 명령어를 치면 docker hub와 연동된다.
    • 만약에 비밀번호를 요구하면 가입 정보를 입력하면 된다.이후에 기존 이미지에 원격 리포지터리의 이름과 태그를 부여한다.
  • 원격 리포지터리에 전송한다.
    이렇게 저장소에 이미지가 업로드 된다.
    이렇게 가져올 수도 있음
  • 추가적으로 리포지터리는 바꿀 수가 있다. ex) AWS ECR, GCP ECR...

 

* 도커 엔진 정리하는 명령어

  • 이미지를 다운로드할수록 계속 파일이 쌓인다.. 좀 더 살펴봐야겠지만 주기적인 정리가 필요할 듯싶다.
# Docker가 사용하는 디스크 공간을 확인
docker system df

# 컨테이너 전체 중지
docker stop $(docker ps -aq)

# 컨테이너 삭제
docker rm $(docker ps -aq)

# 안쓰는 이미지 전체 삭제
docker image prune -a -f

# 안쓰는 볼륨 전체 강제 삭제
docker volume prune -f

# 안쓰는 네트워크 전체 삭제.
docker network prune -f

# 안쓰는 빌더 캐쉬 전체 삭제
docker builder prune -a -f

# Docker가 사용하는 디스크 공간을 확인
docker system df