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:~$
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:~$