기본적인 도커 클라이언트 명령어 알아보기

Min·2021년 1월 15일
0

Docker

목록 보기
2/5
post-thumbnail

1. 도커 이미지 내부 파일 구조 보기

$ docker run alpine ls

1) Alpine 이미지를 이용해서 컨테이너를 생성된다.

2) 생성할때 Alpine 이미지 안에 들어있던 파일 스냅샷들(bin,, dev, etc 등)이
컨테이너안에 있는 하드 디스크로 다운로드 된다.

3) 이미지 이름 뒤에 다른 명령어를 더 붙여서 원래 이미지 안에 들어있는
기본 커맨드는 무시가 되고 ls 명령어가 실행된다.

ls 명령어가 실행 가능하려면?

이미지 파일 스냅샷 안에 이미 ls 사용 가능하게 하는 파일이 있다.
만약 파일이 없다면 excutable file not found라는 오류가 뜬다.

2. 컨테이너들 나열하기

1) 실행중인 컨테이너 나열

$ docker ps

실습

1) 2개의 Terminal을 작동시킨다.
2) 첫번째 Terminal에서 컨테이너 하나를 실행한다.
이때 컨테이너를 켰다가 바로 끄면 3)을 실행할 때
이밎 프로세스가 꺼져있기 때문에 리스트에서 볼 수 없다.
3) 두번째 Terminal에서 $ docker ps로 확인

이미지 설명

$ docker run Alpine ping localhost

CONTINER ID

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

IMAGE

컨테이너 생성시 사용한 도커 이미지

CREATE

컨테이너가 생성된 시간

STATUS

컨테이너의 상태.
실행중은 Up, 종료는 Exited, 일시정지 Pause.

PORTS

컨테이너가 개방한 포트와 호스트에 연결한 포트.
특별한 설정을 하지 않은 경우 출력되지 않는다.

NAMES

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

2) 원하는 항목만 보기


$ docker ps --format 'table{{.Names}}\table{{.Image}}

3) 모든 컨테이너 나열

꺼져있는 컨테이너도 확인 가능

$ docker ps -a

3. 도커 컨테이너의 생명주기

1) dokcer run

= Docker create <이미지 이름> + Docker start <컨테이너 아이디/이름>

docker create

파일 스냅샷을 컨테이너의 하드 디스크에 넣는다.
컨테이너 ID가 생성.
$ docker create <이미지 이름>

docker start

시작시 실행 될 명령어를 컨테이너에 넣는다.
$ docker start -a <컨테이너 아이디/이름>
-a 옵션 (attatch) : 컨테이너가 실행될때 붙어있어서 아웃풋들을 표출해주는 역할을 한다.

2) docker stop/kill

docker stop

docker kill

공통점

둘 다 실행중인 컨테이너를 중지시킨다.

차이점

1) Stop
부드럽게 그동안 하던 작업들을 (메시지를 보내고 있었다면 보내고 있던 메시지)
완료하고 컨테이너를 중지시킨다.

2) Kill
바로 컨테이너를 중지시킨다.

3) 컨테이너 삭제하기

중지된 컨테이너를 삭제

실행중인 컨테이너는 먼저 중지한 후에 삭제 가능
$ docker run <아이디/이름>

모든 컨테이너를 삭제

$ docker rm `docker ps -a p -q`

이미지 삭제

$ docker rmi <이미지 id>

한번에 사용하지 않은 컨테이너, 이미지, 네트워크 모두 삭제

$ docker system prune
도커를 쓰지 않을 때 모두 정리하고 싶을 때 사용해주면 좋다.
하지만 이것도 실행중인 컨테이너에는 영향을 주지 않는다.

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

$ docker exec <컨테이너 아이디>

1) 터미널 2개를 실행

2) 첫번째 터미널에서 컨테이너 하나를 실행
$ docker run alpine ping localhost

3) 두번째 터미널에서
컨테이너가 잘 작동하고 있는지 확인하고 아이디를 알아낸 후
$ docker ps

다른 명령어를 전달한다.
$ docker exec <컨테이너 아이디> ls

docker run vs docker exec

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

5. 레디스를 이용한 컨테이너 이해

레디스(Redis)

REDIS(REmote Dictionary Server)는 메모리 기반의 “키-값” 구조 데이터 관리 시스템이며,
모든 데이터를 메모리에 저장하고 조회하기에 빠른 Read, Write 속도를 보장하는
비 관계형 데이터베이스이다.
출처 링크


1) 첫번째 터미널 실행 후, 레디스 서버를 작동
$ docker run redis

2) 두번째 터미널 실행 후, 레디스 클라이언트를 작동
$ redis-cli

3) 에러 발생!!

오류


레디스 클라이언트가
레디스 서버가 있는 컨테이너 밖에서 실행을 하려고하여
레디스 서버에 접근할 수가 없다.

해결


레디스 클라이언트도 컨테이너 안에서 실행을 시켜야 한다.
redis 서버가 실행 중인 컨테이너이므로 exec를 통해 redis 클라이언트를 실행

1) 첫번째 터미널 실행 후, 레디스 서버를 작동
$ docker run redis

2) 두번째 터미널 실행 후, 레디스 클라이언트를 작동
$ docker exec -it <컨테이너 아이디> redis-cli

3) 오류 해결!!

-it 옵션

Interactive Terminal
옵션을 붙여줘야 명령어를 실행한 후 계속 명령어를 적을 수 있다.
-it가 없다면 redis-cli를 키기만 하고 밖으로 다시 나와버린다.

6. 실행 중인 컨테이너에서 터미널 생활 즐기기

문제

지금까지 실행중인 컨테이너에 명령어를 전달할 때는
$ docker exec -it <컨테이너 아이디> <명령어>와 같이
명령어를 계속 입력해야 했다.

해결

컨테이너 안에 쉘이나 터미널 환경으로 접속을 해줄 수 있는데,
마지막 명령어를 sh로 해주면 된다.
exec 대신 run을 사용하는 것도 가능하다.

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

1) 첫번째 터미널 실행 후, alpine 이미지를 이용해서 컨테이너를 실행
$ docker run alpine ping localhost

2) exec를 이용해 마지막 명령어 부분에 sh를 입력 후
컨테이너 안에서 터미널 환경을 구축
$ docker exec -it <컨테이너 아이디> sh

3) 그 안에서 여러가지 터미널에서 원래 할 수 있는 작동들을 해본다.
ex)

  • ls : 컨테이너 디렉토리에 있는 내용(디렉토리, 파일) 확인
  • touch new-file : 파일생성
  • export hello=hi echo $hello : 변수 생성 출력

4) 쉘을 빠져나올때는 Ctrl + D

profile
slowly but surely

0개의 댓글