Docker Seminar는 프레젠테이션 형식이 아닌 연습 문제입니다.
하나. Node.js 컨테이너를 빌드하고 Docker Hub에 배포
2. Ubuntu 기반 웹 서버 컨테이너를 빌드하고 Docker Hub에 배포
이 두 가지 작업을 진행하기 전에 먼저 Docker가 무엇인지 이해하고 싶습니다.
도커를 사용하는 이유?
일반적인 프로그램 설치에 대해 생각해 봅시다.
Docker를 다운로드할 때 운영 체제 환경에 적합한 설치 프로그램을 찾아야 합니다. 그리고 다운로드한 프로그램에 의존하는 프로그램을 설치해야 하는 경우 먼저 설치해야 합니다. 하지만 도커는 다릅니다. 운영 체제 환경에 독립적 도커 실행 – 레디스 명령으로 다운로드하면 완료됩니다.
모든 프로그램을 컨테이너로 변환하여 어디에서나 실행할 수 있기 때문에 Docker를 사용합니다.
도커
Linux 컨테이너를 기반으로 특정 서비스를 패키징하고 배포하는 데 유용한 오픈 소스 프로그램입니다.
Docker는 Docker가 설치된 위치에 관계없이 컨테이너를 사용하여 애플리케이션을 쉽게 구축, 확장 및 실행할 수 있도록 설계된 오픈 소스 컨테이너 기반 가상화 플랫폼입니다.
Docker는 Linux의 네임스페이스와 cgroup을 사용하여 컨테이너라고 하는 가상 격리 환경을 생성합니다.
네임스페이스와 cgroup의 컨테이너를 LXC라고 합니다.
● 가상화
물리적인 하드웨어를 논리적으로 추상화하는 것
서버에서 많은 리소스는 특정 피크 시간에만 집중적으로 사용되며, 다른 시간에는 평균적으로 실제 용량의 20% 미만이 사용됩니다. 사용하지 않는 자원의 80%가 낭비됩니다. 따라서 낭비되는 리소스의 80%에 다른 서버를 실행하여 리소스 활용을 극대화하는 것이 목표입니다. 따라서 CPU, 메모리, 스토리지, 네트워크 등을 가상화하여 사용합니다.
● 네임스페이스
프로세스를 독립적으로 만드는 가상화 기술
시스템 등과 독립적인 모든 컨테이너에서 프로세스를 실행할 수 있습니다. 프로세스별로 리소스 사용을 분리합니다.
VM에서는 하드웨어 리소스 자체가 가상화되어 각 게스트에 독립적인 저장 공간을 제공하고 경합을 피할 수 있지만 네임스페이스의 경우 리소스가 Linux에서 가상화됩니다.
| PID(프로세스 ID) | 프로세스에 할당된 고유 ID(독립 프로세스 공간 할당) |
| NET(네트워크) | 네트워크 인터페이스 관리 |
| IPC(프로세스 간 통신) | 공유 커뮤니케이션 리소스 관리 |
| MNT(마운트) | 파일 시스템 마운트 지점 관리(다른 네임스페이스로 액세스 불가) |
| 유닉스 시분할(UTS) | 호스트네임, 도메인네임 관리 |
컨테이너에 접속하여 PID 값을 알아보세요.

VSCode의 터미널을 사용했습니다.
1) docker exec -it { 컨테이너 ID } /bin/sh로 컨테이너에 접속
2) ps명령어로 현재 시스템에서 돌고 있는 프로세스를 알아본다.
3) 각각의 PID를 확인 할 수 있다.
● cgroups(제어 그룹)
프로세서, 메모리. 네트워크, 장치 및 I/O와 같은 리소스를 제어할 수 있는 Linux 커널의 기능입니다.
Docker 컨테이너는 여러 컨테이너와 물리적 하드웨어의 리소스를 공유합니다. 이 시점에서 Linux 커널의 cgroup은 리소스 할당을 관리하는 데 사용됩니다. 프로세스와 스레드를 그룹화하여 그룹별로 CPU, 메모리 등 리소스 사용을 제한할 수 있습니다. cgroups를 사용하면 하나의 컨테이너가 다음과 같은 다른 컨테이너에 영향을 미치는 것을 방지할 수 있습니다. B. 자원의 독점.
● 유니온 파일 시스템
가볍고 빠른 읽기 전용 계층으로 구성된 Docker 엔진에서 사용하는 파일 시스템입니다.
UFS를 사용하는 이유는 다음 포스팅에서 확인하세요!
UFS는 하나의 파일 시스템에 여러 파일 시스템을 마운트하는 기능입니다. 여러 파일 시스템을 하나로 결합하면 나중에 UFS가 마운트된 파일로 덮어쓰는 중복 파일이 생성됩니다.
Docker를 사용하면 이미지와 독립적으로 여러 컨테이너를 실행할 수 있습니다. 단일 이미지에서 빌드된 컨테이너가 동일한 파일 시스템을 공유하는 경우 컨테이너는 어떻게 독립적으로 실행됩니까?
UFS에서 새 레이어가 기존 레이어 위에 쌓이면 하위 레이어는 읽기 전용이 됩니다. 상위 레이어가 하위 레이어에 쓰기를 해도 하위 레이어가 복사되어 사용되기 때문에 상위 레이어는 하위 레이어에 영향을 미치지 않습니다.
Docker에서 레이어는 크게 컨테이너 레이어(상단)와 이미지 레이어(하단)로 나뉩니다. UFS의 특성상 컨테이너가 파일 시스템에 쓰기를 하면 하위 레이어 복사본에서 해당 작업을 수행하므로 다른 컨테이너가 하위 레이어를 공유하더라도 독립적인 파일 시스템 작업이 가능하다.
리소스
https://anweh.67
https://kimjingo.38
https://velog.io/@koo8624/Docker-Union-File-System-Union-File-System