نحوه دسترسی از راه دور به برنامه های GUI با استفاده از Docker و Caddy در اوبونتو 20.04

حتی با محبوبیت روزافزون خدمات ابری ، نیاز به اجرای برنامه های بومی هنوز وجود دارد.با استفاده از noVNC و TigerVNC ، می توانید برنامه های بومی را درون یک کانتینر Docker اجرا کنید و از راه دور با استفاده از یک مرورگر وب به آنها دسترسی پیدا کنید. علاوه بر این ، می توانید برنامه خود را بر روی سرور مجازی با منابع سیستم بیشتر از آنچه به صورت محلی موجود دارید اجرا کنید ، که می تواند در هنگام اجرای برنامه های بزرگ ، انعطاف پذیری بیشتری را ارائه دهد.در این آموزش ، Mozilla Thunderbird ، کلاینت ایمیل را با استفاده از Docker کانتینرایز می کنید. پس از آن ، آن را ایمن کرده و با استفاده از سرور مجازی وب Caddy امکان دسترسی از راه دور را فراهم خواهید کرد.پس از اتمام کار ، فقط با یک مرورگر وب می توانید از هر وسیله ای به Thunderbird دسترسی پیدا کنید. همچنین به صورت اختیاری می توانید با استفاده از WebDAV به طور محلی به فایل های موجود در آن دسترسی پیدا کنید. همچنین یک تصویر کاملاً خود شمول از Docker خواهید داشت که می توانید در هر مکانی اجرا کنید.پیش نیازهاقبل از شروع این راهنما ، به موارد زیر نیاز خواهید داشت:⦁ یک سرور مجازی اوبونتو 20.04 با حداقل 2 گیگابایت رم و فضای دیسک 4 گیگابایتی.⦁ یک کاربر غیر ریشه با امتیازات sudo.⦁ Docker که روی سرور مجازی شما تنظیم شده باشد. می توانید نحوه نصب و استفاده از Docker در Ubuntu 20.04 را در این لینک دنبال کنید.مرحله 1 – ایجاد پیکربندی supervisordاکنون که سرور مجازی شما در حال اجرا است و Docker نصب شده است ، آماده هستید تا پیکربندی کانتینر برنامه خود را شروع کنید. از آنجا که کانتینر شما از چندین مؤلفه تشکیل شده است ، برای راه اندازی و نظارت بر آنها باید از یک مدیر فرآیند استفاده کنید. در اینجا ، از supervisord استفاده خواهید کرد. supervisord یک مدیر فرآیند است که در پایتون نوشته شده و اغلب برای موزون کردن کانتینرهای پیچیده استفاده می شود.ابتدا دایرکتوری به نام thunderbird برای کانتینر خود ایجاد کنید و وارد شوید:⦁ $ mkdir ~/thunderbird⦁⦁ $ cd ~/thunderbirdاکنون با استفاده از nano یا ویرایشگر مورد نظر خود ، فایلی به نام supervisord.conf ایجاد و باز کنید:⦁ $ nano ~/thunderbird/supervisord.conf⦁اکنون این اولین بلوک کد را به supraord.conf اضافه کنید ، که گزینه های جهانی برای supervisord را تعریف می کند:~/thunderbird/supervisord.conf[supervisord]nodaemon=truepidfile=/tmp/supervisord.pidlogfile=/dev/fd/1logfile_maxbytes=0در این بخش ، شما خود supervisord را پیکربندی می کنید. باید nodaemon را روی true تنظیم کنید زیرا درون یک کانتینر Docker به عنوان ورودی وارد می شود. بنابراین ، می خواهید که در پیش زمینه اجرا شود. همچنین pidfile را روی مسیری که توسط یک کاربر غیر ریشه قابل دسترسی است و logfile را روی stdout تنظیم میکنید تا بتوانید ورودها را مشاهده کنید.در مرحله بعد ، یک بلوک کد کوچک دیگر را به supervisord.conf اضافه کنید. این بلوک TigerVNC را که یک سرور مجازی ترکیبی VNC / X11 است شروع می کند:~/thunderbird/supervisord.conf…[program:x11]priority=0command=/usr/bin/Xtigervnc -desktop “Thunderbird” -localhost -rfbport 5900 -SecurityTypes None -AlwaysShared -AcceptKeyEvents -AcceptPointerEvents -AcceptSetDesktopSize -SendCutText -AcceptCutText :0autorestart=truestdout_logfile=/dev/fd/1stdout_logfile_maxbytes=0redirect_stderr=trueدر این بلوک ، سرور مجازی X11 را تنظیم می کنید. X11 یک پروتکل سرور مجازی نمایشگر است ، همان چیزی است که به برنامه های GUI اجازه اجرا می دهد. توجه داشته باشید که در آینده باWayland جایگزین خواهد شد ، اما دسترسی از راه دور هنوز در دست توسعه است.برای این کانتینر ، شما از TigerVNC و سرور مجازی داخلی VNC استفاده می کنید. که دارای چندین مزیت نسبت به استفاده از یک سرور مجازی جداگانه X11 و VNC است:• زمان پاسخ سریعتر ، زیرا کشیدن GUI مستقیماً روی سرور مجازی VNC انجام می شود به جای اینکه روی یک بافر چارچوب واسطه (حافظه ای که محتویات صفحه را ذخیره می کند) انجام شود.• تغییر اندازه خودکار صفحه ، که به برنامه ریموت اجازه می دهد تا به طور خودکار تغییر اندازه دهد تا با کلاینت (در این حالت ، پنجره مرورگر وب شما) متناسب باشد.در صورت تمایل ، می توانید آرگومان را برای گزینه -desktop از Thunderbird به چیز دیگری که انتخاب کرده اید تغییر دهید. سرور مجازی انتخاب شما را به عنوان تیتر صفحه وب مورد استفاده برای دسترسی به برنامه شما نمایش می دهد.اکنون ، بیایید یک بلوک سوم از کد را به supervisord.conf اضافه کنیم تا easy-novnc را شروع کنیم:~/thunderbird/supervisord.conf…[program:easy-novnc]priority=0command=/usr/local/bin/easy-novnc –addr :8080 –host localhost –port 5900 –no-url-password –novnc-params “resize=remote”autorestart=truestdout_logfile=/dev/fd/1stdout_logfile_maxbytes=0redirect_stderr=trueدر این بلوک ، یک easy-novnc را راه اندازی می کنید ، یک سرور مجازی مستقل که یک پوشش حول noVNC فراهم می کند. این سرور مجازی دو نقش را انجام می دهد. ابتدا یک صفحه اتصال ساده فراهم می کند که به شما امکان می دهد گزینه های اتصال را پیکربندی کنید و به شما امکان می دهد موارد پیش فرض را تنظیم کنید. دوم ، VNC را روی WebSocket پروکسی میکند ، که به آن امکان دسترسی از طریق یک مرورگر وب معمولی را می دهد.معمولاً تغییر اندازه در سمت کلاینت انجام می شود (یعنی مقیاس بندی تصویر) ، اما شما از گزینه resize=remote استفاده می کنید تا از تنظیمات وضوح تصویری از راه دور TigerVNC استفاده کامل کنید. این گزینه همچنین تأخیر کمتری را در دستگاه های کندتر مانند Chromebooks رده پایین ایجاد می کند:توجه: در این آموزش از easy-novnc استفاده شده است. در صورت تمایل می توانید به جای آن از websockify و یک وب سرور مجازی جداگانه استفاده کنید. مزیت easy-novnc این است که میزان حافظه و زمان راه اندازی آن به میزان قابل توجهی پایین است و خود شمول به حساب می آید. easy-novnc همچنین یک صفحه اتصال تمیزتر نسبت به noVNC پیش فرض ارائه می دهد و تنظیم گزینه های پیش فرض مفید برای این ستاپ (مانند resize=remote) را ممکن می سازد.برای شروع OpenBox ، یعنی مدیر پنجره ، بلوک زیر را به پیکربندی خود اضافه کنید:~/thunderbird/supervisord.conf…[program:openbox]priority=1command=/usr/bin/openboxenvironment=DISPLAY=:0autorestart=truestdout_logfile=/dev/fd/1stdout_logfile_maxbytes=0redirect_stderr=trueدر این بلوک ، شما در حال راه اندازی OpenBox ، مدیر پنجره سبک X11 هستید. می توانید از این مرحله بگذرید ، اما بدون آن ، نمودارهای میله ای عنوان را ندارید یا نمی توانید اندازه ویندوز را تغییر دهید.در آخر ، بیایید آخرین بلوک را به supervisord.conf اضافه کنیم ، که برنامه اصلی را شروع می کند:~/thunderbird/supervisord.conf…[program:app]priority=1environment=DISPLAY=:0command=/usr/bin/thunderbirdautorestart=truestdout_logfile=/dev/fd/1stdout_logfile_maxbytes=0redirect_stderr=trueدر این بلوک آخر ، برای اطمینان از اجرای Thunderbird بعد از TigerVNC ، اولویت را روی 1 تنظیم کنید در غیر این صورت با یک شرایط مسابقه روبرو می شوید و به طور تصادفی در شروع کار ناکام خواهید ماند. بنابراین autorestart = true قرار دهید تا اگر برنامه به اشتباه بسته شد ، برنامه را مجدداً باز کنید. متغیر محیط DISPLAY به برنامه می گوید تا روی سرور مجازی VNC که قبلاً تنظیم کرده اید نمایش داده شود.در اینجا ظاهر نهایی supervisord.conf شما نمایش داده شده است:~/thunderbird/supervisord.conf[supervisord]nodaemon=truepidfile=/tmp/supervisord.pidlogfile=/dev/fd/1logfile_maxbytes=0[program:x11]priority=0command=/usr/bin/Xtigervnc -desktop “Thunderbird” -localhost -rfbport 5900 -SecurityTypes None -AlwaysShared -AcceptKeyEvents -AcceptPointerEvents -AcceptSetDesktopSize -SendCutText -AcceptCutText :0autorestart=truestdout_logfile=/dev/fd/1stdout_logfile_maxbytes=0redirect_stderr=true[program:easy-novnc]priority=0command=/usr/local/bin/easy-novnc –addr :8080 –host localhost –port 5900 –no-url-password –novnc-params “resize=remote”autorestart=truestdout_logfile=/dev/fd/1stdout_logfile_maxbytes=0redirect_stderr=true[program:openbox]priority=1command=/usr/bin/openboxenvironment=DISPLAY=:0autorestart=truestdout_logfile=/dev/fd/1stdout_logfile_maxbytes=0redirect_stderr=true[program:app]priority=1environment=DISPLAY=:0command=/usr/bin/thunderbirdautorestart=truestdout_logfile=/dev/fd/1stdout_logfile_maxbytes=0redirect_stderr=trueاگر می خواهید برنامه دیگری را کانتینرایز کنید ، /usr/bin/thunderbird را با مسیر قابل اجرای برنامه خود جایگزین کنید. در غیر این صورت ، اکنون آماده پیکربندی منوی اصلی GUI خود هستید.مرحله 2 – تنظیم منوی OpenBoxاکنون که مدیر پروسه شما پیکربندی شده است ، بیایید منوی OpenBox را تنظیم کنیم. این منو به ما امکان می دهد تا برنامه ها را درون کانتینر راه اندازی کنیم. همچنین یک ترمینال و مانیتور پردازش برای اشکال زدایی در صورت لزوم را در اختیار خواهیم داشت.در داخل دیرکتوری برنامه خود ، از nano یا ویرایشگر متن مورد علاقه خود استفاده کنید تا فایل جدیدی به نام menu.xml ایجاد و باز کنید:⦁ $ nano ~/thunderbird/menu.xml⦁اکنون کد زیر را به menu.xml اضافه کنید:~/thunderbird/menu.xml<?xml version=”1.0″ encoding=”utf-8″?><openbox_menu xmlns=”http://openbox.org/” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://openbox.org/ file:///usr/share/openbox/menu.xsd”><menu id=”root-menu” label=”Openbox 3″><item label=”Thunderbird”><action name=”Execute”><execute>/usr/bin/thunderbird</execute></action></item><item label=”Terminal”><action name=”Execute”><execute>/usr/bin/x-terminal-emulator</execute></action></item><item label=”Htop”><action name=”Execute”><execute>/usr/bin/x-terminal-emulator -e htop</execute></action></item></menu></openbox_menu>این فایل XML شامل آیتم های منو است که با کلیک راست بر روی دسکتاپ ظاهر می شود. هر مورد از یک لیبل و یک عمل تشکیل شده است.اگر می خواهید برنامه دیگری را کانتینرایز کنید ، / usr / bin / thunderbird را با مسیر اجرایی برنامه خود جایگزین کنید و لیبل مورد را تغییر دهید.مرحله 3 – ایجاد Dockerfileاکنون که OpenBox پیکربندی شده است ، Dockerfile را ایجاد خواهید کرد ، که همه چیز را به هم پیوند می دهد.یک Dockerfile در دیرکتوری کانتینر خود ایجاد کنید:⦁ $nano ~/thunderbird/Dockerfile⦁برای شروع ، بیایید برای ساختن easy-novnc کد دیگری اضافه کنیم:~/thunderbird/DockerfileFROM golang:1.14-buster AS easy-novnc-buildWORKDIR /srcRUN go mod init build && \go get github.com/geek1011/easy-novnc@v1.1.0 && \go build -o /bin/easy-novnc github.com/geek1011/easy-novncدر مرحله اول ، شما در حال ساختن easy-novnc هستید. برای سادگی و صرفه جویی در فضا این کار در یک مرحله جداگانه انجام می شود – به زنجیره ابزار کلیGo در تصویر نهایی خود نیازی ندارید. به@ v1.1.0 در دستور build توجه داشته باشید. این تضمین می کند که نتیجه تعیین کننده است ، و از آن جهت مهم است که Docker نتیجه هر مرحله را ذخیره می کند. اگر نسخه صریح را مشخص نکرده اید ، Docker در زمان ساخت اولین تصویر، آخرین نسخه های easy-novnc را ارجاع می دهد. علاوه بر این ، بهتر است اطمینان حاصل کنید که یک نسخه خاص از easy-novnc را دانلود می کنید تا در صورت ایجاد تغییرات در رابط CLI آن را داشته باشید.اکنون بیایید مرحله دوم را ایجاد کنیم که به تصویر نهایی تبدیل می شود. در اینجا از Debian 10 (Buster) به عنوان تصویر پایه استفاده خواهید کرد. توجه داشته باشید که از آنجا که این کار در یک کانتینر در حال اجرا است ، صرف نظر از توزیع شما در سرور مجازی خود ، کار خواهد کرد.سپس ، بلوک زیر را به Dockerfile خود اضافه کنید:~/thunderbird/Dockerfile…FROM debian:busterRUN apt-get update -y && \apt-get install -y –no-install-recommends openbox tigervnc-standalone-server supervisor gosu && \rm -rf /var/lib/apt/lists && \mkdir -p /usr/share/desktop-directoriesدر این دستورالعمل ، شما Debian 10 را به عنوان تصویر پایه خود نصب می کنید و سپس حداقل مورد نیاز برای اجرای برنامه های GUI را در کانتینر خود نصب می کنید. توجه داشته باشید که apt-get update را به عنوان بخشی از همان دستورالعمل ها برای جلوگیری از مشکلات ذخیره سازی در Docker ، اجرا کنید. برای صرفه جویی در فضا ، همچنین لیست های بسته را که بعد از آن دانلود شده است حذف می کنید (بسته های ذخیره شده به صورت پیش فرض حذف می شوند). همچنین /usr/share/desktop-directories را ایجاد می کنید زیرا برخی برنامه ها به دایرکتوری موجود بستگی دارند.بیایید یک بلوک کد کوچک دیگر اضافه کنیم:~/thunderbird/Dockerfile…RUN apt-get update -y && \apt-get install -y –no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xzip gzip bzip2 zip unzip && \rm -rf /var/lib/apt/listsدر این دستورالعمل ، شما در حال نصب برخی از نرم افزارها و بسته های عمومی مفید هستید. موارد قابل توجه در اینجا xd-utils (که دستورات پایه مورد استفاده برنامه های دسکتاپ را در لینوکس فراهم می کند) و ca-certificates (که گواهی های ریشه را نصب می کند تا به ما امکان دسترسی به سایت های HTTPS را بدهد) هستند.اکنون می توانیم دستورالعمل برنامه اصلی را اضافه کنیم:~/thunderbird/Dockerfile…RUN apt-get update -y && \apt-get install -y –no-install-recommends thunderbird && \rm -rf /var/lib/apt/listsمانند قبل ، در این قسمت در حال نصب برنامه هستیم. اگر برنامه کاربردی دیگری را کانتینرایز میکنید ، می توانید این دستورات را با دستورالعمل های لازم برای نصب برنامه خاص خود جایگزین کنید. برخی از برنامه ها برای اجرای داخل Docker به کار کمی بیشتر نیاز دارند. به عنوان مثال ، اگر برنامه ای را نصب می کنید که از Chrome ،Chromium یا QtWebEngine استفاده می کند ، باید از آرگومان خط فرمان –no-sandbox استفاده کنید ، زیرا در Docker پشتیبانی نمی شود.در مرحله بعد ، بیایید دستورالعمل هایی را اضافه کنیم تا چند فایل آخر به کانتینر اضافه شود:~/thunderbird/Dockerfile…COPY –from=easy-novnc-build /bin/easy-novnc /usr/local/bin/COPY menu.xml /etc/xdg/openbox/COPY supervisord.conf /etc/EXPOSE 8080در اینجا شما می توانید فایل های پیکربندی را که قبلاً ایجاد کرده اید به تصویر اضافه کرده و از مرحله اول کپی کردن باینری easy-novnc را انجام دهید.این بلوک کد بعدی دایرکتوری داده را ایجاد می کند و کاربر اختصاصی را برای برنامه شما اضافه می کند. از آن جهت مهم است که برخی برنامه ها از اجرا به عنوان ریشه خودداری می کنند. همچنین بهتر است که حتی در یک کانتینر ، برنامه ها را به صورت ریشه اجرا نکنید.~/thunderbird/Dockerfile…RUN groupadd –gid 1000 app && \useradd –home-dir /data –shell /bin/bash –uid 1000 –gid 1000 app && \mkdir -p /dataVOLUME /dataبرای اطمینان از یک UID / GID سازگار برای فایل ها ، صریحاً هر دو را روی 1000 تنظیم می کنید. همچنین می توانید یک حجم را در دایرکتوری داده قرار دهید تا اطمینان حاصل شود که بین راه ریستارت ها همچنان ادامه دارد.در آخر ، دستورالعمل هایی را برای راه اندازی همه موارد اضافه می کنیم:~/thunderbird/Dockerfile…CMD [“sh”, “-c”, “chown app:app /data /dev/stdout && exec gosu app supervisord”]با تنظیم دستور پیش فرض روی supervisord ، مدیر فرآیندهای مورد نیاز برای اجرای برنامه شما را راه اندازی می کند. در این حالت ، به جای ENTRYPOINT از CMD استفاده می کنید. در بیشتر موارد ، تفاوتی ایجاد نمی کند ، اما استفاده از CMD برای این منظور به چند دلیل مناسب تر است. اولا ، supervisord هیچ آرگومانی مربوط به ما را دریافت نمیکند ، و اگر آرگومان هایی را به کانتینر ارائه می دهید ، آنها CMD را جایگزین می كنند و به ENTRYPOINT اضافه می شوند. دوما ، استفاده از CMD به ما امکان می دهد هنگام ارسال آرگومان ها به داخل کانتینر ، یک دستور کاملاً متفاوت (که توسط / bin / sh -c اجرا خواهد شد) ارائه دهیم ، که اشکال زدایی را آسان تر می کند.و در آخر ، لازم است قبل از شروع supervisord ، chown را به عنوان ریشه اجرا کنید تا از مشکلات مجوز در حجم داده جلوگیری کنید و به فرآیند کودک (child) اجازه دهید stdout را باز کند. این همچنین بدان معنی است که شما باید به جای دستورالعمل USER برای تعویض کاربر از gosu استفاده کنید.در اینجا ظاهر Dockerfile تکمیل شده شما به شرح زیر است:~/thunderbird/DockerfileFROM golang:1.14-buster AS easy-novnc-buildWORKDIR /srcRUN go mod init build && \go get github.com/geek1011/easy-novnc@v1.1.0 && \go build -o /bin/easy-novnc github.com/geek1011/easy-novncFROM debian:busterRUN apt-get update -y && \apt-get install -y –no-install-recommends openbox tigervnc-standalone-server supervisor gosu && \rm -rf /var/lib/apt/lists && \mkdir -p /usr/share/desktop-directoriesRUN apt-get update -y && \apt-get install -y –no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xzip gzip bzip2 zip unzip && \rm -rf /var/lib/apt/listsRUN apt-get update -y && \apt-get install -y –no-install-recommends thunderbird && \rm -rf /var/lib/apt/listsCOPY –from=easy-novnc-build /bin/easy-novnc /usr/local/bin/COPY menu.xml /etc/xdg/openbox/COPY supervisord.conf /etc/EXPOSE 8080RUN groupadd –gid 1000 app && \useradd –home-dir /data –shell /bin/bash –uid 1000 –gid 1000 app && \mkdir -p /dataVOLUME /dataCMD [“sh”, “-c”, “chown app:app /data /dev/stdout && exec gosu app supervisord”]Dockerfile خود را ذخیره کرده و ببندید. اکنون آماده ساخت و اجرای کانتینر خود هستیم و سپس به Thunderbird – که یک برنامه GUI است، دسترسی پیدا خواهیم کرد.مرحله 4 – ساخت و اجرای کانتینرمرحله بعدی ساخت کانتینر شما و تنظیم آن در زمان راه اندازی است. همچنین می توانید یک حجم برای حفظ داده های برنامه بین ریستارت ها و به روز رسانی تنظیم کنید.ابتدا کانتینر خود را بسازید. حتماً این دستورات را در دیرکتوری ~ / thunderbird اجرا کنید:⦁ $ docker build -t thunderbird .⦁اکنون یک شبکه جدید ایجاد کنید که بین کانتینرهای برنامه به اشتراک گذاشته شود:⦁ $ docker network create thunderbird-net⦁سپس یک حجم برای ذخیره داده های برنامه ایجاد کنید:⦁ $ docker volume create thunderbird-data⦁در آخر ، آن را اجرا کرده و آن را روی ریستارت خودکار تنظیم کنید:⦁ $ docker run –detach –restart=always –volume=thunderbird-data:/data –net=thunderbird-net –name=thunderbird-app thunderbird⦁توجه داشته باشید که در صورت تمایل ، می توانید thunderbird-app را بعد از گزینه –name با نام دیگری جایگزین کنید. هرچه انتخاب کردید ، اکنون برنامه شما کانتینرایز شده و در حال اجرا است. اکنون بیایید از سرور مجازی وب Caddy برای امنیت آن استفاده کنیم و از راه دور به آن متصل شویم.مرحله 5 – راه اندازی Caddyدر این مرحله ، وب سرور مجازی Caddy را تنظیم می کنید تا تأیید هویت انجام شود و به صورت اختیاری ، دسترسی از راه دور فایل از طریق WebDAV را انجام دهد. برای سادگی و اینکه به شما امکان استفاده از پروکسی معکوس موجود خود را بدهد ، آن را در یک کانتینر دیگر اجرا کنید.یک دیرکتوری جدید ایجاد کنید و سپس به داخل آن بروید:⦁ $ mkdir ~/caddy⦁⦁ $ cd ~/caddyاکنون با استفاده از nano یا ویرایشگر مورد نظر خود ، یک Dockerfile جدید ایجاد کنید:⦁ $ nano ~/caddy/Dockerfile⦁سپس بخش های زیر را اضافه کنید:~/caddy/DockerfileFROM golang:1.14-buster AS caddy-buildWORKDIR /srcRUN echo ‘module caddy’ > go.mod && \echo ‘require github.com/caddyserver/caddy/v2 v2.0.0’ >> go.mod && \echo ‘require github.com/mholt/caddy-webdav v0.0.0-20200523051447-bc5d19941ac3’ >> go.modRUN echo ‘package main’ > caddy.go && \echo ‘import caddycmd “github.com/caddyserver/caddy/v2/cmd”‘ >> caddy.go && \echo ‘import _ “github.com/caddyserver/caddy/v2/modules/standard”‘ >> caddy.go && \echo ‘import _ “github.com/mholt/caddy-webdav”‘ >> caddy.go && \echo ‘func main() { caddycmd.Main() }’ >> caddy.goRUN go build -o /bin/caddy .FROM debian:busterRUN apt-get update -y && \apt-get install -y –no-install-recommends gosu && \rm -rf /var/lib/apt/listsCOPY –from=caddy-build /bin/caddy /usr/local/bin/COPY Caddyfile /etc/EXPOSE 8080RUN groupadd –gid 1000 app && \useradd –home-dir /data –shell /bin/bash –uid 1000 –gid 1000 app && \mkdir -p /dataVOLUME /dataWORKDIR /dataCMD [“sh”, “-c”, “chown app:app /data && exec gosu app /usr/local/bin/caddy run -adapterاین Dockerfile با فعال کردن افزونه WebDAV ، Caddy را ایجاد می کند ، و سپس آن را در پورت 8080 با Caddyfile در / etc / Caddyfile راه اندازی می کند. فایل را ذخیره کنید و ببندید.سپس سرور مجازی وب Caddy را پیکربندی می کنید. فایلی به نام Caddyfile را در دایرکتوری که تازه ایجاد کرده اید ایجاد کنید:⦁ $ nano ~/caddy/Caddyfileاکنون بلوک کد زیر را به Caddyfile خود اضافه کنید:~/caddy/Caddyfile{order webdav last}:8080 {logroot * /datareverse_proxy thunderbird-app:8080handle /files/* {uri strip_prefix /filesfile_server browse}redir /files /files/handle /webdav/* {uri strip_prefix /webdavwebdav}redir /webdav /webdav/basicauth /* {{env.APP_USERNAME} {env.APP_PASSWORD_HASH}}}این Caddyfile دیرکتوری اصلی را به کانتینر thunderbird-app که در مرحله 4 ایجاد کرده اید پروکسی میکند ( Docker آن را در IP صحیح تجزیه می کند). همچنین یک مرورگر فایل مبتنی بر وب فقط قابل خواندن در /files ارائه می کند و یک سرور مجازی WebDAV را روی / webdav اجرا می کند که می توانید برای دسترسی به فایل های خود به صورت محلی قرار دهید. نام کاربری و رمز عبور از متغیرهای محیط APP_USERNAME و APP_PASSWORD_HASH خوانده می شود.اکنون کانتینر را بسازید:⦁ $ docker build -t thunderbird-caddy .⦁Caddy v2 نیاز دارد که شما پسورد موردنظر خود را hash کنید. دستور زیر را اجرا کنید و به یاد داشته باشید که mypass را با یک رمز عبور قوی به انتخاب خود جایگزین کنید:⦁ $ docker run –rm -it thunderbird-caddy caddy hash-password -plaintext ‘mypass’⦁این دستور یک رشته کاراکتر را تولید می کند. آن را برای تهیه دستور بعدی در کلیپ بورد خود کپی کنید.اکنون آماده اجرای کانتینر هستید. اطمینان حاصل کنید که myuser را با نام کاربری مورد نظر خود جایگزین کنید و mypass-hash را با همان دستوری که در مرحله قبل اجرا کردید جایگزین نمایید. همچنین می توانید پورت (8080 در اینجا) را برای دسترسی به سرور مجازی خود در پورت دیگری تغییر دهید:⦁ $ docker run –detach –restart=always –volume=thunderbird-data:/data –net=thunderbird-net –name=thunderbird-web –env=APP_USERNAME=”myuser” –env=APP_PASSWORD_HASH=”mypass-hash” –publish=8080:8080 thunderbird-caddy⦁اکنون آماده دسترسی و آزمایش برنامه خود هستیم.مرحله 6 – تست و مدیریت برنامهبیایید به برنامه دسترسی پیدا کنیم و از عملکرد آن اطمینان حاصل نماییم.ابتدا http: // your_server_ip: 8080 را در یک مرورگر وب باز کنید ، با اعتباراتی که قبلاً انتخاب کرده اید وارد شوید و روی connect کلیک کنید.اکنون می توانید با برنامه تعامل برقرار کنید ، و برای تنظیم مناسب پنجره مرورگر ، باید به طور خودکار تغییر اندازه دهد.اگر بر روی دسکتاپ سیاه رنگ کلیک راست کنید، باید منویی را مشاهده کنید که به شما امکان دسترسی به یک ترمینال را می دهد. اگر کلیک وسط کنید ​​، باید لیستی از پنجره ها را ببینید.اکنون http://your_server_ip:8080/files/ را در یک مرورگر وب باز کنید. باید بتوانید به فایل های خود دسترسی پیدا کنید.به صورت اختیاری ، می توانید http: // your_server_ip: 8080 / webdav / خود را در یک کلاینت WebDAV نصب کنید. باید بتوانید مستقیماً به فایل های خود دسترسی پیدا کرده و آن ها را تغییر دهید. اگر از گزینه Map network drive در ویندوز اکسپلورر استفاده می کنید ، باید برای اضافه کردنHTTPS از یک پروکسی معکوس استفاده کنید یا HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters\BasicAuthLevel را روی DWORD:2 تنظیم کنید.در هر صورت ، برنامه GUI بومی شما اکنون برای استفاده از راه دور آماده است.نتیجهاکنون با موفقیت یک کانتینر Docker را برای Thunderbird تنظیم کرده اید و سپس با استفاده از Caddy ، دسترسی به آن را از طریق یک مرورگر وب پیکربندی کرده اید. در صورت نیاز به بروزرسانی برنامه خود ، کانتینرها را متوقف کنید ، docker rm thunderbird-app thunderbird-web را اجرای کنید، تصاویر را مجدد بسازید و سپس دستورات docker را از مراحل قبلی بالا مجدداً اجرا کنید. از آنجا که در یک حجم ذخیره می شود ، داده های شما همچنان حفظ می شوند.اگر می خواهید در مورد دستورات اساسی Docker اطلاعات بیشتری کسب کنید ، می توانید این لینک آموزش یا این صفحه را بخوانید. برای استفاده طولانی مدت تر ، میتوانید HTTPS را برای امنیت بیشتر فعال کنید (برای این کار به دامنه ای نیاز دارید).علاوه بر این ، اگر بیش از یک برنامه نصب کرده اید ، می توانید به جای شروع هر کانتینر به صورت دستی ، از Docker Compose یا Kubernetes استفاده کنید. و به یاد داشته باشید ، این آموزش می تواند به عنوان پایه ای برای اجرای سایر برنامه های لینوکس روی سرور مجازی شما استفاده شود ، از جمله:⦁ Wine ، یک لایه سازگاری برای اجرای برنامه های ویندوز در لینوکس.⦁ GIMP ، ویرایشگر تصویر منبع باز.⦁ Cutter ، پلتفرم مهندسی معکوس منبع باز.این گزینه آخر پتانسیل بسیار مهمی را برای کانتینرایز و دسترسی از راه دور به برنامه های GUI ارائه می دهد. با استفاده از این ستاپ ، اکنون می توانید از سرور مجازی با توان محاسباتی بسیار بیشتر از آنچه به صورت محلی در دسترس دارید برای اجرای ابزارهای منبع فشرده مانند Cutter استفاده کنید