Docker container varsayılan olarak her zaman root kullanıcı olarak çalışır. Sonuç olarak çalışan tüm işlemlerin, paylaşılmış klasörlerin, dosyaların vs. sahibi root olacaktır. Bu durum ana sistemde veya docker container içinde klasörler/dosyalar üzerinde değişiklikler yapmak istediğimiz zaman problem olacaktır.

Bu gibi sorunları çözmek için, ana sistem ve docker container kullanıcısının UIDlerini eşitlememiz gerekir. Docker container'in root kullanıcısının UIDsi her zaman 0 olacaktır. Docker container'i root kullanıcısı ile çalıştırmak kötü bir güvenlik sorunudur.


Ana sistem


Aktif kullanıcının bilgileri.


ubuntu@linux:~$ echo $HOME
/home/ubuntu

ubuntu@linux:~$ pwd
/home/ubuntu

ubuntu@linux:~$ id
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu)

Eğer paylaşılmış klasörü kendiniz yaratmazsanız, docker yaratıp, sahibini de root olarak atayacaktır ki, bu da istemediğimiz bir şeydir.


ubuntu@linux:~$ mkdir data

ubuntu@linux:~$ ls -l
drwxrwxr-x 2 ubuntu ubuntu 4096 Dec 2 13:39 data

Dockerfile


ubuntu@linux:~$ nano Dockerfile

FROM ubuntu:16.04

ENV user inanzzz

RUN useradd -m -d /home/${user} ${user} \
&& chown -R ${user} /home/${user}

USER ${user}

CMD ["/bin/bash"]

Yukarıda yapılan:


  1. inanzzz isminde bir kullanıcı ve grup yaratıp, UIDlerini de 1000 olarak belirlemek.

  2. inanzzz kullanıcısının /home/inanzzz klasörünü sahiplenmesini sağlamak.

  3. Container'i çalıştırmak için inanzzz kullanıcısına geçmek.

İmaj yaratma


ubuntu@linux:~$ docker build -t app_img .

Sending build context to Docker daemon 46.59kB
Step 1/5 : FROM ubuntu:16.04
---> dd6f76d9cc90
Step 2/5 : ENV user inanzzz
---> Running in 145029c73c09
---> 31a5bff4cc84
Removing intermediate container 145029c73c09
Step 3/5 : RUN useradd -m -d /home/${user} ${user} && chown -R ${user} /home/${user}
---> Running in c35e2a504b76
---> c21936ff38a8
Removing intermediate container c35e2a504b76
Step 4/5 : USER ${user}
---> Running in d44cd17ef30d
---> e2ed0f96182b
Removing intermediate container d44cd17ef30d
Step 5/5 : CMD /bin/bash
---> Running in 5665ced5f3e5
---> a4632094fab6
Removing intermediate container 5665ced5f3e5
Successfully built a4632094fab6
Successfully tagged app_img:latest

Container yaratma


Bu komut ayrıca ana sistemdeki /home/ubuntu/data klasörünü, container'deki /home/inanzzz/data klasörüne bağlar.


ubuntu@linux:~$ docker run -i -t -d -v $(pwd)/data:/home/inanzzz/data --name app_con app_img

Test


Container


Kullanıcı bilgileri.


ubuntu@linux:~$ docker exec -it app_con id
uid=1000(inanzzz) gid=1000(inanzzz) groups=1000(inanzzz)

Yukarıda gördüğümüz gibi, ana sistem ve container kullanıcılarının UIDleri birbirleriyle aynı. İsimler önemli değil.


Host  : uid=1000(ubuntu)  gid=1000(ubuntu)  groups=1000(ubuntu)
Guest : uid=1000(inanzzz) gid=1000(inanzzz) groups=1000(inanzzz)

Paylaşılmış klasörlerin hakları.


ubuntu@linux:~$ docker exec -it app_con ls -l /home
drwxr-xr-x 1 inanzzz inanzzz 4096 Dec 2 13:44 inanzzz

ubuntu@linux:~$ docker exec -it app_con ls -l /home/inanzzz
drwxrwxr-x 2 inanzzz inanzzz 4096 Dec 2 13:39 data

ubuntu@linux:~$ docker exec -it app_con ls -l /home/inanzzz/data

Test dosyası yaratma.


ubuntu@linux:~$ docker exec -it app_con bash
inanzzz@ce0a5fcb9e17:/$

inanzzz@ce0a5fcb9e17:/$ touch ~/data/guest.txt
inanzzz@ce0a5fcb9e17:/$ echo 'Guest' >> ~/data/guest.txt

inanzzz@ce0a5fcb9e17:/$ ls -l ~/data
-rw-r--r-- 1 inanzzz inanzzz 6 Dec 2 13:51 guest.txt

inanzzz@ce0a5fcb9e17:/$ cat ~/data/guest.txt
Guest

Ana sistem


Aşağıda gördüğümüz gibi, docker içinde yaratılan dosyalar otomak olarak ubuntu kullanıcısı tarafından sahiplenmiş durumda. Bunun nedeni ise UIDlerin aynı olmasıdır.


ubuntu@linux:~$ ls -l data/
-rw-r--r-- 1 ubuntu ubuntu 6 Dec 2 13:51 guest.txt

Yeni dosya yaratma ve mevcut olanları yenileme.


ubuntu@linux:~$ touch data/host.txt
ubuntu@linux:~$ echo 'Host' >> data/host.txt
ubuntu@linux:~$ echo 'Host' >> data/guest.txt

ubuntu@linux:~$ ls -l data/
-rw-r--r-- 1 ubuntu ubuntu 6 Dec 2 13:51 guest.txt
-rw-rw-r-- 1 ubuntu ubuntu 5 Dec 2 13:54 host.txt

ubuntu@linux:~$ cat data/guest.txt
Guest
Host

ubuntu@linux:~$ cat data/host.txt
Host

Container


Paylaşılmış klasörlerin hakları.


inanzzz@ce0a5fcb9e17:/$ ls -l ~/data
-rw-r--r-- 1 inanzzz inanzzz 11 Dec 2 13:55 guest.txt
-rw-rw-r-- 1 inanzzz inanzzz 5 Dec 2 13:54 host.txt

inanzzz@ce0a5fcb9e17:/$ cat ~/data/guest.txt
Guest
Host

inanzzz@ce0a5fcb9e17:/$ cat ~/data/host.txt
Host

inanzzz@ce0a5fcb9e17:/$ echo 'Guest' >> ~/data/host.txt

inanzzz@ce0a5fcb9e17:/$ ls -l ~/data
-rw-r--r-- 1 inanzzz inanzzz 11 Dec 2 13:55 guest.txt
-rw-rw-r-- 1 inanzzz inanzzz 11 Dec 2 13:57 host.txt

inanzzz@ce0a5fcb9e17:/$ cat ~/data/host.txt
Host
Guest