kimyu0218
  • [docker] docker CLI (컨테이너/볼륨/네트워크)
    2024년 03월 03일 19시 15분 26초에 업로드 된 글입니다.
    작성자: @kimyu0218

    컨테이너

    생성하기: run & create

    run

    Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    Create and run a new container from an image

    `run`은 이미지로부터 컨테이너를 생성하고 실행하는 명령어다. 로컬에 이미지가 없는 경우, 도커 이미지를 `pull`한 뒤 컨테이너를 생성`create`하고 시작`start`한다.

     

    create

    Usage:  docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    Create a new container

    `create`는 이미지로부터 컨테이너를 생성하는 명령어다. `run`과 달리 생성된 컨테이너를 시작하지 않는다.

    💡 컨테이너의 기본 사용자는 root이며 호스트 이름은 무작위 16진수 해시값이다.

    목록 확인하기: ps

    Usage:  docker ps [OPTIONS]
    
    List containers

    `ps`는 실행중인 컨테이너를 출력하는 명령어다. 정지된 컨테이너를 포함한 모든 컨테이너를 출력하기 위해서는 `-a` 옵션을 추가해야 한다.

    Options:
      -a, --all             Show all containers (default shows just running)
    • CONTAINER ID : 컨테이너 아이디
    • IMAGE : 컨테이너를 생성할 때 사용된 이미지
    • COMMAND : 컨테이너가 시작될 때 실행될 명령어
    • CREATED : 컨테이너가 생성된 후 흐른 시간
    • STATUS : 컨테이너의 상태 (Up 실행중 / Exited 종료 / Pause 정지)
    • PORTS : 컨테이너가 개방한 포트와 호스트에 연결한 포트들의 배열
    • NAMES : 컨테이너의 고유한 이름으로 `--name` 옵션으로 지정하지 않았다면 무작위로 설정된다.

    삭제하기: rm

    Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]
    
    Remove one or more containers

    `rm`은 하나 이상의 컨테이너를 삭제하는 명령어다. 하지만 실행중인 컨테이너는 삭제할 수 없으므로 그 전에 컨테이너를 정지하는 과정이 필요하다.

    docker stop [CONTAINER]
    docker rm [CONTAINER]

    실행중인 컨테이너를 종료하는 또 다른 방법은 `-f` 옵션을 이용하는 것이다.

    Options:
      -f, --force     Force the removal of a running container (uses SIGKILL)

    외부에 노출하기: -p

    -p, --publish list                   Publish a container's port(s) to the host

    컨테이너는 가상 IP 주소를 할당받는데, 아무런 설정을 하지 않았다면 도커가 설치된 호스트에서만 접근할 수 있다. 외부에서 컨테이너로 접속하기 위해서는 `-p` 옵션을 이용하여 호스트 포트와 컨테이너 포트를 바인딩 해야 한다.

    -p [호스트 포트]:[컨테이너 포트]
    💡 도커 컨테이너는 IP 주소로 `172.17.0.x`를 할당받는다. 
    💡 여러 개의 포트를 외부에 개방하려면 `-p` 옵션을 여러 번 사용하면 된다.

    어플리케이션 구축하기

    백그라운드로 실행하기: -d

    -d, --detach                         Run container in background and print container ID

    `-d`는 컨테이너를 백그라운드로 실행한 후 (detached 모드) 컨테이너 아이디를 출력하는 옵션이다. 즉, 컨테이너를 실행한 후 해당 컨테이너와 상호작용하지 않고 다른 작업을 수행할 수 있다.

     

    환경변수 설정하기: -e

    -e, --env list                       Set environment variables

    `-e`는 컨테이너 내부의 환경변수를 설정하는 옵션이다.

     

    다른 컨테이너 접근하기: --link

    --link list                      Add link to another container

    `--link`는 다른 컨테이너로 접근할 수 있는 링크를 추가하는 옵션이다. 내부 IP 주소를 알 필요 없이 별명으로 접근할 수 있다.

    docker run -d --name db \
    -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=web_db \
    mysql:8.2.0
    
    docker run -d --name web-server \
    -e DB_HOST=mysql -e DB_USER=root -e DB_PASSWORD=passord \
    --link db:mysql \
    -p 80:80
    wordpress
    🚨 `--link`에 지정된 컨테이너가 실행 중이지 않거나 존재하지 않는 경우, `--link`를 적용한 컨테이너를 실행할 수 없다.
    🚨 deprecated된 옵션이므로 브리지 네트워크를 사용하는 것을 권장한다.

    볼륨

    설정하기

    호스트 볼륨 공유하기 : -v

    -v, --volume list                    Bind mount a volume

    `-v`는 볼륨을 공유하는 옵션이다. 이미지는 읽기 전용이기 때문에 컨테이너에 변경사항이 저장되는데, 컨테이너를 삭제하면 모든 변경사항이 날아간다. 이를 방지하기 위해 호스트와 볼륨을 공유하여 컨테이너를 삭제하더라도 호스트에 변경사항을 유지할 수 있다.

    # -v [호스트 공유 디렉토리]:[컨테이너 공유 디렉토리]
    -v /home/db:/var/lib/mysql
    💡 호스트에 호스트의 공유 디렉토리를 생성하지 않아도 도커에서 자동으로 생성한다.
    🚨 이미지에 원래 존재하던 디렉토리에 호스트 볼륨을 공유하면 컨테이너의 디렉토리가 자동으로 오버라이드 된다.

     

    볼륨 컨테이너 사용하기 : --volumes-from

    --volumes-from list              Mount volumes from the specified container(s)

    `--volumes-from`은 `-v` 옵션을 적용한 컨테이너 (볼륨을 사용하는 컨테이너) 를 통해 볼륨을 공유한다.

     

    도커 볼륨 사용하기 : docker volume

    Usage:  docker volume COMMAND
    
    Manage volumes
    
    Commands:
      create      Create a volume
      inspect     Display detailed information on one or more volumes
      ls          List volumes
      prune       Remove unused local volumes
      rm          Remove one or more volumes
      update      Update a volume (cluster volumes only)

    `docker volume`을 이용하면 도커 자체에서 제공하는 볼륨 기능을 활용하여 데이터를 보존할 수 있다.

     

    먼저 `create`를 통해 볼륨을 생성한다.

    docker volume create --name docker-volume

    해당 볼륨을 사용하는 컨테이너를 다음과 같이 생성한다.

    docker run -d \
    -v docker-volume:/root/ \ # -v [볼륨명]:[컨테이너의 공유 디렉토리]
    ubuntu:22.04
    🚨 도커 볼륨은 도커 엔진에서 관리한다. 도커 볼륨이 실제로 어디에 저장되는지 알고 싶다면 `docker inspect`의 `MountPoint`를 확인하면 된다.

    네트워크

    설정하기

    Usage:  docker network COMMAND
    
    Manage networks
    
    Commands:
      connect     Connect a container to a network
      create      Create a network
      disconnect  Disconnect a container from a network
      inspect     Display detailed information on one or more networks
      ls          List networks
      prune       Remove all unused networks
      rm          Remove one or more networks

     

    # 브리지 네트워크 생성하기
    docker network create --driver bridge custom-bridge
    # 브리지 네트워크 컨테이너에 연결하기
    docker network connect custom-bridge my-container
    # 브리지 네트워크 컨테이너에서 끊어주기
    docker network disconnect custom-bridge my-container
    💡 도커 컨테이너를 실행할 때 네트워크를 연결하고 싶다면 `--net` 옵션을 활용하면 된다.

     

    댓글