Docker - 기본 명령어 (2)

FromCloud·2023년 6월 18일
0

Kubernetes & Docker

목록 보기
4/12

inspect

도커 이미지를 다운받았고나서 자세한 내용을 보기 위해서 사용하는 명령어 이다 실행중인 컨테이너에서 물론 확인을 하고 싶으면 확인이 가능하다

docker inpsect <images_name>


이렇게 httpd(apache)와 관련된 자세한 내용들을 확인할 수 있다

run

도커허브에서 가져온 이미지를 실행하기 위한 명령어 이다
원래 도커의 lifecycle을 보면 create -> start 이러한 방법과 run 하는 방법이 두가지가 있는데
run 명령어는 create + start를 같이 한다고 생각하면 된다

docker run <option> --name <name> <images>

<option>에 들어갈 수 있는 -i -t -d 가 있다
1. -i: 대화형 콘솔로 통신을 한다는 의미이다
2. -t: tty
3. -d: 서비스 데몬을 실행한다는 의미

service(httpd, nginx, mysql...등)를 실행 할때는 -d 옵션을 붙여줘야하고
sh(nginx,centos,ubuntu)를 실행 시켜준다면 -it 옵션을 붙여 run을 해줘야 한다는점 참고하면 좋을거같다

--name은 꼭 붙여서 run을 해주기를 권장한다 name옵션을 사용하지 않으면 랜덤으로 NAMES가 들어가지는데 복잡할 뿐더러 매번 확인해줘야하는 불상사가 생긴다


docker run -it --name h1 httpd

위 사진과 같이 run 해줘야하는 image가 service인데 -it 옵션을 사용하면 현재 서비스의 상태가 Exited 즉 정상적으로 실행되지 않고있는 것을 확인할 수 있다

docker run -d --name h2 httpd
docker ps -a를 하고 보면 정상적으로 Up 으로 되어있는 모습을 볼 수 있다

만약 실행해야하는 images가 service인지 sh인지 모르겠다면 그냥 -itd 모든 옵션을 다주면 실행도 정상적으로 될것이다


이번엔 sh을 실행해볼 것인데 여기서 주의해야 할점도 있으니 잘 봐주세요~

docker run -it --name c1 centos:7

처음 images를 가져올때 centos:7 태그를 붙여서 가져온점 참고 해주세요
이번엔 centos:7 을 실행할 때 -it 옵션을 주어 실행을 하였습니다 run은 정상적으로 되었지만 프롬르트가 바뀐 모습을 보실 수 있습니다.
sh을 실행 시킬때 -it옵션만 주게 된다면 run과 동시에 sh에 진입을 하게 됩니다 바로 작업을 해야한다면 이렇게 실행을 시키면 되지만 단지 그냥 실행만 시키면 된다면 -itd옵션을 주면 실행을 정상적으로 되고 진입도 하지 않는 모습을 보실 수 있습니다

주의!!
sh에 진입하고 작업을 끝마치고 다시 나가고 싶어 exit를 치게 된다면 컨테이너가 중지됨과 동시에 나가게 될것입니다
sh에서 나갈때는 ctrl+q+p를 쳐서 나가면 정상적으로 sh에서 나갈 수 있으니 참고하시면됩니다!

docker run -d --name c2 centos

분명 처음 제가 가져온 images 파일은 centos:7이었습니다 태그명을 지정해 주었죠,
하지만 실행할때 -d 옵션을 붙여 centos를 실행하면 도커는 태그명이 지정되어있지 않아 centos의 최신버전(latest)가 로컬 이미지 파일에 있는지 확인을 하고 없으면 다운을 받고 실행을 하게 됩니다!!! 하지만 실행도 Exited가 떠있는것을 보아하니 정상실행이 되지 않앗습니다

centos:7을 다운받앗는데 또 centos:latest가 받아진다면 헷갈릴 뿐더러 작업해야할때 필요하지 않은 것이 다운이 되었기때문에 문제가 생길수가 있다는점 이러한 불상사가 생기지 않도록 주의 하셔야 합니다

그래서 -itd 옵션을 사용하고 추후에 실행을 시켜볼 수 있는 exec, attach가 있습니다

ps

docker ps 현재 실행중인 컨테이너를 확인 할 수 있는 명령어

ps 를 하게 되면 현재 실행중인 컨테이너만 확인이 가능하고 실행중이지 않은 컨테이너는 확인이 불가능한 것을 보실 수 있습니다

ps -a 옵션을 붙여 실행중이지 않은 컨테이너 모두를 확인 할 수 있습니다

또 한가지 응용해서 명령어를 입력한다면

docker ps -aq
-q 옵션을 더 붙여주면 Container ID 만 표출이 되게 하실 수 있습니다
실행중인 컨테이너를 삭제 할때 요긴하게 쓰일것이니 알아두면 좋습니다

rm

이미지를 지우는 명령어는 rmi 였습니다 실행중인 컨테이너를 지우기 위해선 rm을 사용하시면 됩니다

docker rm -f<NAMES or CONTAINER ID>

CONTAINER ID를 쓰기엔 너무 길고 복잡하고, NAMES를 쓰면 편하지만 만약 100대의 서비스나 sh을 돌리고 있다면?? 하나하나 지우는데 시간이 더 오래걸릴것입니다
-f 옵션을 실행중인 컨테이너를 강제적으로 종료하고 삭제하는 명령어 입니다

여러 컨테이너를 삭제할 때 유용하게 사용할 수 있는 명령어가 있습니다

docker rm -f $(docker ps -aq)
docker ps -qa 에서 나오는 출력값을 인식하여 실행중인 컨테이너를 삭제 해주는 명령어 입니다
이 명령어 하나면 한번에 실행중인 컨테이너를 다 삭제가 가능하게 할 수 있습니다

exec, attach

컨테이너를 실행한 후exec,attach 명령어를 입력하면 접속을 다시 하여 작업을 할 수 있다
sh에 접속 할때에는 보통 attach service에 접속 할때는 exec를 사용한다

우선 docker attach <NAMES> 를 이용하여 alpine에 접속을 할 것이다

이렇게 attach를 이용하여 접속을 하면 간단하게 접속을 할 수 있다 하지만 나가야할땐
꼭~!~~ctrl+q+p를 이용하여 나가야 한다 exit로 나가면 실행중인 컨테이너가 중지 될 수 있으니 주의 해야한다

물론 exec 명령어를 사용하여 접속 하는 방법도 있다 a1(alpine)에서 예를 들어 설명하겠다

docker exec -it a1 /bin/sh

attach 를 사용했을때와 동일하게 접속이 된 모습을 확인할 수 있다 한가지 차이점이 있다고 하면 접속을 나갈때 exit를 사용해도 컨테이너가 중지가 안되고 정상적으로 나갈수 있다는 점이다!!

마지막 /bin/sh 는 cmd를 실행 시켜주는 것인데 alpine은 bash셸을 지원하지 않기 때문에 sh로 접속을 한것이고 centos나 ubuntu 같은 경우는 bash셸을 지원하기 때문에 마지막에 /bin/bash를 적어주면 정상적으로 접속이 가능하다

이는 sh뿐만 아니라 service에서도 마찬가지이다
docker exec -it h1 /bin/bash

hash 셸에서 exec 로 접속을 하여 경로나 파일 들을 확인할 수 있고 curl을 통해서 정상 작동하는지도 확인을 할 수 있다

service에서 접속을 할때는 exec로는 접속이 가능하지만 attach로는 접속이 가능해도 아무 작업을 하지 못한다

그 이유는 httpd는 cmd가 httpd-foreground 로 프로세스를 점유하고 있어 접속을 하면 들어가서 아무것도 동작이나 작동을 하지 않기 때문에 접속을 해제하기 위해선 ctrl+c로 접속을 해제해야하는데 그렇데 되면 데몬 또한 종료되는 불상사가 생기니 왠만하면 exec로 접속하는 것을 추천한다

profile
매일 발전하는 Cloud Engineer

0개의 댓글