본문 바로가기
DevOps

[Docker] 도커(Docker) 간단 사용법

by 토마토베이컨수프 2021. 10. 6.

도커란 뭘까?

도커는 '컨테이너(container)' 라는 격리된 프로세스를 이용하여 가상머신 상에 리눅스 응용 프로그램들을 실행하고 관리할 수 있게 도와주는 오픈소스 소프트웨어 입니다.

현재 본인이 사용하고 있는 컴퓨터의 운영체제가 리눅스 기반이 아니라 하더라도 이 도커 컨테이너 시스템을 이용해 리눅스 환경을 구축할 수 있는 것이죠.

 

이곳에서 도커를 설치할 수 있습니다.

https://docs.docker.com/get-docker/

 

Get Docker

 

docs.docker.com

 

이제 도커를 다운받았으면, docker hub라는 곳에서 자신이 원하는 소프트웨어, 즉 image를 다운(pull) 받을 수 있게 되고, 이 image를 실행(run)시키면 image가 container가 되어 내부 프로세스가 작동됩니다.

 

도커 허브에서 다운받을 수 있는 이미지들은 이곳에서 찾을 수 있습니다.

https://hub.docker.com/search?type=image 

 

Docker Hub

 

hub.docker.com

 


기본적인 도커 명령어

윈도우면 명령 프롬프트(cmd), 맥이면 CLI, 또는 리눅스 커맨드 라인으로 가서 다음과 같이 입력하면 됩니다. 원하는 이미지를 다운 받거나 기존에 가지고 있던 이미지를 지울 수 있고, 가지고 있는 이미지로 컨테이너를 생성하고 실행시키거나 멈추고 삭제하는 등 다양한 명령을 내릴 수 있습니다.

이미지 다운
docker pull {image 이름}

이미지 확인
docker images

컨테이너 생성, 실행
docker run --name {컨테이너 이름} {이미지 이름}

실행 중인 컨테이너 확인
docker ps
모든 컨테이너 확인
docker ps -a

실행 중인 컨테이너 중지
docker stop {컨테이너 이름}

컨테이너 재실행
docker start {컨테이너 이름}

컨테이너 실행 시 로그 출력
docker logs -f {컨테이너 이름}

컨테이너 제거
docker rm {컨테이너 이름}

이미지 제거
docker rmi {이미지 이름}

위 작업들은 모두 명령어 입력 없이 Docker Desktop에서도 수행할 수 있습니다.

 


네트워크 연결

클라이언트와 웹 서버의 상호작용은 웹 서버의 포트(port)라는 곳에서 이뤄집니다. 클라이언트가 웹 서버 내부의 파일 시스템으로 접근하기 위해서 정해진 특정 번호의 포트로 연결해야 하고, 그렇게 해야 서버는 파일시스템에 저장되어 있는 html 같은 파일을 제공할 수 있는 것입니다.

 

그러나 도커의 경우, 웹 서버 자체가 컨테이너로 구현되어 도커 호스트(Host)라는 곳에 담겨 실행될 수 있습니다.

이때 호스트는 컨테이너와 독립된 포트를 가지게 되는데요, 따라서 클라이언트가 컨테이너 안의 웹 서버로 접속하기 위해선 호스트의 특정 포트를 거친 후, 그 포트와 연결된 컨테이너의 포트로 접속해야 합니다.

이렇게 호스트와 컨테이너의 연결된 포트의 신호로 접속하는 것을 포트 포워딩(port forwarding)이라고 합니다.

이미지 출처: 생활코딩

보통 컨테이너의 포트는 고정되어 있는 경우가 많고 호스트의 포트를 지정하여 포트 포워딩을 합니다.

명령어는 다음과 같습니다.

docker run --name {컨테이너 이름} -p 8000:80 {이미지 이름}

이렇게 하면 '8000'번 포트로 접속했을 때 컨테이너의 '80'번 포트로 연결하겠다고 지정할 수 있습니다.

그리고 컨테이너 실행 후 localhost:8000으로 접속하면 페이지 연결이 됩니다.

 


명령어 실행

컨테이너 내부의 파일들을 열람하거나 수정하기 위해 컨테이너 내부에 대한 명령어를 수행하기 위해선 다음과 같이 입력합니다.

docker exec {컨테이너 이름} {명령어}

예를 들어 test란 이름의 컨테이너가 있다 했을 때 docker exec test ls 를 입력하면 test 컨테이너의 내부 디렉토리들을 확인할 수 있습니다.

 

그러나 매 명령어마다 docker exec를 입력해야 되는데요, 지속적으로 컨테이너와 연결된 상태로 명령어를 전달하고 싶다면 다음과 같이 입력합니다.

docker exec -it {컨테이너 이름} /bin/sh
또는
docker exec -it {컨테이너 이름} /bin/bash

연결된 상태에서 나가고 싶을 땐
exit

 

그러나 컨테이너 내부에서 직접 파일을 수정해 가며 프로젝트의 버전 관리를 하는 것은 위험합니다. 컨테이너가 사라질 경우 해당 파일들도 모두 사라지기 때문입니다. 따라서 호스트에서 따로 파일 시스템을 관리하고 컨테이너 내 원하는 경로랑 연동시켜줘야 합니다.

이미지 출처: 생활코딩

docker run --name {컨테이너 이름} -p 8000:80 -v {호스트 내 경로}:{컨테이너 내 경로} {이미지 이름}

이렇게 두 경로에 대해 연결 시켜준후 컨테이너를 실행하면 호스트 내의 파일을 변경할 때 마다 해당 내용이 컨테이너에 반영되는 것을 확인할 수 있습니다.

 


이미지 생성

기존에 도커 허브에서 제공하는 이미지가 아닌, 특정 이미지로부터 생성된 컨테이너 내부의 파일들을 수정하고 이 변경된 상태의 컨테이너를 새로운 이미지로 만들어낼 수 있습니다.

 

우선 컨테이너 하나를 실행하고 /bin/sh을 실행해 명령어 창을 띄운 다음, 새로운 패키지를 설치합니다.

apt update
apt install {패키지명}

 

그리고 원래대로 돌아와서, 컨테이너와 이미지의 파일시스템 간의 변경 사항을 다음과 같은 방법으로 확인할 수 있습니다.

docker diff {컨테이너 이름}

 

이제 commit을 통해 기존의 이미지와 달라진 이 컨테이너를 또 다른 이름을 가진 이미지로 만들 수 있습니다.

docker commit {컨테이너 이름} {새로운 이미지 이름}

 


참고 자료

'DevOps' 카테고리의 다른 글

[Docker] 도커 파일(Dockerfile) 작성법  (0) 2021.10.07