TIL 63일차

안광의·2021년 9월 17일
0

Today I Learned

목록 보기
63/64
post-thumbnail

시작하며

오늘은 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼인 Docker에 대해서 학습하고 이미지와 컨테이너를 생성하고 추가적으로 docker-compose와 volume 옵션을 활용하는 스프린트를 진행하였다.

Docker

정의
도커(Docker)는 리눅스 컨테이너(Linux Container) 기술을 기반으로 하는 오픈 소스 서비스로, 도커를 통해 애플리케이션 실행 환경을 코드로 작성할 수 있으며, OS를 컨테이너로 격리화하여 관리할 수 있다.

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

  • 프로세스의 구획화
    • 특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스 할 수 있다.
    • 컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에게 영향을 줄 수 없다.
  • 네트워크의 구획화
    • 기본으로 컨테이너 하나에 IP 주소가 할당되어 있다.
  • 파일 시스템의 구획화
    • 컨테이너 안에서 사용되는 파일 시스템은 구획화되어 있기 때문에 해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한할 수 있다.

image
이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않는다. 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장되고 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남는다.

  • 레지스트리(Registry)
    • Docker Hub : https://hub.docker.com/
    • 도커 이미지를 관리하는 공간입니다.
    • 특별히 다른 것을 지정하지 않는다면, 도커 허브(Docker Hub)를 기본 레지스트리로 설정합니다.
    • 레지스트리는 Docker Hub, Private Docker Hub, 회사 내부용 레지스트리 등으로 나뉠 수 있습니다.

  • 레포지토리(Repository)
    • 레지스트리 내에 도커 이미지가 저장되는 공간입니다.
    • 이미지 이름이 사용되기도 합니다.
    • GitHub의 레포지토리와 유사하게 생각하시면 됩니다.

  • 태그(Tag)
    • 같은 이미지라고 할지라도 버전 별로 안의 내용이 조금은 다를 수 있습니다.
    • 해당 이미지를 설명하는 버전 정보를 주로 입력합니다.
    • 특별히 다른 것을 지정하지 않는다면 latest 태그를 붙인 이미지를 가져옵니다.

Docker-compose
Docker-compose란 복수 개의 컨테이너를 실행시키는 도커 애플리케이션이 정의를 하기 위한 툴로 단일 호스트에 여러개의 컨테이너가 생성되기 때문에 네트워크를 공유하거나 볼륨 데이터를 공유하는 것이 가능하다.

yaml 파일을 생성하여, 컨테이너 명, 사용되는 이미지, 포트번호, 환경변수, 볼륨 등 설정값을 기입하여 docker-compose up을 실행하면 파일에 정의되어 있는 컨테이너가 실행된다.


yaml파일 예시

version: '3.8'

services:
  nginx:
    image: sebcontents/client
    restart: 'always'
    ports:
      - "8080:80"
    container_name: client

  node:
    image: sebcontents/server
    restart: 'always'
    ports:
      - "5000:3000"
    container_name: server
    volumes:
      - "./volumefolder:/data"

  mysql:
    image: mysql:latest
    restart: 'always'
    ports:
      - "3307:3306"
    container_name: database
    environment:
      MYSQL_ROOT_PASSWORD: root_계정_비밀번호
      MYSQL_DATABASE: 초기_생성_데이터베이스
      MYSQL_USER: 유저_이름
      MYSQL_PASSWORD: 유저_패스워드

volume
도커는 하나의 이미지로 부터 여러 컨테이너를 만들기 위해서 Union File system을 사용하는데 유니온 파일 시스템은 원본 이미지에 변경된 내용를 추가하는 방식이므로, 다른 컨테이너에서 사용 할 수 없다. 애플리케이션에 따라서는 데이터를 다른 컨테이너와 공유 하거나 혹은 호스트에서 접근 할 수 있어야 하는 경우가 있는데, 이때 데이터 볼륨을 사용하여 호스트의 파일 시스템을 컨테이너에서 마운트 하는 방식으로 사용할 수 있다.

  • 데이터 볼륨은 호스트 운영체제의 파일 시스템을 사용한다.
  • 데이터 볼륨은 재사용 가능하며, 컨테이너들 간에 공유 할 수 있다.
  • 데이터 볼륨은 호스트에서 직접 접근 할 수 있다.
  • 데이터 볼륨은 기본적으로 컨테이너와 독립적으로 운영되기 때문에 컨테이너가 삭제되도 계속 유지된다.

명령어

docker image pull 이미지_레포지토리:latest : 이미지_레포지토리의 최신 이미지를 받아온다.

docker image ls : 받아온 이미지 리스트를 출력한다.

docker image rm 이미지_레포지토리or이미지 id : 해당 이미지를 삭제한다.(docker rmi와 동일)

docker container run --name 컨테이너_이름 이미지_레포지토리:latest : 컨테이너_이름을 이름으로 갖는 컨테이너에 이미지_레포지토리를 담아 실행한다.

docker container ps -a : 모든 컨테이너 리스트를 출력한다.

docker container cp ./ 컨테이너_이름:컨테이너 경로 : 현재 폴더에 있는 파일을 컨테이너 경로로 복사한다.

docker exec -it 컨테이너_이름 bash : 컨테이너 안에서 bash shell을 실행한다.

docker-compose up : docker-compose.yaml에 정의된 이미지를 컨테이너로 실행한다. (-d 옵션을 함께 사용하면, 컨테이너를 백그라운드로 실행할 수 있다.)

docker-compose down : docker-compose.yaml에 정의된 이미지를 이용해 실행된 컨테이너를 종료한다.

마치며

하나의 컴퓨터에서 다양한 환경을 컨테이너로 분리할 수 있고 필요에 따라 docker-compose와 volume 옵션을 사용하여 컨테이너간 연결할 수 있다는 것이 굉장히 편리하다고 생각한다. 지난번에 배운 AWS의 EC2와 함께 활용한다면 추가적인 인스턴스를 사용할 필요없이 하나의 인스턴스에도 다양한 컨테이너들을 생성하여 필요한 환경에서 데이터베이스를 관리하거나 서버를 실행시킬 수 있을 것이다. docker hub에서 자주 사용했던 환경의 이미지가 어떤식으로 만들어져 있고 옵션은 무엇이 있는지 찾아보면서 깊게 학습할 예정이다.

profile
개발자로 성장하기

0개의 댓글