Docker

  • 컨테이너화된 애플리케이션을 구축, 배포 및 실행하기 위한 오픈 소스 플랫폼
    • 컨테이너는 소프트웨어를 패키징하고 실행하는 데 필요한 모든 것을 포함하는 독립적이고 가벼운 환경
  • 애플리케이션과 해당 종속성을 격리된 환경에서 실행할 수 있음
  • 개발과 배포 프로세스를 단순화하고 일관성을 유지하는 데 도움됨

image

우분투 환경에서 Docker 설치하기

Docker 설치 전 사전작업

  1. 기존에 설치되어있는 오래된 버전 삭제
sudo apt-get remove docker docker-engine docker.io containerd runc
  1. apt 패키지 업데이트 및 apt가 HTTPS를 통해 저장소를 사용할 수 있도록 하는 패키지 설치
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg
  1. Docker의 공식 GPG 키를 추가함
 $ sudo install -m 0755 -d /etc/apt/keyrings
 $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
 $ sudo chmod a+r /etc/apt/keyrings/docker.gpg
  1. 다음 명령을 사용하여 레포지토리를 설정함
$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Docker 설치

  1. 시스템의 패키지 관리자인 Advanced Pacakge Tool(APT)을 사용하여 패키지 목록 업데이트
$ sudo apt-get update
  1. Docker Engine, containerd 및 Docker Compose 설치
 sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Docker 실행

 $ sudo docker run hello-world

Docker CLI

더 많은 Docker CLI : https://docs.docker.com/engine/reference/commandline/cli/

run

  • 새로운 컨테이너를 실행 (Name을 지정하지 않을 경우에는 임의로 생성)
$ docker run hello-world

image

  • run –name : 컨테이너를 실행하면서 컨테이너 이름(NAMES)를 지정함
    • 동일한 name을 가진 컨테이너를 만들 수 없음
$ docker run -- name hello-world_01 hello-world

image

ps

  • 기본적으로 작동중인 docker process를 출력
$ docker ps

image

  • filter
    • https://docs.docker.com/engine/reference/commandlines/ps/
$ docker ps -a -f "name=hello"
$ docker ps -a -f "name=hello-world_[1-3]"

image

  • format
    • filtering 결과에서 원하는 column만 뽑아 볼 수 있음
$ docker ps -af "name=hel" --format "  "

image

rm

  • 컨테이너 제거
$ docker rm <CONTAINER ID|NAMES>

image

rmi

  • 도커의 이미지를 지움
  • 이미지를 사용하는 컨테이너가 존재할 경우 image 삭제 실패 (force option으로 강제 삭제 가능하지만, 작동하는 컨테이너가 깨지므로 추천 x)
$ docker rmi hello-world

image

$ docker ps -af "ancestor=hello-world" --format  | xargs docker rm
$ docker rmi hello-world

image

image

  • ls
    • 명령은 현재 시스템에 있는 도커 이미지를 나열
$ docker image ls

image

  • pull
    • Docker Hub나 다른 Docker 레지스트리에서 지정된 이미지를 로컬 시스템으로 다운로드
    • 당장 run 목적이 아니라, 나중에 run 하거나 build 혹은 save 목적인 경우에 pull을 진행함
$ docker image pull nginx # $ docker pull nginx와 같음

image

  • inspect
    • Docker 이미지의 상세 정보를 확인하는데 사용됨
    • 버전 및 여러가지 정보를 볼 수 있고 format을 이용해서 특정 정보만 확인할 수 있음
$ docker image inspect
$ docker image inspect -f "" nginx

image

  • save
    • Docker 이미지를 아카이브 파일로 저장하는 데 사용
    • 이미지를 단일 파일로 내보낼 수 있으며, 이 파일을 나중에 다른 Docker 호스트로 복원하여 이미지를 다시 로드할 수 있습니다.
$ docker image save nginx > docker_nginx_1.23.4.tar
$ file docker_nginx_1.23.4.tar

image

  • load
    • 저장한 이미지 아카이브 파일을 로드하여 Docker 호스트에 이미지를 복원함
$ docker image load < docker_nginx_1.23.4.tar

image

exec

  • run은 새롭게 컨테이너를 실행하는 명령이지만, exec는 기존에 존재하는 컨테이너에서 실행하는 명령
  • 터미널을 2개 실행한 뒤, 각각 아래의 cli로 docker run을 실행
    • 동일한 Name을 가진 컨테이너를 만들 수 없으므로 2번째 터미널에서 오류가 발생
    • Name을 바꿀 경우 잘 실행 됨
    • 기존에 존재하는 컨테이너에서 실행하기 위해서는 exec를 사용
    • 2개의 프로세스를 하나의 컨테이너에 넣음
$ docker run -it --name ubuntu_top ubuntu "top" "-d 1"

image

$ docker exec -it --name ubuntu_top ubuntu "top" "-d 0.2"

image