[Docker] 2. 도커 명령어

김주희's avatar
Jul 29, 2025
[Docker] 2. 도커 명령어

시작 전

  • 컨테이너를 삭제해야 이미지를 삭제할 수 있다.
  • 이미지는 무조건 도커 허브에서 들고 온다.
  • 허브에 올라가 있는 이미지 내부에는 프로그램이 설치되어있다.
    • 즉, 플랫폼이 세팅되어있다 (PaaS)
    • 예를 들어 리눅스만 설치되는 게 아니라 리눅스 안에 필요한 애플리케이션도 다 기본으로 세팅되어있는 이미지를 다운받을 수 있다.
    • 톰캣을 다운받으면 OS도 같이 받아진다
      • 왜? OS 없이 톰캣은 실행될 수 없으니까
 
톰캣을 세팅하고 싶으면 리눅스를 받아서 톰캣을 직접 세팅하는 것이 아니라 이미 톰캣이 세팅된걸 받아서 사용한다. 그러고 나서 내가 세팅을 다 하고 잘 만들어진 배포 서버가 세팅이 되면 이걸 이미지로 구워서 내 허브에 올려두고 사용하면 된다.
 
💡
터미널에 복사 붙여넣기 Ctrl + C → Shift + insert
 

도커 허브에서 이미지 찾기

notion image
 

1. 이미지 다운로드

이미지를 로컬 컴퓨터에 다운받기
docker pull tomcat:jre21-temurin-noble
notion image
 

2. 이미지 검색

다운받은 이미지 확인하기
docker images
notion image
  • Repository : 도커 허브에 등록된 이미지 이름
  • Tag : 이걸 만든 회사 이름 OR 버전 (버전이 안적혀 있으면 최신 버전임)
  • Image ID : 이미지를 식별하는, 일종의 이미지 PK 역할을 이미지를 해시한 해시값
  • CREATED : 이미지가 만들어진 시점 (언제 출시된 이미지인지)
  • SIZE : 이미지의 크기
    • OS가 들어있는거 치곤 439MB는 매우 가벼운 것.
    • 즉, 바이너리랑 라이브러리만 존재
    • 실제 커널은 윈도우의 리눅스 하위 시스템을 사용한다.
 
이미지를 다운받았지만 아직 실행하지 않았으므로 프로세스가 아니다.
 

3. 이미지 실행하기

run이 되면 전부 컨테이너로 바뀌고 배 위에 뜬다. 배가 움직이라는 실행이라면 배에 컨테이너를 띄우기만 하면 실행이 된다. 컨테이너로 만드는 이유는 프로그램과 OS를 패키징해서 한번에 올려야 하기 때문이다.
docker run → 도커 엔진한테 컨테이너 실행 명령을 내린다. -it 터미널 모드를 좀 열어줘! 이미지명 → 이걸 프로세스화 시킨다. bash (우분투를 실행시킬건데, 그 우분투 안에서 어떤 프로그램을 실행시켜줄까?)
docker run -it 이미지(이미지ID) command
 
notion image
  • 외부 컴퓨터(N) → 내 컴퓨터(host, 윈도우)의 5000번 포트로 연결
    • → TCP 연결이 성립됨 (바이트 스트림 흐름 시작)
  • 내 컴퓨터의 방화벽이 5000번 포트를 열어둬야 외부 연결 가능
  • 그런데 도커 컨테이너는 호스트 OS 안에서 실행되는 가상 환경(Linux 기반 OS)
  • 즉, 외부에서 들어오는 요청은 직접 컨테이너에 도달할 수 없음!
    • → 먼저 호스트 OS가 연결을 받아야 하고,
      → 그다음 도커가 호스트 OS 내부에서 실행 중인 컨테이너로 포워딩해줘야 함
 
 
  • host 컴퓨터 = 윈도우
  • 윈도우는 외부로부터 보호를 위해 방화벽으로 감싸져 있음
  • 방화벽 = 기본적으로 모든 포트를 차단
  • 외부에서 다른 네트워크가 달려있는 컴퓨터와 내 컴퓨터를 연결할 때 무조건 호스트 컴퓨터에 연결되고 도커에 연결 불가능하다.
    • 외부에서 들어올 때 선이 연결됨 ⇒ Byte Stream
  • 호스트 시스템에서 연결되기를 원하는 포트를 열어줘야 함
  • 예시) 윈도우 시스템에서 5000번을 열었음 → 방화벽에 5000번 문이 열림 → 5000번 문이 선(바이트 스트림)으로 연결됨 → 호스트 컴퓨터는 자신과 연결된 컨테이너에 연결하고자 함
 
 
 
 
 
command 자리에 bash를 입력시
  • -it
    • -i : interactive, 표준 입력을 열어두겠다는 의미 (입력 받기 가능)
    • -t : tty : 가상 터미널을 할당하여 쉘처럼 보이게 함
    • 터미널에서 직접 컨테이너와 상호작용
 
  • -dit
    • -it는 동일
    • -d : 백그라운드에서 실행
 
command 자리에 bash : 터미널을 열긴 열건데 무슨 쉘로 열거야? bash
 
돌려달라는 명령어를 실행시키고 바로 꺼진다.
bash는 터미널의 커서가 깜빡거리고 있으면(스캐너 모드로 들어가줘) 내가 우분투가 떠있느데 interaction모드
할게없네? → 컨테이너 종료
-it는 접속할 수 잇는 선을 만들어달라는거고
-it로 들어갔느데 bash 실행시키면 터미널에 글자 적을수 있는 모드가 실행됨
리스너가 깜빡거리면서 사용자 입력을 기다리고 있는거임 bash를 실ㅇ행시키면 무한(데몬인거임)
 
dit로 실행
우분투 뜨면 내가 아닌 백그라운드 스레드가 들어가서 띄움 나는 내 터미널을 보고 있는거지 리눅스 터미널을 보는게 아님
 
notion image
 
ctrl + c를 하게 되면 포그래운드에서 싱행중ㄴ던
notion image
 
 

4. 실행중인 컨테이너 확인하기

docker ps
notion image
 
  • 컨테이너 아이디 : 실행중인 프로세스 id
  • command : 실행된 것 → bash가 실행된거임
 
호스트에게 8080요청하면 어쩌라고 모드
내부에서 8080요청하면 톰캣
 
빠져나오기
exit
notion image
 

5. 명령어 넣어서 실행하기

컨테이너를 띄울때 실행중인 명령어가 데몬이어야 컨테이너가 계속 떠있는다.
bash는 데몬이니까 사용자 입력 받기 대기중이므로 (= 스캐너의 while 도는 것과 같다.)
echo hello 명령어는 hello를 화면에 띄우고 종료되므로 컨테이너도 종료된다.
docker run -it tomcat echo hello
notion image
 
아무런 실행 명령어는 없지만 백그라운드로 실행해라
docker run -dit tomcat
notion image
 
 
💡
모든 이미지는 기본 커맨드를 가진다.
notion image
 
우분투에 jdk 설치된 상태
javac hello.java 파일 (컴파일된 클래스 파일)
누군가 이미지를 실행했을때 디폴트 커맨드를 java hello라고 잡아둔다.
 
우분투 -> jdk21설치 -> Hello.java javac Hello.java -> Hello.class -> 굽기 전에 기본 cmd 설정 -> java Hello -> 이미지 구웠음 아이디/jh (이미지 이름 jh) docker pull 아이디/jh docker run -it 아이디/jh -> java Hello라는 커맨드가 실행되고 종료됨 dit가 아니더라도 내부에서 도는 프로세스가 데몬이면 (while이 걸려있는 프로그램) docker run -it 아이디/jh echo good 기존 cmd가 오버라이드 돼서 무효화되고 echo good이 실행된다.
 
node 서버를 내려 받음 (javascript run타임 환경 = node) -> 우분투가 들어있고 node가 설치되어있는 이미지 다운 -> run
 
 

7. 컨테이너 종료

docker stop 컨테이너ID4자리
notion image
 

2. 도커로 띄워진 모든 프로세스를 보여준다.

docker ps -a
  • -a : all 옵션
notion image
 

8. 컨테이너 삭제

docker rm 컨테이너ID
notion image
 

9. 종료된 컨테이너 삭제 (컨테이너 한번에 삭제)

q : 컨테이너 아이디만 보여줌
docker ps -aq
notion image
 
docker rm $(docker ps -aq)
$() : 명령어 치환, return값을 리다이렉션해서 가져온것?
notion image
 

5. 이미지 삭제

docker rmi 이미지/이미지ID
 
한꺼번에 삭제
docker rmi $(docker images -q)
notion image
 
 

호스트 컴퓨터의 localhost:8888을 때리면
 
컨테이너마다 8080 떠있는건 상관 없음(방화벽을 OS마다 가지니까)

10. 포트포워딩

docker run -dit -p 8888:8080 tomcat
톰캣을 띄울거면 톰캣이 어떤 포트번호로 뜨는지는 알아야 사용 가능(tomcat → 8080
notion image
 
요청
1.식별자 요청
2.파일로 요청
→ localhost:8080은 식별자 요청,파일로 요청 둘다 X 입구 요청O (서버에 처음으로 들어오는 요청, 즉 클라이언트가 애플리케이션에 접근하기 위한 최초의 진입점이 되는 요청)
notion image
 

bash모드로 치환해서 들어갈거임 근데 이미 실행중인 거에 들어갈거임!! (attach와 exec??)

11. 실행중인 컨테이너 접속하기

1. attach

💡
커맨드를 봐야됨!! 기존 이미지가 마음에 안드니까 내부에 들어가는건데 그러면 커맨드가 뭔지가 중요
예를 들어 스프링을 실행하면 로그 뜨고 거기서 ctrl+c하면 종료되는 것처럼 지금 로그만
기본 cmd가 bash였으면 입력 대기로 깜빡거리는 상태였을 것
docker attach 컨테이너ID
notion image
 
Ctrl + C ⇒ 인터럽트
빠져나온게 아니라 실행중인걸 끄고 튕겨나온 것
notion image
 
들어가서 작업하고 싶으면 기본 커맨드가 뭔지 정확하게 봐야됨
 

2. exec

커맨드를 변경해서 접속하는 명령어
 
notion image
 
그러나 기존 ps의 커맨드가 변경되지는 않는다.
exec를 쓰는 경우는 bash로 접속하는 경우 이외에는 잘 쓰지 않는다.
notion image
 

인덱스 파일 만들기
현재 폴더 = /user/local/tomcat
webapps = 웹서버 폴더
notion image
 
dist ⇒ 최종적으로 빌드될 수 있도록 결과물
 
웹서버 폴더 변경할 수 잇음
notion image
 
cp /usr/local/tomcat/webapps.dist/ROOT/bg-upper.png /usr/local/tomcat/webapps/hello.png
 
 
컨테이너는 종료되면 상태를 다 잃는다. = 종료되면 내가 세팅한 것들 전부 날라감 (영구히 보관하고 싶으면 볼륨이라는걸 알아야함)
이 상태로 이미지 굽고 싶으면 컨테이너가 종료되면 안된다.
→ 다른 터미널을 열어서 거기에서 이미지를 구워야 한다.
 

이미지 굽는 방법

docker commit 컨테이너ID 도커허브아이디/생성할이미지이름:태그
 
sha256:523255d2b1e695a1d591551e45a020389847d325134decccb863a2d966eca11c
notion image
아이디를 걸어저 이미지를 만들면 자동으로 인증이 된다.
 

도커 허브에 올리기

도커 허브에 올리기 위해서는 로그인 먼저 해야한다.
notion image
 
docker push 도커허브아이디/생성할이미지이름:태그
notion image
 
notion image
notion image
00:02 그냥 하얀 거 할게요 혹시 이거 제일 괜찮은 거 없드나 그래보니까 밝지 없지 어두운 거는 쓰면 딱 좋은데 보이지가 않을 것 같아서 그런데 여기 있는 거 하나도 못쓰는데 색깔이 다 노랗고 있는데, 따로는 안 보여드렸는데 이거는 잘 보여 어논하면은 혹시 제일 뒤에 이걸로 갈게 도커 이미지스라고 하면 어제 받은 통캣이 하나 있을 거예요. 01:27 확인했어. 도커 이미지스 그 다음에 조커 ps 해봐요. 이제 도커 명령업에 있는 거예요. 버퍼 ps 하니까 뜨는 거 있어요. 여기 아무것도 없죠 그럼 이렇게 한번 더 줘봐봐 지금 아직 미우는 거 아니야. 02:13 지금 찌꺼기 남아있는지 확인하려고 버퍼 ps 마이너스 a 너 있지 찌꺼기거든. 죽어있는 컨테이너야 종료된 컨테이너 얘 좀 지우고 깔끔하게 시작할게 일단은 지금은 지우는 명령어를 아직 안 외울 거거든. 기본부터 배워야 되니까. 그래서 데스크톱의 방정 불량 지금부터 딱 잘 배우잖아. 그리고 도퍼를 자유자재로 가를 수가 있어 딱 일주일만 배운다 3시간씩 그러면 어차피 나중에 해야 되는 거 한 번만 더 잘 배워두면 또 배우고 나면 별거 아니거든요. 배우기 전이 어려울 겁니다. 03:19 켰어 이거 내가 켜면 봐봐 여기 이미지 있지 통쾌 9.0 이미지 가볼래 있어요. 그러면 이미지를 잡아서 딜리트 해줘요 그러면 뭐라고 뜰 거냐면 딜리트 더 컨테이너 된 유징 이렇게 뜨잖아. 컨테이너가 지금 살아있다는 거거든. 요걸 이제 죽여야 돼 그래서 이제 여기 보면 컨테이너스 가볼래 이 이미지가 보이나 컨테이너가 근데 여기 지금 세모 버튼이 안 눌려져 있지 그러니까 죽어있잖아. 지금 종료 상태 얘를 다시 눌러도 스타트 할 수 있거든. 그럼 명령 불러도 되잖아. 04:15 얘를 잡아서 쓰레기통에서 버릴게 컨테이너를 항상 삭제해야 이미지를 삭제할 수 있어 일단 이렇게 삭제할게 다 잘 되죠. 완전 제일 기본 명령으로 뽑혀있는 거예요. 일단 첫 번째로는 우리가 이미지라는 거를 가져와요. 이거 어디서 둔 거냐면 무조건 국가 허브에 있어요. 05:15 이미지 그럼 이제 이 이미지를 들고 와서 이 이미지를 실행시킬 건데 그 이미지 안에 어떤 애들은 홈페이지 설치돼 있고 어떤 애들은 뭐 파이썬이 설치돼 있고 프로그램들이 다 설치돼 있는 것들을 우리가 받을 수 있거든. 그 말은 뭐랑 똑같은 거냐면 플랫폼이 세팅이 딱 돼 있다는 거야. 그냥 리눅스만 딱 설치한다는 게 아니라 리눅스 안에 필요한 애플리케이션도 다 기본으로 세팅이 딱 돼 있는 이미지를 다운 받을 수 있어요. 그래서 이거는 우리 그때도 마찬가지로 나만 할게 왜냐하면, 같이 들어가면 막히니까 나중에 한번 들어가봐요. 여기 들어가면 포커 허브거든. 나중에는 내 이미지로 이렇게 만들 수도 있어 이건 내 거거든. 06:13 개인 레파지토리에 개인 이미지들을 구워낼 수 있어 내가 원하는 것들을 제일 처음에 그거는 우분투를 좀 써볼 것 같아요. 우분투 내가 아마 우분투라고 검색을 하면 여기 우분투 오피셜 이미지가 뜨잖아요. 보이나요? 얘를 클릭을 하면 뭐라고 뜨냐면 제일 오른쪽에 우분투를 다운받는 방법이 있어 이게 풀이에요. 풀 제일 처음 배웠어요. 풀 일단 이미지를 다운 받아야 돼 내 로컬 컴퓨터 근데 이제 이런 우분투 말고 어디 있냐면 톰캣이라고 검색을 하잖아. 그러면 얘도 있잖아요. 통캣 그럼 이 통켓을 다운 받는다는 거는 뭐도 같이 받는다는 걸까요? 당연히 os를 같이 받는다는 거야. 이해를 os 없이 통켓이 돌아갈 수가 없잖아. 07:15 그럼 나중에 받을 때는 내가 만약에 통켓을 세팅하고 싶잖아. 그러면 우분수를 받아서 내가 직접 통켓을 세팅할까 통켓이 세팅되는 걸 그냥 받을까? 당연하지 그리고 나중에 어떻게 하면 되냐면 내가 세팅을 다 하잖아. 너무 잘 만들어진 배포 서버를 딱 세팅했잖아. 이미지로 그럼 그걸 부어버리거든. 그래서 내 허브에 넣어놨다가 이걸 쓰는 거야. 나중에 그러면 그냥 내려받으면 세팅 끝이거든. 그때 우리 기억나잖아. 스크립트는 다 작성했잖아. 뭐 세팅하려고 세팅된 이미지를 그냥 부어버리는거 같아요. 엄청나게 편한거잖아. 그럴 것 같지 않아 음 그래서 우리 일단 1번에도 뭐 해볼거냐면 일단은 문투를 다운받아서 안에 세팅하는 것부터 먼저 한번 해볼거야. 08:06 기본적으로 해보자 어 무분처럼 한다. 통캣을 자 여기 통캣을 보면 클릭하면 이렇게 다운로드 받는 게 나오잖아. 얘를 복사해서 줄일게요 슬랩으로 얘를 지원할게요 그래서 첫 번째 명령어는 다운로드예요. 나는 이렇게 넣어볼게 이미지 다운로드 어차피 gpt로 치면 이런 건 다 나오잖아. 나와도 정리해야 돼 그리고 이거를 터미널에 넣을 때는 컨트롤 v 하면 안 돼요. 08:55 시프트 인서트 해야 돼 그래야지 잘 들어간다 시프트 인서트 기억해 컨트롤 c 그 다음에 시프트 인서트 이거 먼저 해볼게 제일 처음에 이미지를 다운받는 거를 배우겠습니다. 시프트 인서트 엔터 이게 이미지 다운로드예요. 09:45 자 그 다음에 다운받은 거를 확인하는 명령어 도커 이미지스야 이건 치고 로션 앱니다. 도커 이미지스 자 두 번째 배운 명령어는 이미지 검사 그리고 정리할 때는 이렇게만 해놓는 것보다 있잖아. 맞지 이걸 캡쳐해서 같이 넣어주는 게 이런 식으로 당연히 좋겠죠. 이런 식으로 컨트롤 씨 컨트롤보다는 이렇게 쏙 들어가잖아. 나중에 볼 때도 좋거든. 10:34 됐지 자 그러면 이제 요 이미지가 하나 있는데, 여기 하나하나씩 볼 때 제일 위에 보니까 레파지토리스라고 보이죠. 레파지토리가 톰캣 여기 옆에 태그가 있잖아요. 태그 태그는 보통 두 가지를 표현하는데 하나는 이걸 만든 회사 이름 두 번째는 버전 보통 버전이 안 적혀 있으면 다 최신 버전 버전형 붙어있으니까 보통 붙어 있으면 땡땡 아무튼 붙어있을 거고, 땡땡 안 붙어있으니까 최신 버전 그 다음에 여기 이미지 아이디라고 있잖아. 얘는 해시값이에요. 11:33 이미지를 해시합니다. 얘가 그래서 고유 프라이머리티라고 부른다 그 다음에는 크레이티드라고 적혀있는데, 이게 3위크 어버라고 돼 있지만 3주 전에 출시된 이미지를 합니다. 3주 전에 우리가 만든 이미지가 아니라 해물이 나요? 3주 전 마지막으로, 사이즈 몇 메가예요. 439메가 os가 439메가면 진짜 가벼운 거예요. 몇 개가 되거든요. 원래 그러니까 여기에 뭐밖에 없다는 건 바이너리랑 라이브러리밖에 없다는 거야. 실제 커널은 뭘 쓰는데 우리 윈도우에 리눅스 하이 시스템을 쓴다고 그렇게 기억해야 돼요. 12:26 실제 커널은 윈도우에 리눅스 하이 시스템 자 그러면 받았으니까 실행을 해야 되거든. 실행 이 이미지는 아직 프로세스가 아니야. 실행해야 되겠죠. 실행하는 방법 도커 런 얘가 이제 실행렬이 나와요. 그러면 이제 런이 되면 다 컨테이너로 바뀌거든. 배 위에 뜬다고 오케이 배가 움직이는 실행이라면 이렇게 막 컨테이 이렇게 배가 움직이고 있잖아. 여기 띄우기만 하면 실행되거든. 13:27 컨테이너로 만들어서 띄워 왜 컨테이너로 만든다고 하냐면 프로그램만 얹히는 게 아니니까 뭐랑 같이 얹히니까 os랑 같이 얹히니까 os랑 패키징해서 그 안에 프로그램까지 다 집어넣어서 올리거든요. 그래서 이걸 컨테이너라고 해요. 근데 이제 런을 할 때는 옵션이 있어요. 주민이 안된다. 주민이 안된다. 여기 옵션에 옵션에 한 칸 튀기고 마이너스를 한 칸 붙이고요. it라고 하면 it 이걸 interaction이라는 옵션이라고 해요. 14:25 터미널을 인터랙션 한다고 해서 두 가지 약어인데 그냥 쉽게 얘기해서 it를 그냥 무조건 붙여서 쓰거든. 인터랙션 무슨 뜻인지 이해해야 되거든. 그림 한 번만 보고 갈게 아니면 그냥 아무 생각 없이 적으니까 잘 봐 잘 봐 지금 호스트 컴퓨터가 있잖아. 우리 컴퓨터에요. 이 호스트를 이제 뭐라고 생각해야 되냐고요. 우리 컴퓨터 윈도우라고 생각하면 돼 자 윈도우고 윈도우는 무조건 뭐로 감싸져 있냐면 외부로부터 보호하기 위해서 방화벽으로 이렇게 감싸져 있어요. 방화벽 그러면 방화벽으로 감싸져 있는데, 얘를 방화벽이라고 해요. 15:16 파이어월 들어봤죠 근데 이제 이 방화벽이 이렇게 있으면 이 방화벽은 기본적으로 모든 포트를 막아 모든 포트를 그 말은 이 말이거든. 봐봐 무슨 말이냐면 외부에서 다른 어떤 네트워크가 달려있는 컴퓨터랑 내 컴퓨터를 연결할 때는 호스트 컴퓨터 연결하는 거예요. 무조건 도커에 연결 못해 그러면 외부에서 들어올 때 선이 이렇게 딱 그어지면서 이렇게 연결되거든. 이렇게 여기까지는 알 거야. 맞죠. 이 선을 이름 뭐라고 한다고 바이트 스트림 바이트가 흘러가는 스트링이야 실제로는 1010 10 10 이게 8개가 모여서 하나의 바이트를 이루거든. 그래서 한 바이트씩 날려요 문자 하나씩 날릴 때 방화 이 방화벽에 맞거든. 16:17 왜 막냐면 모든 포트가 막혀 있으니까 그러면 윈도우에서 어떻게 해야 되냐면 호스트 시스템에서 요거 연결되는 원하는 포트는 열어줘야 돼요. 예를 들어서 내가 윈도우 시스템에서 5천 번 포트를 열었다고 할게 이거 5천 번 포트를 열었다는 건 방화벽에 5천 번 문이 하나 열린 거야. 그럼 5천 번 문으로 선이 이렇게 다 연결되는 거예요. 만약에 포트가 배방이 안 됐으면 연결이 안 돼 끝까지 이해됐지 어 자 그러면 잘 봐 나는 지금 이 호스트 컴퓨터에서 어디에 연결할 거냐면 이 호스트가 연결해주면 컨테이너 연결할 거거든. 컨테이너 이 호스트 내부를 자세히 보면 컨테이너를 띄울 수 있어요. 이제부터 이런식으로 기억나요? 17:13 호스트 컴퓨터는 잘 봐 그때 그림이랑 기억해야 된다. 이 호스트 컴퓨터는 컨테이너한테 바로 명령을 안 내려 누구한테 내려요 도커 엔진한테 내려 도커엔진 그치 독화 엔진한테 내리고 독화 엔진이 얘를 만들어 준다든지 얘를 삭제한다든지 생성의 체계 어떻게 보면 뭐라고 생각하면 되냐면 db로 치면 ddl이라고 생각합니다. ddl 크레이트하고 뷰오파브 이런 거 있잖아. 이걸 제어를 하거든. 얘를 통해서 이렇게 이해돼 근데 봐봐 이제 제어를 할 때 얘가 얘한테 뭘 때렸는데 런을 때릴 거잖아. 18:04 런 실행이라고 죽어있는 이미지 하나를 컨테이너 올리라 런을 할 거지 런을 하면 얘는 떠 맞죠. 뜨겠죠. 중요한 건 얘는 떴는데 얘랑 얘랑 얘가 이 방에서 놀고 싶어요. 얘가 이 안에서 놀고 싶다고 접속해서 다시 뭐라고 얘가 이 안에서 놀고 싶다고 이 컨테이너도 하나의 os 세상이잖아. 맞지 그래서 런할 때 어떻게 하냐면 얘가 런을 할 때 이렇게 런을 날릴 때 마이너스 it 옵션을 붙이잖아. 그러면 이게 인터랙션이거든. 인터랙션이 되면 이게 되는 거야. 18:56 이 컨테이너랑 이 호스트랑 선이 연결돼 그럼 내가 이제 뭐 할 수 있는 거야. 다이렉트로 여기 접속돼 가지고 있는 것처럼 해서 얘한테 명령을 해 달릴 수 있다. 그러니까 터미널 접속 모드를 위해서 이 옵션을 쓰는 거야. 아이티를 안 쓰면 우리가 터미널로 접속 모드 이 리눅스예요. 그래서 내가 우분들을 딱 띄우면서 내부가 궁금하잖아. 그럼 it를 붙이는 거야. 내부가 안 궁금해 그냥 실행만 할 거야. 그러면 it 안 붙여도 돼 근데 어떻게 실행하든 it는 그냥 무조건 붙여요. 그냥 왜냐하면, 내부에 접속할 일이 분명히 한 번은 생길 거거든. 19:49 그 말 무슨 말인지 알겠어 나중에 포트를 안에 본다든지 뭐가 안녕 안에서 서버가 돌고 있는데, 뻗었잖아. 그럼 들어가서 봐야 될 거 아니에요. 그래서 아이템을 열어놓고 실행하는 게 좋아 안 열어놓으면 이게 없으니까 평생 어떻게 되느냐 못 들어가는 거야. 됐어 그래서 내 턱을 통로를 만드는 거야. 무슨 모드로 터미널 알려줬다 it 어 근데 여기서 이제 중요한 옵션이 하나 더 있어 잘 봐 그게 뭐냐면 d거든. d 붙여볼래 d 아 지금 붙이지는 마요 여러분들 일단 it로 먼저 할게 d를 붙이잖아. 아이를 붙였을 때 it를 그냥 붙였을 때랑 d를 붙였을 때는 달라요. 아마 호스트에서 런을 하면서 it를 붙이잖아. 20:49 그럼 어떻게 되냐면 얘가 얘를 띄우지 근데 얘가 여기 바로 접속을 해버려 4그라운드 모드로 그냥 바로 접속해버리거든. 터미널로 근데 만약에 d를 붙이잖아. 그럼 백그라운드 그러니까 데몬 실제로 뜯은 레몬인데 그냥 백그라운드라고 생각하면 돼요. 백그라운드로 얘를 띄워버려서 인터랙션 모드까지 얘가 지금 터미널에서 포그라운드로 지금 보고 있잖아. 예술 애들 다 터미널을 보고 있을 때 지금 봐봐 여러분들 지금 파워실 자체가 터미널이지 그걸 포그라운드로 보고 있는 거거든. 뒤에서 돌고 있는 거 아니잖아. 여러분들 킨 거잖아. 내 눈으로 보고 있지 그래서 dit로 딱 키잖아. 그냥 it가 아니라 그냥 it로 튀면 내 터미널이 어디로 바뀌어 그 안으로 바뀌어버리고 바로 접속을 해버려서 did로 하면 얘가 백그라운드로 진행되거든. 터미널이 그럼 터미널은 눈에 안 보이는 거야. 21:49 그러니까 여기서 지금 보고 있는 터미널은 어딘데 원래 자기가 보고 있는 걸 그대로 보고 있는 거고, 얘는 백그라운드로 돌고 있기 때문에 나중에 다시 접속이야 터미널로 근데 열려 있으니까 접속이 되는 거지 it를 안 붙이면 열려있지도 않으니까 접속이 안돼 백그라운드로 실행하냐? 4그라운드로 실행하냐? 이건 무슨 말이랑 똑같은 거냐면 우리가 서버를 딱 실행할 때 있잖아. 터미널에서 내가 딱 실행했는데 막 로그가 막 뜨잖아. 내가 뭘 제어할 수 없잖아. 이게 forground야 근데 내가 뭔가 다운로드 같은 걸 눌리거나 서버를 딱 실행했는데 이게 안 뜨잖아. 터미널에 내가 글자 쓸 수 있게 돼 있잖아. 그러면 이게 백그라운로드 일단 자 그래서 일단은 우리 it로만 할게 it 시간 항상 띄우고 이미지 이름을 넣어야 돼 그러면 이제 두 가지가 다 돼요. 22:49 이 톤캣이라는 걸 적어도 되고요. 혹은 이미지 아이디를 적어도 일반적으로는 이 이름은 컨테이너를 실행시킬 때 이미지 아이디는 크게 중요하지 않거든요. 됐어 이걸 이미지의 이름이라고 한다. 그 다음에 마지막에 뭘 정해줘야 되냐면 마지막에 터미널을 열든 열 건데 무슨 첼롯이를 할 거야. 이렇게 물어보는 마지막 자리가 나는 메시로 했다. 어느 정도냐 메시 그때 cell이라는 걸 개념이 안 잡히면 이런 건 전혀 이해를 못 하더라고요. 23:48 터미널 구조로 들어갈 건데 무슨 cell을 쓸 거다 메쉬를 쓸 거다 엔터 잡아요. 그리고 이거 넣어놔 옆에 정리해 놔야 돼 그리고 이거 삭제했다가 이제 백그라운드로 실행해 볼게 바로 접속해서 배쉬 모드로 뜬 거야. 24:21 바로 리눅스로 접속이 됐죠 맞아 여기서 정리하자 여기까지 다 봐 도커런은 누구한테 명령을 내리는 거예요. 도커 엔진 그래서 도커 봐봐 이렇게 좀 정리해봐 아직 완벽하게 이해 못하는데 계속 하다 보면 점점 익숙해지면서 내부가 보이거든. 도커넘 이건 누구한테 도커 엔진한테 크레이트 실행명령을 내립니다. 컨테이너 실행명령 맞죠. 25:18 그 다음에 이제 마이너스 it는 뭐냐면 터미널 모드를 좀 열어놔라입니다. 터미널 모드를 좀 그래야지 이제 스프리밍이 연결된다고 터미널 모드의 스트리밍 그 다음에 마지막에는 이미지명을 넣죠 이걸 프로세스화 시키는 거죠. 마지막에 배쉬는 정확하게 얘기해줄게 마지막 배쉬는 이게 제일 중요하거든. 26:04 이 대시는 뭐냐면 우분투를 실행을 시킬 건데 그 오븐투 안에서 어떤 프로그램을 실행시켜줄까 라는 거거든. 애쉬를 실행시켜줘라는 거야. 근데 이렇게 할 수도 있어 나중에 여기다가 애쉬하면 무조건 어떻게 할 통일 수 있냐면 여기다가 결국 이게 커맨드거든. 커맨드라고 하는데 여기에다가 이렇게 적을 수도 있어요. 자바 하나 그리고 자르 스프링 점 자르 제일 끝에 뭐가 들어간 건데 스프링 실행 명령어가 들어간 거잖아. 26:53 그 오드가 딱 열리면서 걔가 실행이 돼 마지막에 이게 커맨드야 니가 리눅스를 딱 띄웠는데 그 리눅스 뿌리고 나서 무슨 명령어를 내가 실행시켜 줄까 만약에 배씨를 안 적잖아. 그럼 오브 온트를 띄웠는데 아무런 명령어를 실행시켜 달라고 안 했잖아요. 그럼 바로 어떻게 되냐면 꺼져버린 거야. 바로 어떻게 된다고 꺼져버린 거야. 돌고 있는 게 없기 때문에 니가 돌려달라는 명령어를 내가 돌려줄게 근데 다 돌면 꺼져요 이거 진짜 중요한 거다 아니면 난 멘탈 터져 사실 얘기해 주세요. 마지막에 적혀있는 이 명령어 이걸 실행시키고 바로 꺼진다고 근데 배쉬 같은 건 있잖아. 잘 들어 배쉬는 터미널에 커서가 깜빡깜빡거리고 있잖아. 우리 시스템 안전 프린터링이랑 스캐너 같은 거랑 똑같은 거거든. 스캐너 모드로 지금 들어가지고 이 말이거든. 27:46 깜빡깜빡거리고 있지 커서가 커저가 깜빡깜빡거리고 있다는 건 뭐냐면 내가 지금 접속했지 내 봐봐 여기 보험소가 떴어 떴지 근데 여기 들어가고 싶은데 인터랙션 모드가 안 돼있으면 못 들어가거든. 그래서 터미널 모드가 지금 이게 스트린이 연결돼 있잖아요. 나는 들어갈 수 있어 안에 들어갔어 들어가서 제일 끝에 benc가 안 적혀 있잖아. 그럼 난 뭐해 라고 그러는 거거든. 할 게 없네 그럼 나와요. 그럼 컨테이너 그냥 종료돼 자 그 다음 봐봐 내가 it로 들어간다 들어왔지 들어왔는데 왜 잘 봐 들어왔는데 애쉬라고 적잖아. 대쉬를 실행시키잖아. 내가 해시 딱 실행시키면 뭐가 되냐면 이런 것들처럼 터미널에서 글자를 적을 수 있는 모드가 실행되는 거거든요. 28:38 it는 그 모드가 실행되는 게 아니라 그 모드로 접속할 수 있는 이걸 만들어 나가는 거고, 그럼 내가 모드로 접속하면 무조건 어떻게 되냐면 커서 막 깜빡깜빡거려요 깜빡깜빡거리고 있지 않아요. 여러분 화면 보면 맞죠. 그 깜빡깜빡거리고 있는 게 뭐 하는 거냐면 사용자 입력을 대기하고 있는 건데 와인을 돌면서 뭐 한다고 리스머가 와인을 돌면서 사용자의 입력을 대기하고 있는 거라고 그러니까 사용자 입력을 대기하고 있으니까 죽을 수가 없는 거야. 그래서 무한이야 레몬이 된거야. lc를 실행 시킬 거야. 29:19 자 그럼 이렇게 될 수도 있어 봐봐 내가 5분들을 실행시킬 건데 마이너스 2 아이템을 실행해 dit 그럼 어떻게 되냐면 잘 봐 내가 지금 numdit 실행했지 로봇도 떴지 떴어 근데 내가 아닌 액그라운드 스레드가 내가 아닌 다른 스레드가 들어가서 뛰어와 그럼 나는 뭘 보고 있는데, 지금 내 터미널을 보지 미국집 터미널을 안 봅니다. 이해돼요. 너무 어렵나 스레드라는 건 아니잖아. 분신 내가 지금 내가 눈으로 보고 있는 화면이 도커런 이런 걸 적었을 거 아니에요. 명령어를 엔터 딱 치잖아. 그러면 무분투가 뜨거든. 30:06 뜨는데 내가 들어가는 게 아니라 다른 백그라운드 서비스가 들어간다고 그럼 내 눈에는 뭐가 보이냐면 그냥 내 터미널 화면이 그대로 보이는 거지 윈도우에 이 터미널 화면이 안 보인다고 그것까지 실수를 할 거예요. 자 들어왔으면 지금 여기서 봐봐 들어왔지 창을 하나 더 열어 위에 마우스 여기서 마우스 클릭해봐 분할 탭이라고 있거든. 파워실에 아니면 cmd 창을 하나 더 열면 돼요. 하나 더 열어 볼래 이런 식으로 그러면 새로운 스레드가 다 뜬 거야. 얘를 작업하는 스레드 얘를 작업하는 스레드는 다른 거예요. 무슨 말인지 알죠 여기도 글자 적을 수 있고 여기도 동시에 적을 수 있잖아요. 다 스레드예요. 31:02 스레드 자 여기서 도퍼 ps라고 해봐 돌고 있을 거예요. 그쵸. 어 그러면 4번 뭐라고 적어요. 31:21 실행 중인 컨테이너 확인하기 자 해보니까 여기 뜨는 거 보여 어떻게 뜨는지 조커 ps 자 봐봐 컴퓨터는 아이디가 하나 생겼지 얘가 이제 실행 중인 프로세스 아이디야 컸잖아. 돌고 있어 근데 여기 봐봐 끝에 커맨드라고 적혀있잖아. 얘가 제일 좋더라고. 32:12 얘를 잘 봐라고 캡쳐나 하고 얘기해주고 배쉬가 제공돼 아직 잘 이해 못할 수 있는데, 예제를 두 개만 더 읽으면 이게 이해가 갈 거예요. 이게 제일 중요해 이게 파악이 안 되면 나중에 제대로 못 써야 됩니다. 그리고 여기 봐봐 포트는 내부적으로 8080이 돌고 있다는 거야. 내부에 근데 여기 접속할 수 있는 방법은 없어요. 왜냐하면, 외부에서 접속하려면 호스트 시스템으로 들어와야 되잖아. 호스트에는 8080이 안 열렸거든. 8080 오면 어째라고 하는 거야. 33:05 얘한테 바로 8080 요청하면 뭐가 되겠지만, 이해돼 내부 사설 아이피의 세상은 따로 있어 이쪽에 이거 나중에 알려줄게 이쪽 네트워크 내 나중에 알려줄게 그럼 봐봐 여기서 여기서 exit 해봐 왼쪽 화면에서 실행 중인 컨테이너에서 빠져나오기 맞죠. 2x it 엔터 빠져나오죠. 그럼 오른쪽에서 도커 px를 다시 해보면 종료됐어 맞지 그럼 내가 재밌는 거 한번 해도 되게 보기만 해 보기만 해요. 내가 이번에는 이렇게 적어볼 거야. 34:01 도커 런 마이너스 아이티 톰텔 그 다음에 끝에 뭐라고 적어있더냐 에코 헬로 뭐라고 적었어 끝에 에코 헬로를 적었잖아. 커맨드를 잡고 다니고 엔터친다 헬로우가 딱 찍히고 끝나죠. 봐봐 터미널이 열려있어도 내가 터미널로 접속했어. 안했어. 안 했어. 난 배쉬를 실행시키라고 한 게 아니니까 그럼 잠깐 후보트가 딱 꺼졌다 내가 이렇게 하는 거야. 자 봐 내가 도커런 했지 마이너스 it로 터미널을 연결했어. 터미널 그 통신선만 연결한 거야. 자 연결하고 나서 톰캣이라고 적었으니까 이 폼켓 컨테이너가 떴겠지 뜨는데 내가 안으로 들어와 왜냐하면, 백그라운드를 실행한 게 아니니까 들어왔지 그리고 내가 에코 에코는 뭔지 cs 아웃이잖아. 34:58 에코 해가지고 헬로우 하고 화면을 찍었지 그리고 나서 할 게 없잖아. 나오는 거야. 그러니까 컨테이너를 실행한다고 계속 떠 있지 않는다고 이 명령어만 실행하면 끝이라고 근데 여기서 그러면 이게 중요한 거야. 이 명령어가 보여야지만 컨테이너는 계속 돌아와 대문 열려 이게 핵심입니다. 내가 지금 이번 시간에 여러분한테 가르쳐주고 싶은 게 이거예요. 컨테이너를 띄울 때 실행 중인 명령어가 대문이어야지만 컨테이너는 죽지 않고 계속되는 거예요. 이게 되게 중요해요. 베이씨는 왜 안 죽을까? 베이씨는 대문이거든. 110 프로그램이 딱 실행되잖아요. 그러면 사용자 입력 대기를 받잖아. 35:49 이거는 스캐너에서 y 돌고 있는 거랑 똑같은 거라고 입력 받고 y 돌아서 다시 내려가고 뭔지 알죠 대문성 배씨를 그렇게 생각해야 돼요. 스캐너에 y 도는 거 이해돼 다음 시간에는 해몽으로 실행해보죠.
Share article

jay0628