برای ایجاد یک Container network ابتدا نیاز است یک Custom network bridge را ساخته و containerهای مختلفی را دورن آن اجرا کنیم.
بنابراین برای ایجاد یک شبکه، از دستور زیر استفاده میکنیم:
docker network create --driver bridge isolated-network
isolated-network نام این شبکه است و میتوان به دلخواه آن را تغییر داد که در اینجا از نوع bridge در نظر گرفته شدهاست.
بعد از ایجاد آن میتوانید با دستور زیر، لیست شبکههای موجود خود را مشاهده کنید:
docker network ls
حال میخواهیم containerهای خود را درون این شبکه اجرا نماییم؛ بطور مثال تصویر mongo را در نظر بگیرید. نیاز داریم container آن درون این شبکهی از نوع bridge اجرا شده و بقیهی containerهای درون این شبکه نیز بدان دسترسی داشته باشند.
دستور زیر را برای اجرا کردن container درون شبکهای که ساختهایم، فراخوانی میکنیم:
docker run -d --net=isolated-network --name mongodb mongo
با استفاده از نام mongodb که به این container دادهایم، توسط بقیهی containerهای درون این شبکه، قابل دسترسی است.
برای کامل شدن این مثال کافیاست به ادامهی imageی که در مقالهی قسمت قبلی انجام دادیم رفته و تغییراتی را در آن اعمال نماییم. برنامهی nodejsی را که دفعهی قبل نوشتیم، اینگونه بازنویسی مینماییم:
const express = require('express') const mongoClient = require('mongodb').MongoClient; const app = express() const PORT = 3000; app.get('/', async (req, res) => { let db = null; try { db = await mongoClient.connect("mongodb://mongodb/"); let database = db.db("myDb"); await database.collection('users').insertOne({ firstName: 'Ali', lastName: 'Kh' }); } catch (e) { } finally { if(db) db.close(); res.send('Hello World') } }); app.listen(PORT, () => { console.log(`listening on port ${PORT}!`) })
تغییرات صورت گرفته فقط اضافه شدن پکیج mongodb است و بقیهی کدها هم منطق وصل شدن به دیتابیس و اضافه کردن رکوردی به یک مجموعهی خاص میباشد که به صورت سادهای در نظر گرفته شده است.
نکته: اگر از nodejs ورژن نسخههای پایینتر استفاده میکنید، ممکن است برای نوشتن async/await به خطا برخورد کنید. قاعدتا راه حلش یا بروزرسانی است و یا تغییر دادن کدهای فوق از async/await به callback معمولی جاوااسکریپت.
نکته: همانطور که میبینید در صورت عادی، برای وصل شدن به دیتابیس mongo بطور مثال از localhost:27017 استفاده میکردیم، اما از آنجایی که برنامهی ما درون یک container و شبکهای که ایجاد کردیم، قرار است اجرا شود، توانستیم با استفاده از نام containerی که برای mongo ایجاد کردیم، بدان وصل شویم.
حال کافیاست dockerfile قبلی را هم اضافه کرده و تصویر خود را build نماییم و بعد از آن هم با استفاده از دستور زیر تصویر خود را بر روی container اجرا کنیم:
دستور build
docker build -f dockerfile -t alikhll/nodemongo .
دستور اجرا
docker run -d --net=isolated-network -p 3000:3000 alikhll/nodemongo
همانطور که میبینید containerهای مختلفی را در یک شبکه اجرا کردهایم و قابلیت فراخوانی آنها فراهم هست. اما شاید استفادهی از این روش برای تست مناسب باشد، ولی اگر قرار باشد روند توسعه نرمافزار با استفاده از این روش انجام شود، سختی و تکرارها در فرآیند این کار شاید زیادتر از حد بوده و روند توسعه را کاهش دهد. برای حل این مشکل از ترکیب containerها در کنار هم استفاده میکنیم و مطالب بیشتری در قسمت بعدی آورده خواهد شد.