Docker ajoyib. Bu menga judayam yoqdi. Aslida, men uni juda yaxshi ko'raman. Biroq, har qanday kunda 10 dan ortiq mikro xizmatlar bilan ishlaganingizda, mahalliy darajada rivojlanayotganda ushbu xizmatlar o'rtasidagi munosabatlarni boshqarish qiyin bo'lishi mumkin.

Ishlab chiqarishda bizda boshqa xizmatlarni qidirish uchun foydalanishimiz mumkin bo'lgan ishonchli domenlar mavjud. Mahalliy ravishda ishlaganimizda, biz Docker Compose muhit o'zgaruvchilari va mahalliy quvurlarga erishish uchun murakkab bog'lanishning xohishiga ko'ramiz. Bu chalkash va murakkab sozlashlarga olib keladi, ular uchun1)o‘rganish va2)yangi ishlab chiquvchilarga o‘rgatish uchun uzoq vaqt ketadi.

Men bilishimcha, bu Docker bilan mahalliy ishlashda boshqa Docker konteynerlari ma'lumotlarini qidirishning eng mashhur usuli.

To'g'ri bilaman, rost bo'lish uchun juda yaxshi ko'rinadi... Xo'sh, unday emas. DNSDock bu xususiyatga imkon beruvchi vositadir. DNSDock "Docker konteynerlari uchun DNS xizmati kashfiyoti" deb nomlanadi, men uni "Mahalliy Docker rivojlanishining qon tomiri" deb atashni afzal ko'raman.

"Docker konteynerlari uchun DNS xizmati kashfiyoti"

Ajoyib aytasiz. Bu aniq nimani anglatadi? Xo'sh, bu sizning docker-compose faylingizdagi konteynerlaringizga domenlarni belgilashingiz mumkinligini anglatadi va bu domenlar nafaqat VM-da ishlaydigan boshqa konteynerlar uchun, balki xost kompyuteringizda ham mavjud bo'ladi.

Redis konteyneringizda qanday ma'lumotlar borligi qiziqmi? Uni to'g'ridan-to'g'ri RDM ga ulang. PostgresSQL yoki MySQL ishlayapsizmi? Shunchaki Sequel Pro-ni yoqing va ko'ring. Bularning barchasi DNSDocksiz juda mumkin bo'lsa-da, bu juda kattaPITA!

Shirin, endi nima va nima uchun ekanligini bilganimizdan so'ng, keling, qanday qilib buni ko'rib chiqaylik.

Yakuniy maqsad

Birinchidan, kutilgan natijani ko'rib chiqaylik. Aslida biz shunday ko'rinadigan Docker Compose faylini xohlaymiz ...

# myapp/docker-compose.yml
redis:
  image: redis
  environment:
    DNSDOCK_NAME: cache
    DNSDOCK_IMAGE: myapp
  ports:
    - "6379":"6379"
mysql:
 image: mysql:5.6
  environment:
    DNSDOCK_NAME: db
    DNSDOCK_IMAGE: myapp
    MYSQL_ALLOW_EMPTY_PASSWORD: yes
  ports:
    — “3306:3306”
myapp:
  build: .
  environment:
    REDIS_HOST: cache.myapp.docker
    DB_HOST: db.myapp.docker
    HOST: api.myapp.docker
    DNSDOCK_NAME: api
    DNSDOCK_IMAGE: myapp
  ports:
    - "8001":"8001"

Ushbu konfiguratsiya bilan Redis mijozimiz cache.myapp.docker sahifasida, mysql db-ni db.myapp.dockerda va API-ni da topish mumkin. >api.myapp.docker.

Endi bizning xost-mashinadan biz Redis yoki MySQL ma'lumotlarimizni osongina ko'rishimiz, shuningdek normallashtirilgan domen nomimiz orqali api-ga kirishimiz mumkin. Agar siz boshqa yuqori yoki quyi oqim xizmatlarini ishga tushirishingiz kerak bo'lsa, shunchaki API_HOST env varini o'rnatishingiz mumkin va murakkab Docker havolalari va tashqi_linklarni qo'shishga hojat qolmaydi.

Bu bizga Docker VM ichida ham, tashqarisida ham barcha muhitlarda foydalanishimiz mumkin bo'lgan toza non-docker muhit o'zgaruvchilariga ega bo'lish imkonini beradi. Siz sinov va ishlab chiqarish muhitida REDIS_HOST va MYSQL_HOSTni osongina almashtirishingiz mumkin, u qayerda ishga tushirilayotganini ilovangiz bilishi shart emas.

Tasavvur qilganingizdek, bu murakkab tizimlarni aylantirish va atrof-muhit tengligiga erishish uchun zarur bo'lgan harakatlar miqdorini sezilarli darajada kamaytiradi.

U erga qanday borish mumkin

Xo'sh, bu sehrni amalga oshirish uchun nima qilish kerak? DNSDock-ni sozlash biroz murakkab, lekin uni to'g'ri sozlaganingizdan so'ng, do'stlaringiz va hamkasblaringiz sizni mahalliy ishlab chiqish jarayonini soddalashtirgan qahramon sifatida maqtashadi.

Avval DNSDock qanday ishlashini ko'rib chiqaylik. (Yon eslatma: DNSDock repo-dagi hujjatlar men taqdim eta oladigan narsalardan ancha yaxshi. Ushbu maqolaning maqsadi ko'rsatmalardan ko'ra ko'proq xabardorlikdir.)

Dnsdock Docker Remote API-ga ulanadi va ishlaydigan konteynerlarning yangilangan ro'yxatini saqlaydi. Agar DNS so'rovi ba'zi konteynerlarga mos kelsa, ularning mahalliy IP manzillari qaytariladi.

Bu to'g'ridan-to'g'ri hujjatlardan. Biroq, bu VM va xost mashinasida ishlashi uchun (bu maqola Mac OSXga qaratilgan) biz biroz ish qilishimiz kerak.

Mashinangizni sozlash

Biz qilishimiz kerak bo'lgan birinchi narsa - asosiy kompyuterimiz uchun ba'zi marshrutlash ma'lumotlarini sozlash. Quyidagi buyruqlar bajarilsa, xost kompyuteringiz har qanday so‘rovlarni *.dockerga Docker mashinasi IP manziliga yo‘naltirish uchun sozlanadi.

# make resolver dir if it does not exist
sudo mkdir -p /etc/resolver >/dev/null 2>&1
# add nameserver entry for *.docker URLs
echo "nameserver 172.17.42.1" | sudo tee /etc/resolver/docker > /dev/null
# remove previous entry for DNSDocker in case docker machine has different IP
sudo route -n delete -net 172.17.0.0
# add entries to route table for docker machine
sudo route -n add 172.17.0.0/16 $(docker-machine ip <your_docker_machine_name>)
sudo route -n add 172.17.42.1/32 $(docker-machine ip <your_docker_machine_name>)

DNSDock konteynerini sozlash

Endi xost mashinasi *.docker domenlarini Docker mashinasiga yoʻnaltirishni qoʻllab-quvvatlash uchun sozlangan boʻlsa, biz DNSDock konteynerini ishga tushirishimiz va yangi funksiyamizni sinab koʻrishimiz mumkin.

Birinchidan, konteynerni ishga tushiraylik ...

docker run -d -v /var/run/docker.sock:/var/run/docker.sock --name dnsdock -p 172.17.42.1:53:53/udp tonistiigi/dnsdock

Keling, bu aslida nima qilayotganini ko'rib chiqaylik ...

# share the docker socket to the container so that DNSDock can connect to the Docker API
-v /var/run/docker.sock:/var/run/docker.sock
# expose the default DNS port to the docker0 bridge interface
-p 172.17.42.1:53:53/udp

Va shunday! docker-compose yordamida ba'zi xizmatlarni aylantiring va siz ularga xost kompyuteringizdan va VM ichidan qaysi domen nomini belgilaganingizdan qat'i nazar, ularga kirish imkoniyatiga ega bo'lishingiz kerak!

Umid qilamanki, bu menga olib kelganidek, sizga ham shunchalik quvonch va samara beradi!

MASLAHATLAR!

Shuningdek, siz konteynerlaringiz uchun taxalluslarni oʻrnatishga imkon beruvchi docker yaratish faylida DNSDOCK_ALIAS env var parametrini ham oʻrnatishingiz mumkin…

myapp:
  build: .
  environment:
    REDIS_HOST: cache.myapp.docker
    DB_HOST: db.myapp.docker
    HOST: api.myapp.docker
    DNSDOCK_NAME: api
    DNSDOCK_IMAGE: myapp
    DNSDOCK_ALIAS: api.v2.myapp.docker, m.api.myapp.docker, etc...
  ports:
    - "8001":"8001"

Agar birlamchi .dockerni afzal koʻrmasangiz, kerakli domen qoʻshimchasini ham oʻrnatishingiz mumkin…

docker run -d -v /var/run/docker.sock:/var/run/docker.sock --name dnsdock -domain container -p 172.17.42.1:53:53/udp tonistiigi/dnsdock

Agar biz myapp misolimizdan foydalansak, endi api.myapp.container kabi URL manzillarini olamiz. (Agar siz domenni oʻzgartirsangiz, ushbu domen qoʻshimchasi uchun nom serverini yaratishingiz kerak boʻladi, yuqoridagi marshrutlash maʼlumotlariga qarang.)

Minnatdorchilik

Men @steven.merrill ga https://www.phase2technology.com/ dan katta hayqiriq aytmoqchiman. Mening postimni ko'rib chiqqaningiz va texnik masalalarda yordam berganingiz uchun tashakkur!

Yana bir eslatma

Faza 2 texnologiyasi menga bularning barchasini bajaradigan ba'zi ajoyib docker vositalariga beta-versiyadan foydalanish imkonini berdi! Rasmiy ravishda ochiq manba nashr etilgandan so'ng yangilanish uchun bu yerni tekshiring!