عدم دسترسی به کانتینر داکر در مرورگر - mac

docker
macos

#1

سلام
من یک image برای داکر درست کرده بودم و سرویس هاشو روی لینوکس بدون مشکل بالا آوردم و استفاده میکنم.

یکی از دوستان برروی سیستم عامل مک داکر نصب کرده و همون image و شبکه رو بالا آورده ، از بیرون با دستور زیر میتونم وارد کانتینر بشم

sudo docker exec -it localserver ash

مشکل این هست که بعد از تعریف خط زیر در فایل hosts نمیتونیم آدرس مورد نظر رو در مرورگر بالا بیاریم چون از بیرون اصلا پینگ کانتینر رو نداریم

172.20.0.2   example.com

نظرتون در این باره چی هست ؟


#2

سلام خروجی اینو بده لطفا

sudo docker inspect localserver

احتمالا یا پورت درست پابلیش نشده یا اگر proxy داری درست کارشو انجام نمیده.

این قسمت ربطی به مشکل نداره:
لازم نیست پورت پابلیش بشه کافیه expose کنی و از طریق proxy اندپوینت رو منتشر کنی.


#3

این خدمت شما


#4

پاسخ رو کامل کردم


#5
 "PortBindings": {}

#6

کانتینرو دقیقا چطوری run کردی؟ و دلیل بایند کردن domain به 127.20.0.2 چیه؟


#7

اگر انتظار داری که پورت ۸۰ کانتینر بدون وجود proxy روی پورت ۸۰ هوست فرستاده بشه باید منتشرش کنی

-p 80:80

#8

ببخشید، اگر خیلی پیش پا افتاده بود لطفا پوزش منو بپذیرید چون اطلاعات کافی از سیستم شما نداشتم گفتم


#9

همون تنظیمات روی لینوکس تست شده و مشکلی ندارند . بدون اینکه پورتی رو expose کنیم . همه سرویس ها داخل یک کانتینر هست . بجز سرویس pgadmin که داخل کانتینر دیگه ای هست و این دو کانتینر با شبکه به هم وصل شدن . یعنی طبق این لینک نیست من اشتباهی قرار دادم

درستش این هست

docker-compose up -d

ip 172.20.0.2 البته این ip هر بار تغییر میکنه چون ثابت ندادم .
علت بایند کردن به دامنه برای این هست که توی مرورگر با آدرس سایت رو بالا بیارم ولی الزامی هم نیست. چون https هم درست کردم خواستم بیشتر شبیه سرور بشه .

خب پورت ۸۰ و ۴۴۳ به صورت خودکار expose شده هستن


#10

expose شده به شبکه docker ولی expose با publish فرق میکنه, برای دسترسی از host باید publish بشن.
در ضمن بهتره توی mac برای تست داکر از Vagrant استفاده کنید.
منم مشکلات زیادی با مک و docker دارم و کلا روی Mac mini بیچاره ubuntu نصب کردم.
شاید nginx روی linux host دارید که تصادفا مشکل port forwarding حل شده


#11

من دقیقا نمی دونم Vagrant چی هست و همینطور از سایتش هم دیدم چیزی زیادی متوجه نشدم https://www.vagrantup.com

چطور باید ازش استفاده کنیم یعنی کلا باید بریم روی این من فقط می خوام محیط دولپر روی داکرم روی مکم بالا بیاد بتونم کد بزنم و تست کنم همین! :disappointed_relieved:


#12

وگرنت دقیقا برای همین کاره، اگر فقط میخواستی کانینر ها رو تست کنی مشکلی نبود اما چون قصد داری دولوپمنت شبیه پروداکشن بشه بهتره از ابزار مناسب استفاده کنی، در بعضی موارد شاید docker-machine هم مناسب باشه اما من شدیدا وگرنت رو پیشنهاد میکنم.
در ضمن یه nginx هم میتونی توی مک نصب کنی که وقتی پورتها فوروارد شد با nginx بهتر سروشون کنی


#13

وگرنت نصب کن بعد:

mkdir vagrant_source
cd vagrant_source
touch Vagranfile

محتوای Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/bionic64"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.provider "virtualbox" do |v|
    v.memory = 3072
    v.cpus = 2
  end
end
vagrant up
vagrant ssh

#14
vagrant halt

= shutdown


#15

شایدم اصلا با یه config درست nginx روی مک مشکلت حل بشه


#16

من یه نگاه کلی به این انداختم . در واقع از این استفاده بکنیم مثل این هست که ما روی virtualbox یک لینوکس نصب کرده باشیم و روی اون داکر رو ران اندازی کرده باشیم . حالا یه چندتا ابزار فقط بهش اضافه کردن . وگرنت علاوه بر مصرف زیاد ram . cpu سرعت کمتری نسبت به داکر داره .

حالا باید دید شبیه ساز خوده داکر در مقایسه با وگرنت چقدر منابع استفاده میکنه اگر کمتر باشه خوبه ازش استفاده بشه


#17

تحقیق خوبی بود اما حدس درستی نبود.
وگرنت و داکر قرار نیست با هم مقایسه بشن، شما باید توی وگرنت داکر نصب کنید و ازش به عنوان محیط شبیه سرور استفاده کنید و این ابزاریه که به صورت کاملا حرفه ای استفاده میشه, پس بابت اینکه چرا باید استفاده کنید خیالتون راحت باشه.

اگر توجه کرده باشید من به باکس وگرنت ۳ گیگ رم دادم.

مورد بعدی اینه که هدف نزدیک بودن به پروداکشن هست که روی مک امکان پذیر نیست.

حالا ممکنه شما بگین خب روی vbox لینوکس نصب میکنم و از همون استفاده میکنم اما وگرنت کمک میکنه که روی چیزای مهمتر تمرکز کنید.
و در پایان اصلا لازم نیست روی وگرنت وقت بزارید چون همون چند خط کدی که دادم کار شما رو راه میندازه.


#18

یکمی هم از بحث خارج شدیم،
شما بلاخره نگفتین که آیا باید اون کانتینر مستقیم port ۸۰ رو به host منتشر یا forword کنه یا قراره یک کانتینر proxy در همون شبکه داکری که اون کانتینر توش هست این کاره انجام بده؟
اگر قراره مستقیم باشه همونطور که عرض کردم در مثال شما port ۸۰ منتشر نشده و این ربطی به مک یا لینوکس نداره، در لینوکس هم نباید کار کنه، حالا باید توی لینوکس inspect و بقیه المان ها رو داشته باشیم که ثابت کنیم چرا کار میکنه.

۲- نفرمودین که کانتینر دقیقا چطور اجرا شده؟ یعنی با چه فرمانی؟
۳- اگر از run استفاده می کنید گزینه
docker run -d —name SomeName —net ExplicitNameIfExists -p 80:80 ImageName

اگر از DockerCompose استفاده کردین در قسمت مربوط به کانتینر سرویس:

ports
    - "80:80"

اگر هم فقط از Dockerfile استفاده شده و انتظار دارید که image این موارد رو رو داشته باشه بازم چیز مشابهی هست.

اگر قرار نیست دسترسی مستقیم باشه و احتمالا چیزی شبیه nginx روی کداکر در میان هست که اونم بفرمایید تا مراحل رو عرض کنم.
بازم در پایان بهتره در هر دو صورت روی خود host که مک باشه هم nginx نصب کنید و گانفیگ کنید که بازم به شرایط prod نزدیکتر باشه.
اکر از وگرنت استفاده کردین هم توی وگرنتی که داکر نصب شده باید nginx نصب کنید و گانفیگ کنید که بازم مثل سرور اصلی بشود.

دلیل اینکه شما پاسخ سوال های منو ندادین هم احتمالا این بود که رفتیم روی وگرنت🥶


#19

البته کمبود رم روی مک بوک شهریارجان فعلا معضل هست . برای همین بعید میدونم که بتونیم از وگرنت استفاده بکنیم . بیشتر مقایسه من روی مقدار مصرفی داکر ماشین با وگرنت بود .

توی مقایسه ای که انجام شده بود گفته بودن که وگرنت برای حالت پروداکشن مناسب نیست برای حالت توسعه خوبه

توی کانتینری که الکسیر هست یک انجینکس هم هست که کار پروکسی رو انجام میده . البته localhost رو تست نکردم ببینم روی مرورگر بالا میاد یا نه . علت اینکه روی لینوکس کار میکنه این هست که من از طریق 127.0.0.1:4000 به خروجی فونیکس دسترسی دارم ولی توی مک نه

دستورات داخل یک فایل داکر کمپوز قرار داده شده به صورت زیر

version: "3.7"

services:
  localserver:
    image: mojtabanaserei/elixir_redis_postgres_nginx:last
    container_name: localserver
    restart: always
    working_dir: /src
    command: sh -c "/start_services.sh && sleep 5000000000000"
    volumes:
      - ./conf/nginx/logs/:/var/log/
      - ./conf/nginx/cache/:/var/nginx/cache
      - ./conf/nginx/conf/:/etc/nginx/
      - ./conf/redis/redis.conf:/usr/local/etc/redis/redis.conf
      - ./conf/redis/data:/data
      - ./conf/postgresql/data:/var/lib/postgresql/data
      - ./conf/pgadmin/:/data
      - ./conf/start_services.sh:/start_services.sh
      - ./src:/src
      - ./src/chat/priv/static/:/var/www/example/html
      - ./ssl/:/etc/letsencrypt:ro
      - /etc/localtime:/etc/localtime:ro
    networks:
      - localserver
      
  pgadmin:
    image: dpage/pgadmin4
    container_name: pgadmin
    restart: always
    environment:
      - PGADMIN_DEFAULT_PASSWORD=SuperSecret
      - PGADMIN_DEFAULT_EMAIL=user@domain.com
    volumes:
      - ./conf/pgadmin/:/var/lib/pgadmin
      - /etc/localtime:/etc/localtime:ro
    networks:
      - localserver
      
networks:
localserver:

اجرا به صورت

sudo docker-compose  up -d

از run استفاده نمی کنم . در کانتینر nginx پورت به این صورت expose شده

EXPOSE 80 443

این مورد رو فردا تست میزنم

دسترسی از طریق nginx هست

منظورتون این هست که بجای اینکه nginx داخل کانتینر باشه اون رو بیرون داکر نصب کنم و عمل پروکسی رو انجام بدم ؟

از وگرنت خواستم استفاده بکنم ولی طبق مقایسه ای که بین اون و داکر شده بود چون منابع بیشتری استفاده میکنه منم بیخیال شدم . بجاش گفتم مشکل ip برای داکر ماشین رو حل کنم که مشکلم حل بشه چون اکثرا روی مک به این صورت عمل میکنن از ip داکر ماشین برای دسترسی به کانتینرها استفاده میکنن

روی لینوکس که اصلا به این مورد نیازی ندارم :smile: . باز روی مک مگر اینکه استفاده بشه اونم به دلایلی که شما فرمودین


#20

در لینوکس هم باز وگرنت خیلی کمک بزرگیه، اصلا ربطی به لینوکس یا مک نداره.

ای بابا، من گفتم برای پروداکشن؟ لطفا دقت کنید :rage::rage::rage:
وگرنت فقط برای توسعه هست اما محیطی کاملا شبیه پروداکشن بوجود میراه.

بازم پاسخ ندادین، قراره پورت کانتینر منتشر بشه؟ مستقیم به هوست یا از طریق پروکسی؟
چون ports رو در فایل شما نمیبینم