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.
Rakennusohjelma tukee erilaisia strategioita eri alustojen välisten kuvien rakentamiseen.
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 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:
- # 创建一个新的 buildkit 实例
- docker buildx create --name mybuilder --use
-
- # 启动 buildkit 实例
- docker buildx start mybuilder
-
- # 启用 QEMU 驱动支持
- docker buildx inspect --bootstrap
-
- # 构建一个面向 ARM 架构的 Docker 镜像
- 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 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:
- $ mount | grep binfmt_misc
- binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
- $ ls -l /proc/sys/fs/binfmt_misc
- 总用量 0
- --w------- 1 root root 0 2月 5 22:55 register
- -rw-r--r-- 1 root root 0 2月 5 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öä:
- root@ubuntu:/proc/sys/fs/binfmt_misc# cat qemu-aarch64
- enabled
- interpreter /usr/bin/qemu-aarch64-static
- flags: OC
- offset 0
- magic 7f454c460201010000000000000000000200b700
- mask ffffffffffffff00fffffffffffffffffeffffff
- 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.
Nyt käytämmesatamatyöläinenKomento suorittaa arm64-kuvan:
- $ docker run -it arm64v8/ubuntu bash
- Unable to find image 'arm64v8/ubuntu:latest' locally
- latest: Pulling from arm64v8/ubuntu
- 005e2837585d: Pull complete
- Digest: sha256:ba545858745d6307f0d1064d0d25365466f78d02f866cf4efb9e1326a4c196ca
- Status: Downloaded newer image for arm64v8/ubuntu:latest
- 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-static
ja käynnistä sitten DockerkonttiSe on normaalia.
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.
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:
- root@ubuntu:/proc# docker buildx ls
- NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
- mybuild * docker-container
- mybuild0 unix:///var/run/docker.sock running linux/arm64*, linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/amd64/v4, linux/386
- vigilant_hugle docker-container
- vigilant_hugle0 unix:///var/run/docker.sock stopped
- default docker
- 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:
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:
- $ docker buildx create --name mybuilder
- mybuilder
Tarkista rakentajaluettelo uudelleen:
- $ docker buildx ls
- NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
- mybuilder * docker-container
- mybuilder0 unix:///var/run/docker.sock inactive
- default docker
- default default running 20.10.21 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
- desktop-linux docker
- 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.
Äskettäin luotu mybuilder on tällä hetkellä passiivinen ja se on käynnistettävä ennen kuin sitä voidaan käyttää.
- $ docker buildx inspect --bootstrap mybuilder
- [+] Building 16.8s (1/1) FINISHED
- => [internal] booting buildkit 16.8s
- => => pulling image moby/buildkit:buildx-stable-1 16.1s
- => => creating container buildx_buildkit_mybuilder0 0.7s
- Name: mybuilder
- Driver: docker-container
-
- Nodes:
- Name: mybuilder0
- Endpoint: unix:///var/run/docker.sock
- Status: running
- Buildkit: v0.9.3
- 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.
- $ docker buildx ls
- NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
- mybuilder * docker-container
- 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
- default docker
- default default running 20.10.21 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
- desktop-linux docker
- 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.
- $ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 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.
$ 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.
- $ docker buildx build --platform linux/arm64,linux/amd64 -t jianghushinian/hello-go . --load
- [+] Building 0.0s (0/0)
- 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.
- $ docker buildx imagetools inspect jianghushinian/hello-go
- Name: docker.io/jianghushinian/hello-go:latest
- MediaType: application/vnd.docker.distribution.manifest.list.v2+json
- Digest: sha256:51199dadfc55b23d6ab5cfd2d67e38edd513a707273b1b8b554985ff562104db
-
- Manifests:
- Name: docker.io/jianghushinian/hello-go:latest@sha256:8032a6f23f3bd3050852e77b6e4a4d0a705dfd710fb63bc4c3dc9d5e01c8e9a6
- MediaType: application/vnd.docker.distribution.manifest.v2+json
- Platform: linux/arm64
-
- Name: docker.io/jianghushinian/hello-go:latest@sha256:fd46fd7e93c7deef5ad8496c2cf08c266bac42ac77f1e444e83d4f79d58441ba
- MediaType: application/vnd.docker.distribution.manifest.v2+json
- Platform: linux/amd64
Kuten näet, tämä cross-platform-kuva sisältää kuvia kahdesta kohdealustasta, nimittäin linux/arm64 ja linux/amd64.