Kumaha kuring ngajalankeun Docker di jero Docker sareng naon anu kaluar tina éta

Halo sadayana! Dina dirina artikel saméméhna, Kuring jangji baris ngobrol ngeunaan ngajalankeun Docker di Docker jeung aspék praktis tina ngagunakeun palajaran ieu. Geus waktuna nedunan jangji. Devopser anu berpengalaman sigana bakal ngabantah yén anu peryogi Docker di jero Docker ngan saukur neraskeun soket daemon Docker tina host kana wadahna sareng ieu bakal cekap dina 99% kasus. Tapi ulah buru-buru ngalungkeun cookies ka kuring, sabab urang bakal ngobrol ngeunaan ngajalankeun Docker di jero Docker. Solusi ieu ngagaduhan seueur aplikasi anu mungkin sareng tulisan ieu ngeunaan salah sahijina, janten calik sareng lempengkeun panangan anjeun di payuneun anjeun.

Kumaha kuring ngajalankeun Docker di jero Docker sareng naon anu kaluar tina éta

ngamimitian

Éta sadayana dimimitian dina malem Séptémber hujan nalika kuring ngabersihkeun mesin anu kuring nyéwa $ 5 pa Digital Ocean, anu beku kusabab kanyataan yén Docker ngeusi sadaya 24 gigabyte ruang disk anu aya sareng gambar sareng wadahna. Ironisna nyaéta yén sadaya gambar sareng peti ieu samentara sareng diperyogikeun ngan ukur pikeun nguji kinerja aplikasi kuring unggal waktos versi anyar perpustakaan atanapi kerangka dileupaskeun. Kuring diusahakeun nulis Aksara cangkang jeung nyetel jadwal cron pikeun ngabersihan up sampah, tapi teu mantuan: unggal waktos eta inevitably réngsé kalawan spasi disk server kuring keur didahar nepi na server nongkrong (paling pangalusna). Dina sababaraha waktos, kuring mendakan tulisan ngeunaan cara ngajalankeun Jenkins dina wadah sareng kumaha éta tiasa nyiptakeun sareng ngahapus pipa ngawangun ngaliwatan stop kontak daemon docker anu diteruskeun kana éta. Kuring resep ideu, tapi kuring mutuskeun pikeun langkung jauh sareng nyobian ékspérimén sareng langsung ngajalankeun Docker di jero Docker. Dina waktos éta, sigana kuring mangrupikeun solusi anu logis pikeun ngaunduh gambar Docker sareng nyiptakeun wadah pikeun sadaya aplikasi anu kuring peryogikeun pikeun nguji dina wadah anu sanés (hayu urang nyauran wadahna pementasan). Ide éta pikeun ngamimitian wadah pementasan kalayan bandéra -rm, anu otomatis ngahapus sadayana wadah sareng sadaya eusina nalika dieureunkeun. Kuring tinkered sareng gambar Docker ti Docker sorangan (https://hub.docker.com/_/docker), tapi tétéla teuing pajeujeut sareng kuring henteu pernah junun ngerjakeun cara anu kuring peryogikeun sareng kuring hoyong angkat nyalira.

Prakték. Congcot

Kuring nyetél pikeun nyieun wadahna jalan cara kuring diperlukeun tur nuluykeun percobaan kuring, nu nyababkeun myriad kuncup. Hasil tina panyiksaan diri kuring nyaéta algoritma ieu:

  1. Urang ngajalankeun wadahna Docker dina modeu interaktif.

    docker run --privileged -it docker:18.09.6

    Nengetan versi wadahna, lengkah ka katuhu atawa kenca sarta DinD anjeun robah jadi waluh a. Nyatana, hal-hal sering rusak nalika versi énggal dileupaskeun.
    Urang kudu geuwat meunang kana cangkang.

  2. Kami nyobian milarian wadah mana anu ngajalankeun (Jawaban: teu aya), tapi hayu urang jalankeun paréntahna:

    docker ps

    Anjeun bakal rada reuwas, tapi tétéla yén daemon Docker henteu jalan:

    error during connect: Get http://docker:2375/v1.40/containers/json: dial tcp: lookup docker on 
    192.168.65.1:53: no such host

  3. Hayu urang ngajalankeun sorangan:

    dockerd &

    kejutan pikaresepeun sejen:

    failed to start daemon: Error initializing network controller: error obtaining controller instance: failed 
    to create NAT chain DOCKER: Iptables not found

  4. Pasang iptables sareng bungkusan bash (sadayana langkung pikaresepeun pikeun damel di bash tibatan di sh):

    apk add --no-cache iptables bash

  5. Hayu urang ngajalankeun bash. Tungtungna urang balik deui dina cangkang biasa

  6. Hayu urang nyobian ngajalankeun Docker deui:

    dockerd &

    Urang kedah ningali lambaran panjang log ditungtungan ku:

    INFO[2019-11-25T19:51:19.448080400Z] Daemon has completed initialization          
    INFO[2019-11-25T19:51:19.474439300Z] API listen on /var/run/docker.sock

  7. Pencét Lebetkeun. Urang balik deui ka bash.

Ti ayeuna, urang tiasa nyobian ngaluncurkeun wadah sanés dina wadah Docker kami, tapi kumaha upami urang badé ngaluncurkeun wadah Docker sanés dina wadah Docker kami atanapi aya anu salah sareng wadahna nabrak? Mimitian deui.

Wadah DinD sorangan sareng percobaan énggal

Kumaha kuring ngajalankeun Docker di jero Docker sareng naon anu kaluar tina éta
Pikeun ngahindarkeun léngkah-léngkah di luhur deui-deui, kuring nyiptakeun wadah DinD kuring sorangan:

https://github.com/alekslitvinenk/dind

Solusi DinD anu tiasa dianggo masihan kuring kamampuan pikeun ngajalankeun Docker di jero Docker sacara rekursif sareng ngalakukeun percobaan anu langkung petualang.
Abdi badé ngajelaskeun hiji percobaan (suksés) sapertos ngajalankeun MySQL sareng Nodejs ayeuna.
Anu paling teu sabar tiasa ningali kumaha éta di dieu

Janten, hayu urang ngamimitian:

  1. Urang ngajalankeun DinD dina modeu interaktif. Dina vérsi DinD ieu, urang kedah peta sacara manual sadaya palabuhan anu tiasa dianggo ku wadah anak urang (Kuring parantos ngerjakeun ieu)

    docker run --privileged -it 
    -p 80:8080 
    -p 3306:3306 
    alekslitvinenk/dind

    Urang asup kana bash, ti mana urang tiasa langsung ngamimitian ngaluncurkeun wadah anak.

  2. Ngajalankeun MySQL:

    docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql

  3. Urang nyambung ka database dina cara nu sarua salaku urang bakal nyambung ka eta sacara lokal. Hayu urang pastikeun sagalana jalan.

  4. Ngajalankeun wadah kadua:

    docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-server

    Punten dicatet yén pemetaan port bakal persis 8080:8080, Kusabab urang parantos dipetakeun port 80 tina host kana wadah indungna ka port 8080.

  5. Urang buka localhost dina browser, pastikeun yén server ngabales "Halo Dunya!"

Bisi kuring, ékspérimén sareng wadah Docker nested tétéla rada positip sareng kuring bakal terus ngembangkeun proyék sareng dianggo pikeun pementasan. Sigana mah ieu téh leyuran leuwih lightweight ti Kubernetes na Jenkins X. Tapi ieu téh pendapat subjektif kuring.

Jigana éta sadayana pikeun artikel dinten ieu. Dina artikel salajengna kuring bakal ngajelaskeun sacara langkung rinci ékspérimén sareng ngajalankeun Docker sacara rekursif di Docker sareng dipasang diréktori jero kana wadah anu disarangkeun.

PS Upami anjeun mendakan proyék ieu mangpaat, punten masihan béntang dina GitHub, garpu sareng béjakeun ka babaturan anjeun.

Édit1 Kasalahan dilereskeun, fokus kana 2 video

sumber: www.habr.com

Tambahkeun komentar