본문 바로가기
docker-kub

docker - 기본 명령어

by 오우지 2022. 10. 4.

기본명령어

docker ps

실행 중인 모든 컨테이너를 디폴트로 보여준다.

docker ps -a

더이상 실행되지 않는 중지된 컨테이너를 포함해 과거에 있었던 모든 컨테이너가 표시된다.

 

참고로 ps는 process status라고 한다.

docker ps --help

docker ps에 사용 가능한 모든 구성 옵션이 표시된다.

 

docker run을 이용하면 현재 이미지를 기반으로 컨테이너를 시작한다.

하지만 항상 새로운 이미지로 시작할 필요는 없다. 이미지가 변경되지 않은 경우 기존 컨테이너를 시작하면 되는데

바로 위에서 봤던 docker ps -a을 통해 히스토리를 보고 다시 실행할 컨테이너를 고른다.

여기서 

docker start peaceful_kalam

를 입력하면 기존의 컨테이너를 재시작 할 수 있다. 

docker start는 컨테이너를 재시작 시키고 현재 사용중인 터미널을 연결시키진 않는다. 

이전에 docker run을 이용하면 start로 실행했을때와 다르게 터미널이 막히는 git log를 찍었을 때와 비슷한 상태인 것을 확인할 수 있다.

 

이건 각각의 명령어의 디폴트 실행 설정이 다르기 때문인데

docker start의 경우 detached모드가 디폴트이고 docker run의 경우 attached 모드가 디폴트이다.

 

attached는 그 컨테이너의 출력결과를 수신한 다는 것을 의미하고 detached는 그 반대다.

 

코드로 보면 기존의 docker run을 다음과 같이 사용했다면

docker run -p 8000:80 720f449e5af2

여기에 -d를 입력해주는 것으로 detached 모드로 실행할 수 있다.

docker run -p 8000:80 -d 720f449e5af2

detached로 실행된 컨테이너를 다시 연결하기 위해서는 

docker container attach 컨테이너이름

입력해주면 된다.

그럼 위와 같이 또 다시 실행상태로 들어간다.

 

항상 터미널을 위와 같이 연결해둘 수는 없으니까 docker logs라는 명령어도 존재한다.

 

사용할 수 있는 명령어들은 다음과 같다.

docker logs -f dreamy_goldstine

요래 logs를 follow 하면 attach로 들어간다.

 

docker run의 디폴트가 attach라 -d를 사용했다면 docker start의 디폴트인 detach도 -a를 써주면 attach로 연결 가능하다.

여기까지 봤으면 까먹었을텐데 원래 run과 start의 차이는 attach, detach도 있지만 처음 시작과 재시작이다

 

 

 


인터렉티브 모드

웹 서버가 아닌 간단한 파이썬 파일을 통해 콘솔로 인풋을 넣어보자.

 

from random import randint

min_number = int(input('Please enter the min number: '))
max_number = int(input('Please enter the max number: '))

if (max_number < min_number): 
  print('Invalid input - shutting down...')
else:
  rnd_number = randint(min_number, max_number)
  print(rnd_number)

간단한 파이썬 파일로 input()을 받는다.

 

Dockerfile도 작성해보면

FROM python

WORKDIR /app

COPY . /app

CMD ["python", "rng.py"]

이렇게 작성할 수 있는데

실행해보면 안된다.

왜냐하면 도커의 기본 attached모드는 컨테이너와 인터렉트할 수 있는게 아닌 일방 통신일 뿐이다.

이때는 interactive모드를 사용할 수 있다.

-i를 입력해주면 표준 입력을 열린 상태로 유지하며 attached 모드가 아닐때도 무언가를 입력할 수 있고

-t를 입력해주면 suto TTY가 할당되는데 터미널이 할당되는 것을 의미한다.

 

이 두 명령어를 결함해서 실행하면 정상작동한다.

해당 컨테이너를 재시작해보자.

start는 기본적으로 detached이기 때문에 -a 옵션을 추가하면?

docker start -a

안된다.

 

예상 가능하긴 했다. 아까의 run도 default가 attached였기 때문에 이게 될라면 그것도 돼야 했다.

이것도 -i를 통해 interactive모드로 들어갈 수 있다.

 

docker start -a -i reverent_zhukovsky

이와 같이 도커는 일반적인 어플리케이션도 도커라이제이션 할 수 있다.

 


이미지/컨테이너 삭제, 검사, 파일 복사, 이름짓기

다시 기본 명령어로 돌아와서 이미지와 컨테이너를 삭제해보자

 

docker rm

remove를 나타내며 컨테이너를 삭제한다.

 

docker rmi image_ID

rmi는 이미지를 삭제한다.

 

이미지는 실행중인 컨테이너에서 사용중이면 삭제하지 못하고 중지되어야지만 제거할 수 있다.

docker image prune

사용하지 않는 모든 이미지를 한번에 삭제하는 명령어(prune: 가지치기)

 

--rm은 컨테이너가 종료될 때 자동으로 삭제되는 옵션이다.

docker run -p 3000:80 -d --rm 821b44b1c80d2d07620

다음과 같이 -d 로 detach, --rm으로 종료시 자동 삭제를 설정해주면

docker stop 후 docker ps -a을 해도 위의 컨테이너는 조회되지 않는다.

 

--rm은 웹 어플리케이션이 수정되었을 때를 상당히 많이 사용되는 플래그이기 때문에 기억하는게 편하다.

 

 

docker image inspect IMAGE_ID

입력하면 이미지에 대한 정보를 볼 수 있다.

정보에는 생성날짜, 컨테이너 구성, 포트, 환경변수, entry point, 운영체제, 레이어 정보 등이 나타난다.

 

실행중인 컨테이너 안에 파일이나 폴더를 복사해야 할 때가 있을 수도 있다.

docker cp dummy/. dreamy_goldstine:/test

cp는 copy, dummy/는 현재 내 파일 시스템의 경로를 의미하며 dreamy_goldstine은 실행중인 컨테이너 명 : 뒤쪽은 컨테이너 안의 경로를 의미한다.

 

반대로 컨테이너 안의 파일을 로컬로 복사할 수도 있는데

docker cp dreamy_goldstine:/test dummy

이렇게 적으면 로컬에서 지운 test.txt 파일이 도커 컨테이너 안에서 복사된 것을 확인할 수 있다.

 

물론 cp 명령어로는 현재 실행중인 컨테이너의 코드를 변경하기는 힘들지만 설정정보 정도는 변경할 수 있다.

그보다 컨테이너 안에 쌓이는 log 파일들을 로컬로 가져올 때 좀 더 유용하게 사용할 수 있다.

 

컨테이너 이름짓기

docker run -p 3000:80 -d --rm --name goalsapp 821b44b1c80d2d0762

컨테이너에 --name 명령어를 이용해 goalsapp이라고 지어줬다.

이러면 컨테이너를 내릴때마다 docker ps를 통해 임의의 이름을 지울 필요 없이 내가 지은 별명으로 컨테이너를 종료할 수 있다.

docker stop goalsapp

 

추가로 이렇게 쓰여진 Dockerfile이 있다면

FROM python:3

WORKDIR /app

COPY . /app

CMD ["python", "rng.py"]

이렇게 :콜론을 적으면 앞은 name, 뒤는 tag가 된다. 보다시피 버전을 명시할 수있다.

 

docker build -t goals:latest .

이미지를 빌드할 때 이렇게 적어주면 -t를 통해 태그를 지정할 수 있고

기본 옵션으로 진행한 이미지들과 차이가 있음을 알 수 있다.

 

이미지에 태그를 달아주면 같은 이미지의 버저닝이 가능해진다.