2023. 12. 5. 01:20ㆍInfrastructure/Docker
- Docker
- docker CLI
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