Geliştirici

Docker kullanarak gui uygulama çalıştırma

Image
Paylaş

Bu yazıda örnek olarak docker kullanarak debian testing imajı üzerinde krita uygulaması çalıştıracağız.

Hazırlık

Yöntem 1: Aşağıdaki gibi docker kurabilirsiniz. Bu şekilde kurduğunuz docker yalnızca root kullanıcısı veya docker gurubuna eklenmiş kullanıcı ile çalışır.

apt update
apt install docker.io

Yöntem 2: Aşağıdaki gibi rootless docker kurabilirsiniz. Bu şekilde kurulan docker root gerektirmeden çalışır fakat kısıtlı yetkilerle çalışır.

İlk önce gerekli paketleri kuralım.

apt install curl dbus-user-session

Ardından aşağıdaki iki komutu root ile çalıştırarak subuid ve subgid ayarlarını yapalım.

usermod --add-subgids 1002000000-1002999999 <kullanıcıadı>
usermod --add-subuids 1002000000-1002999999 <kullanıcıadı>

Daha sonra kendi kullanıcımız üzerinde aşağıdaki komutu kullanarak rootless docker kurulumunu gerçekleştirelim.

curl -fsSL https://get.docker.com/rootless | bash

Ev dizinimizdeki bin dizininde docker komutları eklenmiştir. bunları PATH içerisine almak için bashrc içerisine şunu ekleyelim.

export PATH=~/bin/:$PATH

Docker kullanma yetkisi ayarlanması

Rootless olmayan docker kullanmak için root yetkisi gerekmektedir. Bu yüzden aşağıdaki işlemi yaparak kullanıcıya docker yetkisi verebilirsiniz.

# Bu işlemden sonra oturumu kapatıp açmamız gerekebilir.
usermod -aG docker user

Not: Eğer kullanıcıya docker yetkisi verirseniz root yetkisi vermeye eşdeğer yetki vermiş olursunuz. Bu da güvenlik sorunlarına sebep olabilir. Bu işlem bu yüzden tavsiye edilmez.

Detaylı bilgi için: https://docs.docker.com/engine/security/#docker-daemon-attack-surface

Bunun yerine rootless docker kullanmanızı öneririm.

İmajın indirilmesi

Uygulamamızı çalıştırmak için istediğiniz dağıtımın imajını indirmemiz gerekmektedir.

docker pull debian:testing

Görüntü ve ses ile ilgili izinlerin ayarlanması

Docker üzerinde çalışan uygulamamızın pencere oluşturma isteklerini sağlıklı yapabilmesi ve uygulamanın sesinin düzgün bir şekilde kontrol edilebilmesi için aşağıdaki komutları kullanmamız gereklidir. Bu işlemler bilgisayarımızı her yeniden başlattığımızda tekrarlanmalıdır.

# Yerel pencere isteklerini kabul etmek için
xhost +local:
# Pulseaudio ses sunucusu açmak için (sadece yerel istekleri kabul etmek için)
pactl load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1

Container oluşturma

İndirdiğimiz docker imajımızdan container oluşturalım. Burada DISPLAY çevresel değişkenini aktarıp tam donanım ve ağ erişimi yetkisi vereceğiz. Ayrıca ev dizinlerini de birbirine bağlayacağız. Bu sayede donanımımızı ve ağ bağlantımızı kullanırken herhangi bir sorun oluşmayacak ve dosyalarımızı rahatlıkla görüp düzenleyebileceğiz.

docker run \
     -it \
     -e DISPLAY=$DISPLAY \
     -e PULSE_SERVER=127.0.0.1\
     -v /dev/dri:/dev/dri \
     --net host \
     -v /home:/home \
     --name gui_uygulama \
     debian:testing

Buradaki parametrelerin açıklamaları:

  • -it etkileşimli kabuk açmak için
  • -e DISPLAY=$DISPLAY çevresel değişken aktarmak için
  • -e PULSE_SERVER=127.0.0.1 pulseaudio ses sunucusu için
  • –net host tam yetkili ağ bağlantısı erişimi için
  • -v /dev/dri:/dev/dri ekran kartına erişim için
  • -v /home:/home ev dizinini ortak yapmak için
  • –name gui_uygulama container ismi belirlemek için

Container oluşturulduktan sonra container içinde root kullanıcısı ile yeni bir kabuk başlatılacaktır.

Uygulamanın kurulması

Container içerisine girdikten sonra uygulamamızı yükleyebiliriz.

apt update
apt install krita

Uygulamamızın ortak ev dizinini kullanması ve benzer yetkiler ile çalışması için kullanıcı adımız ile aynı ada sahip bir kullanıcı açalım. Bu kullanıcının UID değeri ile bizim kullanıcımızın aynı olması gerekir.

adduser user
# uid değerini /etc/passwd içerisinden değiştirebilirsiniz.
id user
-> uid=1000(user) gid=1000(user) groups=1000(user)
# Kullanıcımızı audio ve video gurubuna eklememiz gereklidir. (ses ve ekran kartı için)
usermod -aG audio user
usermod -aG video user

Container içindeki /dev/dri dizini video gurubuna ait değilse izinlerini düzeltelim.

chgrp video -R /dev/dri

Uygulamanın başlatılması

Öncelikle su komutu ile kullanıcımıza geçelim ve ardından uygulamamızın komutunu çalıştıralım.

su user
krita

Containerdan çıktığımızda veya sistemi yeniden başlattığımızda tekrar giriş yapmak için docker ps -a çıktısında isimlendirdiğimiz imajın container-id değerini bulup docker start ve ardından docker attach şeklinde tekrar başlatabiliriz. Eğer artık ihtiyacımız kalmadıysa docker rm komutu ile containeri silebiliriz.

docker ps -a
-> CONTAINER ID   IMAGE             COMMAND   CREATED       STATUS                      PORTS     NAMES
-> 8b8862d05e24   debian:testing    "bash"    2 hours ago   Exited (137) 5 minutes ago            gui_uygulama
docker start 8b8862d05e24
-> 8b8862d05e24
docker attach 8b8862d05e24

Uygulama menüsüne eklenmesi

Uygulamamızı uygulama menüsüne eklemek için aşağıdaki gibi bir betik hazırlayıp /home/user/.local/bin/docker-krita konumuna kaydedelim

#!/bin/bash
xhost +local:
pactl load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1
docker start gui_uygulama
docker exec gui_uygulama chgrp -R video /dev/dri
docker exec gui_uygulama su $USER -c krita $@

Uygulama başlatıcımızı da aşağıdaki gibi hazırlayıp /home/user/.local/share/applications/docker-krita.desktop içerisine kaydedelim.

[Desktop Entry]
Name=Krita-docker
Comment=Docker üzerinde krita
GenericName=Krita
Exec=/home/user/.local/bin/docker-krita %F
Icon=krita
Terminal=false
StartupNotify=true
Type=Application
Categories=Utility;GTK;

Faydalı bağlantılar

https://sulincix.gitlab.io/sayfalar/html/docker-kullanimi.html

  • Ali Rıza Keskin

    Gentoo kullancısı - Özgür yazılım sevdalısı - Pardus gönüllüsü

[wpdiscuz_comments]