다시 이음

API 개발 - Docker 사용하기 본문

AI 일별 공부 정리

API 개발 - Docker 사용하기

Taeho(Damon) 2021. 10. 1. 00:19

 

안녕하세요.

 

오늘은 Docker에 대해서 알아보려고 합니다.

 

간단하게 정의와 제가 이해한 Docker에 대해서 알아보고 어떻게 실행할 수 있는지를 확인해볼게요.

 

Docker가 하는 일

 

- docker는 쉽게 말하면 리눅스 운영체제에서 사용하는 프로그램을 윈도우나 mac과 같은 환경에서 사용할 수 있도록 만들어주는 툴(tool) 입니다.

- 좀 더 살펴보면 어플리케이션 실행 환경을 코드로 작성할 수 있고 OS를 격리화하여 관리하는 기술입니다.

 

- 그러면 왜 docker가 필요할까요?

 

  1. 개발하려고 하는 어플리케이션에 따라 구동하는 운영체제가 서로 다르다면 환경에 따라 조금씩 변경해줘야합니다. 수작업으로 하나하나 운영체제에 따라 변경을 해준다면 너무나 번거롭겠죠.
  2. 방화벽 설정, 사용자 권한 설정, Port 설정등과 같이 각 컴퓨터마다 다양한 설정작업을 수작업으로 맞춰야한다면 오류도 생기고 번거로울 겁니다.
  3. 우리는 웹에서 어느 정보를 가져오려고 연결을 할 때, IP address 와 port number가 필요합니다. 서버가 여러개라면 각각의 ip 주소와 port number를 적용하여 사용하면 되겠죠. 하지만 서버가 하나라면? 이것을 해결할 방법이 리소스의 격리성입니다.
  4. 리소스의 격리성이란, 각 어플리케이션 마다 다른 컴퓨터에서 실행되는 것처럼 IP, Port 등을 다르게 설정할 수 있습니다. 리소스 격리성을 제공하는 기술로는 가상머신, 도커 등이 있습니다. 

 

Linux container

 

리눅스 컨테이너란?

 

- 리눅스 기반의 기술 중에 하나로 필요한 라이브러리와 어플리케이션을 모아서 마치 별도의 서버처럼 구성한 것을 말합니다. 컨테이너를 이루는 네트워크 설정, 환경 변수 등의 시스템 자원은 각 컨테이너가 독립적으로 소유하고 있습니다.

 

 

1. 프로세스의 구획화

  • 특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스 할 수 있습니다.
  • 컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에게 영향을 줄 수 없습니다.

 

2. 네트워크의 구획화

  • 기본으로 컨테이너 하나에 IP 주소가 할당되어 있습니다.

 

3. 파일시스템의 구획화

  • 컨테이너 안에서 사용되는 파일 시스템은 구획화되어 있습니다. 그렇기 때문에 해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한할 수 있습니다.

 

 

여기서 간단하게 docker 안에서 사용되는 데이터에 대해서 좀 알아볼게요.

 

Docker의 데이터는 레지스트리 > 레포지토리 > 태그 로 분화됩니다.

 

 

레지스트리(Registry)

  • Docker Hub : https://hub.docker.com/
  • Docker Hub는 Git hub와 비슷합니다. 도커의 이미지가 관리되는 공간입니다.

레포지토리(Repository) or 이미지(Image)

  • 레지스트리 내에 도커 이미지가 저장되는 공간입니다.

태그(Tag)

  • 해당 이미지를 설명하는 버전 정보를 주로 입력합니다.

 

즉, docker hub에서 개발자 혹은 작성자가 올린 레지스트리 계정안에 레포지토리 혹은 이미지가 저장되어 있고 그것에는 태그라는 것이 부착되어 있습니다.

 

그래서 우리는 git hub에서 사용할 때와 마찬가지고 pull이라는 명령을 통해 이미지를 받아올 수 있습니다.

 

 

Docker의 프로세스

 

docker을 활용하려면 아직 하나 더 알아보고 가면 좋을 것 같습니다.

 

 

1. docker hub에 있는 레지스트리에서 레포지토리,이미지를 pull해옵니다.(docker pull)

2. 불러온 이미지를 컨테이너(실행) 합니다.

3. 혹은 HOST에서 파일을 복사해 와서 이미지에 적용함으로써 실행할 수도 있습니다.

4. 그렇게 실행된 결과를 하나의 이미지로 저장을 합니다.(commit)

5. 커밋된 이미지를 실행하기 위해서는 다시 컨테이너 해야합니다.

 

이 과정 외에도 서버와 연결과 같은 과정도 있지만 오늘은 기초이기에 넘어가도록 하겠습니다.

 

 

docker 실습

 

사용하려면 먼저 설치를 해야겠죠?

 

docker 홈페이지 https://www.docker.com/ 에 접속하여 운영체제에 맞는 docker를 설치해주세요.

 

위의 사진과 같이 dock을 보면 docker가 생겼고 녹색불과 "Docker Desktop is running"이라는 문구가 뜨는데 이렇게 표시가 되면 정상적으로 작동하고 있다는 걸 뜻합니다.

 

# 도커 레지스트리에서 docker라는 사용자가 배포한 whalesay라는 이미지에서 latest태그인 것을 가져온다.
docker image pull docker/whalesay:latest
#도커 이미지 리스트 출력
docker image ls
#도커 컨테이너(실행)
docker container run --name myName docker/whalesay:latest cowsay boo
#도커 컨테이너 된 리스트 출력
docker container ps -a
#도커 컨테이너, 이미지 삭제
docker container rm myName
docker image rm docker/whalesay:latest

#웹 서버를 연결해서 호스트에 있는 파일을 복사하여 웹서버에서 실행하기
#웹 서버 연결(-p는 post number를 지정)
docker container run --name my_web --rm -p 818:80 httpd
#파일 복사(docker container cp [복사(ctrl-c) 경로] [복사(ctrl-v) 컨테이너이름]:[복사할 경로]
#호스트에서 컨테이너로 복사
docker container cp ./ my_web:/usr/local/apache2/htdocs/
#컨테이너에서 호스트로 복사
docker container cp my_web:/usr/local/apache2/htdocs/ ./
# -- 현재상태로 127.0.0.1:818로 접속하면 결과가 실행된다.

#위의 과정을 단축하여 다시 이미지로 저장하기(commit)
docker container commit my_web(현재 실행되는 컨테이너) my_job:1.0(새로 설정할 이미지 이름과 태그)

#컨테이너로 다시 시작
docker container run -it --name my_repogitory --rm(일회성) my_job:1.0

httpd 웹 서버

위의 코드에서 사용된 이미지는 httpd(http daemon) 입니다. httpd(http daemon)은 Apache HTTP Server 를 실행할 수 있는 오픈소스 웹 서버 소프트웨어 입니다.

httpd 는 /usr/local/apache2/htdocs/ 경로에 웹 서버와 관련된 파일들이 저장되어 있다면, 해당 파일을 기반으로 웹 서버가 실행됩니다.

 

 

위의 코드를 통해서 우리는 

이와 같은 이미지를 실행할 수 있었습니다.

 

 

문과적인 저에게는 너무 충격적이었습니다ㅎㅎㅎ

 

docker hub에서 다른 이미지를 사용한다면 더 다채로운 결과를 확인할 수 있을 것 같네요.