도커(Docker)란?
도커(Docker)는 리눅스 컨테이너를 기반으로 소프트웨어의 격리성을 제공하고 배포를 유연하게 해주는 오픈소스 툴입니다. 도커를 사용하면 실행환경을 일치시킬 수 있고, 네트워크 충돌을 줄일 수 있습니다. 여기서 리눅스 컨테어너는 소프트웨어 개발에 필요한 라이브러리 + 애플리케이션들을 모아서 마치 별도의 서버처럼 작동하도록 구성한 것입니다.
리눅스 컨테이너 환경에서는 프로세스, 네트워크, 파일 시스템이 구분됩니다.
프로세스
특정 컨테이너에서 작동하는 프로세스는 컨테이너 내에서만 접근가능하며, 다른 컨테이너에서 작동하고 있는 프로세스에 영향을 미치지 않습니다.
네트워크
컨테이너들은 각각 개별적인 IP를 할당받습니다. 즉 독립적인 네트워크 환경을 구축할 수 있습니다.
파일 시스템
컨테이너 내에서는 파일 시스템이 구성되어 있습니다.
도커(Docker)를 사용하는 이유?
만약 웹 개발을 완료하고 서비스를 배포하기 위해서는 Heroku나 AWS EC2를 사용하게 됩니다. 이것도 아니면 자체적으로 서버 컴퓨터를 구성하고 애플리케이션을 배포할 수도 있습니다. 여기서 굳이 도커라는 또 다른 미들웨어를 사용해서 배포 과정에 사용하는 이유는 뭘까요?
도커는 실행/개발환경을 표준화 해줍니다
현재 가장 많이 사용되고 있는 OS는 윈도우, 리눅스, Mac 입니다. 모바일 생태계에서는 안드로이드, IOS가 있습니다. 개발자 입장에서는 어떤 환경에서 프로그램이 작동할지 예측하고 코드를 구성합니다. OS 별로 다른 버전의 코드를 작성한다는 건 매우 귀찮고 에너지 소모가 많은 일입니다.
예를 들어 경로를 표시함에 있어 유닉스 계열인 리눅스와 Mac에서는 ('/')을 사용하지만 윈도우에서는 ('\')를 사용합니다. 이런 사소한 차이로 인해 프로그램이 작동하지 않을 가능성이 존재합니다. 도커는 이 문제를 기적적으로 해결해줍니다.
도커는 환경구성을 자동화합니다
프로그램이 실행되는 환경별로 환경변수가 다릅니다. 즉, 개발자가 코드를 작성하고 프로그램 테스트를 진행하는 환경과 실제 프로그램이 동작하는 환경이 다를 수 있습니다. 프로그램을 돌리기 위해서는 환경변수를 설정해주는 수동작업이 필요하게 됩니다.
또한 방화벽 설정, 사용자 권한, PORT 설정 등등 프로그램 하나 돌리기 위해 필요한 환경 구성이 꽤 복잡하게 필요한 경우가 많습니다. 대표적으로 JAVA 계열의 프로그램을 작동하기 위해서는 환경변수에 JDK를 설치해줘야 하는 경우가 있습니다. 도커는 이런 귀찮은 환경 구성 작업을 자동화 시켜줍니다.
도커는 리소스의 격리성을 보장합니다
도커는 프로세스, 네트워크, 파일 시스템을 컨테이너 별로 구분해 환경을 구성하므로, 격리성을 보장합니다.
도커(Docker) 사용방법
1. 기본 사용방법
도커를 사용할 때 가장 먼저 봐야 할 것은 공식문서입니다.
도커는 컨테이너라는 개념을 가지고 일정 Lifecycle 내에서 작동합니다.
도커는 Registry에서 image를 가져와 Container를 생성해 사용합니다.
도커 허브에 저장되어 있는 Image는 아래와 같습니다.
Registry는 기본적으로 Docker Hub를 사용합니다. 도커 이미지를 관리하는 공간입니다.
Repository는 레지스트리 내에는 도커의 Image가 저장되는 Repository로 구획화 되어 있습니다.
Tag는 동일한 Image에 다른 버전을 명시합니다. 특정한 버전을 지정하지 않으면 가장 최근의 Image인 latest 태그가 붙은 Image를 가져옵니다.
Docker CLI로 간단하게 Registry에서 Image를 가져와 실행해봅니다.
① 레지스트리의 이미지를 가져옵니다.
$ sudo docker image pull docker/whalesay:latest
latest: Pulling from docker/whalesay
Image docker.io/docker/whalesay:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
e190868d63f8: Pull complete
909cd34c6fd7: Pull complete
0b9bfabab7c1: Pull complete
a3ed95caeb02: Pull complete
00bf65475aba: Pull complete
c57b6bcc83e3: Pull complete
8978f6879e2f: Pull complete
8eed3712d2cf: Pull complete
Digest: sha256:178598e51a26abbc958b8a2e48825c90bc22e641de3d31e18aaf55f3258ba93b
Status: Downloaded newer image for docker/whalesay:latest
docker.io/docker/whalesay:latest
② 도커 이미지를 조회합니다.
$ sudo docker image ls
③ Pull 한 Image로 Container를 실행합니다.
공식문서에 안내되어 있는 Container 실행 명령어입니다.
$ sudo docker run [OPTION] IMAGE [COMMAND] [ARG...]
받아온 Image를 가지고 Container를 실행합니다.
$ sudo docker container run --name containerName docker/whalesay:latest cowsay boo
컨테이너 실행 결과입니다.
< boo >
-----
\
\
\
## .
## ## ## ==
## ## ## ## ===
/""""""""""""""""___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\______/
- run은 컨테이너 실행 명령어입니다.
- --name은 컨테이너에 이름을 지정할 수 있습니다. 만약 이름을 지정하지 않으면 랜덤한 string이 이름으로 지정됩니다.
- command는 컨테이너 실행시 초기 수행되는 명령입니다. cowsay는 컨테이너 초기 실행 시 cowsay 명령어를 호출합니다.
- boo는 cowsay에 넘겨지는 파라미터(ARG...)입니다.
④ 컨테이너의 목록을 출력합니다.
-a 옵션으로 종료된 컨테이너까지 모두 조회할 수 있습니다.
$ sudo docker container ps -a
⑤ 실행이 완료된 Container를 삭제합니다.
$ sudo docker container rm containerName
⑥ 실행이 완료된 Image를 삭제합니다.
$ sudo docker image rm docker/whalesay
2. 동시에 여러 작업 수행하기
동시에 여러 작업을 수행할수도 있습니다.
- 이미지를 가져오는 작업(docker image pull)
- 컨테이너 실행(docker container run)
- 컨테이너 삭제(docker container rm)
$ sudo docker container run --name ContainerName --rm docker/whalesay:latest cowsay AboutTech
명령어를 실행하면 로컬에서 이미지를 찾을 수 없다는 문구가 출력됩니다. 로컬에서 찾을 수 없는 경우 Image를 PULL 한 뒤 컨테이너를 실행하게 됩니다.
Unable to find image 'docker/whalesay:latest' locally
실행이 완료된 이미지를 삭제합니다.
$ sudo docker rmi docker/whalesay:latest
3. 상호작용 컨테이너 실행
이미지를 받아와서 컨테이너를 실행할 때 -it 옵션(interaction)을 사용할 수 있습니다. 컨테이너와 사용자 간 지속적인 상호작용이 필요한 경우 사용합니다. danielkraic/asciiquarium:latest로 테스트를 진행합니다.
로컬에 이미지가 없으므로 Docker Hub에서 이미지를 가져와 컨테이너를 실행합니다. 상호작용(-it) 가능하므로 터미널에서 이미지가 계속 움직입니다. --rm 옵션으로 실행 종료 후 컨테이너와 관련된 리소스들은 모두 삭제합니다.
$ sudo docker container run -it --rm danielkraic/asciiquarium:latest
'Programming' 카테고리의 다른 글
[Docker] OCI runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $PATH: unknown 해결방법 (0) | 2022.07.28 |
---|---|
[Docker] 도커(Docker) 이미지 만들기 2가지 방법 (0) | 2022.07.27 |
[Hardware] L1, L2, L3 캐시 메모리(Cache Memory)란? (0) | 2022.07.27 |
컴퓨터 구조 (폰 노이만 아키텍처, 프로세서, 주기억 장치, 버스) (0) | 2022.07.25 |
[WebSocket] 웹 소켓(Web Socket) 이란? (0) | 2022.07.18 |
댓글