앎을 경계하기

Anything

[Docker] 도커 초보 탈출하기 part 1 - ㄹㅇ 쌩초보 탈출함

양갱맨 2021. 4. 20. 13:30

참고 영상은 글 맨 아래 확인해주세요! (왜 맨위에 안달아지지..)

-----------------------------

Docker 필요한 이유

  • 개발팀과 운영팀이 적대적이어선 안된다.
    • 새로운 기술, 새로운 언어를 도입하고 싶은 개발팀
    • 안정적인 서비스를 추구하는 운영팀

개발팀이 개발한 프로그램을 가상환경을 통해 운영팀에게 전달하게 된다면 운영팀도 쉽게 개발팀의 개발 서비스를 확인할 수 있지않을까?

기존 vmware나 virtual box같은 가상환경 프로그램은 기존 os에 hypervisor를 통해 hw를 구현하고 그 위에 os를 다시 설치하는 굉장히 큰 부하의 구조를 사용하게 된다.

hw와 os를 굳이 만들지 않고도 애플리케이션을 돌릴 수 있는 방법이 없을까?

그게 바로 컨테이너의 역할이다.

VM의 경우, OS를 매우 크게 가상화한다.

도커를 리눅스 계열에서 사용할 때, 리눅스 컨트롤 그룹(Cgroups)이라는 것을 활용해서 CPU, Memory, Network 대역폭 등 가상화를 할 수 있다. 그럼 윈도우에서는? 윈도우에서는 Hypervisor를 사용한다.

도커에서는 리눅스 네임 스페이스를 사용해 파일 등을 가상화한다.

그렇다면 Docker와 VM의 성능 차이는 얼마나 날까?


온프레미스, 모놀리식, 마이크로서비스

모놀리식에서는 모든 서비스를 한꺼번에 묶어서 다 같이 관리한다.

서비스를 한꺼번에 관리하다보면 단점은 컴파일 시간이 오래걸린다는 것이다.

그리고 개별적으로 서비스 구축이 불가하기 때문에 각 세부 서비스마다 업데이트에 대한 공지가 서로 필요하다.

마이크로서비스는 개별적으로 관리가 가능한 방식이다. 따라서, 개발이 단순화되고 각 환경이 모두 달라도 독립적으로 개발이 가능하다.


도커

  • 컨테이너 기술은 이전부터 존재했으나 도커덕에 알려짐
  • 사실상 컨테이너의 표준
  • 다양한 운영체제에서 사용가능하다.
    • 윈도우는 hypervisor를 사용해야해서 부하가 좀 있는 편이다.
  • 애플리케이션에 국한되지않고 의존성 및 파일시스템까지 패키징해서 빌드, 배포, 실행을 단순화한다.
  • 도커는 다양한 클라우드 서비스 모델을 다음과 같이 사용 가능하다.
    • 이미지 : 필요한 프로그램과 라이브러리, 소스를 설치한 뒤 만든 하나의 파일
    • 컨테이너 : 이미지를 격리하여 독립된 공간에서 실행한 가상 환경
  • 컨테이너는 가상머신처럼 하드웨어를 전부 구현하지 않기 때문에 매우 빠른 실행 가능
  • 프로세스 문제가 발생사는 경우 컨테이너 전체를 조정해야해서 컨테이너에 프로세스 하나를 실행하는 것이 좋다.

컨테이너 격리

Linux name space : 각 프로세스가 파일 시스템 마운트, 네트워크, 유저, 호스트 네임 등에 대해 시스템에 독립 뷰를 제공한다.

Linux control group : 프로세스로 소비할 수 있는 cpu, memory, i/o, 네트워크 대역대, 장치 노드 등을 제한한다.

도커의 한계

  • 서비스가 커지면 관리해야하는 컨테이너 양이 급격히 증가한다.
  • 도커를 사용한다고 해도 관리가 쉽지 않아 쿠버네티스와 같은 오케스트레이션 도입이 필요하다.

docker search [name]

도커 이미지 검색을 할때 docker search를 사용한다.

이미지 설치 시엔 아래 명령어를 사용해 바로 서비스를 실행할 수 있다.

docker run -d -p 8080:8080 --name [name] [image name]

-d : background 실행

-p 8080:8080 : Port 설정 8080을 8080으로 설정함

—name : 이름 설정

 

docker run -d -p 8080:8080 --name tc consol/tomcat-7.0

위 명령어를 통해 설치 후 127.0.0.1:8080으로 접속하여 아래와 같이 창이 뜨면 설치 성공.


내가 원하는 이미지 찾기 : Docker Registry

  • Docker Registry : 도커 이미지 저장해놓은 보관소
  • Image : 이미지는 정적인 상태로 실행되고 있지 않은 상태이다.
  • Container : 이미지 인스턴스를 실행중인 것

이미지를 찾을 때 docker search를 사용할 수 있지만 docker hub를 사용해서 검색하는 것이 훨씬 좋다.

이미지만 다운로드 받고 싶은 경우에는 docker pull을 사용한다.

docker pull [image name]

다운로드 받은 이미지 리스트는 docker images로 확인한다.

docker images

현재 3개의 이미지가 설치되어 있는 것을 확인할 수 있다.


Docker Life Cycle

  • Registry : 도커 이미지 저장소
  • PULL : 도커 이미지 다운로드
  • PUSH : 도커 이미지 저장 - push 시, 권한이 반드시 필요
  • Image : 실행이 불가능한 상태
  • Container : 실행이 불가능한 상태의 Image를 실행하기 위해 반드시 만들어야 하는 것
  • CREATE : 컨테이너를 만들기 위해 필요한 명령어
  • START : 컨테이너를 메모리에 올려 실제로 실행하기 위한 명령어
  • RUN : Image를 다운로드하고 컨테이너를 생성하는 것을 한 번에 수행하는 명령어, (Pull + Create + Start, 이미 pulling 되어있으면 create, start만 실행)
    • run을 계속 실행하면 그만큼 컨테이너가 계속 생성된다. 따라서, 반드시 create가 필요한 상태에서만 run을 사용하도록 한다.
  • Stop : start를 중지함. 메모리에서 내려 컨테이너를 중지함.
  • RM : 컨테이너 지우기
  • RMI : 이미지 지우기
  • COMMIT : 그동안 작업했던 컨테이너를 다시 이미지화해서 저장하는 방법

도커 명령어

1. 도커 이미지 다운로드와 삭제

docker pull [image name] docker rmi [image id]

2. 컨테이너 생성

docker run -d --name [name] [image name] // pull + create + start docker create -d --name [name] [image name]

3. 실행중인 컨테이너 확인

docker ps

4. 모든 컨테이너 확인

docker ps -a

5. 다운로드 된 이미지 리스트

docker images

6. 컨테이너 중지/삭제

docker stop [container id|name] docker rm [container id|name]  //컨테이너가 중지가 된 상태에서만 삭제 가능

  1. nginx 이미지 다운로드
  1. Container 생성
  1. 컨테이너 확인
  1. 컨테이너 실행
  1. 127.0.0.1:포트번호로 접속해서 확인

이미지 비밀 : 레이어

 

도커 이미지 정보 확인

docker pull [image name] docker inspect [image name]

도커 이미지 저장소 위치 확인

docker info

레이어 저장소 확인

도커 이미지 저장소 위치

도커 히스토리 확인

docker history [image name]

도커의 유용한 명령어

1. 포트포워딩으로 톰캣 실행하기

docker run -d --name tc -p 80:8080 tomcat firefox 127.0.0.1:80

2. 컨테이너 내부 쉘 실행

docker exec -it tc /bin/bash

3. 컨테이너 로그 확인

docker logs tc

4. 호스트 및 컨테이너 간 파일 복사

docker cp [path] [to container]:[path] docker cp [from container]:[path] [path] docker cp [from container]:[path] [to container]:[path]

5. 임시 컨테이너 생성

docker run -d -p 80:8080 --rm --nme tc tomcat

도커 컨테이너 실행 연습문제

  1. 기존에 설치된 모든 컨테이너, 이미지 정지 및 삭제
    // 컨테이너 확인 docker ps -a // 이미지 확인 docker images  // 컨테이너 삭제 docker rm [container id|name] // 이미지 삭제 docker rmi [image name]
  1. 도커 기능을 사용해 Jenkins 검색
    docker search jenkins
  1. Jenkins 사용 설치
    docker run -d -p 80:8080 Jenkins
  1. Jenkins 포트로 접속하여 웹 서비스 열기
    • 127.0.0.1:80으로 접속
  1. Jenkins의 초기 패스워드 찾아서 로그인하기
    • 웹으로 접속하면 아래와 같이 뜬다.
    • jenkins container bash를 실행해서 initialAdminPassword를 확인하자
    docekr exec -itu 0 jenkins /bin/bash
    이부분이 정말 정말 중요하다!
    bash를 실행하면 기본적으로 nano, vim 등 에디터가 없기때문에 설치해줘야하는데 그냥 apt-get install하면 Permission denied가 발생한다.권한 문제가 없게끔 실행하려면 -itu 0을 붙여서 bash를 실행해주면 된다.
    apt-get update apt-get install nano
    다시 jenkins 로그인으로 돌아와서
  2. initialAdminPassword파일을 확인하여 비밀번호를 복붙해 로그인하면 아래 화면처럼 창이 넘어간다.
  3. update하고 나노를 설치하는 명령어를 입력해주면 정상적으로 실행되는 것을 확인할 수 있다.
  4. 확인하고자 하는 파일 내용을 확인할때 cat을 사용하지 않고 에디터를 사용해서 확인하고자 했다.

 

 

 

 

 

youtu.be/ePpiEy_C_jk