도커 기초

장후후·2021년 10월 11일
1

Docker Core Guide

목록 보기
1/5
post-thumbnail

도커 개념 및 전망

컨테이너 기술은 VM 기술과는 다르게 Guest OS 없이 Host OS의 리소스를 공유받아 격리된 공간을 제공합니다.

컨테이너 기술은 관리의 편의성, 성능 분배 용이, 자신만의 컨테이너 조합의 서비스를 구축하기 편리합니다.

여러 컨테이너 기술이 존재하였는데, 현재 생태계에서는 도커가 가장 큰 범위를 차지하고 있습니다.

아래와 같이 도커 컨테이너는 별도의 Guest OS 없이 효율적으로 Host OS 리소스를 공유하여 가상 격리를 해줍니다.

도커 VS Podman

도커가 현재 컨테이너 기술 점유도가 타 제품에 비해 월등히 높긴 하지만 치명적인 결함이 하나 존재 하는데, 그것이 바로 Docker Daemon입니다.

도커는 도커 데몬을 통해서, 컨테이너 서비스를 제공하는데, 만약에 이 데몬이 멈춘다면, 동작중인 모든 컨테이너는 멈추게 됩니다. 이러한 단일 실패지점이 생긴다는건 안정적인 서비스를 제공하는데, 장벽이 생긴다는 것을 의미하기 때문에 이것을 꼭 해결하여야 합니다.

그래서 현재 도커 대신 Podman이라는 기술이 점차 각광 받고 있는 추세입니다.

Podman은 도커의 이 치명적인 문제를 해결하기 위해서, 데몬을 쓰지않고, 하나의 컨테이너를 서비스로 실행해서 다른 컨테이너에게 영향을 주지않게 설계되었습니다.

컨테이너 개념

컨테이너 기술을 알기 위해서, 먼저 리눅스 컨테이너를 설명해야 합니다.
리눅스에서 하드웨어 가상화 없이 커널 공유방식의 프로세스 격리 기술인 컨테이너 기능이 개발되었습니다.

컨테이너 프로세스는 커널을 공유하지만, 네임스페이스, 컨트롤 그룹, 루트 디렉토리들은 격리되어서, 마치 독립적인 환경을 가진 가상머신으로 인식됩니다.

장점은 운영체제 수준의 가상화, 빠른속도와 효율성, 높은 이식성, 상태를 가지지 않음(stateless - 다른 컨테이너에게 영향을 주지 않음)

컨테이너 종류는 system container (LXC, LXD), application container (docker)가 있습니다. 운영체제를 가상화 하냐, 프로세스를 실행하는 목적으로 가상화 하는 것이냐 하는 차이점이 있습니다.

도커는 닷클라우드dotCloud의 솔로몬 하이크가 파이콘 2013 USPyCon 2013 US에서 처음 발표한 컨테이너 런타임입니다.

그래서 왜 써야 하냐?
관리가 편하다!

사례는?
해외는 에어비엔비, 레딧, 틴더, 아마존, 핀터레스트 등 모두 컨테이너 기술 기반으로 운영되고 있음!
국내는 당근마켓, 엔씨소프트, 토스 서버, 타다 , 삼성 헬스

틴더 쿠버네티스
틴더 도커 컨테이너로 이식
틴더 엘라스틱 로드 밸런싱
출처 https://www.44bits.io/ko/keyword/linux-container#%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EB%9F%B0%ED%83%80%EC%9E%84

도커 기본

도커 허브 가입하기

도커를 실행해보기에 앞서, 도커 허브를 가입해보시죠.
https://hub.docker.com/

메인화면이 가입창으로 되어 있습니다.
가입하고, 로그인을 하게 되면, 아래와 같이 내가 만든 이미지들 리스트가 보입니다.

도커 설치하기

윈도우 10 기준으로 설치방법을 설명하겠습니다.
설치파일을 실행하고 순서대로 설치하고 나면 도커 트레이가 생성됩니다. (아래 링크 참고)
https://docs.docker.com/desktop/windows/install/



대시보드를 들어가서 아래와 같이 고래가 초록색 바탕이되면 성공

도커 run hello world

도커가 잘 동작하는지 최종적으로 확인해보려면
docker run hello-world 를 cmd에서 실행해보자.
아래 그림과 같이 나오면 성공!

주요 명령어

docker run -dit -p [host port]:[container port] --name [container id or name] [image name]
docker exec -it [container id or name] bash
docker attach [container id or name] 컨테이너 접근
docker ps [option]
docker ps -f name=foo 필터 기능 아래와 같은 필터를 제공

docker ps -a 모든 컨테이너 보기
docker ps -s 컨테이너 용량이랑 같이 보기
docker stop [container id or name]
docker start [container id or name]
docker rm -f [container id or name]

호스트와 컨테이너 파일 시스템 연결하기

도커 컨테이너는 호스트의 파일 시스템을 컨테이너에 마운트 시키는게 가능하다.

여기서 우리는 bind mount와 volume에 대해서, 알아보겠다.

먼저 볼륨을 다루는 방법을 알아보자.

docker volume create vol1

명령어로 볼륨을 생성한다.

docker volume ls 볼륨 목록 확인

docker volume inspect vol1 볼륨 상세정보 보기
를 순서대로 하면, 아래와 같이 출력된다. 여기서 Mountpoint 라는게 있는데, 도커 데스크탑에서는 해당 경로로 접근할 수 있는 방법이 없으니 참고만 하자. (리눅스 환경에서는 가능하다.)

자, 이제 생성된 볼륨을 컨테이너에 마운트 해보자.

docker run -dit -v vol1:/app --name test1 busybox
docker inspect test1 으로 정상적으로 볼륨이 마운트되었는지 확인할 수 있다.

테스트로 텍스트 파일 하나를 만들어보자

docker exec -it test1 touch /app/test.txt

볼륨에 해당 test가 저장 되어있는지 확인해보자. 도커 데스크탑에서는
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\vol1\_data
경로에서 확인가능하다.

이 볼륨은 다른 컨테이너에도 마운트가 가능하다.

이 방법은 volume 을 도커가 관리하기 때문에, 내가 원하는 호스트 경로로 설정이 불가능한 단점이 있다.

그래서 바인드 마운트라는 개념이 등장하였다. 옵션은 똑같은데, 위에서 만든 것과 다르게 볼륨경로를 호스트 경로로 직접 바인드 하는 방식이다.

예시로 아래 경로에 test 파일을 만들어보겠다.

docker run -dit -v C:\Users\jsh\volume:/app --name test2 busybox

docker exec -it test2 ls app 으로 확인해보면 볼륨이 정상적으로 바인딩된것이 확인된다.

위와 같이 호스트 경로를 직접적으로 바인딩하고 싶을때, bind mount를 사용하면 된다.

가상 네트워크 개념

도커는 컨테이너가 생성되면 내부 IP를 할당한다. 아래 그림과 같이 veth(virtual ethernet)라는 네트워크 인터페이스를 컨테이너가 만들어질때마다 생성하는데, 별도의 설정없이 도커 데몬이 자동으로 만들어준다. 네트워크에 별도의 설정이 없다면, docker0를 브리지로 사용한다.
도커 네트워크1
아래 예제와 같이 사용자 정의 bridge를 생성하여, 컨테이너에 연결이 가능하다.
도커 네트워크2

도커 네트워크를 확인하기 위해서
docker network ls 명령어로 현재 도커에서 사용할 수 있는 네트워크 리스트를 확인할 수 있다.

docker network inspect bridge로 기본으로 제공되는 브릿지를 확인해보자.


위에 설명대로 나만의 브릿지를 만들 수 있다.

docker network create --driver bridge mybridge


my_bridge의 정보를 보게되면 기본 bridge와 다른 대역으로 IP를 할당할 수 있게 설정되어 있습니다.
docker network inspect my_bridge

나의 브리지를 통해서 컨테이너 생성하기
docker run -dit --name container1 --net my_bridge alpine

내가 만든 컨테이너의 상세정보를 보면 방금 만든 브리지가 연결되어 있는걸 확인할 수 있음

docker inspect container1

할당된 아이피는 컨테이너 내부에서도 확인할 수 있다.

docker attach container1
ifconfig

도커 네트워크는 connect, disconnect를 통해서 붙였다, 뗏다 할 수 있다.

docker network diconnect my_bridge container1

컨테이너에 접근하고, 아이피를 확인해보자

docker attach container1
ifconfig

성공적으로 해제된것을 볼 수 있다.
docker inspect container1

다시 붙이려면 connect 명령어를 사용하면된다.

docker network connect my_bridge container1

도커에서는 위와 같이 자동 세팅 말고도, 커스텀 네트워크 또한 생성할 수 있다.

# docker network create --driver=bridge \ --subnet=172.72.0.0/16 \ --ip-range=172.72.0.0/24 \ --gateway=172.72.0.1 \ my_custom_network

참고사이트 https://captcha.tistory.com/70

profile
Backend Developer, DevOPS Engineer, IIoT, IoT

0개의 댓글