컨테이너 생성시 매번 마운트 스토리지에 매핑해줘서 Scale-out에는 크게 문제가 없겠거니 했는데 DB가 갑자기 터져버렸다.
알고보니 도커 이미지, 컨테이너 정보 등이 모두 OS 디렉터리(/var/lib/docker)에 저장되고있었다.
이에 도커 저장소를 아예 바꿔버리는 방법을 알아보았다.
저장소 위치 변경
원래는 config 파일을 찾아서 이리저리 바꾸고 해야하는데, OS마다 방법이 다르고 심지어 OS 버전별로도 다르다.
다행히도 도커 공식 문서에서 ‘OS 비종속적인 해결방법’을 소개해줬다.
방법은 간단하다.
단순히 /etc/docker/daemon.json을 수정하면 된다.
{ "graph": "/storage/repository/docker" }
위의 키워드가 먹히지 않는다면 버전이 달라서 그렇다.
참고로 graph 커맨드는 특정 버전 이후로 depreciated됐기 때문에, 필자는 data-root 커맨드를 추천한다.
{ "data-root": "/storage/repository/docker" }
물론 위의 디렉터리는 미리 만들어놓아야 한다.
이제 설정을 적용하고 도커를 재시작하면 된다.
$ sudo service docker stop $ sudo systemctl daemon-reload $ sudo service docker start
문제가 생겼을 경우 다음 커맨드로 에러를 확인하자.
$ docker logs --tail 10 --follow --timestamps <container_name>
재시작하면 지정된 경로에 도커 관련 폴더들이 생성되었을 것이다.
만약 이전의 도커 정보를 유지하고 싶으면 이전 도커 저장경로를 그대로 복사해오면 된다.
보통 CentOS 7에서는 /var/lib/docker/ 안에 있는 것 같다.
물론 옮기고나서는 지워도 된다.
또는 다음의 키워드로 불필요한 자료들을 지울 수도 있다.
$ docker system prune -af
SELinux 설정
CentOS 7에서는 아쉽게도 추가적인 작업이 필요하다.
SELinux때문에 도커에서 도커 저장소에 접근할 수 없기 때문이다.
운이 좋으면 설정이 잘 되어있어 문제없이 도커를 운용할 수 있겠지만,
보통 컨테이너를 실행하면서 libtinfo.so.5 등을 찾을 수 없다는 문제가 발생한다.
보통 아래의 에러 메시지와 함께 컨테이너가 무한 재부팅에 들어간다.
error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
SELinux는 Security-Enhanced Linux의 약자로 말 그대로 보안을 위한 시스템이다.
모든 파일들은 SELinux에 의해 레이블링된다.
SELinux는 이러한 레이블링 정보를 통해 권한을 관리한다.
위의 단계에서 생성한, 또는 복사해온 도커 저장소에 올바른 레이블링을 해주어야 도커가 정상적으로 동작한다.
예시로 필자의 기존 도커 저장소의 SELinux 레이블은 이러했다.
[root@hooni generator]# ls -Z /storage/repository/ drwx--x--x. root root unconfined_u:object_r:samba_share_t:s0 docker drwxr-xr-x. root root system_u:object_r:samba_share_t:s0 gitlab dr-xrwx-wx. root root system_u:object_r:container_file_t:s0:c323,c361 grafana drwxr-xr-x. root root system_u:object_r:container_file_t:s0:c142,c659 influxdb drwx------. sysop sysop system_u:object_r:unlabeled_t:s0 lost+found drwxr-xr-x. root root system_u:object_r:container_file_t:s0:c79,c611 mysql [root@hooni generator]# ls -Z /storage/repository/docker/ drwx------. root root system_u:object_r:samba_share_t:s0 containers drwx--x--x. root root system_u:object_r:samba_share_t:s0 docker drwx------. root root system_u:object_r:samba_share_t:s0 image drwxr-x---. root root system_u:object_r:samba_share_t:s0 network drwx------. root root system_u:object_r:samba_share_t:s0 overlay2 drwx------. root root system_u:object_r:samba_share_t:s0 plugins drwx------. root root system_u:object_r:samba_share_t:s0 swarm drwx------. root root system_u:object_r:samba_share_t:s0 tmp drwx------. root root system_u:object_r:samba_share_t:s0 trust drwx------. root root system_u:object_r:samba_share_t:s0 volumes
아무래도 도커 저장소가 samba로 공유되다보니 samba 폴더의 디폴트 레이블이 그대로 적용된 듯 하다.
기존의 도커 저장소(/var/lib/docker)의 레이블을 참고하여 다음처럼 바꾸었다.
... [root@hooni generator]# chcon -u system_u -t container_share_t /storage/repository/docker/overlay2 [root@hooni generator]# ls -Z /var/lib/docker/ drwx------. root root system_u:object_r:container_var_lib_t:s0 containers drwx--x--x. root root system_u:object_r:container_var_lib_t:s0 docker drwx------. root root system_u:object_r:container_var_lib_t:s0 image drwxr-x---. root root system_u:object_r:container_var_lib_t:s0 network drwx------. root root system_u:object_r:container_share_t:s0 overlay2 drwx------. root root system_u:object_r:container_var_lib_t:s0 plugins drwx------. root root system_u:object_r:container_var_lib_t:s0 swarm drwx------. root root system_u:object_r:container_var_lib_t:s0 tmp drwx------. root root system_u:object_r:container_var_lib_t:s0 trust drwx------. root root system_u:object_r:container_var_lib_t:s0 volumes
이러고나니 문제없이 도커 컨테이너가 동작했다.
의도치 않은 삽질이었다.