이전 글 ‘Raspberry PI 에서 docker 설치와 실행하기‘  을 작성하고 1년이 지났습니다. 올 해에는 RPi3 보다 한 층 성능이 좋아진 Raspberry PI 4 (이하, RPi4) 가 국내에도 정식으로 출시를 했습니다. RPi4 에 설치하는 최신 Raspbian OS 는 ‘buster’ 라는 이름이 붙어 있습니다. 오늘은 이 buster OS 를 설치한 RPi4 에 docker 를 설치해 보고자 합니다. 이전의 OS 에서의 설치와 어떤 점이 달라졌는지 비교해 보시기 바랍니다.

Info

apt 명령을 이용해서 docker package 를 쉽게 설치 할 수 있습니다만 최신의 버전을 사용하고자 한다면 아래 방법을 사용하는게 좋습니다. 참고로, buster 현재 버전에는 최신의 docker 버전을 포함하고 있습니다.

1. 사용 기기

  • H/W: Raspberry Pi 4 Model B Rev 1.2 (4GB RAM 모델)
  • OS: Raspbian GNU/Linux 10 (buster)
  • Kernel 4.19.75-v7l+

2. Docker 설치 script 를 다운 받자!

Docker 는 다른 package 와 다르게 apt 로 설치 하지 않고, 다음과 같이 별도의 Script 를 이용해야만 합니다.

$ curl -fsSL get.docker.com -o get-docker.sh

다운로드 받은 Shell script 를 살짝 열어 보니 이전 버전에서 보이던 Docker 설치 가능 OS 목록이 없어졌습니다. 그럼, RPi4 buster 에 설치가 가능한 지를 어떻게 확인하면 좋을까 하던 차에 다른 Script 가 하나 더 있다는 것을 확인했습니다. 바로 test-docker.sh 입니다.

$ curl -fsSL https://test.docker.com -o test-docker.sh

3. 일반 계정으로 Docker 사용하도록 설정

원래 docker 는 root 권한으로 실행해야만 합니다. 그러나, root 권한이 아닌 일반 계정(non-root account) 에서 매 번 ‘sudo’ 를 붙여서 명령을 입력하는 것은 매우 귀찮은 일이 아닐 수 없습니다. 일반 계정에서 sudo 없이도 docker 실행이 가능하도록 하기 위해서 일반 계정을 docker group 에 포함 시켜 주도록 합니다.

여기서는 RPi 의 기본 계정인 pi 를 docker group 에 포함시켰습니다.

$ sudo usermod -aG docker pi

설정을 마친 후, logout 하고 다시 login 하면, sudo 없이 docker 명령을 사용 할 수 있습니다. 단, 이 경우, 일반 계정이 root 권한을 부여 받아서 발생할 수 있는 보안상 취약점이 있다는 사실을 명심해야 하겠습니다.

4. test-docker.sh 로 docker 설치 가능 확인 후 설치

다운로드 받은 test-docker.sh 을 실행하면 docker 설치가 가능한 지와 어떤 버전을 설치할지를 확인해서 Docker 를 설치합니다. 설치 정보는 아래와 같이 보여 줍니다.

$ bash test-docker.sh
# Executing docker install script, commit: 6bf300318ebaab958c4adc341a8c7bb9f3a54a1a
+ sudo -E sh -c apt-get update -qq >/dev/null
+ sudo -E sh -c apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
+ sudo -E sh -c curl -fsSL "https://download.docker.com/linux/raspbian/gpg" | apt-key add -qq - >/dev/null
Warning: apt-key output should not be parsed (stdout is not a terminal)
+ sudo -E sh -c echo "deb [arch=armhf] https://download.docker.com/linux/raspbian buster test" > /etc/apt/sources.list.d/docker.list
+ sudo -E sh -c apt-get update -qq >/dev/null
+ [ -n ]
+ sudo -E sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null
+ sudo -E sh -c docker version
Client: Docker Engine - Community
 Version: 19.03.5
 API version: 1.40
 Go version: go1.12.12
 Git commit: 633a0ea
 Built: Wed Nov 13 07:37:22 2019
 OS/Arch: linux/arm
 Experimental: false

Server: Docker Engine - Community 
Engine:
 Version: 19.03.5
 API version: 1.40 (minimum version 1.12)
 Go version: go1.12.12
 Git commit: 633a0ea
 Built: Wed Nov 13 07:31:17 2019
 OS/Arch: linux/arm
 Experimental: false
containerd:
 Version: 1.2.10
 GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339
runc:
 Version: 1.0.0-rc8+dev
 GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
docker-init:
 Version: 0.18.0
 GitCommit: fec3683

5. docker 서비스 동작 확인

docker 설치가 제대로 되었다면 docker daemon 이 동작하고 있을 겁니다. ps 명령을 이용해서 확인해 보았습니다.

$ ps auwx|grep docker
root      2744  0.1  1.5 966736 61112 ?        Ssl  13:38   0:01 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

docker daemon이 잘 동작하고 있습니다.

5. docker container 를 확인해 보자!

docker daemon 이 동작하고 있으므로 다음과 같이 실행 중인 docker container 가 있는지 확인해 보겠습니다.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS       NAMES

현재는 동작 중인  docker container 는 없음을 알 수 있습니다.

6. “Hello, World”

여기까지 완료하였다면 RPi 에서 docker 사용이 가능합니다. 대표적인 “Hello, World” 를 출력해 볼까요?

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1eda109e4da: Pull complete 
Digest: sha256:4fe721ccc2e8dc7362278a29dc660d833570ec2682f4e4194f4ee23e415e1064
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm32v7)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

이 다음 부터는 일반 Linux machine 과 동일하게 docker 를 사용 할 수 있습니다.