티스토리 뷰

반응형

Docker는 컨테이너 플랫폼으로 굉장히 유용하게 다양한 분야에서 사용되어질 수 있습니다. 특히 무엇인가 설치를 많이해야하는 상황일 때 컨테이너화를 통해 배포를 하면 이를 다른 곳에서는 설치 후 별도의 작업없이 개발을 시작할 수 있는데요. 그만큼 각광도 많이 받고 있기 때문에 진화도 빠르게 되어가고 있습니다. Docker를 개발하는 관점은 크게 인프라적인 관점이 가장 클 것입니다. 리눅에서도 수 많은 명령어가 있어 리눅스 프로그래밍을 잘하는 것은 명령어 싸움이라고 할 만틈 얼마나 필수 적인 그리고 도움되는 명령어를 잘 알고 있는지도 개발속도나 개발의 효율성 관점에서 큰 몫을 차지한다고 할 수 있습니다. 오늘은 Docker의 명령어 중 주로 필요한 것에 대해서 살펴 보도록 하겠습니다.

https://docs.docker.com/engine/reference/run/

 

Docker run reference

 

docs.docker.com

docker run은 특정 컨테이너를 실행할 때 보통 사용하는데 공식문서에 정리되어 있는 링크는 위와 같습니다. 그중에서 가장 먼저 많이 사용하는 것 몇가지만 오늘 알아보도록 하겠습니다.

$ docker version
Client:
 Cloud integration: v1.0.29
 Version:           20.10.20
 API version:       1.41
 Go version:        go1.18.7
 Git commit:        9fdeb9c
 Built:             Tue Oct 18 18:20:35 2022
 OS/Arch:           darwin/arm64
 Context:           default
 Experimental:      true

Server: Docker Desktop 4.13.1 (90346)
 Engine:
  Version:          20.10.20
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.7
  Git commit:       03df974
  Built:            Tue Oct 18 18:18:16 2022
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.6.8
  GitCommit:        9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

현재 저의 PC에는 docker enginedl 20.10.20이 설치되어 있네요. 그 외에도 다양한 정보들을 볼 수 있는데, Docker Engine 자체가 이루는 프로세스 들이 Engine이라는 것 외에도 containerd, runc, docker-init 과 같은 것들이 있고 각각의 버전들도 표기되어지는 것을 볼 수 있습니다.

$ docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc., v0.9.1)
  compose: Docker Compose (Docker Inc., v2.12.1)
  dev: Docker Dev Environments (Docker Inc., v0.0.3)
  extension: Manages Docker extensions (Docker Inc., v0.2.13)
  sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0)
  scan: Docker Scan (Docker Inc., v0.21.0)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 3
 Server Version: 20.10.20
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
 runc version: v1.1.4-0-g5fd4c4d
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
  cgroupns
 Kernel Version: 5.15.49-linuxkit
 Operating System: Docker Desktop
 OSType: linux
 Architecture: aarch64
 CPUs: 4
 Total Memory: 7.667GiB
 Name: docker-desktop
 ID: F4BO:DD3Q:YA6H:UBCQ:CDLB:JDDE:N45Q:H2GY:EOQI:XXCG:ELEM:4CTR
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 HTTP Proxy: http.docker.internal:3128
 HTTPS Proxy: http.docker.internal:3128
 No Proxy: hubproxy.docker.internal
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  hubproxy.docker.internal:5000
  127.0.0.0/8
 Live Restore Enabled: false

docker info를 타이핑하니, 또 엄청난 정보가 나오고 있습니다. 현재 이미지 갯수라던지, 아키텍쳐라던지, 메모리, 파일시스템이라던지 등등이 나오고 있는데, 실제 자신이 구성하는 인프라의 특성이 있다면 이 내용도 아주 중요한 내용이니 참고해주시면 좋겟습니다.

그 다음 부터는 설명 위주로 간단하게 진행하도록 하겠습니다.

$ docker images는 현재 어떤 이미지들이 내 PC에 다운 받아져 있는지 확인 할 수가 있고

$ docker ps -a  는 어떤 컨테이너들이 생성되었거나, 종료되었거나, 멈춰있거나, 동작중이거나 다 보여주게 됩니다.

$ docker exec -it <container name> /bin/bash 이렇게 하면 실생중인 특정컨테이너에 /bin/bash로 접속해서 실시간으로 tty로 출력하게 되구요. 물론 컨테이너 자체에 /bin/bash가 설치되어지지 않았다면 접속할 수 없겟지요.

$ docker start <container name>  은 만약 docker run 한 뒤에, 컨테이너가 종료되었으나, 삭제되어지지 않았을 경우 다시 실행시킬때 사용합니다.

$ docker run -it --name <conatiner name> <image name> /bin/bash 는 특정 이미지를 기반으로 컨테이너를 생성해서 시작하라는 뜻이고 entry point는 역시나 /bin/bash 입니다.

$ docker commit <container name> <image name> 는 특정 컨테이너를 이미화 시킬 때 사용합니다. 보통 스크래치나 기본 이미지에서 시작해서 자신만의 것들을 설치한 후 저장하고 싶을때 commit 명령어를 사용하 곤 합니다.

$ docker rmi <image name or image id> 는 특정 이미지를 삭제할 때 사용하며 만약 특정 이미지 기반으로 컨테이너가 생성되어서 있을때는 삭제되어지지 않으니, 미리 지우고 싶다면 컨테이너가 있는지 확인이 필요합니다.

$ docker logs --tail 10 -f <container name> 특정 컨테이너의 로그 마지막 10줄에 대해서 보여주는 명령어 입니다. 아무래도 -it로 항상 실행할 순 없기때문에 어떤 동작을 하고 있는지 궁금할 때 자주 이용합니다.

이외에도 굉장히 많은 명령어들이 있으나, 우선은 하나씩 컨테이너를 생성하고 삭제하고, 이미지화 시키고 로그를 보면서 추가적인 명령어들을 하나둘 씩 익히면 좋겠고, docker 공식사이트에 굉장히 문서화가 잘 되어 잇으니 필요한 내용이 있을 때 찾아보시면 좋습니다. 이를 테면 컨테이너에 리소스를 얼마나 할 당할지도 정할 수 있고 볼륨옵션도 정상할 수 있으며, 네트워크 브리지도 생성해서 매핑할 수 있습니다. 이런 명령어들은 Dockerfile을 통해 다시 함축 시킬 수도 있으니 하나씩 필요한 사항 들이 있을때 리서치해나간다면 여러분 개인의 환경에 가장 최적화되게 세팅할 수 있을 것인데, 앞으로 서버 카테코리에 직접 서버 구축 하는 일들을 정리하면서 틈틈히 정리해 나가도록 하겠습니다. 

 

 

반응형

'Technology > AWS, Docker' 카테고리의 다른 글

AWS API Gateway 제대로 써보자 2  (0) 2022.12.06
AWS API Gateway 제대로 써보자 1  (0) 2022.12.06
Serverless 는 서버가 있다? 없다?  (0) 2022.12.05
My Docker environment with ubuntu app,  (0) 2017.08.03
Start Docker,  (0) 2017.07.15
댓글