도커 정리 06-11

김하은·2023년 6월 10일
0

docker build . 로 최적화된 이미지가 만들어져 그것은 하나의 컴퓨터가 된다.
즉, 명령어를 적은 Dockerfile을 전부 빌드시에 실행하면서 최적화를 거친 컴퓨터에서, docker run [이미지 아이디]을 하면 마지막에 RUN 또는 CMD 부분이 실행되는 것이다!!

CMD명령어는 마지막에 한번만 사용할 수 있다.
Run이라는 명령어는 여러번 사용이 가능하다.
이렇기에 Run까지는 최적화 과정에 들어가게되고,(즉 build에 포함이 되어 미리 실행되는 명령어) 이미지가 만들어지게 된다.

docker images 로 이미지들을 볼 수 있는데, 이때 이미지 아이디를 볼 수 있고, docker run [이미지아이디] 하면 build명령어로 이미 만들어져있는 이미지 즉, 컴퓨터가 하나 열리게 된다.
그리고 여기서 CMD부분이 실행된다.


실행중인 컴퓨터 보기

docker ps

해당 컴퓨터 들어가기

docker exec -it [컨테이너 아이디]

=> 해당 컨테이너에 접속하거나 변경할 수 있게 해줘~

docker exec -it [컨테이너 아이디] /bin/bash

=> 해당 컨테이너에 bash쉘(터미널 의미)을 실행시켜줘
여기서 bin은 실행파일을 의미 ,
다시말해 실행파일에 bash쉘을 실행시켜줘!!

그러면 바로 쉘이 변경된다. WORKDIR로 설정한 폴더에 위치한 쉘로..

해당 쉘을 종료하려면 exit를 , 실행한 docker 컨테이너를 종료하려면

docker stop [컨테이너아이디]

지금 CMD(커멘드)명령어가 종료되지 않는 명령어이기에 지금 컨테이너는 자동으로 종료되지 않는다.

앞서서 node로 실행하는 파일을 커멘드 명령어를 사용해 실행하도록 했을 경우에는 실행되고, 바로 종료되었으나, 지금 dev에 설정한 nodemon으로 실행하는 경우에는 끄기 전까지는 실행되는 것이기 때문!!!

컨테이너 종료를 원하지 않는다면 마지막 CMD명령은 24시간 실행되는것으로 설정!!


지금 yarn dev를 docker를 통해 서버를 켜주었음에도 해당 포트를 통해 api요청을하면 접속되지 않는다.

왜???

=> 당연한 말이라고도 할 수 있지만, 지금은 도커안에 서버가 열린것이다.
즉, 도커 안에서 express가 실행중인것이다.
따라서 브라우저에서 해당 서버를 찾으려고 해도 밖에 있는것이 아니라 도커에 있으니 찾을 수가 없는것.

포트포워딩!

: 포트를 전달해 준다.
도커 컨테이너에 포트포워딩을 연결해준다.

=> 들어오는 포트와 나가는 포트 설정 가능(원하는 포트를 설정).
요청하는 포트가 들어오는 포트, 그리고 실제 도커에서 실행중인 포트가 나가는 포트.

브라우저(또는 포스트맨) 3000번 포트로 요청 => 도커컨테이너에서 포트포워딩 (어? 3000번으로 들어왔네.. 보자 나가는 포트는 3000번!) => 실제 도커에서 실행되고 있는 3000번 포트로 가서 데이터 받아 reponse를 줌.

도커를 실행할때 포트 포워딩을 붙여주면 된다.

docker run -p 도커로 들어오는 포트:내보낼 포트 [이미지 아이디]

docker run -p 8000:3000 [이미지 아이디]

=> 8000번으로 들어오는 포트를 3000번으로 내보내주자
이런식으로 작성한다.
여기서 -p는 포트의 약자이다.

docker ps로 확인할 수 있다

포트 포워딩을 하기전 :

포트 포워딩을 한 후:

PORTS라는것이 추가된 것을 볼 수 있음
0.0.0.0 => 누구든지를 의미
(나만 접속 가능하게 => 주소: localhost
=== ip주소:127.0.0.1)

=>도커밖에서 8000번으로 들어오는 포트를 도커 안에서 3000번으로 넘겨줄게!!
지금 도커안에 express 벡엔드 서버가 3000번으로 실행되고 있기때문.

==> http://localhost:8000/엔드포인트 => 이렇게 접속을 시도하면 포트포워딩에 의해 도커내 실행되고있는 3000번 포트로 설정된 서버에 접속이 가능해진다.

이렇게 8000으로 접속했더니 도커안의 3000번 express서버가 응답해

이렇게 응답결과를 받아올 수 있었다.

다시 한번 언급하지만, 이 3000번 포트나 8000번 포트 등은 다른 포트로 변경이 가능하다. 포트포워딩시 정해준 포트번호를 적어주면 된다.


다시 정리

ps는 프로세스를 의미

docker container종료(중지)

docker stop [containerId]

중지된것 포함 모든 container보기

docker ps -a

-a는 all이라는 의미
특정한 것을 지우고 싶으면

docker rm [해당containerId]

복수개를 지우고 싶다면

docker rm [해당containerId],[해당containerId]

중지 container전부 지우고 싶다면

docker ps -a -q

=> 중지된 container의 id만 뽑혀나옴.
이것을 활용

docker rm docker ps -a -q

docker rm하고 docker ps -a -q는 벡틱(``)을 사용해 감싸주면 감싸여진 것을 리눅스 명령어로 인식하여 중지된 container의 모든 id를 가져오게되고 이것들이 전부 지워지게 된다.

rm은 remove의 약자

그렇지만 container를 지웠다고 해서 이미지까지 지워지지는 않았다.

도커 이미지보기

docker images

도커 container를 지울때에는 docker rm, 도커 이미지를 지울때에는 docker rmi

도커 이미지 하나만 지울때

docker rmi [이미지 id]

마찬가지로 도커 이미지를 지우기 위해서 이미지 아이디만 뽑을 수 있는 명령어가 있다.

docker images -a -q

이미지 전부 지우기

docker rmi docker images -a -q

docker images -a -q 이부분 역시 벡틱으로 감싸 명령어임을 인식하게 해준다.


모든 시스템 정리

docker system prune -a

  • 모든 stop된(중지된) 컨테이너 지움
  • 모든 네트워크설정 없어짐
  • 이미지 지움
  • 캐시 지움....

Docker-Compose

-> 도커를 여러개 실행했을때 하나로 묶어주는 도구!!


0개의 댓글