انتخاب روش مناسب برای بالا آوردن چند سایت با داکر(prod/dev)

network
docker

#21

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


#22

اگر هر سرویس با نام خودش در swarm قابل دسترس نباشه یعنی یک جای کار مشکل داره و باید حلش کرد، اگر دوست داشتی فایل yml رو در secret chat بده که ببینم


#23

البته من هنوز توی حالت swarm با اسم سرویس تست نکردم ببینم که ایا به مشکل میخورم یا نه به نظرتون اگر اسم سرویس داخل فایل pg_hba.conf مثل این نوشته بشه

# TYPE  DATABASE        USER            ADDRESS                 METHOD
#------------------------------------------------------------------------
host  cms_user      container_cms      my_service_name           md5

یا این فایل redis.conf

bind service_name

آیا به مشکل نمیخورن؟

چون من اسم سرویس رو داخل کانتینر redis پینگ میگرفتن به من ip اون رو میداد ولی وقتی توی bind میزاشتم کار نمیکرد :thinking:

و یه مورد دیگه . اسم سرویس توی swarm رو میشه مشخص کرد یا متغیری هست که بشه استفاده کرد چون هر بار تغییر میکنه یا بر اساس تعداد کانتینرها و سرویس عوض میشه


#24

Swarm از یک روش round robin برای networking استفاده میکنه.
نیازی به او تنظیمات در pg conf نیست!، هست؟
اسم سرویس رو که خودمون مشخص کردیم admin, redis, database


#25

نیازی به اون کانفیگ ها نسیت


#26

برای ping گرفتن چطور container رو اجرا میکنی؟ منظورم فرمانی که میدی هست


#27

چون میخواستم هر کانتینر وقتی به پستگرس وصل هست با شبکه خودش فقط به دیتابیس که من مشخص کردم وصل بشه و یک محدودیت شبکه هم برای redis ایجاده شده باشه چون bind توی redis در حالت نرمال 127.0.0.1 هست که من تغییر میدم به ip خودش بنابراین هر کانتینر که توی range اون هست میتونه بهش دسترسی داشته باشه البته اگر رمز رو هم بدونه

کدوم کانفیگ ها ؟ همین فایل pg_hba.conf و redis.conf ?

اگر درست متوجه شده باشم
ping my_postgres


#28

دادن static ip یعنی شما نیازی به داکر ندارید و کلا منطق netwoking در داکر بهم میریزه.
پاسخ به سوال ها مثبته.


#29

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


#30

محدودیت یعنی چی؟ مثال بزن


#31

برای postgres فایل pg_hba.conf

This file controls: which hosts are allowed to connect, how clients
# are authenticated, which PostgreSQL user names they can use, which
# databases they can access.  Records take one of these forms:
#
# local      DATABASE  USER  METHOD  [OPTIONS]
# host       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostssl    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostnossl  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]

برای redis فایل redis.conf

################################## NETWORK #####################################

# By default, if no "bind" configuration directive is specified, Redis listens
# for connections from all the network interfaces available on the server.
# It is possible to listen to just one or multiple selected interfaces using
# the "bind" configuration directive, followed by one or more IP addresses.
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#
# ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the
# internet, binding to all the interfaces is dangerous and will expose the
# instance to everybody on the internet. So by default we uncomment the
# following bind directive, that will force Redis to listen only into
# the IPv4 lookback interface address (this means Redis will be able to
# accept connections only from clients running into the same computer it
# is running).
#
# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 172.20.10.3


#32

بنظر میاد نیازی به این تنظیمات نیست.
اما در مورد host ها باید بگم که localhost درسته، چون مثلا postgres در کانتینر خودش local بحساب میاد. بنظر میاد تا حدی دچار over engineering شدیم اینجا☺️


#33

برای پستگرس اون تنظیمات باعث ایجاد محدودیت میشه که مثلا کانتینر A نتونه به دیتابیس کانتینر B دسترسی داشته باشه یعنی علاوه بر اینکه هر دیتابیس کاربر مخصوص به خودش رو داره یه لایه هم اینجا جلوی دسترسی رو بگیره . برای ردیس اگر bind تعریف نشه طبق توضیحات خودش روی همه ip ها دسترسی میده . اگر هم local تعریف بشه که دیگه دسترسی بهش امکان پذیر نیست چون خودش مستقل هست . پس باید ip خودش رو بدم تا کانتینری که در range اون قرار داره بتونه به ردیس دسترسی پیدا بکنه . برای پستگرس خب میشه اون موارد رو نادیده گرفت و لایه اضافی امنیتی رو حذف کرد . ولی برای ردیس امکانش نیست :thinking:


#34

الان متوجه شدم، شما قصد دارید دسترسی به postgres محدود باشه درسته؟ اما چرا؟ مگر قراره postgres به دنیای خارج از swarm ورودی داشته باشه. به جای ports کافیه از expose استفاده کنی که port ها فقط در شبکه داخلی داکر قابل دسترس باشه


#35

چرا کانتینر نباید بتونه به پستگرس دسترسی داشته باشه، لازمه که این کارو انجام بدیم؟ چرا سرویس های مربوط به هم در نتورک خودشون نیستند؟ میتونید در yml گزینه networks هم داشته باشید


#36

در مورد redis هم چیز مشابهی وجود داره و واقعا چرا نباید سرویس های موجود در یک نتورک به redis دسترسی داشته باشند؟ بنظر من باید طراحی yml رو بهتر کنید


#37

این کانتینرهایی هست که من فعلا دارم

CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS              PORTS                                                            NAMES
11bbc0a0783b        mojtabanaserei/discourse:2.2.2_beta6      "bash -c /sbin/boot"     4 minutes ago       Up 4 minutes                                                                         sosesh_discourse
27ae8ef58b0a        mojtabanaserei/nginx:1.15.7               "nginx -g 'daemon of…"   9 minutes ago       Up 9 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp                         nginx_master
091f01c7696d        mojtabanaserei/elixir:1.6.4               "sh -c 'rm -r _build…"   17 hours ago        Up 17 hours                                                                          sosesh_dev_html
c4988b24712e        example_elixir_prod_html_app:0.0.3       "sh -c 'PORT=4000 MI…"   38 hours ago        Up 38 hours                                                                          sosesh_html
fd9cfb3adf0b        example_elixir_prod_api_app:0.0.1        "sh -c 'PORT=4000 MI…"   3 days ago          Up 3 days                                                                            sosesh_api
4b2b3ac4be42        example_elixir_prod_user_app:0.0.1       "sh -c 'PORT=4000 MI…"   3 days ago          Up 3 days                                                                            sosesh_user
5943b88d7e13        mojtabanaserei/php7-fpm:7.2.10            "docker-php-entrypoi…"   3 days ago          Up 3 days                                                                            sosesh_roundcube
5be97cfe2de6        mojtabanaserei/dovecotsmtp:2.3.4_debian   "bash -c '/ip_change…"   3 days ago          Up 3 days           0.0.0.0:25->25/tcp, 0.0.0.0:587->587/tcp, 0.0.0.0:993->993/tcp   sosesh_dovecot
00bd3c2617be        example_elixir_prod_cms_app:0.0.1        "sh -c 'PORT=4000 MI…"   3 days ago          Up 3 days                                                                            sosesh_cms
f906569cb170        mojtabanaserei/redis:4.0.11               "docker-entrypoint.s…"   3 days ago          Up 3 days                                                                            sosesh_redis
c0cdc3c1c611        mojtabanaserei/postgresql:10.5            "docker-entrypoint.s…"   3 days ago          Up 3 days  

پورتهایی که از بیرون باید بهشون دسترسی داشته باشن فقط expose شده هست

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

فایل شبکه yml به این صورت هست

version: '3.7'
services:
  nginx_master:
    networks:
      nginx:
      nginx_to_roundcubemail_example:
        ipv4_address: 180.20.1.2
      nginx_to_html_example:
        ipv4_address: 180.20.2.2
      nginx_to_discourse_example:
        ipv4_address: 180.20.3.2
      html_dev_to_nginx_example:
        ipv4_address: 180.20.14.2
  #===================================      
  example_discourse:  
    networks: 
      discourse:
      nginx_to_discourse_example:
        ipv4_address: 180.20.3.3
  #===================================        
  example_html:
    networks:
      html:
      nginx_to_html_example:
        ipv4_address: 180.20.2.3
      html_to_api_example:
        ipv4_address: 180.20.4.2
  #===================================  
  example_api:
    networks:
      html_to_api_example:
        ipv4_address: 180.20.4.3
      api_to_user_example:
        ipv4_address: 180.20.5.2
      api_to_cms_example:
        ipv4_address: 180.20.6.2
  #===================================  
  example_user:
    networks:
      api_to_user_example:
        ipv4_address: 180.20.5.3
      user_to_redis_example:
        ipv4_address: 180.20.7.2     
      user_to_postgresql_example:
        ipv4_address: 180.20.8.2
      user_to_dovecotsmtp_example:
        ipv4_address: 180.20.9.2
  #===================================  
  example_cms:
    networks:
      cms_to_postgresql_example:
        ipv4_address: 180.20.10.2
      api_to_cms_example:
        ipv4_address: 180.20.6.3
  #===================================        
  example_roundcube:
    networks:
      nginx_to_roundcubemail_example:
        ipv4_address: 180.20.1.3
      roundcubemail_to_postgresql_example:
        ipv4_address: 180.20.11.2
      roundcubemail_to_dovecotsmtp_example:
        ipv4_address: 180.20.12.2
  #===================================  
  example_dovecot:
    networks:
      dovecot:
      roundcubemail_to_dovecotsmtp_example:
        ipv4_address: 180.20.12.3
      user_to_dovecotsmtp_example:
        ipv4_address: 180.20.9.3
      dovecotsmtp_to_postgresql_example:
        ipv4_address: 180.20.13.2
  #===================================  
  example_redis:
    networks:
      user_to_redis_example:
        ipv4_address: 180.20.7.3
  #===================================  
  example_postgres:
    networks:
      user_to_postgresql_example:
        ipv4_address: 180.20.8.3
      cms_to_postgresql_example:
        ipv4_address: 180.20.10.3
      roundcubemail_to_postgresql_example:
        ipv4_address: 180.20.11.3
      dovecotsmtp_to_postgresql_example:
        ipv4_address: 180.20.13.3
  #===================================
  #===================================
  example_dev_html:
    networks:
      html_dev_to_nginx_example:
        ipv4_address: 180.20.14.3     
#============================================ 
#============================================ 
networks:
#============================================   
#============================================ 
#------- internet access  
  nginx:
  discourse:
  dovecot:
  html:
#============================================   
  nginx_to_roundcubemail_example:
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 180.20.1.0/24
  nginx_to_html_example:
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 180.20.2.0/24
  nginx_to_discourse_example:
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 180.20.3.0/24
#============================================         
#============================================         
  html_to_api_example:
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 180.20.4.0/24
#============================================        
  api_to_user_example:
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 180.20.5.0/24
  api_to_cms_example:
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 180.20.6.0/24
#============================================        
  user_to_redis_example:
    internal: true   
    ipam:
      driver: default
      config:
        - subnet: 180.20.7.0/24     
  user_to_postgresql_example:
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 180.20.8.0/24
  user_to_dovecotsmtp_example:
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 180.20.9.0/24
#============================================        
  cms_to_postgresql_example:
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 180.20.10.0/24
#============================================        
  roundcubemail_to_postgresql_example:
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 180.20.11.0/24
  roundcubemail_to_dovecotsmtp_example:
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 180.20.12.0/24
#============================================  
  dovecotsmtp_to_postgresql_example:
    internal: true  
    ipam:
      driver: default
      config:
        - subnet: 180.20.13.0/24  
#============================================  
  html_dev_to_nginx_example:
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 180.20.14.0/24

#38

بزار من یک مثال بزنم،
فکر کن در یک swarm سرویس های a, b, c وجود داره به اضافه redis, خب حالا شما دلیل بیار که چرا فقط a باید به redis دسترسی داشته باشه؟


#39

هر کانتینری که به redis نیازه داره باید بهش بتونه وصل بشه چه دلیلی داره که مثلا کانتینر ایمیل که نیاز به redis نداره بتونه به اون دسترسی پیدا بکنه؟ خصوصا که کانتینر ایمیل از بیرون سرور هم قابل دسترس هست این به نظرتون مشکل امنیتی ایجاد نمیکنه؟ :thinking:


#40

خب کانتینر email نباید در نتورک redis باشه، همین
در مثال شما user و redis میتونند در یک نتورک باشند به نام مثلا redis