[docker] 기본적인 도커 클라이언트 명령어

이상훈·2023년 6월 14일
0

CICD

목록 보기
2/10

이미지 내부 파일 시스템 구조 보기

☑️ 명령어
docker run [이미지 이름] ls

docker 명령어의 4번째 자리 역할 : 원래 이미지가 가지고 있는 시작 명령어를 무시하고 이 자리에 있는 커멘드를 실행하게 함.
ls : 현재 디렉토리의 파일 리스트 표출

☑️ 작동 순서
ex) docker run alpine ls

  1. alpine 이미지를 이용해서 컨테이너 생성.
  2. alpine 이미지 안의 파일 스냅샷들이 컨테이너 안에 있는 하드디스크로 다운로드 됨.
  3. docker 명령어의 ls 즉 4번째 자리로 명령어로 인해 기존의 시작 시 실행될 기본 커멘드는 무시되고 ls 명령어 실행

☑️ 결과

☑️ 기타
docker run hello-world ls
위 명령어는 에러가 뜨는데 hello-world 이미지 안의 파일 스냅샷 안에는 ls 명령어를 실행할 수 있는 파일이 들어가 있지 않기 때문이다.


컨테이너들 나열하기

☑️ 명령어
docker ps

ps : process status

☑️ 결과

  • CONTAINER ID : 컨테이너의 고유한 아이디 해쉬값. 실제로는 더욱 길지만, 일부분만 표출.

  • IMAGE : 컨테이너 생성 시 사용한 도커 이미지.

  • COMMAND : 컨테이너 시작 시 실행될 명령어. 대부분 이미지에 내장되어 있으므로 별도의 설정 필요 X.

  • CREATED : 컨테이너가 생성된 시간.

  • STATUS : 컨테이너의 상태.

    • 실행 중은 Up, 종료는 Exited, 일시정지는 Pause.
  • PORTS : 컨테이너가 개방한 포트와 호스트에 연결한 포트, 특별한 설정을 하지 않은 경우 출력 X.

  • NAMES : 컨테이너 고유한 이름. 컨테이너 생성 시 --name 옵션으로 이름을 설정하지 않으면 도커 엔진이 임의로 형용사와 명사를 조합해 설정. id와 마찬가지로 중복이 안되고 docker rename 명령어로 이름을 변경할 수 있음.

    • ex) docker rename original-name changed-name

☑️ 기타

실행되지 않은 모든 컨테이너를 보고 싶으면 아래 명령어 사용.
docker ps -a


도커 컨테이너 생명주기


☑️ 명령어

docker run = docker create + docker start

  • docker create : 컨테이너를 생성함과 동시에 이미지의 파일 스냅샷을 컨테이너의 하드디스크에 넣어 준다.
  • docker start : 이미지에 저장된 시작 시 실행될 명령어를 컨테이너에 넣어 줌으로써 컨테이너를 실행한다.

docker stop vs docker kill

  • docker stop : 그동안 하고 있던 작업들을 완료하고 컨테이너를 중지시킨다.
  • docker kill : stop과 달리 그 즉시 컨테이너를 중지시킨다.

docker rm <아이디/이름> : 중지된 컨테이너를 삭제한다.
docker rm 'docker ps -a -q : 모든 컨테이너를 삭제한다.
docker rmi <이미지 ID> : 이미지를 삭제한다.
docker system prune : 한번에 컨테이너, 이미지, 네트워크 모두를 삭제한다(실행중인 것은 영향 x).


실행 중인 컨테이너에 명령어 전달

 이미 실행중인 컨테이너에 명령어를 전달할 때는 docker exec <컨테이너 id>를 사용한다.

☑️ 명령어

docker exec vs docker run

  • docker exec : 이미 실행 중인 컨테이너에 명령어 전달.
  • docker run : 새로 컨테이너를 만들어서 실행.

ex) redis를 통한 예제

 redis를 통해 exec 명령어에 대해 자세히 알아보도록 하겠다. redis는 아래 그림과 같이 먼저 redis server 실행 후 redis client를 통해서 server에 명령어를 전달해줘야 한다.

하지만 위와 같이 docker run redis를 통해 서버를 실행한 후 첫번째 터미널에서는 아무것도 할 수 없어서 다른 터미널을 통해 redis-cli를 입력했지만 인식을 못했다.

인식을 못 하는 이유는 아래와 같이 redis client가 redis server가 있는 컨테이너 밖에서 실행하려 하니 redis server에 접근할 수 없어서이다.

따라서 redis client도 컨테이너 안에서 실행을 시켜야한다. 앞서 살펴본 docker exec를 사용하면 redis 서버가 실행 중인 컨테이너에 redis client도 실행시킬 수 있다.

아래와 같이 정상적으로 redis client에 접속했음을 확인할 수 있다.

it : it를 붙여줘야 명령어를 실행한 후 계속해서 명령어를 적을 수 있다. it가 없으면 redis client만 키고 밖으로 나간다.

컨테이너를 쉘 환경으로 접근

 지금까지 실행 중인 컨테이너에 명령어를 전달할 때 docker exec -it <컨테이너 ID> 명령어 이런 식으로 커멘드를 하나하나 입력해야 했다. 이러한 번거로움을 해결하고자 컨테이너 안에 쉘이나 터미널 환경으로 접속할 수 있다.
docker exec -it <컨테이너 ID> sh : 컨테이너를 쉘 환경으로 접근

그다음 ls, touch new-file등 명령어를 자유롭게 사용하면 된다.

ctrl+d : 쉘 환경 빠져나오기.

profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글

관련 채용 정보