상세 컨텐츠

본문 제목

[4차시/15기 김제성] Docker-1

본문

https://www.udemy.com/course/learn-docker/learn/lecture/7894024?start=705#questions 강의를 기반으로 작성하였습니다.


도커 필요성

  • compatibility, dependency : 각기 백엔드, 프런트엔드, DB에서 필요로 하는 라이브러리나 OS가 각기 상이 → 코드를 더 빨리 전달하고 리소스 사용률을 높여 비용 절감
  • long setup time : 개발자들 간의 개발 환경 통일하는데 어려움, 운영 표준화
  • 개발자는 도커를 사용함으로써 모든 곳에서 실행할 수 있는 경량의, 쉽게 적용 시킬 수 있는 자립형 컨테이너형 애플리케이션을 손쉽게 빌드, 패키징, 제공, 실행할 수 있음

도커로 할 수 있는 일

  • containerize application : 소프트웨어를 컨테이너 라는 표준화된 유닛으로 패키징하고, 컨테이너 안에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 것들이 들어가 있음
  • run each service with its own dependencies in separate containers

containers

: isolated environments but share same OS kernel

: 사용자 공간을 추상화하여 격리된 공간에서 경량의 OS 수준의 가상화를 제공

: 호스트 시스템의 커널을 다른 컨테이너와 공유 (영구적 X, 이미지로 부터 생성 and 삭제)

 

virtual machine vs docker

VM

  • 하나의 서버를 여러 서버로 나누어놓은 가상환경
  • 각 VM은 OS 복사본과 어플리케이션 및 기타 필요한 모든 바이너리 파일들과 라이브러리들을 모두 포함 → 용량 크고 부팅 시간 오래 걸림 (매번 각기 커널 자원 할당, 게스트 OS 부팅)

docker

  • 게스트OS가 깔리지 않아서 자원의 효율성을 얻을 수 있음
  • 애플리케이션 구동하는데 필요한 모든 패키지(=image)만 있으면 컨테이너 구동 가능
  • 하나의 커널을 통해서 공유하고 있기 때문에 호스트 시스템에서도 컨테이너 내부 프로세스를 볼 수 있다

 

 

도커 → 리눅스 커널을 활용, 기반!

윈도우, mac은 별도의 virtual machine 필요 (그림 상에서 docker engine이 여기에 해당_ 리눅스 환경으로 변환해줌)

 

https://hoon93.tistory.com/41

https://velog.io/@kdaeyeop/도커-Docker-와-VM의-차이

 

 


Docker Commands

▶run : container를 생성. 만약에 해당 image가 존재하지 않으면 자동으로 docker hub에서 pull해와서 컨테이너 생성

▶ps : 작동중인 모든 container 표시해줌 ( -a 를 추가하면 종료되었던 이전 컨테이너도 모두 보여줌)

▶images : 설치된 images 나열

▶rmi : image 삭제 (해당 image와 관련된 컨테이너는 미리 꼭 삭제해두어야 함)

 

 💡 docker run ubuntu 을 실행시키고 docker ps 를 확인해보면 실행중인 container가 없음을 확인할 수 있다.
⇒ container는 os의 host가 되는 것이 아니라 구체적인 task나 process를 수행하는 역할이기 때문에 컨테이너는 process가 진행되는 도중에만 실질적으로 실행이 된다

Docker Run

▶Run - tag

: 내가 원하는 이미지의 특정 버전으로 run 하고자 할 때

docker hub에서 해당 image의 버전들을 확인하고

run command 옆에 별도의 버전을 표기해준다

 

 

▶Run - detatch

docker run ubuntu sleep 15 우분투에게 ‘ sleep 15’라는 명령을 다음과 같이 주게 되면 15초 동안 어떠한 작업도 현재 창에서 진행할 수 없게 된다

 

그리고 다른 콘솔 창에서 docker ps를 확인해보면 해당 container가 실행중임을 확인할 수 있다.

해당 컨테이너의 실행을 멈추고 싶다면 다른 콘솔 창에서 docker stop [container name] 을 입력하면 된다

 

 

이런 번거로움을 방지하고자 background에서 컨테이너의 command가 수행될 수 있게 하는 명령어가 -d (detatch)이다.

background에서 진행되는 프로세스를 다시 foreground로 불러내기 위해서는 docker attatch [container]를 입력해주면 된다 (그러면 다시 아까처럼 프로세스 끝날 때까지 내가 조절할 수 없다)

 

실행중인 컨테이너의 로그를 확인하기 위해선 docker logs [container]를 활용하면 된다.

 

 

▶Run - standart input

디폴트로 도커 컨테이너는 인풋을 받지 않아 별도의 옵션을 적용해줘야 함 (non interactive mode)

interactive mode

 

 

▶Run - PORT mapping

웹 브라우저에서 웹 서버에 접속하기 위해서

(웹 브라우저 - 도커 호스트) & (도커 호스트 - 도커 컨테이너)

이렇게 두 개의 출입문 즉 포트 번호를 명시해주어야 한다

이 때 쓸수 있는 옵션 명령어가 -p (publish)이다

-p [호스트 포트번호] : [컨테이너 포트 번호]

각 컨테이너들의 정보들은 docker inspect [container]를 통해 확인할 수 있다. 여기서 컨테이너들의 ip주소도 확인 가능

 

 

 

 

 

jenkins란?

소프트웨어 개발 시 지속적으로 통합 서비스를 제공하는 툴이다. (CI : Continuous Integration)

여러 개발자들이 하나의 프로그램을 개발할 때 버전 충돌을 방지하기 위해 각자 작업한 내용을 공유영역에 있는 저장소에 업로드하여 지속적으로 통합할 수 있게 해줌

git과 연동되어 코드 변경을 감지하고 자동화 테스트를 수행

https://inpa.tistory.com/entry/Jenkins-📚-젠킨스란-무엇인가

 

 

 


Docker Image

: 컨테이너를 정의하는 읽기 전용 템플릿

: 코드에 필요한 라이브러리 및 종속성에 대한 정의와 코드 내포 in Dockerfile

: package template plan -> create containers

이렇게 정의한 image를

docker build . -f Dockerfile -t jaykim/my-custom-app 으로 빌드할 수 있다

(이 과정에서 docker hub와 인증 과정 필요로 하는 듯)

 

  • RUN : 라이브러리 설치를 할 때
  • CMD : 이미지로부터 컨테이너를 생성하여 최초로 실행할 때 수행 → docker run 명령어를 실행할 때, override 가능
  • ENTRYPOINT : 이미지로부터 컨테이너를 생성하여 최초로 실행할 때 수행 → 컨테이너가 최초에 꼭 실행해야만 하는 명령어가 있을 때

+) 실습 : 컨테이너 내부에 접근하여 파일 수정하기

 

웹서버 구축할 수 있게 해주는 아파치에서 나온 httpd image

run을 통해서 컨테이너를 만들고

컨테이너를 실행하여 컨테이너 내부로 들어감

해당 컨테이너의 주소는 /usur/local/apache이고

httpd가 제공하는 웹 서비스의 index.html 파일은 /usur/local/apache/htdocs 안에 있음

해당 주소로 이동을 해주고 (현재 컨테이너 안임)

nano 에디터로 index.html 파일을 수정하고

저장한뒤 localhost:8081을 새로고침해주면

수정한 html 파일 결과물이 나오게 된다

관련글 더보기

댓글 영역