study_recode 2025. 3. 4. 23:15

도커란?

'데이터 또는 프로그램을 격리시키는 기능'을 제공하는 소프트웨어

컴퓨터에는 워드, 엑셀, 메일, 아파치, mysql 등 많은 프로그램(소프트웨어)이 함께 동작한다. 

도커는 다양한 프로그램과 데이터를 각각 독립된 환경에 격리하는 기능을 제공, 그것도 운영체제(비슷한 것) 통째로 격리하는 기능이다.

 

  • 운영체제 독립 애플리케이션(앱) 개발
    • 도커 설치 시 앱 실행 가능
    • WInodw, Linux 등 운영체제에 무관
  • 앱 패키지화(이미지화)
    • 앱 및 실행 환경을 이미지에 패키지화
    • 앱 : 앱 소스
    • 실행 환경 : 운영체제, 웹 서버, 런타임 환경, 라이브러리 및 종속성 등
  • 앱 가상화(파일화)
    • 앱 이미지의 내용을 파일에 작성
  • 리눅스 컨테이너 기술 기반
    • 리눅스 커널 기반 가상화 기술 : 컨테이너 격리(독립)

도커 구성

  • 도커 엔진
    • 도커 실행 환경 : 컨테이너(앱) 실행
    • 클라이언트(CLI) - 서버(Demon) 구조로 동작
  • 도커 이미지
    • 컨테이너 원판
    • 도커 파일을 통해 생성
    • 이미지 : 베이스 이미지와 다층 레이어로 구성
    • 베이스 이미지 : 운영체제
    • 레이어 : 웹 서버, 런타임 환경, 필수 라이브러리 및 종속성, 앱 소스 등
  • 도커 컨테이너
    • 이미지 인스턴스(실행판)
    • 호스트 시스템과 환경 격리 : 컨테이너별 자체적으로 파일시스템, 프로세스, 네트워크, 자원(CPU, 메모리, 디스크 등) 운영리눅스 컨테이너 기술 기반 
  • 도커 레지스트리
    • 도커 이미지 저장 및 관리
    • 공식 도커 허브, 사설 레지스트리
  • 도커 컴포즈
    • 여러 컨테이너들(서비스들)로 구성된 앱 정의 및 실행
    • 한 번에 여러 컨테이너 실행 및 관리
    • YAML 파일 사용 

도커 엔진

도커를 사용하려면 도커 소프트웨어의 본체인 도커 엔진을 설치해야하며, 도커 엔진을 사용해 컨테이너를 생성하고 구동시킬 수 있다. 

  • 도커 데몬
    • 기능
      • 컨테이너, 이미지, 네트워크, 볼륨, 이벤트 로그, 자원 등 관리
      • 컨테이너 기반 앱 관리에 필요한 모든 작업 수행
      • which dockerd: 도커 데몬 실행 명령어(dockerd)경로
      • /usr/bin/: dockerd 명령어 위치
  • dockerd 명령어
    • dockerd : 도커 데몬 실행 명령어
    • 현재 실행중이기 때문에 실행되지 않음 
    • sudo systemctl stop docker : 도커 데몬 중지
    • sudo dockerd : 도커 데몬 시작
    • Ctrl + c : 도커 데몬 종료
    • sudo systemctl status docker : 도커 데몬 상태 확인
  • 도커 클라이언트
    • 기능
      • 컨테이너 런타임 환경 자체 완비
      • 컨테이너 실행 중 발생 상황에 대응
      • 사용자에게 CLI 인터페이스 제공
      • 도커 엔진과 상호 작용 
      • which docker : 도커 클라이언트 실행 명령어(docker) 경로 표시
      • /usr/bin/ : docker 명령어 위치
      • ehco $PATH : 현재 사용자의 PATH 환경 변수 값 표시
      • cat /etc/environment : 시스템 전역 PATH 환경변수 값 표시 
    • docker 명령어
      • docker : 도커 클라이언트 호출 명령어 
      • docker [options] command : 도커 데몬에게 옵셔을 고려해서 command 수행 요청
      • 도커 데몬에 컨테이너 생성/실행 :  이미지 빌드 / 다운로드 / 업로드 등 작업 요청 

도커 네트워크

가상 브릿지 docker0(호스트)

  • 도커 기본 네트워크 드라이버 : 도커 데몬 시작 시 호스트 시스템에 생성
  • 실제 네트워크에 게이트웨이(외부통신) 및 스위치(내부통신) 역할
  • 가상 네트워크 생성 및 가상 네트워크 인터페이스(컨테이너) 연결
  • 컨테이너 간 내부통신 및 호스트 시스템 외부 네트워크(인터넷) 통신 지원

가상 브릿지 네트워크 인터페이스(컨테이너)

  • 가상 브릿지가 각 컨테이너에 할당하는 가상 네트워크 장치
  • 실제 네트워크에서 인터페이스 카드 역할

가상 브릿지 네트워크

  • 가상 브릿지와 컨테이너들 집합 : 사용자 정의 브릿지 추가 가능
  • 브릿지 방식 네트워크 : bridge(기본), csw_net(사용자 추가) 
[root@bro ~]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "896a680b438e01989465012b9467fa960f238e495bffb446305353691dfee164",
        "Created": "2025-03-04T21:50:18.549688591+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv4": true,
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
  • "Name" : "bridge" : 가상 네트워크 이름
  • "Driver" : "bridge" : 가상 네트워크 드라이버 방식
  • "Subnet" :  "172.17.0.0/16" : 가상 네트워크 주소
  • "Gateway" : "172.17.0.1" : 가상 네트워크 게이트웨이(docker0) 주소
  • "cohttp://m.docker.network.bridge.enable_ip_masquerade": "true"  : NAT 허용(호스트 외부 통신 가능)
  • "cohttp://m.docker.network.bridge.name": "docker0" : 도커 네티워크의 가상 브릿지 이름

도커 이미지

도커 엔진이 있어야 컨테이너를 만들 수 있지만 컨테이너의 빵틀과도 같은 역할을 할 이미지가 필요하다. 

소프트웨어의 종류에 따라 다양한 이미지가 존재하며, 아파치 컨테이너는 아파치 이미지, MySQL 컨테이너는 MySQL 이미지를 사용해야 한다. 

  • 기능
    • 컨테이너 템플릿
    • 파일 시스템과 실행 환경으로 구성
      - 파일 시스템 : 파일, 디렉토리
      - 실행 환경 : 실행 파일, 런타임 환경, 네트워크 설정 등
    • 계층 구조
      - 베이스 이미지(하위) : 우분투 베이스 이미지
      - 렝어(상위) : 웹 서버 , DB 서버, 프로그래밍 언어 및 해당 언어 런타임 환경 추가 
  • 구성 
    • 베이스 이미지
      • 기본적인 파일 시스템과 실행 환경 제공
      • 기본적인 운영체제 : 우분투
      • 기본적인 런타임 환경 : 특정 프로그래밍 언어 런타임 환경, 웹 서버, DB 서버 등
      • 기본적인 도구 및 유틸리티 : 파일 시스템 관리 도구 등
      • 도커 허브에서 공식적 이미지 제공
    • 레이어
      • 파일 시스템의 새로운 변경 사항만 추가
      • 이전 레이어 변경 사항 상속 

도커 컨테이너

기능

  • 애플리케이션 실행
    • 도커 이미지 기반 컨테이너 인스턴스 생성
    • 애플리케이션을 독립적으로 실행
  • 애플리케이션 격리
    • 호스트 시스템으로부터 격리된 환경에서 실행
    • 각 컨테이너는 자체 파일 시스템, 네트워크, 프로세스 공간에서 독립적 실행
  • 다양한 환경에서 애플리케이션 실행 및 관리
    • 호스트 운영체제에 종속되지 않음
    • 도커 설치 우분투에서 빌드한 이미지는 도커 설치 Winodws에서도 실행 가능 

구성

  • 파일 시스템
    • 도커 이미지의 파일 시스템을 기반으로 함
    • 애플리케이션 실행에 필요한 파일들 포함
  • 프로세스
    • 실행된 애플리케이션
  • 네트워크
    • 호스트에 독립된 네트워크 인터페이스 보유
    • 컨테이너 간 및 외부 서비스와 통신
  • 환경변수
    • 실행 환경 구성 및 앱 설정 제공
  • 컨테이너 설정
    • 도커 이미지에서 컨테이너 생성을 위해 정의된 설정
    • 컨테이너 실행 방식, 리소스 제한, 네트워크 구성 등 결정 

도커 레지스트리

  • 도커 이미지 저장 및 관리 저장소
    • 이미지 저장, 공유, 배포
    • Docker Hub 공식 레지스트리
    • 개인이나 조직 자체 사설 레지스트리

도커 컴포즈

  • 다중 컨테이너 기반 앱 관리
    • 여러 컨테이너 기반의 하나의 종합적인 앱 서비스 개발 가능
    • 웹 앱 : 웹 서버, 데이터베이스, 백엔드 서비스 등 다중 컨테이너 결합 

데이터나 프로그램을 독립된 환경에 격리해야 하는 이유

대부분 프로그램은 프로그램 단독으로 동작하는 것이 아니라 어떤 실행 환경이나 라이브러리, 다른 프로그램을 이용해 동작한다. 소프트웨어 끼리 같은 폴더(디렉토리)를 공유하거나 같은 라이브러리를 사용할 수 있다. 

 

소프트웨어 A, B가 소프트웨어 C를 사용하고 있는데 A가 업데이트 되면서 C도 업데이트가 필요해 C를 업데이트 하는 순가 B는 오류가 발생한다. 

 

이처럼 업데이트 뿐만아니라 초기 설치시에도 적절한 버전을 맞추어 설치도 많이 까다로워 진다.

 

컨테이너를 이용해 프로그램들을 격리시켜 각 프로그램마다 맞는 버전에 맞추어 격리하여 설치하면 어느 환경에서 작동을 쉽게 하게 할 수 있다. 


도커 설치 후 작업

#docker 그룹 만들고 그룹에 사용자 추가하기
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

# 사용자에게 도커 실행권한 설정 방법
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R

# 사용자로 전환
su - $USER
docker ps, docker run hello-world
exit

 

https://docs.docker.com/engine/install/linux-postinstall/

 

Post-installation steps

Find the recommended Docker Engine post-installation steps for Linux users, including how to run Docker as a non-root user and more.

docs.docker.com

nginx로 기본적 명령어 사용

docker pull nginx:latest # 이미지 다운로드
docker images # 다운로드 이미지 확인
docker run -name web -d -p 80:80 nginx:latest #다운로드 이미지로 nginx 'web'이름으로 컨테이너 실행
docker ps # 컨테이너 확인
curl localhost:80 # 접근
docker stop web # 컨테이너 멈추기
docker ps -a # 멈춘 컨테이너 확인
docekr rm web # 컨테이너 삭제
docker rmi nginx:latest # 이미지 삭제
[root@bro ~]# docker pull nginx:latest
latest: Pulling from library/nginx
7cf63256a31a: Pull complete
bf9acace214a: Pull complete
513c3649bb14: Pull complete
d014f92d532d: Pull complete
9dd21ad5a4a6: Pull complete
943ea0f0c2e4: Pull complete
103f50cb3e9f: Pull complete
Digest: sha256:9d6b58feebd2dbd3c56ab5853333d627cc6e281011cfd6050fa4bcf2072c9496
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@bro ~]# docker images
REPOSITORY                       TAG           IMAGE ID       CREATED         SIZE
nginx                            latest        b52e0b094bc0   3 weeks ago     192MB
mcr.microsoft.com/mssql/server   2022-latest   b823451808db   7 weeks ago     1.62GB
gvenzl/oracle-xe                 latest        0ae0009858dd   5 months ago    2.91GB
phpstorm/php-apache              latest        570a2631967b   14 months ago   580MB
[root@bro ~]# docker run --name web -d -p 80:80 nginx:latest
de685509a078ef0cff28feceec1ba8ed4919c7df874175c62a920085afac77e5
[root@bro ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                 NAMES
de685509a078   nginx:latest   "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   0.0.0.0:80->80/tcp, [::]:80->80/tcp   web
[root@bro ~]# curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

 

브라우저로 접근

컨테이너 및 이미지 삭제

[root@bro ~]# docker stop web
web
[root@bro ~]# docker ps -a
CONTAINER ID   IMAGE                                        COMMAND                   CREATED              STATUS                           PORTS                                         NAMES
de685509a078   nginx:latest                                 "/docker-entrypoint.…"   About a minute ago   Exited (0) 3 seconds ago                                                       web
[root@bro ~]# docker rm web
web
[root@bro ~]# docker rmi nginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:9d6b58feebd2dbd3c56ab5853333d627cc6e281011cfd6050fa4bcf2072c9496
Deleted: sha256:b52e0b094bc0e26c9eddc9e4ab7a64ce0033c3360d8b7ad4ff4132c4e03e8f7b
Deleted: sha256:3c8b88c16794e3082397557e5482f5a04a6c295cec37919c65c234e1a3645e80
Deleted: sha256:d5c83383666c732fcb30d7e25c74c2e0884c262f2e497cc9f2844870980311d8
Deleted: sha256:d62b6301e685a7cdc3bb3b1508a959e4710a707ea2f680f848c19a9ad74ac6a7
Deleted: sha256:d443654bda4a04f31ba6bd39bed82a053a17f2974b401fef552e4e88d6546db8
Deleted: sha256:129409d5d363e5d5af273f0b2a90237f708ed9972f8d58a4dbcd17f1abbabe21
Deleted: sha256:a3a2912e392a24d8c7dde076a3778c6eded8839660963ac2084e051eb6931c13
Deleted: sha256:5f1ee22ffb5e68686db3dcb6584eb1c73b5570615b0f14fabb070b96117e351d

컨테이너 기술의 역사와 발전

 

컨테이너 기술의 역사와 발전

컨테이너 역사는 1979년에 Chroot로부터 시작합니다. 2013년에 오픈 소스로 도커가 발표되고 그후에 Container 기술은 급속히 발전합니다. 구글이 쿠버네티스를 발표한 후도커를 지원하다 중단선언을

www.openmaru.io