Teknologian jakaminen

Käytä docker buildx:tä luodaksesi monialustaisia ​​kuvia

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

buildx on Dockerin virallisesti tarjoama rakennustyökalu. Se voi auttaa käyttäjiä rakentamaan Docker-kuvia nopeasti ja tehokkaasti, ja se tukee useiden alustojen rakentamista. Builxx:n avulla käyttäjät voivat rakentaa kuvia useille arkkitehtuureille, kuten x86- ja arm-arkkitehtuureille, yhdellä komennolla ilman, että sinun tarvitsee käyttää useita koontikomentoja manuaalisesti. Lisäksi buildx tukee myös Dockerfilen monivaiheista rakentamista ja välimuistia, mikä voi parantaa kuvan rakentamisen tehokkuutta ja nopeutta huomattavasti.

buildx on CLI-laajennus, joka hallitsee Dockerin koontiversioita.

BuildKit on Dockerin virallisesti tarjoama korkean suorituskyvyn rakennusmoottori, jota voidaan käyttää korvaamaan Dockerin alkuperäinen rakennusmoottori. Alkuperäiseen moottoriin verrattuna BuildKitillä on nopeampi rakennusnopeus, suurempi yhdensuuntaisuus, vähemmän resurssien käyttöä ja parempi tietoturva.

Builx:n asentamista ja käyttöä varten Docker Enginen versionumero on suurempi tai yhtä suuri kuin 19.03.

Platform-kuvanrakennusstrategia

Rakennusohjelma tukee erilaisia ​​strategioita eri alustojen välisten kuvien rakentamiseen.

QEMU-emulointituen käyttö ytimessä

Jos käytät Docker Desktopia, QEMU on jo tuettu ja se on yksinkertaisin strategia useiden alustojen välisten kuvien luomiseen. Se ei vaadi muutoksia alkuperäiseen Dockerfile-tiedostoon. BuildKit toteuttaa useiden alustojen välisen ohjelman suorittamisen Linux-ytimen toiminnon binfmt_misc kautta.

toimintaperiaate:

QEMU on prosessorisimulaattori, joka voi simuloida erilaisia ​​CPU-arkkitehtuureja. Voimme ymmärtää sen toisena virtuaalikoneena. Buildx:ssä QEMU:a käytetään binäärien suorittamiseen ei-natiiviarkkitehtuureille rakennusprosessin aikana. Esimerkiksi kun rakennetaan ARM-kuva x86-isäntään, QEMU voi simuloida ARM-ympäristöä ja suorittaa ARM-binaaritiedostoja.

binfmt_misc on Linux-ytimen moduuli, jonka avulla käyttäjät voivat rekisteröidä suoritettavia tiedostomuotoja ja vastaavia tulkkeja.Kun ydin kohtaa tuntemattoman muotoisen suoritettavan tiedoston, binfmt_misc:tä käytetään tiedostomuotoon liittyvän tulkin etsimiseen (tässä tapauksessa QEMU) ja tiedoston suorittamiseen. . Tämä toiminto on poistettu käytöstä rk3568-alustalla.

QEMU:n ja binfmt_misc:n yhdistelmä mahdollistaa useiden alustojen rakentamisen buildx:n kautta. Tämän ansiosta voimme rakentaa Docker-kuvia yhdelle arkkitehtuurille muiden arkkitehtuurien isännällä ilman, että meidän tarvitsee omistaa todellista kohdelaitteistoa.

Vaikka Docker Desktop on valmiiksi määritetty tukemaan binfmt_misc-tukea muille alustoille, Dockerin muissa versioissa saatat joutua käyttämään tonistiigi/binfmt-kuvaa avataksesi etuoikeutetun säilön tukea varten.

docker run --privileged --rm tonistiigi/binfmt --install all

Tämän komennon suorittaminen asentaa eri arkkitehtuurien tulkkausohjelmia, eli qemu-simulaattorin /usr/bin-hakemistoon:

Binfmt_misc-moduuli on ladattu käännöspalvelimellemme:

Docker buildx:n rooli qemulla

Docker Buildx on Dockerin kokeellinen ominaisuus, joka laajentaa Dockerin rakennusominaisuuksia, mukaan lukien usean solmun, qemun jne. käyttö. QEMU on avoimen lähdekoodin virtuaalikoneen ohjelmisto, joka voi simuloida erilaisia ​​suorittimia ja muita laitteita, jolloin voimme rakentaa kuvan toisesta käyttöjärjestelmästä yhdellä käyttöjärjestelmällä.

Docker Buildxin qemu-toiminnon käyttäminen voi auttaa meitä rakentamaan Docker-kuvia useille erilaisille arkkitehtuureille (kuten ARM, MIPS jne.).

Seuraavassa on yksinkertainen esimerkki, joka näyttää, kuinka Docker Buildx:n ja QEMU:n avulla luodaan Docker-kuva ARM-arkkitehtuurille:

  1. # 创建一个新的 buildkit 实例
  2. docker buildx create --name mybuilder --use
  3. # 启动 buildkit 实例
  4. docker buildx start mybuilder
  5. # 启用 QEMU 驱动支持
  6. docker buildx inspect --bootstrap
  7. # 构建一个面向 ARM 架构的 Docker 镜像
  8. docker buildx build --platform linux/arm/v7 -t myimage:latest .

Tässä esimerkissä--platform Parametri määrittää, että kohdealusta, jolle haluamme rakentaa, on ARM v7. Tällä tavalla Docker käyttää QEMUa simuloidakseen ARM-ympäristöä ja rakentaakseen Docker-kuvan ARM-arkkitehtuurille x86-arkkitehtuurikoneelle.

binfmt_misc tiedostojärjestelmä

binfmt-misc on Linux-ytimen tarjoama toiminto, joka on samanlainen kuin tiedostojen yhdistäminen Windowsissa, mutta tehokkaampi kuin tiedostojen yhdistäminen on se, että se ei voi arvioida vain tiedoston päätteen perusteella, vaan se voidaan myös avata eri ohjelmilla tiedostoon perustuen. sisältö (Magic Bytes) . Tyypillinen käyttöskenaario on käyttää qemua binääritiedostojen suorittamiseen muilla arkkitehtuurialustoilla.

Ota binfmt-misc käyttöön

Ota se väliaikaisesti käyttöön käyttämällä seuraavaa komentoa:

$ sudo mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc

Tämä menetelmä ei kelpaa uudelleenkäynnistyksen jälkeen. Jos haluat sen olevan voimassa pitkään, voit lisätä rivin /etc/fstab-tiedostoon:

none  /proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0

Voit tarkistaa avauksen onnistumisen seuraavalla komennolla:

  1. $ mount | grep binfmt_misc
  2. binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
  3. $ ls -l /proc/sys/fs/binfmt_misc
  4. 总用量 0
  5. --w------- 1 root root 0 25 22:55 register
  6. -rw-r--r-- 1 root root 0 25 22:55 status

Valmistele ensin ohjelma arm64-arkkitehtuurilla Sen suorittamisen jälkeen ilmoitetaan virhe:

bash: ./go-test:无法执行二进制文件: 可执行文件格式错误

Suoritetaan nyt komento apt install qemu-user-binfmt ja suorita sitten yllä oleva arm64-ohjelma ja todetaan, että se voi toimia normaalisti. Kun olet asentanut qemu-user-binfmt, hakemistoon /proc/sys/fs/binfmt_misc luodaan useita tiedostoja, mukaan lukien yksi qemu-aarch64. Katsotaanpa tämän tiedoston sisältöä:

  1. root@ubuntu:/proc/sys/fs/binfmt_misc# cat qemu-aarch64
  2. enabled
  3. interpreter /usr/bin/qemu-aarch64-static
  4. flags: OC
  5. offset 0
  6. magic 7f454c460201010000000000000000000200b700
  7. mask ffffffffffffff00fffffffffffffffffeffffff
  8. root@ubuntu:/proc/sys/fs/binfmt_misc#

Tämä tiedosto kuvaa sääntötiedoston:

Ensimmäinen rivi käytössä osoittaa, että sääntö on käytössä.

Toisen rivin tulkki /usr/bin/qemu-aarch64-static osoittaa, että tiedostoa /usr/bin/qemu-aarch64-static käytetään binaaritiedoston suorittamiseen;

Kolmas rivi: OC edustaa käynnissä olevaa lippua, tarkka merkitys on seuraava:

P: tarkoittaa konserv-argv:tä, mikä tarkoittaa, että simulaattoria kutsuttaessa alkuperäiset parametrit (argv) säilyvät.Tämä on hyödyllistä tilanteissa, joissa hiljaisten ohjelmien on tiedettävä oma nimensä (eli argv[0]) ajon aikana

O: edustaa siirtymää, mikä tarkoittaa, että ennen simulaattorin käynnistämistä on binääritiedostosta luettava offset, jota käytetään simulaattorin parametrina.

C: tarkoittaa valtuustietoja, mikä tarkoittaa, että emulaattori toimii samalla käyttäjätunnuksella ja ryhmätunnuksella, joita alkuperäinen ohjelma käyttää, mikä auttaa varmistamaan, että emulaattori toimii samoilla käyttöoikeuksilla kuin alkuperäinen ohjelma.

Neljäs rivi: offset 0 tarkoittaa tiedoston lukemisen aloittamista 0-arvosta;

Viides rivi: magic 7f454c460201010000000000000000000200b700 edustaa sovitettavaa modulotavua;

Arm64-arkkitehtuurin ELF-tiedoston otsikon taikakenttä on seuraava, mikä tarkoittaa, että binfmt_misc-tiedostojärjestelmä voi ELF-tiedoston taikakentän perusteella määrittää, millä arkkitehtuurisimulaattorilla tiedosto suoritetaan:

Alla on kaksi erilaista arkkitehtuuria

Mips-arkkitehtuuri: 7f454c46010201000000000000000000000020008
arm64-arkkitehtuuri: 7f454c4602010100000000000000000000200b700

Rivi 6: maski ffffffffffffff00ffffffffffffffffffffff edustaa tavumaskia, jota voidaan käyttää sivuuttamaan joitain tiedoston merkityksettömiä tavuja.

Käynnissä arm64-arkkitehtuuri Docker-kuva x86_64-järjestelmässä

Nyt käytämmesatamatyöläinenKomento suorittaa arm64-kuvan:

  1. $ docker run -it arm64v8/ubuntu bash
  2. Unable to find image 'arm64v8/ubuntu:latest' locally
  3. latest: Pulling from arm64v8/ubuntu
  4. 005e2837585d: Pull complete
  5. Digest: sha256:ba545858745d6307f0d1064d0d25365466f78d02f866cf4efb9e1326a4c196ca
  6. Status: Downloaded newer image for arm64v8/ubuntu:latest
  7. standard_init_linux.go:207: exec user process caused "no such file or directory"

Pienen tutkimisen jälkeen huomasin, että niin kauan kuin suoritan seuraavan komennon:apt install qemu-user-staticja käynnistä sitten DockerkonttiSe on normaalia.

Monivaiheisen ristiinmuodostuksen käyttäminen Dockerfilessä

Ristikääntämisen monimutkaisuus ei piile Dockerissa, vaan itse ohjelmassa. Esimerkiksi Go-ohjelmat voidaan helposti ristiin kääntää Sinun tarvitsee suorittaa vain kaksi ympäristömuuttujaa GOOS ja GOARCH, kun rakennat ohjelmaa go buildilla.

Luo rakentaja

Jotta voimme käyttää buildx:ää useiden alustojen välisen kuvan rakentamiseen, meidän on ensin luotava rakentaja, joka voidaan kääntää rakentajaksi.

Käytä docker buildx ls -komentoa nähdäksesi rakentajaluettelo:

  1. root@ubuntu:/proc# docker buildx ls
  2. NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
  3. mybuild * docker-container
  4. mybuild0 unix:///var/run/docker.sock running linux/arm64*, linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/amd64/v4, linux/386
  5. vigilant_hugle docker-container
  6. vigilant_hugle0 unix:///var/run/docker.sock stopped
  7. default docker
  8. default default running linux/amd64, linux/386

*-merkki ilmaisee tällä hetkellä käytössä olevan rakennusohjelman. DRIVER/ENDPOINT toisessa sarakkeessa osoittaa käytetyn ohjaimen. buildx tukee seuraavia ohjaimia:

  • Docker: Käytä BuildKit-kirjastoa, joka on yhdistetty Docker-daemoniin, joka on oletusarvoinen BuildKit Dockerin asentamisen jälkeen.
  • docker-container: Luo uusi omistettu BuildKit-säilö Dockerin avulla.
  • kubernetes: Luo BuildKit Pod kubernetes-klusteriin.
  • kaukosäädin: Yhdistä suoraan manuaalisesti hallittavaan BuildKit-demoniin.

Koska Docker-ohjainta käyttävä oletusmuodostin ei tue useiden alustojen välisten kuvien rakentamista yhdellä komennolla (oletusmuodostimen --platform-parametri hyväksyy vain yhden arvon), meidän on luotava uusi rakennustyökalu docker-container-ajuria käyttäen. .

Komennon syntaksi on seuraava:

$ docker buildx create --name=<builder-name> --driver=<driver> --driver-opt=<driver-options>

Parametrien merkitys on seuraava;

--name: Muodostettava nimi, pakollinen.

--driver: Builder-ohjain, oletus on docker-container.

--driver-opt: ajurin valinnat Esimerkiksi vaihtoehto --driver-opt=image=moby/buildkit:v0.11.3 voi asentaa BuildKitin määritetyn version. Oletusarvo on moby/buildkit.

Voimme luoda uuden rakentajan seuraavalla komennolla:

  1. $ docker buildx create --name mybuilder
  2. mybuilder

Tarkista rakentajaluettelo uudelleen:

  1. $ docker buildx ls
  2. NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
  3. mybuilder * docker-container
  4. mybuilder0 unix:///var/run/docker.sock inactive
  5. default docker
  6. default default running 20.10.21 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
  7. desktop-linux docker
  8. desktop-linux desktop-linux running 20.10.21 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

Voit huomata, että valittu koontiversio on vaihdettu Mybuilderiin. Jos sitä ei ole valittu, sinun on vaihdettava rakentaja manuaalisesti Docker buildx use mybuilder -komennolla.

Aloita rakentaja

Äskettäin luotu mybuilder on tällä hetkellä passiivinen ja se on käynnistettävä ennen kuin sitä voidaan käyttää.

  1. $ docker buildx inspect --bootstrap mybuilder
  2. [+] Building 16.8s (1/1) FINISHED
  3. => [internal] booting buildkit 16.8s
  4. => => pulling image moby/buildkit:buildx-stable-1 16.1s
  5. => => creating container buildx_buildkit_mybuilder0 0.7s
  6. Name: mybuilder
  7. Driver: docker-container
  8. Nodes:
  9. Name: mybuilder0
  10. Endpoint: unix:///var/run/docker.sock
  11. Status: running
  12. Buildkit: v0.9.3
  13. Platforms: linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6

Tarkastus-alikomentoa käytetään koontitilan tarkistamiseen. Käytä parametria --bootstrap käynnistääksesi rakennustyökalun. Mybuilder-tila on muuttunut.

  1. $ docker buildx ls
  2. NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
  3. mybuilder * docker-container
  4. mybuilder0 unix:///var/run/docker.sock running v0.9.3 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
  5. default docker
  6. default default running 20.10.21 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
  7. desktop-linux docker
  8. desktop-linux desktop-linux running 20.10.21 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

PLATFORMS-sarakkeessa näkyvä arvo

linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6 ovat nykyisen rakentajan tukemia. alustat.

Käytä nyt docker ps -komentoa nähdäksesi, että mybuilder builderiä vastaava BuildKit-säilö on käynnistetty.

  1. $ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. b8887f253d41 moby/buildkit:buildx-stable-1 "buildkitd" 4 minutes ago Up 4 minutes buildx_buildkit_mybuilder0

Tätä säilöä käytetään auttamaan meitä luomaan monialustaisia ​​kuvia. Älä poista sitä manuaalisesti.

Käytä Builderiä luodaksesi monialustaisia ​​kuvia

$ docker buildx build --platform linux/arm64,linux/amd64 -t jianghushinian/hello-go .

Docker buildx -koontiversion syntaksi on sama kuin Docker buildin. Parametri --platform ilmaisee kuvan rakentamisen kohdealustan, -t ilmaisee kuvan tunnisteen, ilmaisee, että konteksti on nykyinen hakemisto。 

Ainoa asia, joka ei toimi, on tuki --platform-parametrille Docker buildin --platform-parametri tukee vain yhden alustan tiedon välittämistä, kuten --platform linux/arm64, mikä tarkoittaa, että yksi alustakuva voi toimia. rakennetaan kerrallaan.

Docker buildx build:n käyttäminen kuvan rakentamiseen tukee useiden alustatietojen lähettämistä samanaikaisesti englanninkielisillä pilkuilla erotettuina, mikä toteuttaa toiminnon useiden alustojen välisten kuvien rakentamiseen vain yhdellä komennolla.

Yllä olevan komennon suorittamisen jälkeen saamme varoituksen:

WARNING: No output specified with docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load

Tämä varoitus muistuttaa, että emme ole määrittäneet tulostetta Docker-säilön ohjaimelle. Luodut tulokset säilytetään vain koontivälimuistissa. Käytä --pushia työntämään kuva Docker Hub -etävarastoon ja käytä komentoa --load tallentaaksesi kuvan paikallisesti.

Tämä johtuu siitä, että äskettäin luotu mybuilder käynnistää säilön BuildKitin suorittamiseksi. Se ei voi tulostaa rakennettua alustan välistä kuvaa suoraan paikalliselle koneelle tai siirtää sitä kaukosäätimeen.

Voimme yrittää määrittää --load tallentaaksesi kuvan paikalliseen isäntään.

  1. $ docker buildx build --platform linux/arm64,linux/amd64 -t jianghushinian/hello-go . --load
  2. [+] Building 0.0s (0/0)
  3. ERROR: docker exporter does not currently support exporting manifest lists

Tuloksena on virheloki. Näyttää siltä, ​​että se ei tue useiden alustojen viemistä paikalliseen kone.

Sitten voimme vain työntää cross-platform-kuvan etävarastoon --push-parametrin kautta. Ennen kuin teet tämän, sinun on kuitenkin varmistettava, että käytät Docker-kirjautumista kirjautumisen suorittamiseen.

$ docker buildx build --platform linux/arm64,linux/amd64 -t jianghushinian/hello-go . --push

Kirjaudu nyt sisään Docker Hubiin ja näet työnnetyn monialustaisen kuvan.

Voimme myös käyttää imagetools-työkalua monikäyttöisen kuvan luettelotietojen tarkistamiseen. Tätä komentoa voidaan käyttää vain kuvatietojen hankkimiseen varastossa, eikä paikallisia kuvia voi tarkastella.

  1. $ docker buildx imagetools inspect jianghushinian/hello-go
  2. Name: docker.io/jianghushinian/hello-go:latest
  3. MediaType: application/vnd.docker.distribution.manifest.list.v2+json
  4. Digest: sha256:51199dadfc55b23d6ab5cfd2d67e38edd513a707273b1b8b554985ff562104db
  5. Manifests:
  6. Name: docker.io/jianghushinian/hello-go:latest@sha256:8032a6f23f3bd3050852e77b6e4a4d0a705dfd710fb63bc4c3dc9d5e01c8e9a6
  7. MediaType: application/vnd.docker.distribution.manifest.v2+json
  8. Platform: linux/arm64
  9. Name: docker.io/jianghushinian/hello-go:latest@sha256:fd46fd7e93c7deef5ad8496c2cf08c266bac42ac77f1e444e83d4f79d58441ba
  10. MediaType: application/vnd.docker.distribution.manifest.v2+json
  11. Platform: linux/amd64

 

Kuten näet, tämä cross-platform-kuva sisältää kuvia kahdesta kohdealustasta, nimittäin linux/arm64 ja linux/amd64.