Docker 컨테이너 학습 [1]

1. 컨테이너 개요

1.1 컨테이너란?

컨테이너는 샌드박스 기술이며 주요 목적은 그 안에서 애플리케이션을 실행하고 외부 세계와 격리하는 것이며 이 샌드박스는 다른 호스트 시스템으로 전송하는 것이 편리합니다. 본질적으로 이것은 특별한 과정입니다. 네임스페이스, 컨트롤 그룹, chroot 기술을 통해 리소스, 파일, 장치, 상태, 구성을 독립적인 공간으로 나눕니다.

대중적인 이해는 소프트웨어 실행에 필요한 종속 라이브러리 및 구성이 포함된 애플리케이션 소프트웨어가 포함된 상자입니다. 개발자는 내부 소프트웨어 작동에 영향을 주지 않고 이 상자를 모든 시스템으로 옮길 수 있습니다.

1.2 컨테이너 원칙

컨테이너 프로세스를 외부 세계와 격리하기 위해 컨테이너의 맨 아래 계층은 주로 네임스페이스, 제어 그룹 및 chroot를 사용합니다.

네임스페이스:

  1. PID 네임스페이스: 다른 컨테이너는 pid 네임스페이스로 구분되며 다른 네임스페이스는 동일한 pid를 가질 수 있습니다.
  2. 마운트 네임스페이스: 마운트를 사용하면 다른 네임스페이스의 프로세스가 다른 파일 구조를 볼 수 있으므로 다른 네임스페이스의 프로세스가 보는 파일 디렉터리가 격리됩니다. 또한 네임스페이스의 각 컨테이너에 대한 /proc/mounts의 정보에는 마운트 지점의 현재 이름만 포함됩니다.
  3. IPC 네임스페이스: 컨테이너의 프로세스 상호 작용은 여전히 ​​세마포어, 메시지 큐 및 공유 메모리를 포함하여 Linux의 일반적인 프로세스 상호 작용 방법(프로세스 간 통신 -IPC)을 채택합니다.
  4. 네트워크 네임스페이스: 네트워크 격리는 Net을 통해 구현되며 각 Net에는 독립적인 네트워크 장치, IP 주소, 라우팅 테이블 및 /proc/net 디렉토리가 있습니다. 이러한 방식으로 각 컨테이너의 네트워크를 격리할 수 있습니다.
  5. UTS 네임스페이스: UTS(UNIX 시분할 시스템)는 각 컨테이너가 독립적인 호스트 이름과 도메인 이름을 가질 수 있도록 하여 호스트의 프로세스가 아닌 네트워크의 독립적인 노드로 간주될 수 있습니다.
  6. 사용자 네임스페이스: 각 컨테이너는 다른 사용자 및 그룹 ID를 가질 수 있습니다. 즉, 호스트의 사용자 대신 컨테이너 내부의 사용자를 사용하여 프로그램을 실행할 수 있습니다.

컨트롤 그룹(Control groups):
Cgroups는 프로세스 그룹을 제한, 기록 및 격리할 수 있는 Linux 커널에서 제공하는 물리적 리소스 메커니즘입니다. 네임스페이스 기술은 프로세스의 시각적 범위만 변경할 수 있기 때문에 실제로 리소스를 제한할 수는 없습니다. 따라서 Cgroup 기술을 사용하여 컨테이너가 호스트 시스템의 모든 리소스를 다 사용하여 다른 컨테이너가 충돌하는 것을 방지하기 위해 컨테이너의 리소스를 제한하는 것이 필요합니다. Linux의 /sys/fs/cgroup 디렉토리에는 cpu, memory, devices, net_cls 등의 하위 디렉토리가 있으며 필요에 따라 해당 구성 파일을 수정하여 물리적 자원에 대한 프로세스 ID의 최대 사용률을 설정할 수 있습니다.

루트로 변경:
루트 절단의 의미는 프로그램이 실행 중일 때 프로그램이 참조하는 루트 디렉토리의 위치를 ​​변경하여 서로 다른 컨테이너가 서로 다른 가상 루트 디렉토리에서 작동할 수 있도록 하여 서로 직접적인 영향을 미치지 않도록 하는 것입니다.

1.3 컨테이너 및 가상 머신

가상 머신은 일반적으로 전체 운영 체제와 애플리케이션을 포함하며 실제 운영 체제는 내부에서 실행됩니다. 본질적으로 가상 머신은 하이퍼바이저로 가상화된 하드웨어에 설치된 다양한 운영 체제이며 컨테이너는 호스트 머신에서 실행되는 다양한 프로세스입니다. 사용자 경험의 관점에서 볼 때 가상 머신은 무겁고 많은 물리적 리소스를 차지하며 시작하는 데 오랜 시간이 걸립니다. 컨테이너는 물리적 리소스를 적게 차지하고 빠르게 시작합니다. 반대로 가상 머신은 더 완벽하게 격리되는 반면 컨테이너는 더 나쁩니다.
여기에 이미지 설명 삽입

1.4 컨테이너 개발 역사

여기에 이미지 설명 삽입

2 도커

컨테이너와 관련하여 모든 사람이 기본적으로 도커를 지칭하는데 왜 다른 사람들은 그렇지 않습니까? docker는 사용하기 쉽고 대부분의 사용자 요구 사항을 해결하기 때문에 그 이유는 매우 간단합니다. 다른 용기는 포장이 불편하고 호환성이 떨어지는 문제가 다소 있습니다. 도커 솔루션은 로컬 어플리케이션만 패키징하는 것이 아니라 로컬 환경(운영체제의 일부)도 함께 패키징하여 로컬 환경과 서버 환경이 완전히 일치하여 진정한 일회성 개발이 가능하도록 합니다. 어디에서나 실행합니다.

Docker는 Apache2.0 프로토콜을 준수하는 Go 언어 및 오픈 소스를 기반으로 하는 오픈 소스 애플리케이션 컨테이너 엔진입니다.

Docker를 사용하면 개발자는 응용 프로그램과 종속성을 가볍고 휴대 가능한 컨테이너로 패키징할 수 있습니다. 그런 다음 널리 사용되는 모든 Linux 시스템에 배포하고 가상화할 수도 있습니다.

컨테이너는 완전히 샌드박스 메커니즘을 사용하고 있으며 둘 사이에 인터페이스가 없으며(iPhone 앱과 유사) 더 중요한 것은 컨테이너의 성능 오버헤드가 매우 낮다는 것입니다.

Docker는 개발 환경, 코드, 구성 파일 등을 이 컨테이너에 패키징하고 모든 플랫폼에 게시 및 적용할 수 있는 가상 환경 컨테이너입니다. 예를 들어 Python을 사용하여 로컬에서 웹 사이트의 배경을 개발하는 경우 개발 및 테스트가 완료된 후 Python3 및 해당 종속 패키지, Flask 및 해당 다양한 플러그인, Mysql, Nginx 등을 컨테이너로 패키징할 수 있습니다. 그런 다음 원하는 환경에 배포하십시오.

docker 및 nvidia-docker
docker는 컨테이너이고 nvidia-docker는 docker를 지원하는 플러그인입니다. 일반 웹 애플리케이션의 경우 nvidia-docker가 필요하지 않습니다.

2.1 도커의 장점

Docker는 애플리케이션을 개발, 제공 및 실행하기 위한 개방형 플랫폼입니다. Docker를 사용하면 애플리케이션을 인프라에서 분리하여 소프트웨어를 신속하게 제공할 수 있습니다. Docker를 사용하면 애플리케이션을 관리하는 것과 동일한 방식으로 인프라를 관리할 수 있습니다. 코드를 신속하게 제공, 테스트 및 배포하는 Docker의 접근 방식을 활용하면 코드 작성과 프로덕션에서 실행 사이의 지연 시간을 크게 줄일 수 있습니다.

1. 애플리케이션을 빠르고 일관되게 제공
Docker는 개발자가 제공하는 애플리케이션 또는 서비스의 로컬 컨테이너를 사용하여 표준화된 환경에서 작업할 수 있도록 하여 개발 수명 주기를 단순화합니다.

컨테이너는 CI/CD(지속적인 통합 및 지속적인 배포) 워크플로에 매우 적합합니다. 다음 예제 시나리오를 고려하십시오.

개발자는 로컬에서 코드를 작성하고 Docker 컨테이너를 사용하여 동료와 작업을 공유합니다.
Docker를 사용하여 애플리케이션을 테스트 환경에 푸시하고 자동 또는 수동 테스트를 수행합니다.
개발자가 버그를 발견하면 개발 환경에서 버그를 수정하고 테스트 및 검증을 위해 테스트 환경에 재배포할 수 있습니다.
테스트가 완료된 후 수정 사항을 프로덕션으로 푸시하는 것은 업데이트된 이미지를 프로덕션으로 푸시하는 것만큼 쉽습니다.

2. 반응형 배포 및 확장
Docker는 이동성이 뛰어난 워크로드를 허용하는 컨테이너 기반 플랫폼입니다. Docker 컨테이너는 개발자의 로컬 시스템, 데이터 센터의 물리적 또는 가상 시스템, 클라우드 서비스 또는 하이브리드 환경에서 실행할 수 있습니다.

Docker의 이식성과 경량성 덕분에 워크로드를 동적으로 쉽게 관리하고 비즈니스 요구 사항에 따라 실시간으로 애플리케이션과 서비스를 확장하거나 축소할 수 있습니다.

2. 동일한 하드웨어에서 더 많은 워크로드 실행
Docker는 가볍고 빠릅니다. 하이퍼바이저 기반 가상 머신에 대한 실행 가능하고 비용 효율적이며 효율적인 대안을 제공하므로 더 많은 컴퓨팅 성능을 활용하여 비즈니스 목표를 달성할 수 있습니다. Docker는 적은 비용으로 더 많은 작업을 수행할 수 있는 고밀도 환경 및 중소형 배포에 이상적입니다.

2.2 컨테이너 및 이미지

Docker의 수명 주기에서 이미지와 컨테이너는 가장 중요한 두 부분입니다. 이미지는 읽기 전용 템플릿인 파일로, 컨테이너 실행에 필요한 데이터가 포함된 독립된 파일 시스템으로 새로운 컨테이너를 생성하는 데 사용할 수 있으며, 컨테이너는 이미지를 기반으로 생성되는 프로세스입니다. , 컨테이너의 프로세스는 이미지의 파일에 따라 컨테이너에 쓰기 기능이 있으며 필요에 따라 내부 소프트웨어 및 구성을 다시 작성할 수 있으며 새 이미지로 저장할 수 있습니다. 가져오기 방식으로 생성된 경우 완전히 새로운 이미지입니다. 커밋 방식으로 생성된 새 이미지를 사용하면 새 이미지와 원본 이미지 간에 상속 관계가 있습니다.
여기에 이미지 설명 삽입

2.3 도커 환경 설치

https://blog.csdn.net/qq_38345468/article/details/110128659
도커 설치

3 도커 시작하기

Docker는 일반적인 프로세스를 사용합니다.
웨어하우스(일반적으로 DockerHub)에서 이미지를 다운로드(풀)하고, Docker는 run 메서드를 실행하여 컨테이너를 가져오고, 사용자는 컨테이너에서 다양한 작업을 수행합니다. Docker는 커밋 메서드를 실행하여 컨테이너를 이미지로 변환합니다. Docker는 login 및 push와 같은 명령을 사용하여 로컬 이미지를 웨어하우스에 푸시(푸시)합니다. 이 이미지는 다른 시스템이나 서버에서 컨테이너를 생성한 다음 해당 애플리케이션을 실행하는 데 사용할 수 있습니다.

Docker 사용자 지정 이미지
Docker 항목 작업

부록:

  1. 도커 공식 홈페이지 https://docs.docker.com/
  2. 도커 허브: https://hub.docker.com/

추천

출처blog.csdn.net/qq_41224270/article/details/128033646