본문 바로가기

NLP/error

도커 컨테이너 유지한 채 마운트 경로 추가하기

이 글이 도움이 될 사람

  • 기존 컨테이너를 생성했는데 지우지 않고 마운트를 하고 싶은 사람
  • 이미 마운트 했는데 또 추가하고 싶은 사람
  • 아직 컨테이너 만들기 전이다? 그러면 이 글 말고 '도커 컨테이너 볼륨 마운트 설정' 검색해서 편하게 하세요
  • 이 방법 말고는 '컨테이너'를 '도커 이미지'로 만들어서 새로운 컨테이너 생성할 때 마운트해주는 수 밖에...

(다만 이 글은 구글링해서 찾은 방법을 따라한 게 아니라 친구들이 도커 고수들이라 이 방법이 되지 않을까해서 해봤는데, 저는 잘되길래 남겨놓은 것임을 밝힙니다.)

 

과정 요약

  1. 도커 재시작 및 컨테이너 종료
  2. hostconfig.json 수정
  3. config.v2.json 수정
  4. 도커 서비스 재시작
  5. 컨테이너 실행 후 마운트 확인

1. 일단 컨테이너와 도커 서비스를 멈춘다

: config 를 수정해야 하니 일단 다 멈추고 안전하게 해야 하니까.

 

docker stop [container_id]
docker service stop
  • 혹시 몰라서 'docker ps' 를 통해 켜져 있는 컨테이너를 확인하고 모두 종료해줬다

 

2. hostconfig.json 수정

sudo vim /var/lib/docker/containers/[container_id]/hostconfig.json
  • [container_id]: 'docker ps' 로 나오는 짧은 id 가 아니라 전체 id 가 필요하다.
  • 전체 id 출력하는 방법: 'docker inspect [container_name]' (모르겠다면 여기서 참고할 것)

 

[수정 전]

{
    "Binds": [
        "/media/new_jeans/love:/home/love",
    ],
    "ContainerIDFile": "",
    "LogConfig": {
        "Type": "json-file",
        "Config": {}
    },
  • 수정 전에는 내가 이 컨테이너를 만들면서 처음 마운트했던 경로가 나와 있다
  • /media/new_jeans/love: 호스트에 있는 경로
  • /home/love: 컨테이너 경로

 

[수정 후]

{
    "Binds": [
        "/media/new_jeans/love:/home/love",
        "/hdd/overwatch/zeta:/home/love/mount"
    ],
    "ContainerIDFile": "",
    "LogConfig": {
        "Type": "json-file",
        "Config": {}
    },

 

  • /hdd/overwatch/zeta: 새롭게 접근하고 싶은 호스트 주소 (나 같은 경우는 하드디스크에도 접근하고 싶어졌다)
  • /home/love/mount: 호스트 주소에 접근가능한 폴더 'mount' 를 생성한다
  • 여기서 'mount' 폴더를 미리 만들어두지 않았는데 저렇게 해도 되나 싶었지만, 알아서 폴더를 생성해줬다...!!!

 

3. config.v2.json 수정

: 이건 설정이 길고 많아서 수정할 부분만 보여주겠다.

 

[수정 전]

    "OS": "linux",
    "RestartCount": 0,
    "HasBeenStartedBefore": true,
    "HasBeenManuallyStopped": true,
    "MountPoints": {
        "/home/love": {
            "Source": "/media/new_jeans/love",
            "Destination": "/home/love",
            "RW": true,
            "Name": "",
            "Driver": "",
            "Type": "bind",
            "Propagation": "rprivate",
            "Spec": {
                "Type": "bind",
                "Source": "/media/new_jeans/love",
                "Target": "/home/love"
            },
            "SkipMountpointCreation": false
        }
    },
  • "MountPoints": 이 안에 1개 더 추가해주면 된다.
  • 기존에 있는 걸 참고해서 추가하면 아래와 같다.

 

[수정 후]

    "OS": "linux",
    "RestartCount": 0,
    "HasBeenStartedBefore": true,
    "HasBeenManuallyStopped": true,
    "MountPoints": {
        "/home/love": {
            "Source": "/media/new_jeans/love",
            "Destination": "/home/love",
            "RW": true,
            "Name": "",
            "Driver": "",
            "Type": "bind",
            "Propagation": "rprivate",
            "Spec": {
                "Type": "bind",
                "Source": "/media/new_jeans/love",
                "Target": "/home/love"
            },
            "SkipMountpointCreation": false
        },
        "/home/love/mount": {
            "Source": "/hdd/overwatch/zeta",
            "Destination": "/home/love/mount",
            "RW": true,
            "Name": "",
            "Driver": "",
            "Type": "bind",
            "Propagation": "rprivate",
            "Spec": {
                "Type": "bind",
                "Source": "/hdd/overwatch/zeta",
                "Target": "/home/love/mount"
            },
            "SkipMountpointCreation": false
        }
    },

 

  • 실제로 이거 입력하는 게 꽤 난이도가 높은 일이었다.
  • 터미널이다보니까 위처럼 예쁘게 나오지도 않아서 일일이 입력했다.
  • 나 같은 경우엔 json 내용 복사해서 터미널에 옮긴 다음 format document 를 통해 공백이 예쁘게 보이도록 다듬었다. 그 후 vscode 에서 작성하고 복사해서 붙여넣었다.

 

4. 재실행 후 확인

sudo service docker start
  • 이제 컨테이너 실행해서 확인해보자