محتوای آموزشی وبلاگ نتآرام
کانتینر روشن است، ولی وقتی نشانی سرور و پورت را در مرورگر وارد میکنید چیزی باز نمیشود. روشن بودن کانتینر ثابت نمیکند برنامه داخل آن اجرا شده، پورت درست منتشر شده یا مسیر شبکه به آن اجازه عبور میدهد. از داخل به بیرون حرکت میکنیم تا معلوم شود مشکل در کدام مرحله است.
فرمانها را با دسترسی مجاز در ترمینال سرور لینوکسی اجرا کنید. نمونه ما یک برنامه HTTP روی پورت ۸۰ داخل کانتینر و پورت ۸۰۸۰ روی میزبان دارد. پورت و مسیر واقعی برنامه شما ممکن است فرق کند. دیتابیس، پنل مدیریت یا سرویس خصوصی را فقط برای تست به اینترنت عمومی باز نکنید.
۱. وضعیت و گزارش برنامه را ببینید
کد / دستورdocker ps -a
نام کانتینر و ستون STATUS را بخوانید. در مثالها به جای
کد / دستورmyapp نام کانتینر خود را بگذارید. اگر کانتینر متوقف است، ابتدا علت توقف را پیدا کنید:docker logs --tail 100 myapp
گزارش ممکن است بگوید برنامه به دلیل تنظیم اشتباه، نبود فایل یا نرسیدن به دیتابیس بالا نیامده است. رمزها و اطلاعات مشتری را هنگام اشتراکگذاری گزارش حذف کنید. اگر پیام خطای دسترسی به خود Docker دارید، راهنمای دسترسی socket را دنبال کنید.
۲. نگاشت پورت را دقیق بخوانید
کد / دستورdocker port myapp
خروجی نمونه
80/tcp -> 127.0.0.1:8080 یعنی پورت ۸۰ کانتینر به پورت ۸۰۸۰ فقط روی رابط محلی میزبان نگاشت شده است. این حالت برای برنامهای پشت پراکسی محلی مناسب است و طبیعی است که از اینترنت مستقیم باز نشود. خروجی با آدرس عمومی یا 0.0.0.0 به معنی تلاش برای انتشار روی رابطهای مربوط است، اما تضمین نمیکند فایروال یا شبکه مسیر را باز کرده باشد. اگر نگاشتی نیست، صرف وجود EXPOSE در تصویر یا مستندات، پورت را برای بیرون منتشر نمیکند.اگر برنامه روی میزبان HTTP ارائه میدهد، از خود سرور یک درخواست آزمایشی بزنید:
کد / دستورcurl -i http://127.0.0.1:8080/
پورت و مسیر را مطابق برنامه تغییر دهید. دیدن پاسخ HTTP یعنی مسیر محلی تا جایی پاسخ داده است؛ کد 404 ممکن است فقط نشان دهد مسیر
/ در آن برنامه وجود ندارد. اگر connection refused میگیرید، نگاشت، سلامت برنامه و پورت داخلی را بررسی کنید. برخی تصویرها curl یا ابزار شبکه داخل کانتینر ندارند؛ نبود آن ابزار به معنی خراب بودن برنامه نیست.۳. آیا برنامه داخل کانتینر روی رابط مناسب گوش میدهد؟
برنامهای که داخل کانتینر فقط به
127.0.0.1 خود کانتینر گوش میدهد، ممکن است از مسیر نگاشت پورت قابل دسترسی نباشد. در تنظیم برنامه و گزارش شروع آن، نشانی و پورت شنود را ببینید. برای نمونه بعضی برنامهها امکان شنود روی 0.0.0.0 داخل کانتینر دارند؛ این تصمیم با انتشار پورت روی همه رابطهای میزبان فرق دارد. نشانی، احراز هویت و محدودیت شبکه را متناسب با برنامه تنظیم کنید و آن را در محیط آزمایشی بسنجید.۴. در Compose انتشار مناسب را تنظیم کنید
اگر فقط Nginx روی همان میزبان باید به برنامه برسد، نمونه زیر در سرویس Compose میتواند پورت میزبان را به localhost محدود کند:
کد / دستورservices:
myapp:
ports:
- "127.0.0.1:8080:80"
اینجا ۸۰۸۰ پورت میزبان و ۸۰ پورت داخل کانتینر است. فایل موجود را با این قطعه جایگزین نکنید؛ آن را با تنظیمات فعلی سرویس خود ادغام کنید. در پوشه پروژه،
docker compose config را برای بررسی پیکربندی اجرا کنید؛ خروجی ممکن است اطلاعات محرمانه داشته باشد. برای اعمال تغییر نگاشت معمولاً کانتینر باید طبق برنامه انتشار دوباره ساخته شود؛ از اتصال volumeها، پشتیبان و روش بازگشت مطمئن شوید و وقفه احتمالی را در نظر بگیرید.اگر واقعاً کاربران باید مستقیم به پورت عمومی برسند، نشانی و محدوده مجاز، احراز هویت و قوانین شبکه را با مدیر سرور تعیین کنید. انتشار پورت Docker ممکن است با بعضی قوانین فایروال مانند UFW به شیوه مورد انتظار شما رفتار نکند؛ تنها به دیدن قانون فایروال تکیه نکنید و از بیرون با منبع مجاز آزمایش کنید. مستندات رسمی انتشار پورت Docker محدودیتها را توضیح میدهد.
۵. مسیر کامل را آزمایش کنید
پس از اصلاح، دوباره
docker port myapp و درخواست محلی را ببینید. سپس از یک دستگاه مجاز خارج از سرور به نشانی موردنظر وصل شوید. اگر محلی جواب میدهد اما بیرون نه، مسیر پراکسی، IP، پورت، قوانین شبکه ارائهدهنده و فایروال را جداگانه بررسی کنید. اگر اتصال برای عموم لازم نیست، از خارج باید مسدود بماند. در پایان یک قابلیت واقعی برنامه را تست کنید؛ باز بودن یک پورت بهتنهایی سلامت کل برنامه نیست.برای برنامههایی که به محیط و تنظیم شبکه مستقل نیاز دارند، گزینههای سرور مجازی ایران نتآرام را با نیاز و برنامه امنیت خود مقایسه کنید.
مقاله قبلی
مقاله بعدی
دیدگاهها (۰)
دیدگاههای تاییدشده و پاسخهای تیم نتآرام
