در این آموزش، نحوه اجرای دو کانتینر داکر، اضافه کردن آن‌ها به یک شبکه داکر جدید و برقراری ارتباط بین آن‌ها شرح داده شده است.

 

بدین منظور از یک API آزمایشی ایجاد شده با nodejs و یک پایگاه داده Postgres در کانتینرها استفاده کرده‌ایم و سعی می‌کنیم آن‌ها را به یک شبکه docker متصل نماییم.

برای شروع، ابتدا باید یک شبکه داکر ایجاد کنید. شبکه docker یک لایه شبکه ایزوله است که به شما امکان می‌دهد، کانتینرها را به آن اضافه نمایید. شما می‌توانید آدرس‌های IP این کانتینرها را در داخل شبکه تخصیص داده و اجازه دهید آن‌ها با هم ارتباط برقرار کنند. هنگام استفاده از شبکه در یک کانتینر، نگاشت پورت میزبان به کانتینر همچنان در دسترس است و docker به طور پیش فرض یک شبکه bridge ایجاد می‌کند.

 

برای ایجاد یک شبکه داکر، دستور زیر را وارد نمایید:

docker network create --subnet 172.20.0.0/16 dockernetworkdemo

در اینجا، یک زیر شبکه با مقدار 172.20.0.0/16 در قالب CIDR مشخص کرده‌ایم.

پس از آن می‌توانید شبکه را با استفاده از دستور زیر بررسی کنید:

docker network ls

 

برای مشاهده جزئیات بیشتر در مورد شبکه می‌توانید از دستور زیر استفاده نمایید:

docker network inspect dockernetworkdemo

در اینجا dockernetworkdemo، نام شبکه‌ای است که هنگام ایجاد آن مشخص کرده‌ایم.

 

اکنون باید شبکه را به کانتینری ببریم که پایگاه داده برروی آن قرار دارد.

بدین منظور می‌توانید از دستور زیر استفاده کنید:

docker run --name dockernetworkdemopg -p 6543:5432 -e POSTGRES_PASSWORD=123 -e POSTGRES_USER=postgres -e POSTGRES_DB=postgres -d postgres:10-alpine

در این دستور، dockernetworkdemopg نام کانتینر است.

با گزینه p 6543:5432-، پورت 5432 کانتینر به پورت 6543 میزبان نگاشت می‌شود. در اینجا از یک پورت متفاوت استفاده کرده‌ایم؛ زیرا یک پایگاه داده Postgres داریم که روی پورت 5432 اجرا می‌شود.

در e POSTGRES_PASSWORD=123 -e POSTGRES_USER=postgres -e POSTGRES_DB=postgres-، گزینه e یک متغیر محیطی را به کانتینر ارسال می‌کند. در اینجا رمز عبور، کاربر و پایگاه داده را مشخص کرده‌ایم.

پرچم d-، کانتینر را در حالت جدا اجرا می‌کند.

postgres:10-alpine نام و برچسب Postgres image است که ما از Docker Hub دریافت می‌کنیم. در اینجا، نسخه alpine را انتخاب کرده‌ایم؛ زیرا سبک وزن است و اندازه آن در حدود 20 مگابایت کوچک‌تر است.

 

اکنون اگر دستور زیر را اجرا نمایید:

docker ps 

می‌توانید مشاهده کنید که کانتینر Postgres شما آماده و در حال اجرا است.

 

در مرحله بعد، کانتینر Postgres (به نام dockernetworkdemopg) را به شبکه (dockernetworkdemo) که ایجاد کرده‌ایم، متصل می‌نماییم.

docker network connect --ip 172.20.0.5 dockernetworkdemo dockernetworkdemopg

در اینجا، IP کانتینر متصل شده را با استفاده از پرچم ip-- با مقدار 172.20.0.5 مشخص کرده‌ایم.

اکنون، اگر دستور بازرسی شبکه را اجرا کنید، شبکه اضافه شده را مشاهده خواهید کرد:

 

در مرحله بعد باید API را راه‌اندازی نمایید. در اینجا، از یک Nodejs API ساده استفاده می‌کنیم و یک image داکر می‌سازیم.

FROM  node:current-alpine3.12

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm i

ENV NODE_ENV=production
ENV DBURL=postgres://postgres:123@172.20.0.5:5432/postgres
ENV PORT=3001

COPY . .

EXPOSE 3001

CMD [ "npm", "run" , "prod" ]

در dockerfile، متغیر محیطی DBURL را در کانتینر Postgresای که اجرا کرده‌ایم، مشخص نموده‌ایم.

ENV DBURL=postgres://postgres:123@172.20.0.5:5432/postgres

 

در رشته اتصال postgres://postgres:123@172.20.0.5:5432/postgres، مقدار 172.20.0.5:5432 آدرس IP و پورت کانتینر Postgres است و 172.20.0.5 آدرس IPای است که هنگام اتصال به شبکه مشخص کرده‌ایم.

docker build -t dockernetworkdemoapi .

گزینه t-، نام و برچسب را در dockernetworkdemoapi:latest تنظیم می‌کند.

قبل از اجرای imageها باید یک رابطه پایگاه داده ایجاد نمایید تا بتوانید با استفاده از API برروی داده‌ها کوئری اجرا کنید. در اینجا، از یک اسکریپت انتقال برای اجرای برخی از دستورات SQL استفاده می‌نماییم.

 

از آنجایی که انتقال در ماشین میزبان در حال اجرا است، رشته اتصال به صورت postgres://postgres:123@localhost:6543/postgres با IP پایگاه داده به عنوان localhost و پورت 6543 (که هنگام اجرای پایگاه داده Postgres مشخص شده است)، ارسال می‌شود.

در مرحله بعد، API image مربوطه dockernetworkdemoapi:latest را اجرا خواهیم کرد.

docker run --name dockernetworkdemoapicont -p 3001:3001 dockernetworkdemoapi:latest

در دستور بالا، گزینه name-- نام کانتینر را مشخص می‌کند که dockernetworkdemoapicont است.

p 3001:3001- برای انتشار پورت‌ها با نگاشت پورت کانتینر 3001 به پورت میزبان 3001 استفاده شده است.

و dockernetworkdemoapi:latest به عنوان image داکر است.

 

در اینجا، کانتینر را بدون حالت جدا شده (detached) اجرا کرده‌ایم تا بتوانیم خروجی را ببینیم.

اکنون به عنوان آخرین مرحله باید کانتینر API (یعنی dockernetworkdemoapicont) را به شبکه dockernetworkdemo متصل کنید.

docker network connect dockernetworkdemo dockernetworkdemoapicont

در آخر، اگر یک درخواست به API ارسال نمایید، مشاهده خواهید کرد که API قادر به اتصال به پایگاه داده است.


 

خروجی بازرسی نهایی داکر به صورت زیر خواهد بود:

 

تصویر شبکه به صورت زیر است:

 

 

 

منبع:

dev