İlk bölümde Ubuntu container imajı kullanarak bir container oluşturmuş ve Xfce masaüstü ortamı kurarak RDP ile container‘a uzak masaüstü bağlantısı yapmıştık. Bunun için de gerekli komutları çalıştırmak için container konsoluna bağlanmıştık. Peki burada kullandığımız komutları otomatik hale getirebilir miyiz? Cevap: Dockerfile.
Dockerfile’a hangi container imajını kullanacağımızı belirterek başlıyorum.
FROM ubuntu:latest
İlk komut olarak da paket listeleri ve paketleri güncelleyelim.
RUN apt-get update -y && apt-get upgrade -y
İlk bölümdeki Xfce kurulumunda saati dilimi ayarları için bölge ve il seçimi yapmamı istemişti, bu işlemi de otomatikleştirmemiz gerekiyor. Bunun için de aşağıdaki komutları dockerfile’a ekliyorum.
ENV TZ=Europe/Istanbul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
Saat dilimini de belirttikten sonra Xfce masaüstü ortamı, xrdp ve sudo paketlerini kurabiliriz.
RUN apt-get install -y \
xfce4 \
xrdp \
sudo
Paket kurulumlarını tamamladıktan sonra da kullanıcı oluşturma ve sudo grubuna ekleme işlemlerini için gerekli komutları yazıyorum.
RUN useradd -ms /bin/bash -p “$(openssl passwd -1 P@ssword1)” -u 1000 mert
RUN usermod -aG sudo mert
Xrdp’ye kullanıcı session’ı başladığı zaman hangi masaüstü ortamını kullanacağını belirtmek için de
RUN echo xfce4-session >~/.xsession
komutunu ekliyorum.
Buraya kadar zaten ilk bölümdeki bahsettiğim komutları sırasıyla yazmak dışında çok farklı bir işlem yok. Xrdp servisini başlatan komutu ekledikten sonra container imajımız hazır olacak ancak küçük bir sorunumuz var. İlk bölümde container konsoluna bağlandığım için container çalışır haldeydi. Ancak bu container’ı durdurup konsola bağlanmadan tekrar çalıştırırsak, container’ı çalışır halde tutacak bir komut/servis olmadığı için başladıktan çok kısa bir süre sonra duracak. Bunu engellemek için verilen dosyanın sonunu okumak için kullanılan tail komutundan yararlanacağım; -f parametresi ile dosyanın sonunda yeni bir veri olup olmadığı takip etmesini, bunu da /dev/null dosyası üzerinde yapmasını belirterek basit bir döngü gibi çalışmasını sağlayabilirim. Burada bahsettiği /dev/null dosyası üzerine yazılanları anında silen özel bir dosya.
Container başladığında çalışmasını istediğim 2 komut var, ikisini birden entrypoint olarak tanımlamak için bunları içeren bir startup.sh dosyası hazırlıyorum:
service xrdp start
tail -f /dev/null
Bu başlangıç script dosyasını container içerisine taşıyorum.
COPY startup.sh /scripts/startup.sh
Bu dosyayı da çalıştırılabilir bir dosya haline getiriyorum.
RUN [“chmod”, “+x”, “/scripts/startup.sh”]
RDP portunu açıyorum
EXPOSE 3389
Başlangıçta yukarıda belirttiğim script dosyasını çalıştırması için entrypoint olarak ekliyorum.
ENTRYPOINT [ “/scripts/startup.sh”]
Dockerfile ve startup.sh dosyalarına buradan erişebilirsiniz.
Sırada container imajını hazırlamaya geldi. Bu kez de imajı Azure Container Instance (ACI) üzerinde çalıştırarak deneyelim.
Resim-1‘de göreceğiniz gibi dockerfile ve startup.sh dosyalarının olduğu klasörde docker build -t mshowto.azurecr.io/mshowto-rdp . komutunu çalıştırıyorum; mshowto adında bir Azure Container Registry olduğu için container imajına mshowto.azurecr.io/mshowto-rdp ismini verdim. Azure Container Registry (ACR) ile ilgili daha detaylı bilgi için buraya bakabilirsiniz.
Resim-1
İmaj hazırlandıktan sonra ACR’a login olmak için docker login mshowto.azurecr.io komutunu çalıştırıyorum (Resim-2). Daha önceden login olduğum için mevcut credential’ı kullanarak login olabildim. Son olarak da imajı ACR’a push ediyorum ve Azure Portal’a geçiyorum.
Resim-2
NOT: Devam etmeden önce Onur Yüksektepeli‘nin Azure Container Registry’de İmaj Test Etme yazısına göz atabilirsiniz.
ACI üzerindeki repository’ye baktığımızda mshowto-rdp imajını görebiliyoruz (Resim-3). Bu imajdan bir instance oluşturup Azure üzerinde container’ın çalışmasını sağlayabiliriz. Container’a bağlanacağım için bir public IP istediğimi ve RDP portu olan 3389’u açmak istediğimi de belirtiyorum.
Resim-3
Container çalışmaya başladıktan sonra IP adres bilgisini ilgili instance’ın (ilgili resource group üzerinden giderek de bulabilirsiniz) overview ekranından alıyorum (Resim-4).
Resim-4
Container’ın IP adresine mstsc kullanarak (bu kez varsayılan port) bağlanmayı deniyorum (Resim-5).
Resim-5
Kullanıcı adı ve şifre girdikten sonra container üzerinde çalışan masaüstü ortamını kullanmaya başlayabilirsiniz (Resim-6).
Resim-6
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
https://www.mshowto.org/azure-uzerinde-calisan-linux-vme-rdp-ile-nasil-baglanabiliriz.html
https://www.mshowto.org/docker-containera-rdp-ile-nasil-baglanabiliriz-bolum-1.html
https://stackoverflow.com/questions/54121031/multiple-commands-on-docker-entrypoint
https://github.com/mshowto/Containers/tree/master/mshowto-rdp
TAGs: Docker, Containers, Container, Linux, Ubuntu, Remote Desktop, Remote Desktop Protocol, RDP, xrdp, Xfce Desktop Environment, xfce, Azure Container Registry, ACR, Azure Container Instance, ACI, Azure