최근에, 저는 Docker 사용에 대한 몇 가지 흥미로운 튜토리얼을 썼습니다, LXC를 기쁨의 털복숭이 번들로 감싸고, 어떻게 말할까, 덜 자폐적으로 기울어진 개발자, 엔지니어, 시스템 관리자들, Python 구토에 그다지 열중하지 않는 이들이 OS-레벨 가상화의 경이로움을 즐기게 해주는 깔끔한 기술입니다. 하지만 문제들이 있습니다.
오늘 우리가 논의할 두 가지 이슈는 당신이 네이밍된 컨테이너를 시작하거나, 하나를 삭제하려고 할 때 발생합니다. 즉, 화면의 멋진 글자들은 다음과 같이 읽힐 것입니다: "Conflict. The name W is already in use by container XYZ. You have to delete..." 그리고 두 번째 골칫거리는 이렇게 읽힙니다: "Conflict, cannot remove the default name of the container..." 노골적인 구두점 오용은 제쳐두고, 우리는 이제 이것을 어떻게 정리할지 알아내야 합니다.
문제들
좋아요, 그래서 우리는 이 이슈를 가지고 있습니다:
docker run -d -ti -p 22 -p 80 --name <name> <repo:tag>
FATA[0000] Error response from daemon: Conflict. The name "XYZ" is already in use by container hexacode. You have to delete (or rename) that container to be able to reuse that name.
우리는 컨테이너를 시작할 수 없습니다, 왜냐하면 이름이 이미 사용 중이기 때문입니다. docker ps 명령어를 실행하면, 당신은 그것을 거기서 보지 못할 것입니다. 게다가 만약 당신이 문제의 컨테이너 잔재들을 죽이거나 제거하려고 시도하면, 당신은 얻습니다:
docker rm --link <name>
Error response from daemon: Conflict, cannot remove the default name of the container
FATA[0000] Error: failed to remove one or more containers p>
막다른 골목처럼 보입니다. 그래서 이제 뭘 할까요?
해결책들
먼저, 우리가 무엇을 가지고 있는지 파악해 봅시다. 분명히, 과거의 어느 시점에서, 당신은 네이밍된 컨테이너를 생성했고, 그 다음, 당신은 그것을 실행 중인 채로 두었습니다. 그 후, 당신의 호스트는 어떤 이유로든 재부팅되었고, 당신은 당신의 컨테이너들을 우아하게 종료하지 않았습니다. 남은 파일들이 이제 오래된 이름으로 새로운 컨테이너들을 다시 생성하는 것을 막는 것 같습니다, 왜냐하면 시스템이 오래된 것들이 여전히 제자리에 있다고 생각하기 때문입니다.
이슈를 고치는 두 가지 방법이 있습니다. 우리는 우아한 것부터 시작할 것입니다. docker ps 명령어를 실행하면, 당신은 당신의 오래된 컨테이너들을 보지 못할 것입니다, 왜냐하면 그것들이 실제로 실행 중이 아니기 때문입니다. 하지만 docker ps 명령어를 -a 플래그와 함께 실행하면, 당신은 당신의 모든 컨테이너 실행 기록을 볼 수 있어야 합니다:
비정상적으로 종료된 컨테이너들은 0이 아닌 상태 코드를 가질 것입니다. 그들의 이름을 기반으로 필요한 것들을 검색하고, 실제 16진수 코드를 사용하여 그것들을 제거하세요, 예:
docker rm 85c2981e63f6 26ea04f41ab3
두 번째 방법은 /var 아래에서 남은 파일들을 수동으로 삭제하는 것입니다. 구체적으로, 파일들은 /var/lib/docker/containers/ 아래에서 발견될 수 있습니다. 각 컨테이너 디렉토리는 매우 긴 해시 식별자를 가지며, 그 안에는 지저분한 JSON 출력이 톤 단위로 있습니다. 만약 당신이 당신의 원하는 컨테이너 이름과 일치하는 특정 문자열을 검색하면, 당신은 그 구성 파일들을 보유하고 있는 관련 디렉토리를 찾을 것입니다.
이름 검색과 일치하는 부모 디렉토리를 삭제한 다음, Docker 서비스를 재시작하세요. 그 후, 당신은 당신의 이름을 다시 사용할 수 있어야 합니다. 이것은 우리가 KVM과 libvirt 남은 것들에서 본 것과 같습니다. p>
systemctl restart docker
그리고 당신은 작동하고 실행 중이어야 합니다, 올드 보이!
결론
일부 문제들은 정말로 성가실 수 있습니다, 특히 그것들이 서비스가 충돌, 재부팅 등을 얼마나 잘 그리고 강력하게 처리하는지와 관련될 때. 저는 남은 파일들이 그렇게 많은 슬픔을 야기하는 것을 싫어합니다. 그것은 그래서는 안 되고, 서비스는 장엄하게 복구되어야 합니다. 하지만 헤이, 컨테이너들은 여전히 젊은 기술이므로, 이런 종류의 것들은 예상됩니다.
바람처럼 영광스러운 에어컨 시스템이 앞유리에 분노를 퍼붓듯, 우리는 예기치 않은 재부팅 등에 따른 네이밍된 컨테이너 생성과 남은 것들 삭제 주변의 안개와 혼란을 걷어냈기를 바랍니다. 이제, 당신의 Docker 경험은 약간 더 즐거울 것이고, 당신은 배경에서 것들이 어떻게 작동하는지에 대해 한두 가지를 배웠습니다. 가세요, 즐기세요. p>
치어스. p>