חיבור למסד נתונים בדוקר 2
-
@שואף אמר בחיבור למסד נתונים בדוקר 2:
@יוסף-בן-שמעון אמר בחיבור למסד נתונים בדוקר 2:
@שואף אז בעצם אתה רוצה להתחבר מהרשת המארחת לרשת הפנימית של המיכל, אם כן expose פשוט אמור לפתור את זה.
לא עוזר. עדיין אפשר להתחבר בתור כתובת אייפי אבל לא עם שם הקונטיינר.
אם אתה עושה expose, אז אתה מתחבר לlocalhost.
-
root@docker:~# mysql -u root -p54fghjghjk44RkjJHkhgv3798 -h localhost -P 3306 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
-
@aaron @יוסף-בן-שמעון אני מדבר על אפליקציה במצב HOST ומסד נתונים במצב BRIDGE. ואז השאלה איך לגשת מהאפליקציה לנתונים בלי להשתמש בכתובת אייפי החמקמקה.
ברור שאם אגדיר המסד נתונים במצב HOST אוכל לגשת עם LOCALHOST, אבל אני מנסה להמנע מלחשוף שירותים שאינם נחוצים (או שאולי זה לא כזה נורא ואפשר לוותר על הזהירות הזו?) -
@שואף אמר בחיבור למסד נתונים בדוקר 2:
root@docker:~# mysql -u root -p54fghjghjk44RkjJHkhgv3798 -h localhost -P 3306 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
כלומר - אותה הפקודה בדיוק מאותה המכונה, עם אייפי עובדת ועם לוקאלהוסט לא עובדת?
אחרי שערכת את הדוקר קומפוז עשית DOWN ו UP? -
@יוסף-בן-שמעון כן וכן.
במילים אחרות, אם אני מפעיל דוקר של MYQSL במצב BRIDGE ועושה EXPOSE לפורט 3306, אני לא מצליח להתחבר אליו מהשרת הHOSTversion: '3.1' services: db: image: mariadb:10.5 container_name: testdb network_mode: bridge expose: - 3306 environment: MYSQL_ROOT_PASSWORD: 54fghjghjk44RkjJHkhgv3798
הצורה היחידה שאני מצליח להתחבר זה לעשות
docker inspect testdb | grep IPAddress
שמחזיר לי אייפי "172.17.0.2" ואז אני יכול להתחבר כך
mysql -u root -p54fghjghjk44RkjJHkhgv3798 -h "172.17.0.2"
-
בדוגמא שהבאת הוא מנסה להתחבר לסוקט, הסוקט לא קיים, אבל תכלס זה רעיון מעניין לשתף את הסוקט ולא את הפורט.
זה עדיף מאשר לחשוף את הפורט כי דוקר עוקף את הפיירוול המקומי.https://github.com/docker/compose/issues/3211 אולי זה יתן כיוון
-
העובדה שיש לך אפליקציה נוספת שמשתמשת בNetwork של הHost הינה חסרת חשיבות, השאלה שלך היא כיצד ניתן לגשת לקונטיינר (bridge network mode) מבחוץ (הHost המארח).
המשמעות של Expose היא תיעודית בלבד, בשביל לאפשר גישה לקונטיינר מבחוץ אתה צריך לבקש זאת באופן מפורש (Publish), מעבר לעובדה שאתה לא רוצה שזה יתבצע כברירת מחדל (בשל שיקולי אבטחה), אתה גם מעוניין לקבוע באיזה פורט התהליך (שמאזין בקונטיינר) יהיה זמין בHost.
התהליך מתבצע באמצעות מיפוי פורט X בקונטיינר לפורט Y בHost.
להלן מספר דוגמאות מתוך הדוקומנטציה:
פקודה תיאור docker run -p 8080:80 מפה את פורט 80 בקונטיינר לפורט 8080 בHost docker run -p 192.168.1.100:8080:80 מפה את פורט 80 TCP בקונטיינר לפורט 8080 בHost עבור חיבורים לHost באמצעות האייפיי 192.168.1.100 docker run -p 8080:80/tcp -p 8080:80/udp מפה את פורט TCP-80 בקונטיינר לפורט TCP-8080 בHost ואת פורט UDP-80 בקונטיינר לפורט 8080-UDP בHost אם המיפוי של המסד נתונים יתבצע באופן דלהלן
"3306:3306"
, המסד יהיה זמין בפורט 3306 של הlocalhost
.services: db: image: mariadb:10.5 environment: MYSQL_ROOT_PASSWORD: 54fghjghjk44RkjJHkhgv3798 ports: - "3306:3306"