1.1 컨테이너 개요
1.1.1 Linux 컨테이너란?
Linux 컨테이너는 시스템의 다른 부분과 격리된 일련의 프로세스입니다. 이들은 특정 이미지에서 실행되며, 해당 이미지가 프로세스에 필요한 모든 파일을 제공합니다. 컨테이너 이미지는 애플리케이션의 모든 종속성을 포함하므로 개발부터 테스트, 생산까지의 전 과정에서 이동성과 일관성을 보장합니다.
예를 들어 애플리케이션을 개발 중인 경우, 노트북 환경과 특정 구성이 필요할 수 있습니다. 다른 개발자는 약간 다른 환경에서 작업할 수 있으며, 애플리케이션은 현재 구성과 특정 파일에 의존할 수 있습니다. 동시에 표준화된 테스트 및 생산 환경도 존재하며, 자체 구성과 지원 파일 세트를 가지고 있습니다. 이러한 문제를 해결하기 위해 로컬에서 서버 환경을 다시 구축하는 비용 없이 이러한 환경을 모방해야 합니다.
컨테이너는 애플리케이션이 개발, 테스트, 생산 단계를 거치면서 원활하게 실행될 수 있도록 필수적인 설정과 파일을 보장하여 배포 과정에서 문제가 발생하지 않도록 합니다.
1.1.2 컨테이너는 가상화와 동일한가요?
네, 하지만 완전히 동일하지 않습니다. 간단히 말하면:
- 가상화는 여러 운영체제를 단일 시스템에서 동시에 실행할 수 있게 해줍니다.
- 컨테이너는 동일한 운영체제 커널을 공유하며 시스템의 다른 부분과 분리된 상태로 애플리케이션 프로세스를 실행합니다.
이는 더 적은 리소스로 더 많은 애플리케이션을 효율적으로 실행할 수 있음을 의미합니다.
1.1.3 컨테이너의 역사
컨테이너 기술의 개념은 처음으로 2000년대 초반 FreeBSD jail로 등장했습니다. 이 기술은 하나의 FreeBSD 시스템을 여러 하위 시스템으로 나누어 각각 독립적으로 작동하도록 했습니다. 이를 통해 보안 강화와 다중 사용자 간 안정적인 공유가 가능해졌습니다.
그 후, Jacques Gélinas의 VServer 프로젝트를 통해 Linux에서도 유사한 기술이 도입되었습니다. 이후 Linux 컨테이너는 점차 발전하여 오늘날의 형태로 자리 잡았습니다.
1.2 Docker란?
Docker는 다양한 개념을 나타내며, 오픈소스 프로젝트, 도구, 그리고 Docker Inc.라는 회사를 포함합니다. 여기서는 주로 컨테이너화 기술에 초점을 맞추겠습니다.
Docker는 가벼운 가상 머신처럼 컨테이너를 사용할 수 있게 해줍니다. 또한 높은 유연성을 제공하여 컨테이너를 효율적으로 생성, 배포 및 복제할 수 있습니다.
1.2.1 Docker의 작동 방식
Docker는 Linux 커널과 Cgroups, namespaces 등의 기능을 사용하여 프로세스를 격리시킵니다. 이를 통해 독립적으로 실행되는 여러 프로세스나 애플리케이션을 관리할 수 있습니다. 또한 이미지 기반 배포 모델을 제공하여 다양한 환경에서 애플리케이션 또는 서비스 그룹을 쉽게 공유할 수 있습니다.
1.2.2 Docker와 전통적인 Linux 컨테이너의 차이점
초기에는 LXC 기술을 기반으로 했으나 이후 독립적인 경로로 발전했습니다. Docker는 개발자 경험을 개선하고, 컨테이너 생성, 이미지 전송 및 버전 관리를 단순화하는 추가 기능을 제공합니다.
1.3 Docker 설치
환경 설명
두 개의 노드에서 설치 진행
[root@docker01 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@docker01 ~]# uname -r 3.10.0-327.el7.x86_64 [root@docker01 ~]# hostname -I 10.0.0.100 172.16.1.100 [root@docker02 ~]# hostname -I 10.0.0.101 172.16.1.101
설치 명령어
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.reposed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repoyum install docker-ce -y
Docker 기본 명령어
Docker 버전 확인
[root@docker01 ~]# docker version
Client: Version: 17.12.0-ce API version: 1.35 Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:10:14 2017 OS/Arch: linux/amd64Server: Engine: Version: 17.12.0-ce API version: 1.35 (minimum version 1.12) Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:12:46 2017 OS/Arch: linux/amd64 Experimental: false
첫 번째 컨테이너 시작
Nginx 컨테이너 실행
[root@docker01 ~]# docker run -d -p 80:80 nginxUnable to find image 'nginx:latest' locallylatest: Pulling from library/nginxe7bb522d92ff: Pull complete 6edc05228666: Pull complete cd866a17e81f: Pull complete Digest: sha256:285b49d42c703fdf257d1e2422765c4ba9d3e37768d6ea83d7fe2043dad6e63dStatus: Downloaded newer image for nginx:latest8d8f81da12b5c10af6ba1a5d07f4abc041cb95b01f3d632c3d638922800b0b4d
1.3.1 Docker 이미지 관련 명령어
이미지 검색
[root@docker01 ~]# docker search centosNAME DESCRIPTION STARS OFFICIAL AUTOMATEDcentos The official build of CentOS. 3992 [OK] ansible/centos7-ansible Ansible on Centos7 105 [OK]
1.3.2 이미지 가져오기
이미지 다운로드
[root@docker01 ~]# docker pull centosUsing default tag: latestlatest: Pulling from library/centosaf4b0a2388c6: Downloading 34.65MB/73.67MB