Intro
이전 게시글을 통해 가상화를 공부했고 VM과 Docker 그리고 Emulator, Simulator 등의 개념에 대해서 공부해보면서 어떤 차이가 있고 어떤 상황에 특정 용어를 써야하는지에 대해서 공부할 수 있었다. 이번 게시글에서는 본격적으로 Docker를 공부하기 위해 Docker를 어떻게 설치하는지와 어떤 명령어들을 어떤 상황에서 사용하는지에 대해 정리해보겠다. 해당 게시글은 Udemy에서 구매할 수 있는 " [한글자막] Docker&Kubernetes 실전가이드 " 강의를 듣고 추가로 필요한 개념들을 찾아보고 정리했으므로 보다 높은 공부 효과를 위해서는 위 강의와 함께 참고하면 좋을 것 같다.
Docker Installation
도커는 시스템에 종속적인 프로그램이기 때문에 본인의 OS를 확인하고 설치해야한다.
Docker Desktop을 설치하면 그 안에 Docker Engine도 설치되니 아래 사이트에 접속해서 Docker Desktop을 다운받아서 설치한다. 해당 프로그램은 Demon을 통해 Docker Engine을 스케줄링해줄 수 있는 프로세스와 CLI 환경에서 운용하기 위한 Command Interface을 지원한다.
Mac
Install Docker for Mac to get started. This guide covers system requirements, where to download, and instructions on how to install and update.
docs.docker.com
이미지 생성(docker build)
Dockerfile을 통해서 이미지를 생성 하는 명령이다. 이는 단순한 명령이다.
명령어 의미, 그 이상으로 궁금한 점이 있다면 dockerfile에 대해 작성한 게시글을 참고하기 바란다.
컨테이너 생성 & 실행(docker run)
사용할 코드 및 코드 실행을 위한 도구를 담은 이미지를 성공적으로 생성했다면 이제 생성된 이미지를 기반으로 실제 어플리케이션을 구동시킬 Container를 생성하고 실행해야한다. 이를 수행하는 명령어는 run이다.
flag --name
Container 이름을 설정할 때는 --name 000으로 설정해준다. 이름을 설정해주면 추후 재실행/중단/제거 등 container를 handling할 때 편리하게 사용할 수 있다.
Port Forwarding : flag -p <local : container>
만약 container 내부에서 웹서비스를 실행시킬때 소스코드 상 80 포트에 해당 어플리케이션을 보내라고 명령하면, 이 80포트가 local의 80포트를 가르키는 것이 아니라 해당 container 내부의 80 포트를 지칭하는 것이기에 localhost:80에 접속해도 서비스를 볼 수 없다. 따라서 container의 80포트에서 local의 특정 포트로 포워딩작업이 필요한데, 이는 run 명령어에서 -p라는 flag로 간단하게 설정할 수 있다.
먼저 dockerfile을 정의할 때, 어플리케이션을 송출할 포트는 Docker 컨테이너 내부에 보낼 포트로 EXPOSE로 지정해준다. 이후 터미널 상에서 docker run -p <local port>:<container port> 로 실행하게 되면 해당 포트로 쉽게 포워딩 할 수 있다. 이렇게 되면, local에서 localhost:<local port>를 통해 해당 서비스에 접속할 수 있다.
reference : NAT
컨테이너 재실행/중단(docker start/stop)
docker run을 통해 컨테이너를 생성했다면 이 Container를 중단하고 재실행할 수 있다. 이때, CLI 환경에서 Container를 핸들링하기 때문에 CLI 환경에서 Container를 foreground/background로 실행할 지와 입출력과 관련된 flag설정을 통해 해당 container를 어떻게 실행시킬지 정의할 수 있다. 다만 일반적인 foreground, background와 일맥상통하는 의미로 attached, detached를 사용할 순 없다. container에서 따로 실행되는 공간이 있기 때문에 그 점도 고려해서 local - Container의 CLI환경간의 소통 여부를 설정해주는 개념이라고 볼 수 있다.
-a, -d : Foreground(Atteched), Background(Detached)
-i, -t : interact, terminal
컨테이너 /이미지 Listing
생성된 컨테이너/이미지를 확인하기 위한 명령어로 CLI 상에서 List를 출력하여 확인해볼 수 있다. flag -a (실행여부와 관계없이 컨테이너 전체를 출력)없이 명령을 실행하면 현재 실행중인 컨테이너/이미지만 확인할 수 있다.
docker ps : Container Listing
docker images : image Listing
컨테이너/이미지 Remove
생성된 컨테이너/이미지를 제거하는 명령어를 정리해뒀으며, 음절(띄어쓰기)로 Container/Image를 연속하여 작성하면 한번에 여러 Containers 또는 Images를 제거할 수 있다.
docker rm : Container remove
docker run --rm : Container 종료 시 자동으로 제거하는 유용한 플래그(run 실행시 사용)
docker rmi : image remove
docker Image prune : 이미지 가지치기(실행 중인 이미지 빼고 나머지 전부 제거)
파일 수정 반영 : docker cp <reciever> <sender>
실행중인 컨테이너에도 변경되거나 새롭게 정의된 파일을 추가할 수 있다. 이는 터미널 상에서 docker cp라는 명령어를 통해 가능한데,
Linux에서 사용하는 cp 명령과 동일하지만, Container 내부의 공간을 정의할 때는 ":" 로 구분한다. 정확히는 <Container Name> : Address 로 위치를 표기한다.
이미지 보내기/받아오기 : 원격 레지스트리 활용
매번 새롭게 이미지를 생성할 순 없고 생성된 이미지를 원격 레지스트리에 저장하여 이를 보내고 받아오는 작업을 통해 손쉽게 이미지를 관리할 수 있다. 심지어 이미지에 수정을 하고 이를 다시 배포할 경우 변경된 부분만 고쳐서 배포되기에 트래픽도 아끼고 시간도 아낄 수 있기에 효율적인 이미지 버전관리 방법이 될 수 있다고 한다. 문법은 git처럼 push/pull 명령어를 통해 동작한다. 자세한 내용은 docker hub에 대해서 다룰 때 정리하겠다.
알고 있으면 좋은 용어1 : Snapshot
이전에 Git 설명하면서 Version Axis를 설명할 때 commit한 각각의 version을 Tick이라고 뭉뚱그려 이야기 했었는데, 사실 이 개념이 Snapshot이었다. dockerfile을 통해 이미지를 생성하고 그 이미지를 만들었던 dockerfile을 다시 수정하고 만들게 되면 변경된 layer를 인지하고 새로운 이미지를 만들게 된다. 이런 변화에 따라 이전 버전의 이미지와 현재 버전의 이미지에는 차이가 생기게 되는데 이를 구분하는 각각의 이미지 단위를 Snapshot이라 칭할 수 있다.
알고있으면 좋은 용어2 : Registry
레지스트리는 데이터나 정보를 등록하고 관리하는 시스템을 일반적으로 의미한다. 이 시스템은 그 용도와 목적에 따라 여러 형태로 존재할 수 있으며, 소프트웨어, 데이터베이스, 네트워크 관리 등 다양한 분야에서 사용될 수 있다. 컨테이너 이미지나 도메인 정보를 관리하는 저장소는 그 예시 중 하나이며 우리가 흔히 사용하는 github, on-premiss DB, Cloud도 일종의 레지스트리라고 볼 수 있다.
Outro
Udmey Learning Crew 2nd - Leader 활동의 일환으로 작성한 게시글입니다.
인스타 주소 🎗
https://www.instagram.com/f.inn_sharp/
'MLOps > Docker Compose' 카테고리의 다른 글
[6] Docker Network (1) | 2025.03.18 |
---|---|
[5] Argument와 Environment Value 설정 (0) | 2025.03.18 |
[4] Docker Data Storage 관리(Application,Temporary, Persistent) (0) | 2025.03.04 |
[2] Dockerfile 정의와 관련 명령어 (0) | 2025.02.25 |
[0] 가상화(Virtualization) (0) | 2025.02.17 |