Docker 개념 및 명령어

f1v3·2024년 7월 21일
1

배포

목록 보기
1/1


1. Docker를 왜 쓸까?

이식성: 특정 프로그램을 다른 곳으로 쉽게 옮겨서 설치 및 실행할 수 있는 특성

한 마디로 쉽게 하자면 “나는 되던데?” 문제를 해결하기 위한 도구이다.

팀원과 함께 MySQL을 설치한다고 가정을 해보자.

나는 정상적으로 MySQL을 설치하였지만, 팀원의 컴퓨터에서는 MySQL 설치 도중 에러가 발생하는 것이다. 둘은 설치 과정을 동일하게 진행했는데도 이런 경우가 발생한다.

이러한 이유는 다양한 이유가 있다. 버전이 다르다거나, 운영체제(Windows, Mac OS 등)가 다르다거나, 컴퓨터에 깔려있는 다른 프로그램과 충돌이 났거나 등등 다양한 이유로 정상적으로 설치가 진행되지 않는 것이다. 설치 과정이 복잡하다면 새 컴퓨터를 사서 MySQL 설치할 때 번거롭고 귀찮다고 느껴진다.

이러한 불편함을 해결하기 위해서 나온 도구가 Docker 인 것이다. Docker 명령어 한 줄로 어떤 컴퓨터에든 MySQL을 설치하고 실행할 수 있게 되는 것이다.

아래와 같은 장점도 있다!

  • 매번 귀찮은 설치 과정을 일일히 거치지 않아도 된다.
  • 항상 일관되게 프로그램을 설치할 수 있다. (버전, 환경 설정, 옵션, 운영 체제 등)
  • 각 프로그램이 독립적인 환경에서 실행되기 때문에 프로그램 간 충돌이 발생하지 않는다.

2. Docker

Docker란 컨테이너를 사용하여 각각의 프로그램을 분리된 환경에서 실행 및 관리할 수 있는 도구이다.


3. 컨테이너

윈도우 환경에서 ‘하나’의 컴퓨터로 ‘여러’ 사용자를 나눠서 사용할 수 있다. 각 사용자의 환경에 따라 ‘독립적’으로 구성이 되어있기 때문에 A 사용자에게 깔려있는 프로그램을 B 사용자는 이용할 수 없다.

컨테이너도 이와 비슷한 개념이다. 하나의 컴퓨터 환경 내에서 ‘독립적인’ 컴퓨터 환경을 구성해서, 각 환경에 프로그램을 별도로 설치할 수 있게 만든 개념이다.

출처: https://www.docker.com/resources/what-container

호스트(host): 도커가 띄운 컨테이너를 관리하는 곳 (컨테이너와 컨테이너를 포함하고 있는 컴퓨터)

컨테이너(Container)의 독립성

컨테이너는 ‘독립적인 컴퓨터 환경’을 가지고 있다.

  • 디스크 (저장 공간): 각 컨테이너마다 각자의 저장 공간을 가지고 있다. A 컨테이너 내부에서 B 컨테이너 내부에 있는 파일에 접근할 수 없다.
  • 네트워크 (IP, Port): 각 컨테이너마다 고유의 네트워크를 가지고 있다.

4. 이미지(Image)란

이미지 = 닌텐도 칩

  1. MySQL 서버를 이미지로 만들었다면, 이 이미지를 Docker로 실행시키는 순간 MySQL 서버가 컨테이너(Container) 환경에서 실행된다. MySQL을 일일히 설치할 필요 없이 MySQL 데이터베이스를 사용할 수 있다.

  2. 다른 예로, 우리의 백엔드 서버를 빌드 후 jar 파일로 만들어 Docker 이미지로 빌드한 후, 이 이미지를 실행시키는 순간 컨테이너 환경에서 Spring Boot Application이 실행이 됩니다.

이미지(Image)는 프로그램을 실행하는데 필요한 설치 과정, 설정, 버전 정보 등을 포함하고 있습니다. 이 말은 즉, 프로그램을 실행하는데 필요한 모든 것을 포함하고 있다!


5. Docker 명령어

5-1. Docker Image

이미지는 docker hub 에서 가져옵니다.

  1. 이미지 다운로드
    • 명령어: docker pull ‘image-name’
      • 이미지마다 버전은 TAG 로 관리된다.
    • 버전을 명시하여 이미지 다운로드: docker pull 'image-name':'tag-name'
    • default: latest
  1. 다운받은 이미지 리스트

    • 명령어: docker image ls
  2. 이미지 삭제

    • 명령어: docker image rm 'image-id' | docker image rm 'imgae-name'
      • 이미지 이름으로 삭제 가능
      • 이미지 ID 값 일부만 입력해도 삭제가 됨!
      • 컨테이너가 띄워져있다면 (중단 되어있더라도) 오류가 발생함.
    • 중단된 이미지 강제 삭제: docker image rm -f 'image-id'
    • 컨테이너에서 사용되지 않은 모든 이미지 삭제: docker image rm $(docker images -q)
      • 위와 같이 -f 옵션을 붙여서 사용 가능

5-2. Docker Container

  1. 컨테이너 생성 → 이미지 기반으로 생성된다.

    • 명령어: docker create ‘image’
    • 컴퓨터를 만드는 과정
    • 이미지가 없다면, Docker hub에서 이미지를 다운받는다.
  2. 생성된 컨테이너 확인

    • 명령어: docker ps -a
  3. 컨테이너 실행

    • 명령어: docker start ‘container-id'
    • container-id는 일부만 입력해도 실행된다.
  4. 컨테이너 중지

    • 명령어: docker stop 'container-id'
      • 안전하게 종료
    • 명령어: docker kill 'container-id'
      • 강제 종료하는 방식
    • container-id는 일부만 입력해도 실행된다.
  5. 컨테이너 삭제

    • 명령어: docker rm 'container-id'
    • container-id는 일부만 입력해도 실행된다.
  6. 생성 및 실행

    • 명령어: docker **run** 'image'
    • 이미지 다운 → 컨테이너 생성 → 컨테이너 실행
      • default: fore-ground 환경으로 실행
      • -d : back-ground 환경 (docker run -d ‘image’ )
        - 포그라운드(fore-ground): 내가 실행시킨 프로그램의 내용이 화면에서 실행되고 출력되는 상태
          - 실시간으로 로그를 확인할 수 있다. / 다른 명령어를 입력할 수 없다.
          
        - 백그라운드(back-ground): 내가 실행시킨 프로그램이 컴퓨터 내부적으로 실행되는 상태
          - 다른 명령어를 입력할 수 있다. / 로그를 실시간으로 확인할 수 없다.
      • --name : docker container 이름 지정 (docker run -d —name web-server ‘image’ )
      • -p : 포트 포워딩 - 컨테이너 접속할 수 있도록 포트를 맞춰주는 과정
        #docker run -d -p [호스트 포트]:[컨테이너 포트] 이미지명[:태그명]
        $ docker run -d -p 4000:80 nginx
        • 도커를 실행하는 호스트의 4000번 포트를 컨테이너 80포트로 연결하도록 설정
  7. 컨테이너 조회

    • 실행중인 컨테이너 조회: docker ps
    • 모든 컨테이너 조회: docker ps -a
  8. 컨테이너 삭제

    • 명령어: docker rm 'container-id'
      • 실행중인 컨테이너는 지울 수 없다.
    • 실행되고 있는 컨테이너 삭제: docker rm -f 'container-id'
    • 중지된 모든 컨테이너 삭제: docker rm $(docker ps -qa)
  9. 컨테이너 로그 조회

    • 백그라운드로 실행시킨 경우 로그를 확인할 때 주로 사용한다.
    • 명령어: docker logs 'container-id' | docker logs 'container-name'
      • --tail '라인 수' : 마지막 기준, 라인 수만큼 출력
      • -f : 실시간으로 로그를 확인할 때 사용
        # 이전의 로그를 제외하고, 현 시점부터 로그를 볼 때
        $ docker logs --tail 0 -f <container-id> 혹은 <container-name> 

참고 강의 : Docker 강의 - JSCODE 박재성

profile
🏃‍♂️‍➡️

0개의 댓글