⚙️

別のマシンでDocker imageをつくってもっていったり、配布したいけど、Repoを用意したり課金したくない場合

2024/06/07に公開

それ、大体 docker だけでできるよ!

とりあえずDockerfileをつくる

適当にディレクトリつくって、vi Dockerfile とかする

FROM hello-world

buildする

今回名前は my-hello-world でタグは v1 、ここはなんでもよい

$ docker build -t my-hello-world:v1 .

buildしたものをうごかしてみる

$ docker run --rm my-hello-world:v1

Hello from Docker!
(以下略)

イメージをtarにdumpする

$ docker save -o my-hello-world-docker-image.tar my-hello-world:v1

すると、 my-hello-world-docker-image.tar というファイルができます。これがファイルになったイメージです。

テストのために一旦imagesからさっきつくったイメージを削除

$ docker rmi my-hello-world:v1

うごかなくなったことを確認

$ docker run --rm my-hello-world:v1
Unable to find image 'my-hello-world:v1' locally

ファイルからloadして、動く事を確認

$ docker load -i ./my-hello-world-docker-image.tar
Loaded image: my-hello-world:v1
$ docker run --rm my-hello-world:v1

Hello from Docker!
This message shows that your installation appears to be working correctly.
(省略
$ docker images |grep hello
my-hello-world                                               v1                 59379b743747   13 months ago   9.14kB

一旦削除(確認のために)

$ docker rmi my-hello-world:v1

tarをどこかにアップロードする

さっきのTarをどこかにULします。今回面倒なので、 php -Sをつかいます。DLできることを確認します

$ php -S 127.0.0.1:8080
$ curl -v -o /dev/null "http://127.0.0.1:8080/my-hello-world-docker-image.tar"
(省略
< HTTP/1.1 200 OK
< Host: 127.0.0.1:8080
< Date: Fri, 07 Jun 2024 10:20:56 GMT
< Connection: close
< Content-Type: application/x-tar
< Content-Length: 21504
<
{ [21504 bytes data]
100 21504  100 21504    0     0  17.4M      0 --:--:-- --:--:-- --:--:-- 20.5M
* Closing connection

dockerでやれって?

Dockerだけでできてねえじゃんって声がきこえてきた。

$ docker run --rm -v `pwd`:/var/www/html -p 8080:80 php:8.3-apache

(いや、nginxとかでもなんでもいいよそりゃね!)

で、こうやって公開したtarを、リモートからload

curlから標準出力経由で docker load につめこめます。

$ curl -o - "http://127.0.0.1:8080/my-hello-world-docker-image.tar" |docker load
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0[Fri Jun  7 19:21:47 2024] 127.0.0.1:58830 Accepted
[Fri Jun  7 19:21:47 2024] 127.0.0.1:58830 [200]: GET /my-hello-world-docker-image.tar
[Fri Jun  7 19:21:47 2024] 127.0.0.1:58830 Closing
100 21504  100 21504    0     0  25.8M      0 --:--:-- --:--:-- --:--:-- 20.5M
Loaded image: my-hello-world:v1

動く事を確認しましょう!

$ docker run --rm my-hello-world:v1

Hello from Docker!
This message shows that your installation appears to be working correctly.
(省略)

$ docker images |grep hello
my-hello-world                                               v1                 59379b743747   13 months ago   9.14kB

と、いうことで、repoなんかいらんかったんや!!

認証したい

Digest認証でもBasic認証でもかけたらいいんじゃないですかね? curlコマンドにid/pass指定すればよいでしょう。

あとはまあ、tarファイルからロードできるので、プライベートリポジトリにイメージをコミットして(以下略

まあ、そこまでいわんでも、ローカルでビルドしてULしたり、GHAでビルドしてassetとしてULすれば、それでもすむんやで、という話です。

別マシンでつくる時にはArchに注意

あ、別マシンで作成するとき、貴方のマシンがMacで、実行サーバーがAmd64なら注意してね。CPUアーキテクチャがちがうとダメだからね

$ docker build --platform linux/amd64 -t my-image:latest .

とかして platform を指定してビルドしてね。
(上は、Rosetta有効のDocker Desktopを想定しております)

tarはでかい

gzipgzip -d でもつかってくれ

Enjoy!!

ちゃんと稼いでいるみなさんはお金を払うなどして、所定のDocker対応のリポジトリをつかいましょう。

Discussion