우분투에 Docker를 설치하는 방법에 대한 정보를 찾고 있다면, 올바른 장소에 있습니다. 더 나아가, 이 자습서에서는 컨테이너를 실행하고 관리하기 위한 기본 Docker 명령어를 배우는 방법도 알려줍니다.
Visual Studio (VS) Code의 편리한 기능을 사용하여 SSH 기술을 활용하는 방법도 배우게 될 것입니다. 시작해봅시다!
관련 자료: 리눅스 세상에서의 윈도우 가이: VS Code와 원격 SSH
전제 조건
이 자습서를 단계별로 따라가려면 다음 사항을 준비하세요:
- A fresh install of Ubuntu Server LTS with SSH Enabled (This guide will be using Ubuntu Server LTS 20.04.1)
- A Windows Machine with VSCode installed (This guide will be using Visual Studio Code 1.52.1)
- 우분투 서버에 설치된 VSCode 공식 SSH 확장 프로그램과 연결
우분투에 Docker 설치
먼저 우분투에 Docker를 설치해 봅시다. 이 시점에서 자습서는 로컬 Windows 컴퓨터에서 작동하며, VS Code가 SSH를 통해 우분투 서버에 연결되어 있다고 가정합니다. VS Code와 SSH를 사용하는 환경을 설정하는 방법은 VS Code와 SSH 사용에 대한 최신 기사에서 알아보세요.
아래 예시에서는 VSCode가 home 폴더(이 경우 /home/homelab)를 워크스페이스로 열고 우분투에 원격으로 연결된 것을 보여줍니다.

Ubuntu Server에 Docker를 설치하는 실제 과정은 두 개의 명령어로 이루어집니다. Ubuntu는 apt
라고 불리는 Ubuntu와 함께 제공되는 기본 패키지 관리자에서 Docker를 설치할 수 있도록 제공합니다.
VS Code의 SSH 터미널 창에서 Docker를 설치하기 위해 다음 두 개의 명령어를 실행하십시오:
Ubuntu Server 설치 중에 Docker를 snap으로 설치할 수 있는 옵션을 선택할 수 있었습니다. 이 경우, 먼저
sudo snap remove docker
를 실행하여 snap 패키지를 제거하십시오.
아래 애니메이션으로 Docker 설치 과정을 확인할 수 있습니다:

Ubuntu는 부팅 시 자동으로 서비스를 활성화하고 설정해주므로 Docker 사용 준비가 완료됩니다!
Ubuntu에서 Docker 컨테이너 생성 및 실행하기
Docker가 설치되었으니 이제 무엇을 할 수 있는지 살펴보겠습니다. Docker 컨테이너를 생성하는 것부터 시작해봅시다. 이 튜토리얼에서는 Docker 컨테이너의 좋은 예로 정적 웹 서버를 설정합니다. 이 섹션에서는 다음을 수행합니다:
- Docker 허브 이미지 저장소에서 HTTP 서비스를 실행하기 위해 새로운 컨테이너 설정
- 컨테이너 내의 HTTP 포트를 Ubuntu 호스트에 매핑하기 위해 포트 매핑 사용
- 컨테이너 내부의 중요한 데이터를 Ubuntu 호스트에 매핑하기 위해 바인드 마운트 설정
- 컨테이너의 재부팅을 통한 지속성 설정
위의 단계 중 어느 것이 혼란스러울 수 있습니다. 걱정하지 마세요. 각 단계를 하나씩 다루면서 프로세스를 이해하는 데 도움을 드리겠습니다.
도커 이미지 다운로드
첫 번째 질문은 이 컨테이너가 어디에서 가져올 것인가입니다. 도커 허브를 살펴보겠습니다.
A large part of Docker is understanding image repositories. Rather than being distributed like packages, services in Docker get distributed as Docker Images.
A Docker Image is a snapshot of the software that the publisher wants to distribute and the entire filing system! This is analogous to creating .wim image of Windows.
이 파일 시스템 캡처는 Docker를 인기있게 만듭니다: 소프트웨어와 전체 운영 환경이 함께 캡처됩니다. 이렇게 함으로써 서버 환경 간의 차이로 인해 발생하는 문제가 제거됩니다.
가장 인기 있는 저장소(기본값) 중 하나는 공식 도커 저장소인 도커 허브입니다. 이미지 저장소는 수천 개의 미리 생성된 도커 이미지를 다운로드하여 컨테이너로 실행할 수 있는 곳입니다.
이 튜토리얼에서는 정적 웹 서버를 설정하므로 웹 서버 이미지를 다운로드해야 합니다. 가장 인기 있는 웹 서버는 Apache httpd와 Nginx입니다. 그러나 조금 다른 웹 서버를 사용하여 새로운 경험을 할 수 있도록 Caddy라는 웹 서버를 사용해보겠습니다.
Caddy는 간결함으로 알려진 웹 서버입니다. 파일의 한 줄로 많은 유효한 서버 구성을 배포할 수 있습니다. 간단함은 좋은 점이며 좋은 기본 예제가 될 수 있습니다.
- 먼저, 도커 이미지를 찾아야합니다. Windows 기기에서 https://hub.docker.com로 이동하십시오.
- 페이지 상단 왼쪽 모서리에 있는 caddy를 검색하십시오. 다음과 비슷한 페이지가 나타날 것입니다.

A benefit (and downside) of Docker Hub is that anyone, even you, can create and upload Docker Images to the site.
신뢰할 수 있는 출처에서 이미지를 선택하는 것에 주의해야합니다. 누구든지 자신이 선택하고 도커 허브에 업로드하는 이미지에 악성 코드를 넣을 수 있습니다.
3. 이미지의 이름을 메모하세요. 위 스크린샷에서 이름은 caddy입니다. 이 이름은 다음 단계에서 이미지 이름을 지정하는 데 사용됩니다.
우분투에서 도커를 사용하여 컨테이너 실행
다운로드하고 컨테이너를 생성하기 위해 이미지의 이름을 알고 있다면 컨테이너를 시작할 차례입니다.
이미지에서 컨테이너를 시작하려면 하나의 명령을 실행해야합니다. Ubuntu 서버에 연결된 SSH 터미널에서 다음 docker run
명령을 실행하십시오.
아래 명령은 로컬 기기에서 caddy 이미지를 확인합니다. 이미지가 존재하지 않으면 Docker Hub에서 이미지를 다운로드하고 컨테이너를 생성하고 시작합니다. 아래 명령은 -p
스위치를 사용하여 Ubuntu 서버의 리스닝 포트 80을 컨테이너의 포트 80에 매핑하는 기능인 포트 매핑을 사용합니다.
대부분의 도커 허브 이미지는 <사용자>/<이미지 이름> 형식을 따릅니다. 그러나 도커에서 “공식”으로 브랜드된 이미지는 사용자 앞에 <사용자>가 없습니다 (위의 caddy와 같은 경우).
위의 명령을 실행하면 다음과 같은 출력이 나타납니다. caddy의 로그 정보가 터미널에 직접 표시됩니다:

거의 모든 도커 명령은
sudo
로 시작됩니다. 명령을 관리자 권한으로 실행하기 위한 것입니다. 기본적으로 도커 서비스는root
로 실행되며, 컨테이너나 이미지에 대한 변경은 관리자로서 수행해야 합니다.
그리고… 실행되고 있습니다! 그게 다입니다. Ubuntu에 도커를 설치한 것에 만족하지 않으셨나요?
이제 Windows 컴퓨터에서 http://<your-ip>로 이동하면 Caddy의 랜딩 페이지가 표시됩니다. 아래에서 확인할 수 있습니다 (이 가이드의 IP는 http://homelab-docker로 대체되었습니다):

caddy 컨테이너가 현재 실행 중이지만 문제가 발생했을 수 있습니다. 해당 docker
명령을 실행하면 명령줄이 점유됩니다. 더 이상 다른 명령을 실행할 수 없으며, 세션이 종료되면 실행 중인 컨테이너가 중지됩니다. 이 문제를 해결하기 위해 컨테이너를 백그라운드에서 실행하는 방법으로 변경해 보겠습니다 (컨테이너를 분리하는 것으로도 알려져 있음).
백그라운드에서 도커 컨테이너 실행하기
현재 실행 중인 컨테이너가 있지만 명령줄이 멈춰 있습니다. 다른 작업을 수행할 수 없습니다. 서비스처럼 백그라운드에서 컨테이너를 시작하는 더 좋은 방법이 필요합니다. 다음을 수행하세요:
- 현재 컨테이너를 명령줄에서 control+c를 눌러 중지하세요. 이렇게 하면 명령줄을 다시 사용할 수 있습니다.
- 이제 이전과 동일한 명령을 실행하되, 이번에는
-d
매개변수와 함께 아래와 같이 실행하세요. 도커가 컨테이너 ID를 반환하고 명령 줄을 다시 표시할 것입니다.

도커 명령을 사용하여 백그라운드 컨테이너 관리하기
하나 이상의 백그라운드 도커가 실행되면 어떻게 관리해야 할지 알아야 합니다. 도커는 docker container
명령을 사용하여 몇 가지 다른 명령을 제공합니다.
sudo docker container list -a
: 모든 컨테이너(실행 중인 컨테이너와 중지된 컨테이너)와 상태를 나열합니다.sudo docker container stop <name>
: 이름(또는 ID)으로 도커 컨테이너를 중지합니다.sudo docker container start <name>
: 이름(또는 ID)으로 도커 컨테이너를 시작합니다.sudo docker container prune
: 중지된 모든 컨테이너를 삭제하고 제거합니다.
아래 스크린샷에서 위의 모든 명령을 사용한 내용을 확인할 수 있습니다:

서버에서 컨테이너를 보거나 변경하거나 검사하거나 원격으로 접속하는 등 다양한 도커 컨테이너 명령이 있습니다.
sudo docker container --help
를 실행하여 모든 명령을 확인할 수 있습니다.
백그라운드에서 실행되는 컨테이너에 웹 서버를 배포했지만, 여전히 사용자 정의 콘텐츠를 호스팅할 방법이 없습니다. 현재 상태에서 Caddy는 기본 웹 페이지를 제공하고 있습니다.
이제 유의미한 데이터를 사용하여 컨테이너를 배포하는 데 바인드 마운트라는 개념을 사용하여 Docker 이미지를 사용하는 방법을 살펴보겠습니다.
바인드 마운트를 사용하여 컨테이너 데이터 저장하기
Docker는 이미지(및 생성되는 컨테이너)가 휘발성이거나 일시적이라는 개념으로 작동합니다. Caddy 소프트웨어를 업데이트하는 경우, 서비스를 업데이트하지 않고 완전히 새로운 이미지를 사용하여 전체를 삭제합니다.
이렇게 컨테이너를 폐기하고 다시 생성하는 장점은 상당합니다. 소프트웨어의 안정성 문제가 오래된 소프트웨어를 계속 업데이트함으로써 시간이 지남에 따라 도입됩니다. Docker는 매번 새로운 이미지를 사용함으로써 안정적이고 신뢰할 수 있으며 (아마도) 테스트된 기본을 제공합니다.
이 개념은 Windows 애플리케이션 소프트웨어를 업데이트할 때마다 새로운 Windows 설치를 사용하는 것과 동일합니다. Windows에서는 재미있는 아이디어가 아니지만, Docker에서는 매우 적용 가능합니다.
그러나 휘발성 방법론에는 명확한 문제가 있습니다. 현재 서비스가 삭제될 때 중요한 데이터가 폐기되지 않도록 해야합니다. Docker는 이 문제를 바인드 마운트라는 개념을 사용하여 해결합니다.
이제 컨테이너에 대한 바인드 마운트를 생성하는 방법을 살펴보겠습니다.
폴더 구조 생성 및 정리하기
바인드 마운트를 사용하려면 데이터를 저장할 위치를 생성해야합니다. 이 튜토리얼에서는 홈 디렉토리에 폴더를 생성합니다. Ubuntu Server에 연결된 상태에서 VS Code에서 다음을 수행하십시오.
- VS Code 탐색기 패널의 빈 영역에서 마우스 오른쪽 단추를 클릭하고 new folder를 선택하세요.
2. 새 폴더의 이름을 containers/caddy/files로 지정하세요.
폴더 이름은 도커 명령어에서 올바르게 정의되어있는 한 자유롭게 지정할 수 있습니다. 슬래시를 사용함으로써 VS Code는 이를 세 개의 폴더를 생성하는 것으로 해석합니다. files 폴더는 caddy의 하위 디렉토리이며, caddy는 containers의 하위 디렉토리입니다. 이 폴더 구조를 사용하지 않아도 되지만, 동일한 서버에 여러 개의 컨테이너가 있는 경우 더 의미가 있습니다.
이전에 생성한 컨테이너가 있다면 다음 명령어로 중지하고 제거하세요:
아래 스크린샷에서 이 명령어를 볼 수 있습니다:

바인드 마운트를 사용하여 Caddy 컨테이너를 배포
이제 Ubuntu 서버에 폴더 구조를 생성했습니다. 이제 바인드 마운트를 사용하여 Caddy 컨테이너를 생성해 보겠습니다.
- 더 나아가기 전에 작업 중인 컨테이너가 영속 데이터를 저장하는 위치를 먼저 알아봐야 합니다. Docker 이미지를 생성한 사람과 해당 컨테이너의 목적에 따라 해당 위치가 다를 수 있습니다.
어떤 지속적인 데이터가 저장되는지 찾는 가장 좋은 방법은 문제가되는 이미지에 대한 Docker Hub의 문서를 확인하는 것입니다. Caddy의 경우 다음 문서를 찾을 수 있습니다: 여기:

2. 아래 명령을 사용하여 컨테이너를 시작합니다. -v ~/containers/caddy/files:/usr/share/caddy
매개변수는 콜론(~/containers/caddy/files) 앞의 경로를 컨테이너 내의 폴더(/usr/share/caddy)와 매핑합니다. 이는 포트 매핑 명령과 매우 유사합니다. 포트 대신 폴더를 매핑하는 것입니다. 이러한 유형의 명령은 바인드 마운트라고합니다.
위의 코드에서 틸데(~)는 홈 폴더를 나타냅니다. 이 문서에서는
/home/homelab
와 동일합니다.
3. 브라우저를 열고 서버의 http 주소로 이동합니다. 서버가 이제 404
페이지를 제공하는 것을 알 수 있습니다. 현재 ~/containers/caddy/files에 index.html 파일이 없기 때문에 이는 예상 동작입니다.
4. 다음과 같이 Ubuntu 서버의 VS Code 탐색기 창에서 ~/containers/caddy/files에 index.html 파일을 생성합니다:
5. 서버의 HTTP 주소로 이동하여 컨테이너가 새로운 index.html 페이지를 제공하는지 확인합니다.
다음 애니메이션에서 위에 언급된 모든 것을 볼 수 있습니다:

도커 관리 명령과 달리 index.html과 같은 파일은 관리자 권한이 필요하지 않습니다. 이는 caddy 서버가 제공하는 콘텐츠가 사용자의 홈 폴더에 있기 때문입니다.
바인드 마운트 유효성 검사
좋아요! 완전히 새로운 도커 컨테이너를 사용하고 있으며, 해당 컨테이너는 로컬로 저장된 콘텐츠를 제공하고 있습니다! 다음을 실행하여 이를 확인할 수 있습니다:
- 실행 중인 컨테이너를 중지하고 제거하세요. 이 단계에서는 바인드 마운트를 사용하지 않았다면 index.html 파일을 포함한 모든 것을 완전히 제거합니다.
2. 새로운 컨테이너를 생성하세요.
3. 새로운 컨테이너가 여전히 http://<your server>
주소에서 index.html 파일을 제공하는지 확인하세요.
지속적인 도커 컨테이너 생성
A container isn’t that useful if it stops when the server reboots. By default, that’s what is going to happen if you don’t make it happen. To prevent this, let’s generate a new caddy container again but this time once that restarts when the Docker host, Ubuntu in this case, restarts.
- 실행 중인 모든 컨테이너를 중지하고 제거하세요.
2. 새로운 컨테이너를 --restart always
매개변수와 함께 다시 시작하여 해당 컨테이너가 호스트 재부팅 시 시작되도록 설정하세요. --restart always
플래그를 사용하면 컨테이너가 부팅 시 자동으로 시작되는 올바른 서비스처럼 동작합니다.
3. 서버를 다시 시작하세요.
4. 이제 새로운 컨테이너가 정상적으로 시작되고 http://<your server>
주소에서 여전히 index.html 파일을 제공하는지 확인하세요.
아래에 적용된 명령어를 확인할 수 있습니다:

이제 진행해봅시다.
이 시점에서는 작동하는 Docker 환경과 이미지 및 컨테이너에 대한 기본적인 이해가 있어야합니다. 컨테이너를 가져오고 시작하고 중지하며 기본적인 관리 작업을 수행할 수 있습니다. 또한 바인드 마운트와 포트 매핑을 사용하여 실행 중인 웹 서비스 컨테이너를 성공적으로 생성했습니다.
Docker에 대해 아직 다루어야 할 내용이 많이 남아 있습니다: 계속해서 이 공간을 주시하면 다음 기사에서는 Docker Compose를 사용한 고급 Docker 관리에 대해 다룰 것입니다.