docker compose 여러 컨테이너 조작

docker swarm 여러 머신에서 컨테이너들 실행할 수 있도록

(docker swarm. 이거보다는 쿠버네티스 많이 씀.)

 

컨테이너 가상화 : [app + 라이브러리/프레임워크]

 라이브러리 vs 프레임워크

 

Container : h/w - os - container engine - app/lib 이렇게 올라가 있는데

 

그럼 Container Engine이 뭐임?

같은 커널 위에서 여러 instance를 관리하는 넘.

 

Container engines can run multiple, isolated instances, known as containers, on the same operating system kernel. Containers perform virtualization at the operating system level, and provide a controllable, easily manageable environment for running applications and dependencies.

 

Docker가 사용하는 리눅스 컨테이너 기술

CGroups

프로세스 또는 쓰레드를 그룹화하여 관리하는 기능과 리소스 사용을 제한하는 기술

 

Namespace

하나의 하드웨어를 다수의 오브젝트가 사용할 수 있도록 관리하는 기술

ex. 네트워크 카드를 여러 개의 프로세스에서 쪼개서 사용할 때

 

Namespace 종류

Network Namespace : Namespace에서 독립된 네트워킹 사용

PID Namespace : Namespace에서 독립된 PID 사용

UID Namespace : Namespace 독립된 UID 사용 (Namespace마다 UID를 중복해서 사용할 수 있다는 뜻)

UTS Namespace : Namespace에서 독립된 호스트 네임 사용

IPC Namespace : Namespace에서 독립된 IPC 사용

 

결론적으로 컨테이너 가상화 기술들은 리눅스의 컨테이너 기술을 통해서 구현이 되어있다.

 

Docker의 주요 특징

이식성이 좋다.

서버를 코드 형태로 정의할 수 있다.

Docker 사용시 컨테이너를 실행하며 컨테이너는 이미지를 기반으로 실행된다.

컨테이너 이미지를 코드 형태로 정의할 수 있음.

 

이식성

개발 환경, 테스트 환경, 서비스 환경을 통일하여 운영할 수 있음.

 

상호 운용성(?) 머지 이거

AWS, Azure, GCP, Redhat Openshift(오픈소스) 다양한 벤더사가 지원해서 다양한 환경에   사용 가능

 

Docker Daemon, Docker Client

 

컨테이너 이미지

컨테이너의 애플리케이션 및 애플리케이션을 실행하기 위한 라이브러리 등을 포함하는 단위로 컨테이너를 실행하기위해 반드시 필요함

 

컨테이너

컨테이너 이미지가 실행되는 형태로 컨테이너 이미지가 메모리에 로드되면 컨테이너가 실행됨

애플리케이션, 라이브러리, 컨테이너 실행 데이터를 포함함

일반적으로 하나의 애플리케이션을 포함하고 실행함

 

레지스트리 (저장소)

컨테이너 이미지가 저장되는 저장소

대표적인 도커 레지스트리는 도커 허브

 

레포지토리(Repository)
 컨테이너 이미지가 업로드 된 공간
 일반적으로 "Docker_Hub_계정/이미지_이름:태그"
 Official Image는 Docker Hub 계정이 생략됨

 

레즈스트리 안에 레포지토리가 있군! ㅎ

 

도커 기능

- 이미지 생성 (명령어 or Dockerfile)

- 이미지 공유

- 컨테이너 생성

 

Q) 컨테이너는 가상머신이랑 다르게 호스트 OS를 사용한다고 하셨는데, 호스트 OS가 윈도우라도 리눅스 기반 컨테이너를 사용할 수 있나요?

-> 기본적으로 Docker는 Linux에서 돌아가는 것이 기본. 하지만 윈도우에서 실행할 수도 있다.

윈도우에서 사용하는 방법?

Docker Toolbox (가상머신으로 Docker Container 실행)

윈도우에서도 Docker Container 실행할 수 있는 방법 있음.

근데 보통은 리눅스 환경에서 실행하는 것이 보통.

 

도커는 go로 만들었대.

LXC를 더 발전시킨 것.

 

--- Docker 설치 ----

su -
yum install epel-release
cd /etc/yum.repos.d
wget https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io

-> conntainerd.io의 경우, 기존에는 docker container를 썼는데, 이제는 표준화된 container를 써서 이걸루 하는거임.

systemctl status docker.service
systemctl start docker.service
systemctl enable docker.service

usermod -aG docker devops (root로 docker를 할 때도 있지만, 일반 사용자도 많이 이용함. 그럴 때는 docker group에 추가시켜주면 됨. 근데 등록한다고 바로 적용되는게 아니고 logout하고 다시 들어가면 적용됨.)

--------------

Docker 명령어

Docker 정보 확인
$ docker infoDocker Version 확인 (여기서 Kernel version도 확인 가능. = uname -r)
$ docker version

Docker 이미지 목록 확인
$ docker images

Docker 이미지 검색
$ docker search IMAGE


[root@localhost ~]# docker search centos
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos/systemd                    systemd enabled base container.                 105                  [OK]
centos                            The official build of CentOS.                   0         [OK]       


Docker 컨테이너 실행 
$ docker container  run  --name  CONTAINER  IMG_REPOSITORY:TAG  [COMMAND]

CentOS 7 컨테이너 실행(제어 터미널 사용)
$ docker container run  -it  --name CONTAINER IMG_REPOSITORY:TAG

 

#shell을 가지고 실행하는 것과 terminal을 가지고 실행하는 것이 좀 다르다.

Docker 컨테이너 목록 확인
$ docker container ls
$ docker ps

종료된 컨테이너 목록 확인 (도커는 컨테이너 종료해도 바로 지워지지 않고 남아있음)
$ docker container ls -a
$ docker ps -a (옛날 명령어. 직관적이지 않다고 해서 새롭게 container ls 이렇게 새롭게 추가됐대)

CentOS 7 컨테이너 실행(제어 터미널 사용)
$ docker container run -it --name centos7_1 centos:7

(다른 터미널에서) 실행 중인 컨테이너 종료
$ docker container ls

$ docker container stop { CONTAINER_NAME | CONTAINER_ID }

$ docker container ls
$ docker container ls -a

컨테이너에서 프로세스 실행(제어 터미널 사용)
$ docker exec -it CONTAINER COMMAND

컨테이너 안의 프로세스가 종료되면 컨테이너도 종료된대.

 

 

Q1)

attach 명령어와의 차이점?

attach는 컨테이너에서 출력되는 내용을 보는거래.

이거는 log 같은거 띄워서 볼 때 하는거라는디... 

작업같은거 할 때는 정상 작동 안할 수 있어서 작업할 때는 exec -it ddd_container /bin/bash 이렇게 하는게 맞대.

 

Q2)

host os 공유해서 컨테이너 실행하면 굳이 OS 이미지 필요 없는거 아냐?

컨테이너에서 os 이미지를 사용하는 이유?

그렇게 만들게 되면, 뭔가 문제가 생겼을 때, 컨테이너 안에서 작업을 할 수가 없게 돼.

근데 물론 그런 도구들 다 제외하고 실행에 필요한 것들만 올려서 사용할 수도 있어. (그럼 컨테이너 사이즈가 더 줄겠지)

그리구 컨테이너 os 이미지 사이즈 보면, 일반적인 iso 파일보다 용량이 작아.

즉, 모든게 다 있는건 아니고 아주 필수적인 것만 컴팩트하게 있는거야.

host os의 커널을 빌려서 사용하지만, 뭔가 작업에 필요한 최소한의 도구 (압축 풀기, 복사, 등등)는 필요하기 때문에 os 이미지를 사용한다.

 

정리하면) 컨테이너 안에서 작업을 하기 위해서 최소한의 도구가 필요하고, 그래서 필요한 도구가 갖춰진 os 이미지 사용. (OS 자체가 아니고 명령어들만 조금 들어가있는거야.) 그런 것 필요 없이, 서비스만 돌리고 싶으면 라이브러리만 넣어두는거고.

 

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기