Docker Machineが再起動すると、/home/dockerでデータが失われます

8728 ワード

問題の説明


docker default machineが再起動した後(virtualboxで電源を切って再起動した問題)、/home/dockerディレクトリに格納されているスクリプトなどが失われました.再起動するたびにスクリプトを再確立したり、ホストからコピーする前にバックアップしたデータをコピーしたりするのは面倒です.予期せぬ再起動に遭遇したり、最新のデータがバックアップに間に合わなかったりして、悲しくなります.

問題解決策


Find Root Cause


資料を調べたところ、/docker/homeのデータはtmpfs、その名の通りtemp filesystemに格納されていることが分かった.ファイルディレクトリデータがどのfilesystemに格納かを表示するには、df [dir/file name]を使用します.
1.すべてのディスクマウントの表示
docker@default:~$ df -h
Filesystem                Size      Used Available Use% Mounted on
tmpfs                   890.4M    223.7M    666.7M  25% /
tmpfs                   494.7M         0    494.7M   0% /dev/shm
/dev/sda1                17.8G      2.0G     14.9G  12% /mnt/sda1
cgroup                  494.7M         0    494.7M   0% /sys/fs/cgroup
/c/Users                101.4G     49.4G     52.1G  49% /c/Users
/share                  276.7G     55.4G    221.3G  20% /share
/dev/sda1                17.8G      2.0G     14.9G  12% /mnt/sda1/var/lib/docker

2./home/docker対応ディスクの表示
docker@default:~$ df /home/docker
Filesystem                Size      Used Available Use% Mounted on
tmpfs                   890.4M    223.7M    666.7M  25% /

ここから、/docker/homeディレクトリの下のデータは確かにtempfsに置かれていることがわかります.資料を調べたところ、tmpfsはメモリベースの一時ファイルシステムで、machineが閉じた後、データは保存されないことが分かった.

解決策


前述の解析から、データを保存するには、デバイスファイル/dev/sda1にデータを格納する必要があることが分かった.ソフトリンクを作成することで、/home/dockerの下のファイルを/mnt/sda1に保存できますが、ソフトリンクファイルは/home/dockerが存在します.つまり、再起動するとソフトリンクファイルが消え、再構築する必要があります.この方法を排除する.また、/home/dockerに対応するデバイスファイルを直接/dev/sda1に変更する方法も考えられる.Googleは、同じデバイスファイルが2つのファイルディレクトリを同時にマウントできないことを発見しましたが、mount --bindで現在マウントされているディレクトリの下にあるディレクトリ を他のディレクトリにマウントすることができます.

解決プロセス


まず、/mnt/sda1/var/libの下にhomeディレクトリを作成します.このディレクトリを/home/dockerにバインドします.
docker@default:/mnt/sda1/var/lib$ sudo mkdir home
docker@default:/mnt/sda1/var/lib$ sudo mount --bind /mnt/sda1/var/lib/home /home/docker

/home/dockerディレクトリの下にtestを作成します.txt
docker@default:~$ sudo touch test.txt
docker@default:~$ sudo vi test.txt

再起動
C:\Users\Administrator>docker-machine stop default
Stopping "default"...
Machine "default" was stopped.

C:\Users\Administrator>docker-machine start default
Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(default) Waiting for an IP...
Machine "default" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

C:\Users\Administrator>docker-machine env
SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.99.100:2376
SET DOCKER_CERT_PATH=C:\Users\Administrator\.docker\machine\machines\default
SET DOCKER_MACHINE_NAME=default
SET COMPOSE_CONVERT_WINDOWS_PATHS=true
REM Run this command to configure your shell:
REM     @FOR /f "tokens=*" %i IN ('docker-machine env') DO @%i   

default machineに接続し、ファイルを表示します.ファイルには確かに/mnt/sda 1/var/lib/homeが存在しますが、/home/dockerに直接アクセスすると、マウントが失効していることがわかります.こうやって使うのはやはり不便だ
再度マウントし、自動マウントを開始するように設定
docker@default:/mnt/sda1/var/lib/home$ sudo mount --bind /mnt/sda1/var/lib/home /home/docker
docker@default:/mnt/sda1/var/lib/home$ sudo cat /etc/mtab

tmpfs / tmpfs rw,relatime,size=911808k 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
devpts /dev/pts devpts rw,relatime,mode=600,ptmxmode=000 0 0
tmpfs /dev/shm tmpfs rw,relatime 0 0
/dev/sda1 /mnt/sda1 ext4 rw,relatime,data=ordered 0 0
cgroup /sys/fs/cgroup tmpfs rw,relatime,mode=755 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,relatime,cpuset 0 0
cgroup /sys/fs/cgroup/cpu cgroup rw,relatime,cpu 0 0
cgroup /sys/fs/cgroup/cpuacct cgroup rw,relatime,cpuacct 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,relatime,blkio 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,relatime,devices 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,relatime,freezer 0 0
cgroup /sys/fs/cgroup/net_cls cgroup rw,relatime,net_cls 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,relatime,perf_event 0 0
cgroup /sys/fs/cgroup/net_prio cgroup rw,relatime,net_prio 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,relatime,hugetlb 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,relatime,pids 0 0
/c/Users /c/Users vboxsf rw,nodev,relatime 0 0
/share /share vboxsf rw,nodev,relatime 0 0
/dev/sda1 /mnt/sda1/var/lib/docker ext4 rw,relatime,data=ordered 0 0
/dev/sda1 /home/docker ext4 rw,relatime,data=ordered 0 0

マウント対応行/dev/sda1 /home/docker ext4 rw,relatime,data=ordered 0 0が見つかり、/etc/fstabに追加されました.
docker@default:/mnt/sda1/var/lib/home$ sudo mount -o remount,rw /   #  fstab   
docker@default:/mnt/sda1/var/lib/home$ sudo vi /etc/fstab
# /etc/fstab
proc            /proc        proc    defaults          0       0
sysfs           /sys         sysfs   defaults          0       0
devpts          /dev/pts     devpts  defaults          0       0
tmpfs           /dev/shm     tmpfs   defaults          0       0
/dev/zram0  swap         swap    defaults,noauto   0       0
/dev/sda2       none            swap     defaults             0 0 # Added by TC
/dev/sda1       /mnt/sda1       ext4     noauto,users,exec    0 0 # Added by TC
/dev/sr0        /mnt/sr0        auto     noauto,users,exec    0 0 # Added by TC
/dev/sda1       /home/docker    ext4     rw,relatime,data=ordered  0  0

直ちに有効にするfstab(または再起動)
docker@default:/mnt/sda1/var/lib/home$ sudo mount -a
mount: /dev/sda1 is already mounted or /home/docker busy
       /dev/sda1 is already mounted on /mnt/sda1
       /dev/sda1 is already mounted on /mnt/sda1/var/lib/docker
       /dev/sda1 is already mounted on /home/docker

これでこの問題は解決した

その他の関連


バインドが完了すると、~ディレクトリ(すなわち/home/docker)で操作するにはsudo権限が必要になりますが、使用するのは不便です./mnt/sda1/var/lib/homeのユーザを現在のユーザに変更することができる.
docker@default:~$ cd /mnt/sda1/var/lib
docker@default:/mnt/sda1/var/lib$ who  #  
docker          tty1            00:38   Dec 12 09:53:11
docker          pts/0           00:00   Dec 12 09:57:02  192.168.99.1
docker@default:/mnt/sda1/var/lib$ sudo chown -Rf docker home
docker@default:/mnt/sda1/var/lib$ ls -al
total 20
drwxr-xr-x    5 root     root          4096 Dec 12 09:35 .
drwxr-xr-x    3 root     root          4096 Dec  5 08:58 ..
drwxr-xr-x    6 docker   docker        4096 Dec  5 08:59 boot2docker
drwx--x--x   15 root     root          4096 Dec 12 09:53 docker
drwxr-xr-x    2 docker   root          4096 Dec 12 09:36 home
docker@default:/mnt/sda1/var/lib$ cd ~
docker@default:~$ touch demo.txt  #  sudo 
docker@default:~$