반응형
도커 등장 배경
- docker 관련 문서 : https://github.com/remotty/documents.docker.co.kr
- 서버를 관리한다는 것
- 복잡하고 어려운 서버관리
- 복잡하고 어려운 서버관리
- 시간이 흐르면서 서버환경이 종종 바뀌거나 오픈소스가 바뀌거나 하는 걸 볼수 있습니다.
- CentOS -> Ubuntu
- Chef -> Ansible -> 또 다른 오픈소스
- DevOps의 등장으로 짧은 개발주기와 잦은 배포
- 마이크로서비스 아키텍처의 유행 -> 프로그램은 더 잘게 쪼개어져 관리는 더욱 복잡해짐.
- 새로운 툴은 계속 나오고 클라우드의 발전으로 설치해야 할 서버가 수백, 수천대에 이르는 상황(?)
- 이런 노답인 상황에서 Docker가 등장하고 서버관리 방식이 완전히 바뀌게 됩니다.
도커의 역사
- 도커는 2013년 3월 산타클라라에서 열린 Pycon Conference에서 dotCloud의 창업자인 Solmon Hykes가 The future of Linux Containers 라는 세션을 발표하면서 처음 세상에 알려졌습니다.
도커란?
도커는 컨테이너 기반의 오픈소스 가상화 플랫폼 입니다.
- 컨테이너 하면 화물 수송용 박스를 생각할 수 있는데 여기에는 여러가지 화물들이 들어 있고 규격화 되어 컨테이너선이나 트레일러 등 다양한 운송 수단으로 쉽게 옮길 수 있다.
- 마찬가지로 서버에서 이야기하는 컨테이너도 다양한 프로그램, 실행환경을 컨테어니로 추상화 하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다.
백엔드, 데이터베이스, 메시지큐 등 어떤 프로그램도 컨테이너로 추상화 할 수 있고 조립PC, AWS, Azure, Google Cloud등 어디서든 실행 할 수 있다.
기존 가상화 방식은 OS를 가상화!
- VMware, VirtualBox같은 가상머신
- 무겁고 느림
- VMware, VirtualBox같은 가상머신
컨테이너
- 컨테이너
- 프로세스를 격리하는 방식 -> 다수의 컨테이너를 OS커널에서 직접 구동.
- 격리된 실행환경을 제공하기 위한 인프라 기술.
- 하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 Virtual Machine을 사용하는 느낌을 줍니다.
- 실행 중인 컨테이너에 접속하여 명령어를 입력할 수 있고 apt-get or yum으로 패키지 설치 가능
- 프로세스를 격리하는 방식 -> 다수의 컨테이너를 OS커널에서 직접 구동.
이미지
- 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것
- 이미지를 실행한 상태라고 볼수 있고 추가되거나 변하는 값은 컨테이너에 저장
- 같은 이미지에 여러개의 컨테이너를 생성 할 수 있고 컨테이너의 상태가 변경되거나 삭제되더라도 이미지는 변하지 않고 그대로 남아 있습니다.
- 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없습니다.
- 이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성만 하면 됩니다.
- 한 서버에 여러개의 컨테이너를 실행 할 수 있고, 수십, 수백, 수천대의 서버도 문제 X
레이어 저장방식
- 도커 이미지는 컨테이너 실행하기 위한 모든 정보를 가지고 있기 때문에 용량이 큼.(MB)
- 처음 이미지를 다운받을 때는 크게 부담이 안가지만 기존 이미지에 파일하나 추가했다고
다시 다운 받는다면 매우 비 효율적 일 수밖에 없다. - 도커는 이런 문제를 해결하기 위해 레이어(layer)라는 개념을 사용.
- 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해줍니다.
- 이미지는 여러개의 읽기 전용(read only) 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성 됩니다.
- 예를 들어 CentOS 이미지가 A라고 하자.
CentOS 이미지를 베이스로 만든 톰캣 이미지는 A+tomcat이 된다.
webapp 이미지를 톰캣 이미지 기반으로 만들었다고 한다면
A+tomcat+source 레이어로 구성된다.
webapp 소스를 수정하면 A, tomcat 레이어를 제외한 새로운 source(v2) 레이어만
다운 받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수가 있다. - 컨테이너를 생성할 때도 레이어 방식을 사용
- 기존 이미지 레이어 위에 읽기/쓰기 레이어를 추가
- 이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소한의 용량만 사용.
- 처음 이미지를 다운받을 때는 크게 부담이 안가지만 기존 이미지에 파일하나 추가했다고
url 방식으로 관리
- 이미지는 url방식으로 관리하며 태그(tag)를 붙일 수 있음.
Dockerfile
- 도커는 이미지를 만들기 위해 Dockerfile 이라는 파일에 자체 DSL(Domain Specific Language)언어를 이용하여 이미지를 생성 합니다.
Docker Hub
- 도커 이미지 용량은 보통 수백메가로 수기가가 넘는 경우도 흔합니다.
이렇게 큰 용량의 이미지를 서버에 저장하고 관리하는 것은 쉽지 않은데 도커는 Docker Hub를 통해 공개 이미지를 무료로 관리해 줍니다.
Docker Command&Api
- 도커 클라이언트 Command가 있으며 http기반의 Rest Api도 지원
- 확장성 Up!
Docker 설치
- Docker for mac을 설치~끝!
- 설치 확인 : docker version
도커 기본 명령어
이미지 관련
- 이미지 목록 보기
- sudo docker images
- 이미지 검색
- sudo docker search [이미지 이름]
- 이미지 받기
- sudo docker pull [이미지 이름]:[버전]
- 버전에 latest를 쓰면 최신 버전으로 받을 수 있음.
- 이미지 삭제
- sudo docker rmi [image id]
- 컨테이너를 삭제하기 전에 이미지를 삭제 할 때 -f 옵션으로 컨테이너도 강제 삭제 가능
- sudo docker rmi -f [image id]
컨테이너 관련
컨테이너 목록 보기
- sudo docker ps
- -a 옵션 : 모든 컨테이너 목록 출력
- sudo docker ps
컨테이너 실행
- sudo docker run [options] image[:TAG | @DIGEST] [COMMAND] [ARG..]
- sudo docker run [options] image[:TAG | @DIGEST] [COMMAND] [ARG..]
컨테이너 정지
- docker stop [컨테이너 id or name]
컨테이너 시작
- docker start [컨테이너 id or name]
컨테이너 재시작
- docker restart [컨테이너 id or name]
컨테이너 삭제
- docker rm [컨테이너 id or name]
모든 컨테이너 삭제
- docker rm
docker ps -a -q
- docker rm
컨테이너 로그 보기(logs)
- docker logs [OPTIONS] CONTAINER
- 기본 옵션, -f, --tail 옵션을 살펴보자
- docker logs [OPTIONS] CONTAINER
sudo 없이 Docker 명령어 쓰기
- sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한 주기
- sudo usermod -aG docker your-user # your-user 사용자에게 권한 주기
스프링부트+도커
docker는 리눅스 베이스로 돌아간다.
- macOS에서는 Boot2Docker가 필요 함.
- virtualBox 가상머신 안에 리눅스를 설치하고 도커를 실행.
- 다행히 MacOS용 도커를 깔면 기본으로 boot2docker를 제공 해줌.(개꿀~)
- macOS에서는 Boot2Docker가 필요 함.
Dockerfile 만들기
예제)
FROM openjdk:8-jdk-alpine ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
* 참고
* FROM : 이미지를 생성할 때 사용할 기반 이미지를 지정한다. 예제에서는 openjdk:8-jdk-alpine 이미지를 사용했다. 이 이미지는 알파인 OS에 JDK 8을 설치한 이미지이다.
* RUN : 이미지를 생성할 때 실행할 코드를 지정한다. 예제에서는 패키지를 설치하고 파일 권한을 변경하기 위해 RUN을 사용했다.
* WORKDIR : 작업 디렉토리를 지정한다. 해당 디렉토리가 없으면 새로 생성한다. 작업 디렉토리를 지정하면 그 이후 명령어는 해당 디렉토리를 기준으로 동작한다.
* COPY : 파일이나 폴더를 이미지에 복사한다. 위 코드에서 두 번째 COPY 메서드는 entrypoint.sh 파일을 이미지에 run.sh 이름으로 복사한다. 상대 경로를 사용할 경우 WORKDIR로 지정한 디렉토리를 기준으로 복사한다.
* ENV : 이미지에서 사용할 환경 변수 값을 지정한다. 위 코드는 PROFILE 환경 변수의 값으로 local을 지정했는데 이 경우 컨테이너를 생성할 때 PROFILE 환경 변수를 따로 지정하지 않으면 local을 기본 값으로 사용한다.
* ENTRYPOINT : 컨테이너를 구동할 때 실행할 명령어를 지정한다. 위에서는 run.sh을 실행하도록 설정했다.'
반응형
'CM > docker' 카테고리의 다른 글
Dockerfile 명령어 정리 (0) | 2022.06.10 |
---|---|
docker 빌드로 이미지를 만들어보자!(작성 중) (0) | 2022.01.25 |
Docker ? (0) | 2017.06.27 |
about docker (0) | 2017.04.27 |