Ubuntu 20.04 - docker를 위한 tcp 바인딩 추가
(2024-09-20 업데이트) ssh 지원이 추가됐으므로 특별한 이유가 없는 한 굳이 tcp 바인딩을 추가할 필요가 없습니다.
ssh를 이용한 원격 docker 서비스 사용
; https://www.sysnet.pe.kr/2/0/13734
지난 글에서,
Linux 운영체제의 docker를 위한 tcp 바인딩 추가
; https://www.sysnet.pe.kr/2/0/12178
리눅스 환경에서의 2375 관리 포트를 여는 방법을 소개했는데요, 우분투 20.04의 경우 snap을 이용해 docker를 설치하면서,
# snap install docker
서비스 설정 파일 경로도 바뀌었고, "
Linux 운영체제의 docker를 위한 tcp 바인딩 추가" 글에 쓴 방법을 이용해 옵션을 추가하면,
# cat /etc/systemd/system/snap.docker.dockerd.service
[Unit]
# Auto-generated, DO NOT EDIT
Description=Service for snap application docker.dockerd
Requires=snap-docker-471.mount
Wants=network.target
After=snap-docker-471.mount network.target snapd.apparmor.service
X-Snappy=yes
[Service]
EnvironmentFile=-/etc/environment
ExecStart=/usr/bin/snap run docker.dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock
SyslogIdentifier=docker.dockerd
Restart=on-failure
WorkingDirectory=/var/snap/docker/471
TimeoutStopSec=30
Type=simple
[Install]
WantedBy=multi-user.target
서비스 재시작 후, 아예 docker 명령어가 동작을 안 합니다.
# systemctl daemon-reload
# systemctl restart snap.docker.dockerd.service
# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
이전 글을 쓸 때만 해도 "-H fd://"가 기본 경로의
유닉스 도메인 소켓을 자동으로 잡아줬는데 아무래도 그 기능이 삭제된 것 같습니다. (혹시 이력을 아시는 분은 덧글 부탁드립니다.)
암튼, 그냥 다음과 같이 직접 도메인 소켓 경로를 지정해야 합니다.
# cat /etc/systemd/system/snap.docker.dockerd.service
[Unit]
# Auto-generated, DO NOT EDIT
Description=Service for snap application docker.dockerd
Requires=snap-docker-471.mount
Wants=network.target
After=snap-docker-471.mount network.target snapd.apparmor.service
X-Snappy=yes
[Service]
EnvironmentFile=-/etc/environment
ExecStart=/usr/bin/snap run docker.dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
SyslogIdentifier=docker.dockerd
Restart=on-failure
WorkingDirectory=/var/snap/docker/471
TimeoutStopSec=30
Type=simple
[Install]
WantedBy=multi-user.target
참고로, 위에서는 "/etc/systemd/system/snap.docker.dockerd.service" 경로의 파일을 직접 수정했는데요, 아쉽게도 그 파일의 처음 부분에 "# Auto-generated, DO NOT EDIT"라는 글이 괜히 있는 것이 아닙니다. ^^
실제로 (예를 들어) 재부팅을 하고 나면 snap.docker.dockerd.service 파일에 설정했던 내용이 다시 없어집니다. 즉, 그 파일에 대한 수정은 일시적으로 적용될 뿐, 영구적으로 설정하려면 해당 서비스에 대한 override 파일을 만들어야 합니다.
"/etc/systemd/system/snap.{서비스_이름}.d/override.conf" 경로 규칙으로
override 파일을 만들 수 있는데, 위의 내용대로 설정하고 싶다면 "/etc/systemd/system/snap.snap.docker.dockerd.d/override.conf" 파일명으로 아래와 같이 ExecStart를 초기화 및 재설정하는 텍스트를 남기면 됩니다.
[Service]
ExecStart=
ExecStart=/usr/bin/snap run docker.dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
이후 저장하고 서비스를 재시작하면,
$ sudo systemctl daemon-reload
$ sudo systemctl restart snap.docker.dockerd
override.conf에 명시한 대로 ExecStart 명령어가 실행되고 있는 것을 확인할 수 있습니다.
$ systemctl status snap.docker.dockerd
● snap.docker.dockerd.service - Service for snap application docker.dockerd
Loaded: loaded (/etc/systemd/system/snap.docker.dockerd.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/snap.docker.dockerd.service.d
└─override.conf
Active: active (running) since Tue 2024-06-11 15:06:54 KST; 3min 19s ago
Main PID: 13283 (dockerd)
Tasks: 48 (limit: 9426)
Memory: 50.2M
CPU: 1.285s
CGroup: /system.slice/snap.docker.dockerd.service
├─13283 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-docker --pidfile=/run/snap.docker/docker.pid --config-file=/var/snap/docker/2915/config/daemon.json -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
├─13367 containerd --config /run/snap.docker/containerd/containerd.toml --log-level error
├─13586 /snap/docker/2915/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 38959 -container-ip 172.18.0.2 -container-port 6443
└─13601 /snap/docker/2915/bin/containerd-shim-runc-v2 -namespace moby -id 528be85c19a9959b3c40bf988df7cd807f62af57a5f6fbd7b8e3fdaedd34dd81 -address /run/snap.docker/containerd/containerd.sock
...[생략]...
아울러, dockerd 경우에는 ssh 접속으로 공개하는 것이 아니므로 보안을 위해 특정 컴퓨터에서만 접속이 되도록 방화벽 설정을 하는 것이 좋습니다.
// 192.168.100.50 컴퓨터에서만 접속을 허용
$ sudo ufw allow from 192.168.100.50 to any port 2375 proto tcp
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]