Dockerã®volumeæ©èœã«ã€ããŠèª¿ã¹ãããšããŸãšããŸã
-
察象
- Docker 1.10
- VirtualBoxã§ã®docker-machineå©çš
-
å ¬åŒã®Volumeã«ã€ããŠã®èª¬æææž
Manage data in containers
https://docs.docker.com/engine/userguide/dockervolumes/
Volume
dockerã§runã³ãã³ãã³ã³ãããèµ·åãããšãã«ã-vããªãã·ã§ã³ãã€ããããšã§ èµ·åå
(docker runãå®è¡ãããã¹ã)ã®ãã£ã¬ã¯ã ã³ã³ãããå®è¡ããŠãããã¹ãã®ãã£ã¬ã¯ã㪠1 ããã³ã³ããå
ã®ãã£ã¬ã¯ããªãšããŠããŠã³ãããããšãã§ããŸãã
ãã®ããŠã³ããããé åãVolumeãšããããã§ãã
% docker run -v /host/path:/container/path some_image
â ãã¹ãã® /host/path ããã³ã³ããã® /container/path ã«ããŠã³ã
ãã®ããŠã³ãæ©èœã«ããããã¹ããšã³ã³ãããšã®éã§ãã¡ã€ã«ã®ãããšããããããšãã§ããŸãããŸããã³ã³ããäžã®ãã¡ã€ã«ã¯ã³ã³ãããåé€ãããšæ¶ããŠããŸãã®ã§ãéèŠãªããŒã¿ã¯ãã¹ãåŽã«ä¿ç®¡ããããã«å©çšããŸãã
ãã®volumeã®å Žæã¯docker runã§æå®ãããã®ã§ãããããïŒåºŠã³ã³ãããšããŠèµ·åããåŸã¯å€æŽã§ããªãããã§ãã
ãã®æã®volumeã¯uid=1000ã§ããŠã³ããããŸããgidã¯uid=1000ã®ãŠãŒã¶ã®èšå®æ¬¡ç¬¬ã®ããã§ããä»ã®èšäºã§gid=1000ãšã®èšèŒããããŸããããç§ã®æå
ã§ã¯gid=500(staff)ã§ãããdockerã§ã¯ã³ã³ããäžã§éåžžå©çšãããŠãŒã¶ãuid=1000ãšããã®ãäžè¬çãããã®ã§ãããã«åã£ãŠããã®ããšæããŸãã
ãŸãããã¡ã€ã«ã®ã¢ã¯ã»ã¹æš©éã¯ãã¹ãäžã®ç¶æ
ã«åŸã£ãŠãããããã
# ããŠã³ãåæç¶æ
% find . -exec ls -dln {} \;
mode - uid gid size date path
drwxr-xr-x 4 501 20 136 1 3 15:05 .
drwxr-xr-x 3 501 20 102 1 3 15:05 ./dir1
-rw-r--r-- 1 501 20 10 1 3 15:05 ./dir1/file2.txt
-rw-r--r-- 1 501 20 5 1 3 15:05 ./file1.tx
% docker exec cont1 find /cont1/path -exec ls -lnd {} \;
drwxr-xr-x 1 1000 50 136 Jan 3 06:05 /cont1/path
drwxr-xr-x 1 1000 50 102 Jan 3 06:05 /cont1/path/dir1
-rw-r--r-- 1 1000 50 10 Jan 3 06:05 /cont1/path/dir1/file2.txt
-rw-r--r-- 1 1000 50 5 Jan 3 06:05 /cont1/path/file1.txt
# ãã¹ãåŽã§ããŒããã·ã§ã³ããªãŒããŒã倿Ž
% chmod 0777 file1.txt
% sudo chown root ./dir1/file2.txt
% find . -exec ls -dln {} \;
drwxr-xr-x 4 501 20 136 1 3 15:05 .
drwxr-xr-x 3 501 20 102 1 3 15:05 ./dir1
-rw-r--r-- 1 0 20 10 1 3 15:05 ./dir1/file2.txt
-rwxrwxrwx 1 501 20 5 1 3 15:05 ./file1.txt
% docker exec cont1 find /cont1/path -exec ls -lnd {} \;
drwxr-xr-x 1 1000 50 136 Jan 3 06:05 /cont1/path
drwxr-xr-x 1 1000 50 102 Jan 3 06:05 /cont1/path/dir1
-rw-r--r-- 1 1000 50 10 Jan 3 06:05 /cont1/path/dir1/file2.txt
-rwxrwxrwx 1 1000 50 5 Jan 3 06:05 /cont1/path/file1.txt
â ããŒããã·ã§ã³ã®ã¿ã倿ŽããããªãŒããŒã¯å€ããã
# ã³ã³ããåŽã§ããŒããã·ã§ã³ããªãŒããŒã倿Ž
% docker exec cont1 chmod 0400 /cont1/path/file1.txt
% docker exec -u root cont1 chown games /cont1/path/dir1/file2.txt
% docker exec cont1 find /cont1/path -exec ls -lnd {} \;
drwxr-xr-x 1 1000 50 136 Jan 3 06:05 /cont1/path
drwxr-xr-x 1 1000 50 102 Jan 3 06:05 /cont1/path/dir1
-rw-r--r-- 1 1000 50 10 Jan 3 06:05 /cont1/path/dir1/file2.txt
-r-------- 1 1000 50 5 Jan 3 06:05 /cont1/path/file1.txt
% find . -exec ls -dln {} \;
drwxr-xr-x 4 501 20 136 1 3 15:05 .
drwxr-xr-x 3 501 20 102 1 3 15:05 ./dir1
-rw-r--r-- 1 0 20 10 1 3 15:05 ./dir1/file2.txt
-r-------- 1 501 20 5 1 3 15:05 ./file1.txt
â ããŒããã·ã§ã³ã®ã¿ã倿ŽããããªãŒããŒã¯å€ããã
ãã ããã®ãããã®Volumeã®æš©éã¯å°ãããããããããªã®ã§ããããã€ã³ãã«ãªãããã§ãã以äžã®èšäºãã¿ããšãã€ã¡ãŒãžã®å ã«ããç°å¢ã«ãã£ãŠã¯åäœãç°ãªãããšãããããã§ãã
- Dockerã®VOLUMEã調ã¹ãŠã¿ãã - Less is Best
http://yss44.hatenablog.com/entry/2014/01/08/010022
ãŸããããŠã³ãããæã®uid/gidãæå®ã§ããããã«ããããšããåããããããã§ãã
- Make uid & gid configurable for shared volumes · Issue #7198 · docker/docker
https://github.com/docker/docker/issues/7198
Dockerfileã§ã®volumeã³ãã³ã
dockerã®ã€ã¡ãŒãžãäœæããDockerfileã«ã¯ãVolumeãšããã³ãã³ãããããŸãããã®ã³ãã³ãã§ãvolumeãèšå®ããããšãã§ããŸãã
- å
¬åŒã®volumeã³ãã³ãã®èª¬æ
Dockerfile reference - volume
https://docs.docker.com/engine/reference/builder/#volume
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
äžèšã®Dockerfileã®ããã«èšè¿°ããããšã§ãã³ã³ããå ã® /myvol ãã£ã¬ã¯ããªãvolumeãšããŠæå®ããŸããäŸãã°DBãµãŒããŒãdockerã§æ§ç¯ããæã«ããŒã¿ã®ä¿ç®¡é åãã³ã³ããå ã«æããªãããã«ããããã«äœ¿çšãããããããã§ãã
ã§ã¯ããã®Volumeæå®ããããã£ã¬ã¯ããªã¯ãå®éã«ã¯ã³ã³ããå€ã®ã©ãã«ããŠã³ããããã®ã§ããããïŒ
ãã®Dockerfileã§äœæããã€ã¡ãŒãžãdocker runã§ã-vããªãã·ã§ã³ãªãã§èµ·åããå Žåã«ã¯ãdockerã³ã³ããã皌åãããŠããdockerãµãŒããŒå
ã®ãã¹ãèªåã§å²ãåœãŠãããŸããdockerãµãŒããŒã«ã¯ä»¥äžã®å Žæã«ã³ã³ããçšã®äœæ¥ãã£ã¬ã¯ããªãçšæãããŠããããã§ãããã«Volumeãèªåã§ããŠã³ããããŸãã
/mnt/sda1/var/lib/docker/volumes/{volume ID}/_data
ãã®Volumeã®ããŠã³ãç¶æ³ã¯docker inspect {ã³ã³ããID}ã³ãã³ãã§ç¢ºèªã§ããŸãã
% docker inspect jenkins
(ç¥)
"Mounts": [
{
"Source": "/mnt/sda1/var/lib/docker/volumes/03eefde0f6df910352a540c461204a5dca07d9bc93302424b16ca3e12ead0814/_data",
"Destination": "/dir1",
"Mode": "",
"RW": true
}
],
(ç¥)
å ã®Dockerfileã®äŸã¯å ¬åŒèª¬æã§ã®ãµã³ãã«ãªã®ã§ãããVOLUMEæå®ã®åã«ãã£ã¬ã¯ããªããã¡ã€ã«ãäœæããŠããŸããæèŠçã«ã¯ãããŠã³ãããŠããã«ãã¡ã€ã«ãäœãæµãã®æ¹ãèªç¶ãªæ°ãããŸãããŸããvolumeã«ããŠã³ããããé åã«æ¢ã«ãã¡ã€ã«ãååšããŠããå Žåã¯ã©ããªãã®ã§ããããïŒ
ããã§ã以äžã®ãããªDockerfileã§imageãäœæããŠèµ·åããŠã¿ãŸããã
FROM ubuntu
RUN mkdir /myvol
# VOLUMEåã«ãã¡ã€ã«äœæ
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
# VOLUMEåŸã«ãã¡ã€ã«äœæ
RUN echo "hello hello world" > /myvol/greeting2
ããŠã³ããããã¹ãæå®ããªãå Žå
% docker run -d image1
976d7a337b4c300686286a527ac15210c92a6308eb0c674f060f532aa6d80f75
% docker inspect -f '{{json .Mounts}}' 976d7a337b4c
[{"Name":"f39824c1616441199194fcdee59b9227663ec1f061291e073ca76140f81c4e2c","Source":"/mnt/sda1/var/lib/docker/volumes/f39824c1616441199194fcdee59b9227663ec1f061291e073ca76140f81c4e2c/_data","Destination":"/myvol","Driver":"local","Mode":"","RW":true}]
% docker exec 976d7a337b4c30 ls -l /myvol
total 4
-rw-r--r-- 1 root root 12 Jan 3 07:00 greeting
% docker-machine ssh default sudo ls -l /mnt/sda1/var/lib/docker/volumes/f39824c1616441199194fcdee59b9227663ec1f061291e073ca76140f81c4e2c/_data
total 4
-rw-r--r-- 1 root root 12 Jan 3 07:00 greeting
volumeé åã®äžã¯ãVOLUMEã³ãã³ãåã«äœæããŠããgreetingã¯ãããŸãããåŸã§äœæããgreeting2ã¯ãããŸããã§ããã
ãããããVOLUMEã³ãã³ãã®æç¹ã§å¯Ÿè±¡ã®ãã¹ãç¹æ®ãªç¶æ
ã«åºå®ãããŠããããã§ãããã®äžã§ãã³ã³ããèµ·åæã«VOLUMEãããŠã³ãããéã«ããã®åºå®ããå
容ãå®éã«ããŠã³ãããé åã«ã³ããŒãããããªåããããŠããããã§ãã
ååšããªããã¹ãããŠã³ãããããšããå Žå
% ls -ld sample2
ls: sample2: No such file or directory
% docker run -d -v $(pwd)/sample2:/myvol image1
4a931d229d2e654ce993cd92c2de4a67342f18120c718910e4a4e582795ac723
% docker inspect -f '{{json .Mounts}}' 4a931d229d2
[{"Source":"/dev/docker/sample2","Destination":"/myvol","Mode":"","RW":true}]
% ls -l
total 88
drwxr-xr-x 2 namu staff 68 1 3 16:10 sample2/
% ls -l sample2
% docker exec 4a931d229d2 ls -l /myvol
total 0
ã-vããªãã·ã§ã³ä»ãã§docker runãå®è¡ããæç¹ã§ããã¹ãåŽã«ã¯ãã£ã¬ã¯ããªãäœæãããŠããŸãããäžèº«ã空ã«ãªã£ãŠãããšããããšã§ãå®äœã¯ãã¹ãåŽã®ãã£ã¬ã¯ããªã«ãªã£ãŠããŸãã
-v ãæå®ãããšVOLUMEã³ãã³ãã§ã®å¹æãæã¡æ¶ããŠããŸãããã§ãã
äžèº«ã空ã®ãã¹ãããŠã³ãããå Žå
% mkdir sample3
% ls -la sample3
total 0
drwxr-xr-x 2 namu staff 68 1 3 16:12 ./
drwxr-xr-x 9 namu staff 306 1 3 16:12 ../
% docker run -d -v $(pwd)/sample3:/myvol image1
20da9f443f81ac012e60f6ba88920e197977d542992ab625dbcf9c95e0ca1160
% docker inspect -f '{{json .Mounts}}' 20da9f443f81
[{"Source":"/dev/docker/sample3","Destination":"/myvol","Mode":"","RW":true}]
% ls -la sample3
total 0
drwxr-xr-x 2 namu staff 68 1 3 16:12 ./
drwxr-xr-x 9 namu staff 306 1 3 16:12 ../
% docker exec 20da9f443f81 ls -l /myvol
total 0
ããã§ããå®äœããã¹ãåŽã®å 容ã«ãªã£ãŠããŸãã
ããŠã³ãããé åã«æ¢ã«ãã¡ã€ã«ãããå Žå
% ls -l sample1
total 8
drwxr-xr-x 3 namu staff 102 1 3 15:05 dir1/
-r-------- 1 namu staff 5 1 3 15:05 file1.txt
% docker run -d -v $(pwd)/sample1:/myvol image1
d8ea06d78121ef4f37d596766667aa66d61d0a496583454c0826ea9b25c29240
% ls -l sample1
total 8
drwxr-xr-x 3 namu staff 102 1 3 15:05 dir1/
-r-------- 1 namu staff 5 1 3 15:05 file1.txt
% docker exec d8ea06d7812 ls -l /myvol
total 4
drwxr-xr-x 1 jenkins staff 102 Jan 3 06:05 dir1
-r-------- 1 jenkins staff 5 Jan 3 06:05 file1.txt
ãã¡ãããããã§ãã
以äžã®ããšãããDockerfileã§ã®volumeã³ãã³ãã¯imageå€ã®é åã䜿ãããšãæç€ºããã³ãã³ãã§ãããimageå ã§å¯Ÿè±¡ã®ãã¹ã«ãã¡ã€ã«ãååšããå Žåã¯æ³šæãå¿ èŠã§ãã
ãªããdocker runã³ãã³ãã®ã-vããªãã·ã§ã³ã§ã:ããªãã§ãã¹ãæå®ãããšãDockerfileã«ãŠvolumeã³ãã³ãã䜿ã£ãããšãšåã广ã«ãªãããã§ãã
# å
ã®Dockerfileã§volumeã³ãã³ããèšè¿°ããªãã£ããšããäžã§ä»¥äžã®ããã«ãªã
% docker run -v /myvol some_image
% docker inspect -f '{{json .Mounts}}' 20da9f443f81
[{"Source":"/mnt/sda1/var/lib/docker/volumes/0beb488402d2a637ad98a29a414f0b0440efad3b9654a30ca9bc3aa91a44c33e/_data","Destination":"/myvol","Mode":"","RW":true}]
â ã³ã³ããå
ã®/myvolãåŸã¥ãã§volumeã«ããã
ããšããš/myvolã«å
¥ã£ãŠãããã¡ã€ã«ãããŠã³ãå
ã«ã³ããŒããã
Data volume container
- å
¬åŒèª¬æ
https://docs.docker.com/engine/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container
dockerã®volumeé åã¯ä»ã®ã³ã³ããéã§å ±æããããšãã§ããŸãã
# some_imageãšããã€ã¡ãŒãžããcont1ãšããååã®ã³ã³ãããšããŠèµ·å
docker run --detach -name cont1 -v /host/path:/cont/path some_image
# cont2ãèµ·åãããšãã«ãcont1ã®volumeãå
±æ
docker run --detach --name cont2 --volumes-from cont1 some_image
â cont2å
ã«ã /cont/path ã§volumeãäœãããã
äžèšã®ããã«ã--volumes-fromããªãã·ã§ã³ã䜿çšãããšãcont1ã®volumeé åããã®ãŸãŸcont2ã§ãå©çšã§ããŸãã
ãã®æã®cont1ã®ããã«ãvolumeãå
±æãããããšã ããæ³å®ããã³ã³ããããData volume containerããšããããã§ããããã¯äœ¿ãæ¹äžã®ååã§ãã£ãŠç¹æ®ãªæ©èœãèšå®ãæå³ããŠããããã§ã¯ãªãããã§ãã
å
¬åŒããŒãžã§ããã®çšåºŠã®èª¬æã®ã¿ã§ãå®éã®æŽ»çšæ¹æ³ãªã©ãèšè¿°ãããŠããªãã®ã§ããã 以äžã®ãããªäœ¿ãæ¹ãã§ããã®ããªãšæ³åããŠããŸãã
ïŒäŸïŒïŒ
Dockerfileã§volumeã³ãã³ãã§æå®ããé åãè€æ°ã®ã³ã³ããéã§å
±æãããå Žåã«äœ¿ããŸããåãé åãã-vããªãã·ã§ã³ã§ããŠã³ãããããšæã£ãŠãããã®å ŽæãDockerãµãŒããŒå€ããæç€ºããã®ãã§ããªãã®ã§ããã®æ¹æ³ãããããŸããã
ïŒäŸïŒïŒ
postgresqlãšmysqlãšapacheã皌åããŠããã³ã³ããã§ããããã®ããŒã¿é åãå¥ã ã«volumeãšããŠãããšããŸãã
% docker run --detach --name cont1
-v /host/postgresql:/var/postgresql
-v /host/mysql:/var/mysql
-v /host/httpd_doc:/var/apache/public
serv1
ãã®ãšããå¥ã®ã³ã³ããã«ãŠäžèšã®ãã¡ã®httpçšã®é åã®ã¿ãå ±æããããšãããšãã«ã以äžã®ããã«ãããšå°ãæ³å®å€ã®åœ¢ã«ãªããŸãã
% docker run serv1 --name cont2 --volumes-from=cont1
â ããã ãšãäžèŠãªpostgresqlãmysqlçšã®volumeã«ãã¢ã¯ã»ã¹ã§ããŠããŸã
ããã§ã以äžã®ããã«è€æ°ã§å ±æããé åã ãããã€ã³ã³ãããèµ·åããŠãïŒã€ã®ã³ã³ããã§å ±æãããšããã®ããšæããŸãã
% docker run --detach --name=vol_cont
-v /host/httpd_doc:/var/apache/public serv1
% docker run --detach --name=cont1
-v /host/postgresql:/var/postgresql
-v /host/mysql:/var/mysql
--volums-from=vol_cont serv1
% docker run --detach --name cont2
--volumes-from=vol_cont serv1
ããããããšã§ãå¿ èŠãªå Žæã®ã¿ãå ±æããããšãã§ããŸãã
ïŒäŸïŒïŒ
ïŒã€ã®ç°ãªããã¹ãéã®é åãã³ã³ãããéããŠå ±æããããšãã«ã以äžã®ããã«ããããšãã§ããã®ã§ã¯ãªãããšæããŸãã
$ ssh host1
user@host1 $ docker run --name=vol_cont -v /host1/path:/val/path serv1
$ ssh host2
user@host2 $ docker run --name=cont1 --volumes-from=vol_cont serv1
â cont1äžã®/val/pathã®äžèº«ã¯ãhost1ã®/host1/pathã®é åã«ãªãã¯ã
ãã°ïŒ
ãã®dockerã®volumeã«ã€ããŠã¯ããŸã è¬ãªåäœãå«ãŸããŠãããããªæããããŸããå ã«ç޹ä»ãããããŒã¹ã«ãããã£ã¹ããªãã¥ãŒã·ã§ã³ã«ãã£ãŠvolumeé åã®ãªãŒããŒã倿Žã§ãããã»ã§ããªãã£ãããããããªããšããããŸãã
ä»ã«ããããdockerã®ã³ã³ããã®å
ã§docker run -v /path/to:/path/toã³ãã³ããå®è¡ããŠvolumeãããŠã³ãããããšãããšãã³ãã³ããå®è¡ããã³ã³ããå
ã®ãã¹ã§ã¯ãªãããã®ã³ã³ããã皌åããŠããdockerãµãŒããŒäžã®ãã¹ãããŠã³ããããŠããŸããŸãã
% docker run --name cont1 image1
% docker exec -ti cont1 /bin/bash
cont1$ ls -l /home/
total 0
cont1% docker run --detach -v /home:/cont_home image1
d896607cee52a203da75790dc80f401de2916a4b1348c713989d0ba190dbdc37
% docker exec d896607cee5 ls -l /cont_home
total 0
drwxr-sr-x 5 jenkins staff 160 Dec 31 10:41 docker
% docker-machine ssh default ls -l /home
total 0
drwxr-sr-x 5 docker staff 160 Dec 31 10:41 docker
â cont1äžã®/homeã§ã¯ãªãããã®dockerã³ã³ãã皌åããŠãã
ãã¹ã(OSXäžã®dockerç°å¢ã§èšããšãVirtualBoxäžã§èµ·åããŠããä»®æ³OS)ã®
/homeãããŠã³ãããã
dockerã®jenkinsã€ã¡ãŒãžã䜿ã£ãŠjenkinsã皌åãããã®äžã§Docker pluginã䜿ãããšããã®ã§ããããã®è¬ã®çŸè±¡ã®ããã«jenkinsäžã®workspaceãã¹ã¬ãŒããšããŠèµ·åããã³ã³ããå ã«ããŠã³ãã§ããã«è©°ãŸã£ãŠããŸããŸããã
ãŸãšã
ããã§å
¬åŒããã¥ã¡ã³ããåçš®èšäºãªã©ã§ããããããªãã£ãvolumeã®åäœããè²ã
å®éšããŠæŽãããšãã§ããŸããã
ãã®ãšãããdockerãããªãæµè¡ã£ãŠããŠæ§ã
ãªãšããã§å©çšãããŠãããããªã®ã§ã倧çã§ã¯å®å®ããŠããã®ããšæã£ãŠããã®ã§ããã詊ããŠã¿ããšä»¥å€ãšäžæè°ãªåããããã®ã§ããªããªãé£ããé¢ãããããã§ãã
-
2017/03/03ä¿®æ£ ããŠã³ãããããã£ã¬ã¯ããªã®ãã¹ããåéãããŠããŸãããDocker for Macãªã©ã§æå ã«Dockerãã€ã³ã¹ããŒã«ããŠããã®ã§ããã° ãdocker runãå®è¡ããå Žæãã§ãæ£ããã®ã§ãããDockerãã¹ããå¥ã®ãµãŒããŒã®å Žåã¯ãã®ãµãŒããŒå ã®ãã£ã¬ã¯ããªã䜿ãããŸããã¡ãªã¿ã«docker-machineã§VirtualBoxã䜿ã£ãDockerç°å¢ã®å Žåã¯ãVirtualBoxå ã«æå ã®ãã¹ãã®
/UsersãããŠã³ããããŠããã®ã§ãdocker runããå Žæããšããç¶æ ãæç«ããŠããŸãã â©