본문 바로가기
코드 스테이츠

Docker

by 한휘용 2023. 7. 19.
728x90

사전 Docker 설치

Window 유저 Doker Desktop 설치

MacOs 유저 Doker Desktop 설치

 

Docker 설치를 확인하려면 cmd 관리자에서

  • Windows, Mac : docker --version
  • Ubuntu : sudo docker --version

위 와 같이 입력하고 결과 값을 보면 된다.

도커 설치 확인 결과 값

 

컨테이너

컨테이너를 생각하면 보통 무역항이나 화물선에서 볼 수 있는 물건을 보관하는 컨테이너를 떠올릴 것입니다.

이러한 컨테이너는 물건을 옮길때 큰 이점을 가집니다. 예를 들어 물자를 컨테이너에 넣어서 이동한다면

  • 물자를 싣고 내릴 때 선박이 입항해 있는 시간을 획기적으로 단축시켜준다.
  • 물자를 싣고 내릴 때 필요한 인력(분류하는 사람, 짐 옮기는 사람, 감독하는 사람)을 대폭 감소시킨다.

위 두 가지 이점을  가져갈 수 있겠죠.

 

개발자들은 이와 같이 물자의 수송에 획기적인 단축을 가져다준 컨테이너 기술을 "소프트웨어 수송, 즉 배포에 사용할 수는 없을까?" 하는 생각을 하기 시작했습니다. 그 결과 리눅스 컨테이너(lxc)라는 것을 만들게 됩니다.

 

리눅스 컨테이너 기술은 그 자체로 훌륭하고 완성된 기술이었지만 애플리케이션을 쉽게 컨테이너화할 수 있는 생태계 혹은 커뮤니티가 없었습니다. 2013년에 등장한 도커(Docker)는 바로 Docker Hub라는 소프트웨어 저장소와 함께 빠르게 성장했고 그 결과 개발자들은 쉽게 애플리케이션을 포장하고, 컨테이너 방식으로 실행할 수 있게 되었습니다.

 

컨테이너 방식의 최대 장점은 환경의 영향을 받지 않고 독립적인 컨테이너 단위로 사용될 수 있다는 점입니다.

도커 아이콘 이미지

 

 

도커 컨테이너

도커는 애플리케이션을 컨테이너 기술을 이용해 빠르게 배포하고 실행할 수 있도록 도와주는 오픈소스 플랫폼입니다.

 

도커 컨테이너(Docker Container)는 도커 이미지를 바탕으로 생성된 가볍고 독립적인 실행 단위입니다.

도커 컨테이너는 호스트 OS와 다른 컨테이너와 격리되어 있으며, 필요에 따라 자원을 할당받아 실행됩니다. 이렇게 생성된 도커 컨테이너는 마치 가상머신처럼 동작하지만, 오버헤드가 적기 때문에 가볍고 빠르게 실행됩니다.

 

도커 이미지와 도커 컨테이너는 애플리케이션을 배포하고 실행하는 데 매우 유용한 기술입니다. 도커를 사용하면 애플리케이션을 더욱 쉽고 빠르게 배포할 수 있으며, 호스트 OS와 다른 컨테이너와 격리되어 있기 때문에 더욱 안전하게 실행됩니다.

 

도커 컨테이너 생성

 

도커 컨테이너는 이미지를 통해 생성할 수 있습니다.

$ docker run -it --name mycontainer -p 8080:8080 openjdk:11
  • docker run : 도커 컨테이너를 생성하고 실행하는 명령어
  • -it : 컨테이너와 상호작용을 위해 표준 입력(stdin)을 연결합니다. (컨테이너를 대화형 모드로 실행)
  • --name mycontainer : 컨테이너의 이름을 "mycontainer"로 지정합니다. 필요에 따라 다른 이름으로 변경할 수 있습니다. (—name 옵션 미 입력 시 도커에서 랜덤으로 지정)
  • -p 8080:8080 : 호스트의 8080 포트와 컨테이너의 8080 포트를 매핑합니다. 이렇게 하면 호스트의 8080 포트로 들어오는 요청이 컨테이너의 8080 포트로 전달됩니다.
  • openjdk:11 : 이미지를 통해 컨테이너를 만들게 되는데 사용할 베이스 이미지를 지정합니다. (여기서는 OpenJDK 11 이미지를 사용)

 

옵션

  • -d : 컨테이너를 백그라운드에서 실행합니다.
  • -i : 컨테이너와 상호작용을 위해 표준 입력(stdin)을 연결합니다.
  • -t : TTY(터미널)을 연결합니다.
  • -p <호스트 포트>:<컨테이너 포트> : 호스트 포트와 컨테이너 포트를 연결합니다.
  • -P : 호스트와 컨테이너 포트를 랜덤으로 연결합니다.
  • --name <컨테이너 이름> : 컨테이너의 이름을 설정합니다.
  • --rm : 컨테이너가 종료될 때 자동으로 삭제합니다.
  • -v <호스트 경로>:<컨테이너 경로>: 호스트와 컨테이너의 디렉터리를 연결합니다.
  • -e <환경변수>: 컨테이너 내부의 환경변수를 설정합니다.
  • --link <다른컨테이너 이름>:<별명>: 다른 컨테이너와 연결합니다.
  • --network <네트워크 이름>: 컨테이너가 속한 네트워크를 설정합니다.
  • --expose <포트>: 컨테이너의 포트를 노출합니다.
  • --entrypoint <명령어>: 컨테이너가 시작될 때 실행될 명령어를 설정합니다.
  • --user <사용자>: 컨테이너 내부에서 실행될 사용자를 설정합니다.
  • --restart <정책>: 컨테이너 재시작 정책을 설정합니다.

 

  • openjdk:11 이미지를 가지고 있지 않습니다.
    • 도커 Hub를 통해 해당 이미지를 Pulling 하고 있습니다.
  • 이미지를 설치하고 해당 이미지를 통해 컨테이너가 만들어지면 jshell을 입력할 수 있게 됩니다.
    • 실행한 자바 컨테이너에서 자바 코드를 입력하고 실행할 수 있습니다.
    • ex) System.out.println("Hello Docker!");
    • for 문 등 자유롭게 연습해 보세요!
  • 컨테이너를 종료해 보세요.
    • Ctrl + D 입력
    • Docker Desktop에서 컨테이너 출력 결과를 확인할 수 있습니다.

 

 

컨테이너 시작하기

 

컨테이너를 시작하려면, docker start 명령어를 사용합니다. 다음과 같은 형식으로 입력합니다.

$ docker start [컨테이너 이름 또는 ID]

mycontainer라는 이름의 컨테이너를 시작하려면 다음과 같은 명령어를 입력합니다.

$ docker start mycontainer

docker start 명령어는 도커 컨테이너를 시작하는 데 사용됩니다. 다음과 같은 옵션을 사용할 수 있습니다.

  • -a, --attach : 컨테이너와 터미널을 연결합니다. 터미널에 연결되어 컨테이너의 출력을 볼 수 있습니다.
  • -i, --interactive : 컨테이너와 상호작용을 위해 표준 입력(stdin)을 연결합니다.
  • -p, --publish : 호스트와 컨테이너 포트를 연결합니다.
  • -d, --detach : 컨테이너를 백그라운드에서 실행합니다.
  • -e, --env : 컨테이너 내부의 환경변수를 설정합니다.
  • -u, --user : 컨테이너 내부에서 실행될 사용자를 설정합니다.
  • -a, --attach : 컨테이너 출력을 표시합니다.

위와 같은 옵션을 사용하여 컨테이너를 시작할 수 있습니다.

 

컨테이너 중지하기

 

컨테이너를 중지하려면, docker stop 명령어를 사용합니다. 다음과 같은 형식으로 입력합니다.

$ docker stop [컨테이너 이름 또는 ID]

 

예를 들어, mycontainer라는 이름의 컨테이너를 중지하려면 다음과 같은 명령어를 입력합니다.

$ docker stop mycontainer

 

docker stop 명령어는 도커 컨테이너를 중지하는 데 사용됩니다. 다음과 같은 옵션을 사용할 수 있습니다.

  • t, -time: 컨테이너가 종료되기까지 대기하는 시간을 지정합니다. 기본값은 10초입니다.
  • -time-format: 대기 시간의 형식을 지정합니다. 기본값은 "s"입니다.

위와 같은 옵션을 사용하여 컨테이너를 중지할 수 있습니다.

  • 종료된 컨테이너를 다시 실행하는 명령어
    • docker start mycontainer : 이름 (mycontainer)를 통해 컨테이너를 다시 실행할 수 있습니다.
      • 도커 데스크톱에서 컨테이너가 실행되는 결과를 확인할 수 있습니다.
      • 하지만 이전처럼 터미널에서 jshell을 입력할 수 없습니다.
    • docker stop mycontainer : 이름 (mycontainer)를 통해 컨테이너를 다시 실행할 수 있습니다.

 

docker start -ai mycontainer

  • 종료된 컨테이너를 다시 시작하며 -a & -i 옵션을 사용하여 컨테이너에 접속합니다.
  • 컨테이너가 시작되고 터미널에 접속되면 jshell을 실행합니다.
  • 옵션 2개를 붙여서 -ai로 사용할 수 있습니다. (표준 입력을 유지하여 컨테이너 내부에서 터미널 입력을 받을 수 있도록 설정)

 

도커 컨테이너 목록

 

도커 컨테이너 목록을 확인하려면, docker ps 명령어를 사용합니다.

$ docker ps

실행 중인 도커 컨테이너 목록

현재 실행 중인 도커 컨테이너 목록을 확인할 수 있습니다.

  • 가장 기초적인 도커 명령어
  • 컨테이너 정보를 출력하고 싶을 때 사용합니다.
  • 별도의 옵션을 사용하지 않는 ps 명령어는 가동 중인 컨테이너만 출력해 줍니다.

docker stop mycontainer 실행 후 docker ps를 실행해 보세요.

출력되는 컨테이너 목록 정보

  • CONTAINER ID: 컨테이너의 고유 ID 정보
  • IMAGE: 컨테이너가 생성된 이미지 정보
  • COMMAND: 컨테이너에서 실행된 명령어 정보
  • CREATED: 컨테이너가 생성된 시간
  • STATUS: 컨테이너의 상태 정보
  • PORTS: 컨테이너에서 실행 중인 포트 정보
  • NAMES: 컨테이너의 이름 정보

 

도커 옵션

 

  • -a, -all : 모든 컨테이너 목록을 출력합니다.
  • -f, --filter : 원하는 리스트를 필터링을 통해 출력할 수 있는 명령어입니다.
    • name, label 등을 붙인 컨테이너를 출력할 때 사용할 수 있습니다.
id 컨테이너 ID
name 컨테이너 이름
label 커맨드에서 붙인 라벨
exited 종료된 컨테이너의 종료 코드
예) -f "exited=0"
status 컨테이너의 상태
예) created, restarting, running 등
-f "status=created"
ancestor 이미지를 공유받은 컨테이너
예) -f "ancestor=example"
<image-name>[:<tag>], <image id> 또는 <image@digest>로 표현
before 설정 컨테이너를 기준으로 전에 만들어진 컨테이너 확인
예) -f "before=example"
since 설정 컨테이너를 기준으로 이후에 만들어진 컨테이너 확인
예) -f "since=example"

필터는 다양한 사용이 가능하다

  • 옵션 -a와 -f를 붙여 -af로 사용할 수 있습니다.
  • “name=mycontainer”와 name=mycontainer는 같은 결과를 출력합니다.
  • -a 옵션을 사용하지 않고 -f의 status를 이용해 종료된 컨테이너를 출력해 보세요.
  • -n, --last : 최근 생성한 n개의 컨테이너 목록을 출력합니다.
  • --format : 출력할 정보의 포맷을 지정합니다.
  • --no-trunc : 모든 정보를 출력합니다.
  • --quiet, -q : 컨테이너 ID만 출력합니다.

 

도커 컨테이너 삭제

컨테이너를 삭제하려면, docker rm 명령어를 사용합니다. 다음과 같은 형식으로 입력합니다.

$ docker rm [컨테이너 이름 또는 ID]

 

예를 들어, mycontainer라는 이름의 컨테이너를 삭제하려면 다음과 같은 명령어를 입력합니다.

$ docker rm mycontainer

 

docker rm 명령어는 도커 컨테이너를 삭제하는데 사용됩니다. 다음과 같은 옵션을 사용할 수 있습니다.

  • -f, --force: 실행 중인 컨테이너를 강제로 삭제합니다.
  • -l, --link=false: 해당 컨테이너를 참조하는 링크를 제거합니다.
  • -v, --volumes=false: 컨테이너와 관련된 볼륨을 제거합니다.
  • -n, --name: 컨테이너의 이름을 지정합니다.
  • -q, --quiet: 컨테이너의 ID만 출력합니다.
  • --help: 도움말을 출력합니다.

위와 같은 옵션을 사용하여 컨테이너를 삭제할 수 있습니다.

 

도커 저장소

도커 저장소는 도커 이미지를 저장하고, 관리하며, 공유할 수 있는 곳입니다. 여러분이 만든 도커 이미지를 저장소에 등록하면, 다른 사람들도 해당 이미지를 다운로드하여 사용할 수 있습니다. 이는 서버 배포, 애플리케이션 배포 등 다양한 용도로 사용됩니다.

 

 

도커 저장소의 종류

도커 저장소는 크게 Docker Hub, Private Registry, Public Registry 세 가지로 나뉩니다.

  • Docker Hub
    • Docker Hub는 도커에서 제공하는 공식 저장소입니다. 무료로 사용할 수 있고, 개인적으로 사용하는 것뿐만 아니라 공개적으로 이미지를 공유할 수 있습니다. Docker Hub는 이미지를 검색하고 다운로드할 수 있는 검색 엔진도 제공합니다.
  • Private Registry
    • Private Registry는 비공개 저장소로서, 회사나 조직 내에서 도커 이미지를 공유할 목적으로 구축합니다. 회사나 조직 내부에서만 접근이 가능하며, 보안성이 높습니다.
  • Public Registry
    • Public Registry는 공개 저장소로서, 누구나 이미지를 등록하고 공유할 수 있습니다. Public Registry에서는 누구나 이미지를 검색하고 다운로드할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

728x90

'코드 스테이츠' 카테고리의 다른 글

OAuth 2  (0) 2023.07.18
JWT(JSON Web Token)  (0) 2023.07.14
세션 기반 자격 증명 방식 / 토큰 기반 자격 증명 방식  (0) 2023.07.13
Spring Security - 보안  (0) 2023.07.10
테스팅(Testing) - 단위 테스트  (0) 2023.06.28