DOCKER 개념 및 명령어

박선규's avatar
Jun 10, 2024
DOCKER 개념 및 명령어

도커 개념

도커 맥린 예시로 비유하기
맥린: 운수업자 (트럭) - 사업가
모든 물류가 모이는 곳이 항구인데 마진이 남지 않는다.
이유?
-입구앞에 트럭들이 많다.
notion image
차가 일주일 또는 4일 식 대기해서 마진이 남지 않는다
 
그래서 마진을 남기려고 생각 한 게 컨테이너 시스템을 생각 한건데
사람을 다 쳐내고 기중기를 설치해
트럭이 도착하면 기중기를 통해 컨테이너를 옮기니까 사람이 없어 인건비가 안든다.
 
이에 대해서 2가지 문제점이 있는데
  • 프로토콜
  • 사람들이 노조랑 싸우는거 대항
 
자기가 트럭회사를 직접 만든다
컨테이너에 맞게 트럭이 만들어지는 시스템을 구현했다.
그다음 문젭로 배가 컨테이너에 맞게 구현이 안돼있는데
이것을 해결하기 위해 배도 직접 만들었다.
 
이 모든 것들이 끝나니
트럭이 컨테이너를 운송하고 운송된 컨테이너가 기중기를 통해 배로 이동시키는 시스템이 구현이 됐다.
 
컨테이너: 인터페이스
 
여기서 문제 점이 있는데 다른 항구는 이 시스템이 적용이 안돼있어서 구축하다보니
미국 자체에서 시스템으로 만들어 줬다.
 
해외에서는 이 시스템이 안돼있기 때문에 여기서 포기하게 된다.
컨테이너를 인터페이스화 시키려는거였는데 포기.
 
이 시스템이 베트남 전쟁때 다시 수면 위로 떠올랐는데
전쟁 때 섬 하나에 배 를 통해 물자를 운송했는데 컨테이너가 없으니 배송 문제 때문에 음식이 썩는등 문제를 겪는다.
그래서 섬에 컨테이너 하나를 만든다.
 
프로그램도 똑같은게 우리는 앱을 만든다.
앱을 만들기 위해 셋팅 밀 설치해야 될게 많다.
도커가 없으면 앱 배포 및 세팅을 내가 다해야되는데
필요없이
앱에 만들어진거 자체를 구워버린다.
어떤 OS에도 돌아게끔 설정이 돼있다.
이유가 앱을 가상화를 시켜 그 위에 OS도 얹어놓으니 어디에서도 가능
앱을 이미지만 구워서 이 이미지 자체를 던지면 다 돌아간다.
  • 앱을 컨테이너로 패키징: Docker는 애플리케이션과 그에 필요한 모든 라이브러리, 의존성 등을 하나의 이미지로 패키징합니다. 이를 통해 환경 설정과 설치를 쉽게 할 수 있습니다.
  • 이미지(Image): Docker 이미지란 컨테이너를 실행하기 위한 모든 파일과 설정을 포함하는 읽기 전용 템플릿입니다. 이미지를 이용해 컨테이너를 생성하고 실행합니다.
  • 컨테이너(Container): Docker 컨테이너는 이미지에서 생성된 실행 가능한 인스턴스입니다. 애플리케이션 코드, 라이브러리, 환경 변수, 설정 파일 등을 포함하며, 어느 환경에서도 동일하게 실행됩니다.
  • 이식성(Portability): Docker 컨테이너는 애플리케이션을 가상화하여 어떤 운영체제에서도 실행될 수 있도록 합니다. 이를 통해 개발 환경과 운영 환경의 일관성을 유지할 수 있습니다.
  • 가상화(Virtualization): Docker는 OS 레벨 가상화를 사용하여 컨테이너를 격리된 환경에서 실행합니다. 이는 기존의 하드웨어 가상화와 달리 더 가볍고 빠릅니다.
 

OS의 구성요소

  • 커널+명령어로 구성 돼있다.
    • 커널:운옝체제의 핵심이 되는 컴퓨터 프로그램
더 구체적으로 알고 싶으면 운영체제를 공부 해야 된다.
notion image
여기까지가 우리영역 운영 소프트웨어 개발자.
여기까지가 우리영역 운영 소프트웨어 개발자.
 

도커 가상화

  • OS안에서 일어난다.
notion image
윈도우 위에 리눅스를 띄우고 싶다면
리눅스를 가상화 시켜 윈도우에 올리면
앱으로 인식이 된다.(VM으로 감싸져있어서)
notion image
 
최종 구조는 이렇게 된다.
최종 구조는 이렇게 된다.
도커의 핵심 콘셉트는 '커널을 공유'하는 거다. 이를 통해, 다른 운영 체제의 명령어를 도커가 자동으로 해당 운영 체제의 명령어로 변환하여 처리할 수 있다. 예를 들어, 리눅스 명령어는 도커에 의해 윈도우 OS 명령어로 변환되어 처리된다. 이 과정은 도커가 자동으로 수행하여 사용자는 이에 대해 신경 쓸 필요가 없다.
 
 
 
 

명령 순서

notion image
명령 받는 순서
응용프로그램 → 커널 → 도커서버 → 컨테이너
도커 서버에서 컨테이너로 넘어갈 때 컨테이너 언어에 맞게 알아서 도커 서버가 치환해준다.
 
 

내가 할일

컨테이너 만들기
도커 명령어만 배우면 도커서버가 컨테이너를 만들어낸다.
notion image
 

컨테이너 내부

내가 만드는 컨테이너의  OS에서 커널은 빠져있다.
내가 만드는 컨테이너의 OS에서 커널은 빠져있다.
 

커널 공유 예시

  • 회사의 사장님은 호스트 시스템(물리적인 서버)이며, 이 시스템은 리눅스 커널을 가지고 있습니다.
  • 두 부장은 각각의 가상 머신(컨테이너)으로, 이들은 호스트 시스템의 리눅스 커널을 공유합니다.
  • 각 부장은 자신의 역할에 특화되어 있습니다. 하나는 상품 판매를 담당하고, 다른 하나는 구매를 담당합니다.
  • 두 부장은 커널을 공유함으로써 하나의 물리적인 시스템에서 각자의 역할을 독립적으로 수행할 수 있습니다.
  • 신입 직원은 부장의 지시에 따라 각자의 업무를 수행하며, 이들은 부장의 관리 아래에서 작업을 진행합니다.
 

도커 명령어

도커 문서

notion image
 

명령어 :dcoker pull (도커 허브)

초록색 없으면
초록색 없으면
notion image
-포트번호 : 버전 - 하면 다운됨
 
 
notion image
폴더를 만드는 명령어
 
notion image
이 폴더 깃으로 관리하기
notion image
다운된다.
 
 

명령어 :dcoker imgages (이미지 목록보기)

리눅스 명령어로 깃에서 명령 내릴 수 있음
리눅스 명령어로 깃에서 명령 내릴 수 있음
이미지 아이디는 해쉬로 구성 돼있다.
이미지 아이디는 해쉬로 구성 돼있다.
 

명령어 :dcoker run (이미지 명)

이렇게 실행하하면 안됨
notion image
실행 됐다가 바로 꺼짐
 
 
윈도우에 앱을 하나 설치를 했는데
이 앱이 hellow word한번 출력하고 끝나는 앱이면
계속 돌리려면 wile이도는 프로그램이 내장 돼있어야한다.
마찬가지로 이미지도 데몬인 이미지를 실행해야된다.
이 이미지는 서버가 되야되는데
 
결론: 내부에 프로세스가 데몬으로 돌아야 꺼지지 않는다.
 
모든 os에 계속 돌고 있는 게 shell 명령 대기이다.
 
내부에 없는 것은 터미널로 열면된다.
터미널로 열면 사용자 명령 대기 상태가 되기 때문이다.
프로세스가 블락 당한다.
 
터미널로 대기 상태 만들기
 
 

명령어 :dcoker run -it (이미지명) bash {터미널 모드로 열기}

notion image
터미널 모드로 접근 하고 싶을 때 -it를 붙인다.
 

명령어 :dcoker ps (실행중인지 확인)

notion image
컨테이너 아이디:
이미지 :프로세스 명
bash:
포트:null인 이유는 포트 포워딩 하기 때문이다.
OS의포트로 보내기때문이다.
 
 
 
notion image
notion image
exit하고 다시 docker켜져 있는지 확인하면 꺼져있다
 
 

명령어 :docker run -dit ubuntu bash (백그라운드 실행)

notion image
 

명령어 :attacah (실행중인 컨테이너 접속)

notion image
컨테이너 아이디 (해시)의 4자리
 

명령어 :exec (실행중인 컨테이너에 명령어를 변경해서 접속)

notion image
이거는 이렇게 문법만 알기 왜 하는지 지금 이해 x
 
 
notion image
도커 허브에서 컨테이너로 만들거 찾으면 됨
 
notion image
notion image
런을 하면 풀안하고 다운받아도됨
 
모든 이미지는 디폴트 커멘드가 있다.
os위에 프로세스가 있어야 되기때문에
도커 이미지는 무조건 프로세스 위에 구워진다.
 
용량이 커지는 이유는 어플리케이션이 하나가 더 얹어져서 다운받기 대문이다.
notion image
 
 
모든 이미지에는 디폴트 커맨드가 있는데
커맨드를 변경해서 실행중인 컨테이너에 접근학 싶으면 exec 사용
ps -ef : 실행중인 프로세스 확인 가능
notion image
 
# Docker 기본 명령어 리스트 # 1. 이미지 관리 docker pull [이미지 이름] # Docker Hub에서 이미지를 다운로드합니다. docker images # 로컬에 저장된 모든 이미지를 나열합니다. docker rmi [이미지 ID] # 로컬에서 이미지를 삭제합니다. # 2. 컨테이너 관리 docker run [옵션] [이미지 이름] # 새로운 컨테이너를 생성하고 실행합니다. docker ps # 실행 중인 컨테이너 목록을 나열합니다. docker ps -a # 모든 컨테이너 목록을 나열합니다. docker start [컨테이너 ID] # 중지된 컨테이너를 시작합니다. docker stop [컨테이너 ID] # 실행 중인 컨테이너를 중지합니다. docker restart [컨테이너 ID] # 컨테이너를 재시작합니다. docker rm [컨테이너 ID] # 컨테이너를 삭제합니다. docker exec -it [컨테이너 ID] bash # 실행 중인 컨테이너 내부에 접근하여 bash 셸을 실행합니다. # 3. 네트워크 관리 docker network ls # Docker 네트워크 목록을 나열합니다. docker network create [네트워크 이름] # 새로운 네트워크를 생성합니다. docker network rm [네트워크 이름] # 네트워크를 삭제합니다. # 4. 볼륨 관리 docker volume ls # Docker 볼륨 목록을 나열합니다. docker volume create [볼륨 이름] # 새로운 볼륨을 생성합니다. docker volume rm [볼륨 이름] # 볼륨을 삭제합니다. # 5. Dockerfile 및 빌드 docker build -t [이미지 이름] . # Dockerfile을 사용하여 이미지를 빌드합니다. # 6. 컨테이너 로그 docker logs [컨테이너 ID] # 컨테이너의 로그를 출력합니다. docker logs -f [컨테이너 ID] # 컨테이너의 로그를 실시간으로 출력합니다. # 7. Docker 정보 docker info # Docker 시스템 정보를 출력합니다. docker version # Docker 버전 정보를 출력합니다. # 8. 이미지 및 컨테이너 저장 및 로드 docker save -o [파일명.tar] [이미지 이름] # 이미지를 파일로 저장합니다. docker load -i [파일명.tar] # 파일에서 이미지를 불러옵니다. docker export [컨테이너 ID] -o [파일명.tar] # 컨테이너 파일 시스템을 파일로 내보냅니다. docker import [파일명.tar] # 파일에서 컨테이너 파일 시스템을 가져옵니다. # 9. 기타 유용한 명령어 docker inspect [컨테이너 ID/이미지 이름] # 컨테이너 또는 이미지의 상세 정보를 출력합니다. docker diff [컨테이너 ID] # 컨테이너 파일 시스템의 변경 사항을 나열합니다.

포트 포워딩

도커 입장에서는 내 컴퓨터가 게이트웨이다.
 
notion image
notion image
외부에서는 10.5.5.5르 보고 찾아간다.
외부에서는 10.5.5.5르 보고 찾아간다.
 
notion image
notion image
 
포트 포워딩 테이블도 있다.
 
내부 사설 IP 만들려고하는데
notion image
첫번재 컴퓨터 안에 우분투 두개가 있고 톰켓이 두개가 있으면
 
1번은 다 게이트웨이?
 
서브넷마스크:톰
 
도커는 나중에 프로세스에 이름을 부여 할 수있다.
그래서 이름으로 찾을 수 있다.
 
Share article

p4rksk