⚙️
別のマシンでDocker imageをつくってもっていったり、配布したいけど、Repoを用意したり課金したくない場合
それ、大体 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はでかい
gzip
と gzip -d
でもつかってくれ
Enjoy!!
ちゃんと稼いでいるみなさんはお金を払うなどして、所定のDocker対応のリポジトリをつかいましょう。
Discussion