سازنده docker برای اجرای برنامه های dockerized در یک محیط توسعه محلی بسیار محبوب است. تنها کاری که باید انجام دهیم نوشتن یک فایل کامپوزیت حاوی پیکربندی خدمات برنامه و داشتن یک موتور داکر در حال اجرا برای استقرار است. از اینجا ، می توانیم با یک فرمان `docker-compose up` در چند ثانیه محلی را اجرا کنیم.

این محدوده اولیه بود ، اما …

از آنجا که توسعه دهندگان به نظر می رسد سهولت استقرار یکسان در خطوط لوله CI / محیط تولید را در محیط توسعه خود دارند ، ما امروز می بینیم که docker-آهنگسازی به روش های مختلف و فراتر از آن مورد استفاده قرار می گیرد. دامنه اولیه آن در چنین مواردی ، چالش این است كه docker-compose از طریق استفاده از متغیر محیط DOCKER_HOST و -H ، – گزینه خط فرمان () پشتیبانی از اجرای موتورهای از راه دور را فراهم می آورد. این بسیار کاربر پسند نیست و مدیریت استقرار برنامه های کاربردی سازنده در محیط های مختلف بسیار سنگین می شود.

برای رسیدگی به این مسئله ، ما به Docker Contextts متکی هستیم تا بطور ایمن برنامه های کاربردی را در محیط های مختلف تنظیم کرده و آنها را از طریق محلی ما مدیریت کنیم. هدف از این پست نشان دادن چگونگی استفاده از زمینه ها برای هدف قرار دادن محیط های مختلف برای استقرار و به راحتی جابجایی بین آنها است.

ما شروع به تعریف یک نمونه نمونه برای استفاده در طول این تمرین خواهیم کرد ، سپس نحوه استفاده از آن را نشان خواهیم داد. در محل محلی. علاوه بر این ، نگاهی خواهیم داشت به Docker Context و اطلاعاتی که در اختیار دارد تا به ما امکان اتصال ایمن با موتورهای Docker از راه دور را بدهد. سرانجام ، ما از Docker Contexts با docker-compose برای استقرار در موتورهای از راه دور استفاده خواهیم کرد.

قبل از ادامه کار ، docker و docker-آهنگسازی باید در محلی نصب شود. Docker Engine و Compose در Docker Desktop برای ویندوز و macOS گنجانده شده است. برای لینوکس باید Docker Engine و docker-compose تهیه کنید. حتماً با ویژگی پشتیبانی از متن ، آهنگسازی را تهیه کرده اید. این با شروع نسخه 1.26.0-rc2 docker-compose در دسترس است.

نمونه برنامه نوشتن

اجازه دهید یک فایل کامپوزیت برای توصیف برنامه ای متشکل از دو سرویس تعریف کنیم: frontend و backend. سرویس frontend یک پروکسی nginx را اجرا می کند که درخواست های HTTP را به یک سرور برنامه Go ساده هدایت می کند.

نمونه ای با کلیه پرونده های لازم برای این تمرین را می توان از اینجا بارگیری کرد یا به جای آن می توانید از نمونه دیگری از مخزن Compose نمونه استفاده شود.

ساختار پروژه و پرونده نوشتن را می توان در زیر مشاهده کرد:

$ سلام سلام docker
سلام docker
├── backend
│ ├── Dockerfile
│ └── main.go
├── docker-compose.yml
└── frontend
├── Dockerfile
└── nginx.conf

docker-compose.yml

نسخه: خدمات "3.6"
:
جبهه:
ساخت: جبهه
پورت:
– 8080 : 80
وابسته_ون:
[194590207] – [19459908]
backend:
build: backend

در حال اجرا روی localhost

برای استقرار برنامه ای که قبلاً تعریف کرده بودیم ، بروید به فهرست پروژه و اجرای docker-compose:

$ cd hello-docker /
$ docker-compose up -d
ایجاد شبکه "hello-docker_default" با درایور پیش فرض
ایجاد سلام docker_backend_1 … انجام شده است
ایجاد سلام سلام docker_frontend_1 … انجام شده

بررسی کنید تمام ظروف در حال اجرا هستند و بندر 80 ظروف سرویس جلویی به بندر 8080 محلی که مطابق در docker-compose.yml شرح داده شده است نقشه برداری می شود. .

$ docker ps
CONTAINER ID IMAGE Commands Created STATUS
نام های PORTS
07b55d101e74 nginx: آخرین "شبح اعتدال -g" از … "6 ثانیه پیش 5 ثانیه [19450100:8080->80/tcphello-docker_frontend_1
48cdf1b8417c hello-docker_backend "/ usr / local / bin / back …" 6 ثانیه پیش تا 5 ثانیه سلام-docker_backend_1

درخواست وب سرویس درگاه 8080 را جستجو کنید. پیام سلام از باطن برو.

$ curl localhost: 8080
##.
## ## ## ==
## ## ## ## ## = ==
/ "" "" "" "" "" "" "" "" "" "___ / ===
{/ === –
______ O __ /
__ /
____ _______ /
سلام از داکر!

در حال اجرا روی یک هاست از راه دور

میزبان Docker از راه دور یک دستگاه است ، در داخل یا خارج از شبکه محلی ما است. موتور Docker Engine را اجرا می کند و پورت هایی را برای پرس و جو در مورد API موتور در معرض دید دارد.

برنامه نمونه از چند طریق می تواند روی یک میزبان از راه دور مستقر شود. فرض کنید دسترسی SSH به میزبان docker از راه دور با تأیید اعتبار مبتنی بر کلید داشته باشیم تا از ورود سریع رمز عبور هنگام استقرار برنامه جلوگیری کنیم.

سه راه برای استقرار آن بر روی میزبان از راه دور وجود دارد:

1. استقرار دستی با کپی کردن پرونده های پروژه ، نصب docker-compose و اجرای آن

استفاده مشترک از Compose کپی کردن منبع پروژه با docker-compose.yml است ، نصب docker-compose در دستگاه مورد نظر جایی که می خواهیم برنامه آهنگسازی را مستقر کنیم و در نهایت آن را اجرا کنیم.

$ scp -r سلام کاربر docker @ remotehost: / path / to / src
$ ssh user @ remotehost
$ pip install docker-compose
$ cd / path / to / src / hello-docker
$ docker-compose up -d

معایب در این مورد این است که برای هرگونه تغییر در منابع برنامه یا پرونده نوشتن ، باید کپی کنیم ، به میزبان از راه دور متصل شویم و دوباره اجرا کنیم.

2. با استفاده از متغیر محیط DOCKER_HOST برای تنظیم موتور هدف

در طول این تمرین ما از سناریوی متغیر محیط DOCKER_HOST برای هدف قرار دادن میزبان داکر استفاده می کنیم ، اما با عبور از -H می توان همین کار را انجام داد – میزبان استدلال به docker-compose.

$ cd hello-docker
$ DOCKER_HOST = "ssh: // user @ remotehost" docker-compose up – d

این رویکرد بهتری نسبت به استقرار دستی است. اما به دلیل نیاز به تنظیم / صادرات نقطه انتهایی میزبان از راه دور در مورد هر تغییر برنامه یا تغییر میزبان ، بسیار آزار دهنده می شود.

3. با استفاده از زمینه های docker

$ زمینه docker ls
NAME DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
… [
remote ssh: // user @ remotemachine [196590] 19659022] [ docker-compose از راه دور ontecontext up -d

Docker Contextts یک روش کارآمد برای جابجایی خودکار بین اهداف استقرار مختلف است. ما در بخش های بعدی به بحث خواهیم پرداخت تا بدانیم كه چگونه می توان از محتوا Docker با كامپوزیت برای سهولت / سرعت بخشیدن به كار استفاده كرد.

Docker Contextts

Docker Context مکانیزمی برای ارائه نام به نقاط انتهایی Docker API و ذخیره آن است. این اطلاعات برای استفاده بعدی همانطور که در اسناد نشان داده شده است ، Docker Contextts با Docker CLI به راحتی قابل مدیریت است.

برای هدف قرار دادن میزبان از راه دور

زمینه را ایجاد کنید و از آن استفاده کنید

برای دسترسی آسانتر به مشتری از راه دور با مشتری Docker ، ابتدا زمینه ای را ایجاد می کنیم که مسیر اتصال به آن را حفظ کند.

$ docker زمینه ایجاد زمینه از راه دور ockdocker "host = ssh: // user @ remotemachine"
Remote
زمینه موفقیت آمیز ایجاد زمینه "از راه دور"

$ زمینه docker ls
نام DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
پیش فرض * فعلی DOCKER_HOST … یونیکس: ///var/run/docker.sock swarm
remote ssh: // user @ remotemachine

اطمینان حاصل کنید که تأیید اعتبار کلیدی را برای SSH تنظیم کرده ایم به میزبان از راه دور پس از اتمام این کار ، می توانیم ظروف را روی میزبان از راه دور با گذراندن نام متن به عنوان استدلال لیست کنیم.

$ docker remotecontext remote ps
Container ID IMAGE Commands CreatedED NAMES STATUS

ما می توانیم همچنین زمینه "از راه دور" را به عنوان زمینه پیش فرض دستورات docker ما تنظیم کنید. با این کار به ما امکان می دهد تمام دستورات docker را مستقیماً روی میزبان از راه دور اجرا کنیم بدون اینکه آرگومان متن را برای هر فرمان بگذرانیم.

$ زمینه docker از راه دور
از راه دور
استفاده کرد. 19659022] $ زمینه docker ls
NAME DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
پیش فرض فعلی DOCKER_HOST … یونیکس: ///var/run/docker.sock swarm [194598 Remotemachine

استفاده از متن docker-compose

آخرین نسخه نوشتن docker اکنون از استفاده از زمینه هایی برای دسترسی به نقاط انتهایی Docker API پشتیبانی می کند. این بدان معنی است که می توانیم docker-compose را اجرا کنیم و زمینه "از راه دور" را مشخص کنیم تا به طور خودکار میزبان از راه دور را هدف قرار دهیم اگر هیچ زمینه ای مشخص نشده باشد ، docker-compose از متن فعلی درست مانند Docker CLI استفاده خواهد کرد.

$ docker-آهنگسازی ontecontext از راه دور از راه دور
/tmp/_MEI4HXgSK/paramiko/client.py : 837: UserWarning: کلید میزبان ناشناس ssh-ed25519 برای 10.0.0.52: b'047f5071513cab8c00d7944ef9d5d1fd '
ایجاد شبکه "hello-docker_default" با درایور پیش فرض
سلام-docker_docker_back … انجام شده است

$ docker ontecontext از راه دور ps
دستورالعمل شناسه کانتینر ایجاد شده
STATUS PORTS NAMES
ddbb380635aa سلام-docker_frontend "nginx -45" ] تا 23 ثانیه بالاتر 0.0.0.0:8080->80/tcp سلام-docker_web_1
872c6a55316f سلام-docker_backend "/ usr / بن / محلی / تماس …" 25 ثانیه قبل
تا 24 ثانیه سلام docker_backend_1

نوشتن استقرار در سراسر اهداف متعدد

بسیاری از توسعه دهندگان ممکن است چند محیط های توسعه / آزمون که آنها نیاز به سوئیچ بین. با استفاده از زمینه هایی که در docker-compose ساخته شده است ، استقرار در همه این موارد اکنون بی دردسر است.

ما اکنون سعی می کنیم تعویض متن بین چندین موتور داکر را انجام دهیم. برای این منظور ، ما سه هدف را تعریف می کنیم:

  • Localhost که یک موتور محلی Docker را اجرا می کند
  • یک میزبان از راه دور از طریق ssh
  • یک کانتینر Docker-in-Docker که به عنوان میزبان از راه دور دیگری عمل می کند

در جدول زیر نقشه نگاری را نشان می دهد. زمینه برای اهداف داکر:

محیط هدف نام متن انتهای API
localhost پیش فرض یونیکس: ///var/run/docker.sock
میزبان از راه دور [19659076] remote ssh: // user @ remotemachine
docker-in-docker dind tcp: //127.0.0.1: 2375

برای اجرای یک ظرف Docker-in-Docker با بندر 2375 نقشه برداری شده در محلی اجرا شود:

$ docker run ‐‐rm -d -p "2375: 2375" ‐‐privileged -e "DOCKER_TLS_CERTDIR =" ‐‐name dind docker: 19.03.3-dind
ed92bc991bade2d41cab08b8c070c70b788d8ecf9dffc89e8c6379187aed9cdc
$ docker ps [19459018IMAGE] Command Created STATUS
نام های PORTS
ed92bc991bad docker: 19.03.3-dind "dockerd-entrypoint … …" 17 seconds ago Up 15 seconds
0.0.0.0:2375->2375/tcp، 2376 / tcp dind

یک بستر جدید ایجاد کنید تا ظرف به راحتی هدف قرار گیرد:

$ زمینه docker ایجاد dind ‐‐docker "host = tcp: //127.0.0.1: 2375" efdefault- swarm-orcstrator swarm
dind
با موفقیت ایجاد زمینه "dind"

$ زمینه docker ls
نام DESCRIPTION
DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
پیش فرض * فعلی DOCKER_HOST … یونیکس: ///var/run/docker.sock swarm
remote ssh: // user @ devmachine swarm

اکنون می توانیم هرکدام از محیط را هدف قرار دهیم برنامه نوشتن را از localhost استفاده کنید.

$ docker use use dind
dind
زمینه فعلی اکنون "dind"

$ docker-compose updd
شبکه "hello-docker_default" با درایور پیش فرض
ایجاد hello-docker_backend_1 … انجام شده
ایجاد hello-docker_frontend_1 … انجام داد

$ docker ps
CONTAINER IMAGE PROVIN PRINCANC نام ها
95 1784341a0d hello-docker_frontend "nginx -g" Daemon of … "34 seconds ago
Up 33 seconds 0.0.0.0:8080->80/tcp hello-docker_frontend_1
872c6a55316f سلام-docker_backend" / usr / محلی بازگشت … "35 ثانیه پیش
تا 33 ثانیه سلام-docker_backend_1

$ docker defaultcontext پیش فرض ps
شناسه CONTAINER شناسه فرمان ایجاد شده
STATUS PORTS نامها
d92b "dockerd-pointpoint … 3-dind". 28 دقیقه پیش
تا 28 دقیقه 0.0.0.0:2375->2375/tcp ، 2376 / tcp dind

$ docker-kompose remotecontext از راه دور از راه دور
/ tmp / _MEIb4sAgX / paramiko /client.py:837: UserWarning: کلید میزبان ناشناس ssh-ed25519 برای 10.0.0.52: b'047f5071513cab8c00d7944ef9d5d1fd '
ایجاد شبکه "hello-docker_default" با درایور پیش فرض [194501018] سلام … ایجاد silo-docker_frontend_1 … انجام شده است

$ docker زمینه استفاده پیش فرض
پیش فرض
زمینه فعلی اکنون "پیش فرض" است

$ docker-kompose up -d
ایجاد شبکه " hello-docker_default "با درایور پیش فرض
ایجاد hello-docker_backend_1 … انجام شده
ایجاد hello-docker_frontend_1 … انجام شده

$ docker ps
CONTAINER ID IMAGE COMMANDREED [ 8] نامهای وضعیت STATUS
077b5e5b72e8 hello-docker_frontend "nginx -g" Daemon of … "حدود یک دقیقه پیش
تا حدود یک دقیقه 0.0.0.0:8080->80/tcp سلام-docker_frontend_1 [194590188] hele-docker_frontend_1
-docker_backend "/ usr / local / bin / back …" حدود یک دقیقه پیش
حدوداً یک دقیقه سلام-docker_backend_1
ed92bc991bad docker: 19.03.3-dind "dockerd-pointpoint …" 34 دقیقه پیش
تا 34 دقیقه 0.0.0.0:2375->2375/tcp ، 2376 / tcp dind

برنامه نمونه در حال حاضر در هر سه میزبان اجرا می شود. پرس و جو از سرویس جلوه دادن در مورد هرکدام از این میزبان ها همانطور که در شکل زیر نشان داده شده است باید همان پیام را برگرداند:

$ localhost curl: 8080

$ docker exec -it dind sh -c "wget ​​- O – localhost: 8080 ”

$ curl 10.0.0.52:8080 موفق19659002پولز19459008 250Output:ociation19659105] ##.
## ## ## ==
## ## ## ## ## ===
/ "" "" "" "" "" "" "" "" " ___ / ===
{/ === –
______ O __ /
__ /
____ _______ /
سلام از داکر!

خلاصه

اعزام به میزبان های از راه دور با نوشتن docker یک کار معمول بوده است برای مدتی

پشتیبانی Docker Contextts در docker-compose یک رویکرد آسان و زیبا را برای هدف قرار دادن میزبان های مختلف از راه دور ارائه می دهد. اکنون امکان جابجایی بین محیط های مختلف آسان بوده و خطرات استقرار در آنها کاهش می یابد. ما نمونه ای از چگونگی دستیابی به میزبان های docker از راه دور را از طریق پروتکل های SSH و TCP نشان داده ایم که امیدواریم تعداد زیادی از موارد استفاده این موارد را پوشش دهد.