[Docker] 01. 도커 시작하기

2023. 12. 5. 01:20Infrastructure/Docker

반응형
  1. Docker
    1. 도커 등장 배경
    2. Docker?
    3. Docker 설치
  2. docker CLI
    1. docker version
    2. docker run
    3. docker ps

1. Docker

1.1. 도커 등장 배경

전통적인 방법에서는, 어떤 웹 애플리케이션 서비스를 구축하고자 할 때, 서버에 웹서버, DB서버, Redis 등을 직접 설치하고, 구성파일 설정을 한 후 각 애플리케이션간에 연동을 해야 했습니다.

이러한 방식으로 철치하는 것은 구조를 세팅하는데에 인력자원도 많이 들 뿐만 아니라
서로 다른 시스템에서 테스트를 하고자 할 때에도 어려움이 많았습니다.

또, 개발환경을 설정하면서 패키지 버전이나 OS의 차이에 따른 부분으로 인해 개인 PC에서 개발환경을 세팅하는 것만으로도 많은 시간이 소요되었습니다.

도커를 이용하여 서비스 환경을 구축하면, 다양한 환경에서도 손쉽게 서비스를 다운받고, 배포나 실행을 편리하게 할 수 있도록 도와줍니다.


1.2. Docker?

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼으로 (컨테이너를 사용하여) 응용프로그램의 배포나 실행을 보다 간편하게 할 수 있도록 설계된 도구 입니다.

다양한 프로그램과 실행환경을 컨테이너로 추상화 합니다.
추상화된 컨테이너를 활용하여 프로그램의 배포나 관리를 하나의 방식으로 처히라여 단순합니다.

여러가지 클라우드 환경에서 실행가능하게 해줍니다.

컨테이터는 코드를 포함한 모든 종속성을 패키지화하여 응용 프로그램이 여러 컴퓨터 환경에서 빠르고 안정적으로 실행될 수 있도록 하는 소프트웨어 표준 단위입니다.

컨테이너(도커) 이미지는 애플리케이션을 실행하는데에 필요한 모든 요소(코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정)들을 포함하는 가볍고 독립적인 실행 가능한 소프트웨어 패키지를 의미합니다.

컨테이너화된 소프트웨어는 소프트웨어를 환경으로부터 격리시켜주며, 개발환경의 차이와 상관없이 균일하게 작동되도록 보장합니다. 이에 의해 OS와 상관없이 항상 동일하게 실행됩니다.

도커 이미지는 프로그램을 실행하는데에 필요한 모든 설정과 종속성들이 들어있습니다.
도커 이미지를 인스턴스화한 것이 도커 컨테이너입니다.

도커 컨테이너를 실행하는 것이 바로 프로그램을 실행하는 것입니다.


1.3. Docker 설치

Docker 웹페이지에 들어가 docker를 다운받고, Docker ID를 생성합니다.

도커 설치를 완료했다면, docker CLI를 이용하여 도커 명령어를 실행할 수 있습니다.

관련 명령어는 docker --help 를 실행하면 도커 명령어에 대해 상세한 설명을 확인해볼 수 있습니다.

docker [OPTIONS] COMMAND

```txt Common Commands: run Create and run a new container from an image exec Execute a command in a running container ps List containers build Build an image from a Dockerfile pull Download an image from a registry push Upload an image to a registry images List images login Log in to a registry logout Log out from a registry search Search Docker Hub for images version Show the Docker version information info Display system-wide information ``` ```sh Management Commands: builder Manage builds buildx* Docker Buildx (Docker Inc., v0.11.2) compose* Docker Compose (Docker Inc., v2.22.0) container Manage containers context Manage contexts image Manage images manifest Manage Docker image manifests and manifest lists network Manage networks plugin Manage plugins system Manage Docker trust Manage trust on Docker images volume Manage volumes ``` ```txt Commands: attach Attach local standard input, output, and error streams to a running container commit Create a new image from a container´s changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server export Export a container's filesystem as a tar archive history Show the history of an image import Import the contents from a tarball to create a filesystem image inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images save Save one or more images to a tar archive (streamed to STDOUT by default) start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers wait Block until one or more containers stop, then print their exit codes ``` ```sh Global Options: --config string Location of client config files (default "/Users/sherry/.docker") -c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use") -D, --debug Enable debug mode -H, --host list Daemon socket to connect to -l, --log-level string Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info") --tls Use TLS; implied by --tlsverify --tlscacert string Trust certs signed only by this CA (default "/Users/sherry/.docker/ca.pem") --tlscert string Path to TLS certificate file (default "/Users/sherry/.docker/cert.pem") --tlskey string Path to TLS key file (default "/Users/sherry/.docker/key.pem") --tlsverify Use TLS and verify the remote -v, --version Print version information and quit ```

2. docker CLI

2.1. docker version

docker version 명령어로 도커 버전을 조회해봅니다.

docker version
Client:
 Cloud integration: v1.0.35
 Version:           24.0.2
 API version:       1.43
 Go version:        go1.20.4
 Git commit:        cb74dfc
 Built:             Thu May 25 21:51:16 2023
 OS/Arch:           darwin/arm64
 Context:           desktop-linux

Server: Docker Desktop 4.21.1 (114176)
 Engine:
  Version:          24.0.2
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.4
  Git commit:       659604f
  Built:            Thu May 25 21:50:59 2023
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.6.21
  GitCommit:        3dce8eb055cbb6872793272b4f20ed16117344f8
 runc:
  Version:          1.1.7
  GitCommit:        v1.1.7-0-g860f061
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

2.2. docker run

docker 명령어는 docker CLI로, 클라이언트 명령어입니다.

docker run --help 명령어를 실행하면, docker run 명령어를 실행하는 것에 대한 상세한 정보를 확인할 수 있습니다.

거기에는, run에 대한 간략한 설명으로, Create and run a new container from an image 라고 쓰여있습니다.
docker run 은 도커 이미지를 이용하여 새로운 컨테이너를 생성 또는 실행하는 명령어입니다.

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

명령어를 실행했을 때, 만일 로컬(현재서버의 이미지 캐시 보관 장소)에 그 이미지가 없을 경우 Docker Hub로부터 이미지를 다운받은 후 그 이미지를 이용하여 도커 컨테이너를 실행합니다.

기본적으로, 도커 이미지 안에 정의된 시작 커맨드를 실행하며
COMMAND를 설정할 경우, 시작 커맨드 대신 다른 명령어를 실행할 수 있습니다.

※ COMMAND는 도커 이미지 안에 정의되어있는 명령어만 실행 가능합니다.


Docker 이미지 실행 예제 1

Hello from Docker!라는 메시지를 출력하는 예제용 도커 이미지를 이용하여 컨테이너를 실행해봅시다.

docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
70f5ac315c5a: Pull complete
Digest: sha256:c79d06dfdfd3d3eb04cafd0dc2bacab0992ebc243e083cabe208bac4dd7759e0
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

만일 로컬에 해당 이미지가 있을 경우, line 2-5의 이미지를 다운받는 로그는 출력되지 않습니다.


Docker 이미지 실행 예제 2

alpine은 경량 리눅스 이미지입니다.

  • -i, --interactive
    • 표준입출력을 활성화시킵니다.
  • -t, --tty
    • pseudo-TTY(유사 터미널) 할당
    • 유사 터미널을 이용하여 컨테이너에 접속할 수 있게 합니다.

아래는 alpine 이미지로 생성한 컨테이너를 ls 커맨드를 이용해서 실행한 결과입니다.

-it 옵션과 sh 명령어를 이용하여 alpine 컨테이너 내에 접근합니다.

/bin 하위를 ls 명령어로 조회하여 어떤 COMMAND 가 들어있는지 확인할 수 있습니다.

sh, ls 등의 명령어가 여기에 포함되어있기 때문에, COMMAND에 sh나 ls 명령어가 사용 가능한 것입니다.

docker run -it alpine sh
/ # ls /bin
arch           chattr         dd             ed             fsync          ionice         linux32        lzop           mount          pidof          pwd            sed            stty           umount
ash            chgrp          df             egrep          getopt         iostat         linux64        makemime       mountpoint     ping           reformime      setpriv        su             uname
base64         chmod          dmesg          false          grep           ipcalc         ln             mkdir          mpstat         ping6          rev            setserial      sync           usleep
bbconfig       chown          dnsdomainname  fatattr        gunzip         kbd_mode       login          mknod          mv             pipe_progress  rm             sh             tar            watch
busybox        cp             dumpkmap       fdflush        gzip           kill           ls             mktemp         netstat        printenv       rmdir          sleep          touch          zcat
cat            date           echo           fgrep          hostname       link           lsattr         more           nice           ps             run-parts      stat           true

Docker 이미지 실행 예제 3

COMMAND에 _ls_를 설정하여 명령어를 실행한 결과입니다.
alpine 이미지로 실행한 도커 컨테이너 내의 디렉토리의 파일 리스트를 출력한 결과입니다.

docker run alpine ls
bin
dev
etc
home
lib
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

2.3. docker ps

proccess status
도커 컨테이너 목록 조회

docker ps
Options:
  -a, --all             Show all containers (default shows just running)
  -f, --filter filter   Filter output based on conditions provided
      --format string   Format output using a custom template:
                        'table':            Print output in table format with column headers (default)
                        'table TEMPLATE':   Print output in table format using the given Go template
                        'json':             Print in JSON format
                        'TEMPLATE':         Print output using the given Go template.
                        Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates
  -n, --last int        Show n last created containers (includes all states) (default -1)
  -l, --latest          Show the latest created container (includes all states)
      --no-trunc        Don't truncate output
  -q, --quiet           Only display container IDs
  -s, --size            Display total file sizes

기본적으로 현재 실행중인 컨테이너 목록만 조회되며, -a (= --all) 옵션을 추가하면 모든 컨테이너 목록을 조회할 수 있습니다.


현재 실행중인 컨테이너를 조회하기 위해,
알파인 이미지를 올린 컨테이너에 ping명령어를 실행시켜둔 후

docker run alpine ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.022 ms
64 bytes from 127.0.0.1: seq=1 ttl=64 time=0.107 ms
64 bytes from 127.0.0.1: seq=2 ttl=64 time=0.130 ms
64 bytes from 127.0.0.1: seq=3 ttl=64 time=0.127 ms
64 bytes from 127.0.0.1: seq=4 ttl=64 time=0.125 ms
...

터미널을 하나 더 켜서 docker ps를 실행하면 아래와 같이 실행중인 컨테이너 프로세스가 출력됩니다.

docker ps
CONTAINER ID   IMAGE     COMMAND            CREATED         STATUS         PORTS     NAMES
0806dde711bb   alpine    "ping localhost"   6 seconds ago   Up 6 seconds             charming_hertz
  • CONTAINER ID
    • 컨테이너의 고유한 아이디(해시값의 일부)
  • IMAGE
    • 컨테이너 생성시 사용한 도커 이미지
  • COMMAND
    • 컨테이너 시작시 실행한 커맨드
  • CREATED
    • 컨테이너 실행시간
  • STATUS
    • 컨테이너 상태
      • 실행중(Up), 종료(Exited), 일시정지(Pause)
  • PORTS
    • 컨테이너가 개방한 포트와 호스트에 연결한 포트
  • NAMES
    • 컨테이너 고유 이름
    • 컨테이너 생성시 --name 옵션을 설정하지 않을 경우 도커 엔진이 임의로 생성합니다.(형용사_명사로 지어짐)
    • 이름은 중복할 수 없고, docker rename 명령어로 이름을 변경할 수 있습니다.
      • docker rename 기존컨테이너명 변경할컨테이너명

컨테이너 목록 중, 원하는 항목만 조회하기

--format 옵션을 사용하면 원하는 항목만 설정한 포맷대로 조회할 수 있습니다.

docker ps --format 'table(포맷)'

포맷은 {{.테이블명}}형태로 작성합니다.
테이블명은 맨 앞글자만 대문자로 표시합니다.

image명, 커맨드, 컨테이너만 조회하는 명령은 아래와 같습니다.

docker ps --format 'table{{.ID}}\t{{.Image}}\t{{.Command}}\t{{.Names}}'
CONTAINER ID   IMAGE                                COMMAND                  NAMES
5094b62ff780   alpine                               "ping localhost"         mystifying_dijkstra

관련된 상세한 format 설정을 알고 싶다면 Docker docs - FOrmat command and log output을 참고하시면 됩니다.


모든 컨테이너 조회하기

-a 옵션을 사용하면, 종료한 컨테이너를 포함하여 모두 출력합니다.

docker ps -a
CONTAINER ID   IMAGE         COMMAND            CREATED          STATUS                      PORTS     NAMES
51386027ccda   alpine        "ping localhost"   3 minutes ago    Exited (0) 30 seconds ago             ecstatic_bartik
0806dde711bb   alpine        "ping localhost"   16 minutes ago   Exited (0) 15 minutes ago             charming_hertz
a02ec8137e2c   alpine        "ls"               31 minutes ago   Exited (0) 31 minutes ago             nervous_diffie
8df60db66036   hello-world   "ls"               32 minutes ago   Created                               brave_ptolemy
ac64dca944dd   hello-world   "/hello"           2 hours ago      Exited (0) 2 hours ago                nostalgic_thompson
728x90
반응형