docker

root権限を持たないユーザで 80番ポートを開放しようとすると選ぶと怒られる理由

Dockerfileをベストプラクティスに沿って作るとそうなりがち docs.docker.com 理由 0〜1023 までのポートは well known port と呼ばれ、開放にroot権限が必要なため そういう場合に8080を選ぶ理由 8080は、非rootユーザがwebサーバを立てる時の使うポートと…

ローカルでAWS Lambda ランタイムと(ほぼ)同様の環境でserverlessを動作確認する方法

先に結論 --docker オプションを使う serverless invoke local --docker --function hoge 解説 --docker オプションを使うと、AWS lambda が公式に配信しているDocker でシミュレートされた Lambda 環境 ( lambci/lambda ) をつかって、serverlessをローカル…

dockle の警告 `CIS-DI-0008` をどのように処理すべきか考えた

dockle って? コンテナイメージのセキュリティチェックツールです。ビルドしたImageを通すと、セキュリティ的に問題がある部分を指摘してくれます github.com 警告 CIS-DI-0008 って? これですね CIS-DI-0008: Remove setuid and setgid permissions in the …

パイプを使うと最後の処理が成功すると戻り値は0になるので、`pipefail` を使ったほうが事故が少なくなるよというお話

コード例 #!/bin/bash -e exit 1 | echo "a" echo "b" 実行結果 a b -e オプションで、行単位で失敗したら終了するはずなのに、 echo "b" が実行されてしまっている...! 解説 pipeを使う場合、一番右側の処理の戻り値で行の成功/失敗が判定される exit 1 | e…

UnicornとNginxの接続方法は、UNIXドメインソケットとリバースプロキシの2つの方法がある

UNIXドメインソケット 単一マシン上の高効率なプロセス間通信に用いられる機能・インターフェースの一種である UNIXドメインソケット - Wikipedia ファイルシステムを介してプロセス同士の通信を行う仕組み 普通にリバースプロキシするより高速だが、ファイ…

docker-slim で 任意のバージョンの ImageMagickを入れる方法

レガシーなシステムをDocker化するときにたまによくやるのでメモ 多分、Aplineでもおんなじだと思う 方法 コードからmakeする ARG IMAGE_MAGICK_VERSION=${好きなパージョン} RUN wget --quiet https://imagemagick.org/download/releases/ImageMagick-$IMAG…

Rails on Docker での PostgreSQL & unicorn が動く開発環境のメモ

自己学習のためにざっくり作ってみた 個人的には、本番はUnicornでも開発環境ではPumaでいいんじゃないかな...って思っている SQLは合わせたほうが良いと思うけど 前準備 experimentalな機能を使うので環境変数を予め設定しておく .envrc export DOCKER_BUIL…

Alpine Linux で欲しいファイルを持っているパッケージを探す方法

Alpine Linux で gem install をした時のエラーメッセージから不足しているファイルを見つけて、それを持っているパッケージを探す方法を記します native extension を持っている gem install を失敗する時、こんなエラーメッセージが出ます 例: gem pg イン…

Alpine Linuxのパッケージ管理システムapkについて理解を深める

APK is 何? apk = Alpine Linux package management Alpine Linuxのパッケージ管理システム パッケージって何? Linuxが採用しているアプリケーションの配布形態。アプリケーションによっては、正常に動作させるためには「ライブラリ」と呼ぶ別のプログラムを…

Dockerfileで apt-get upgrade するのは止めたほうが良いとベストプラクティスに書かれていた

Dockerfile best practices によると... Avoid RUN apt-get upgrade and dist-upgrade, as many of the “essential” packages from the parent images cannot upgrade inside an unprivileged container. If a package contained in the parent image is out…

dockerfileのARGの使い方おぼえがき

ARGとは build実行時にオプション --build-arg として渡せる可変の値 使いみち 環境毎になにかを変える時に使用する ビルド時に使用する環境変数 entrypoint.sh COPY元 など Dockerfileでの定義方法 ARG hoge="fuga" 解説 上記は、変数 hoge を時環境変数 HO…

dockerfileのCMDやENTRYPOINTでの変数展開について

前提 dockerfileの CMD や ENTRYPOINT でコマンドを定義する方法は2通りある exec form(推奨) : JSONの配列で定義する ["echo", "${HOGE}"] 直接コマンドが実行される(変数展開が行われない ) shell form : 文字列で定義する "echo ${HOGE}" /bin/sh -c を介…

CMDとENTRYPOINT違いおぼえがき

きちんと理解したら全然意味が異なるものだった ENTRYPOINTとは docker run 時に実行されるコマンドを定義 例 apacheを起動させるコンテナ(オフィシャルじゃないけど、説明に最適だった) の ENTRYPOINT ENTRYPOINT ["/usr/sbin/apache2"] docker run した場…

Docker For Mac の docker build で `no space left on device` した時の対策

原因 docker for mac は仮想マシン上で動いているが、その仮想ディスクの容量がいっぱいになると発生 対策 prefarence で仮想ディスクのサイズを変更する 画面上、変更できないように見えるけど、クリックしたら普通に変更できた ただし、今回はディスクリセ…

Dockerのディスクioがボトルネックになる原因とその対策

dockerのディスクのマウント先がループバックデバイスだと遅い ループバックデバイスは特定のファイルをデバイスとみなす仕組み ゲストOSでの書き込み→ループバックデバイスへの書き込み→物理ディスクへの書き込みとなるので、直接物理ディスクに書くより遅…

Dockerのmemory, memory-reservation について

memory : ハードリミット。ここで指定した以上のメモリを使用しようとするとOOMKillerが走る memory-reservation : ソフトリミット。ホストのメモリに余裕がある時は、これ以上使用することもある 余裕が無いときは、memory_reservation 内にとどめる ECSで…

AWS Fargateでtaskを動作させるのに必要な設定の記録

task definition 以下はインスタンスのcpuinfoとメモリの情報をチェックするtaskのdefinition { "family": "get_fargate_cpu_info", "containerDefinitions": [ { "name": "get_fargate_cpu_info", "image": "#{AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws…

AWSのドキュメントに添ってECSを動かしてみた

この2つを参考に、ECSを動かしてみた docs.aws.amazon.com docs.aws.amazon.com ゴール Hello World と書かれた index.html を持つ apache サーバをECSで動作させて、ブラウザで動作確認する 手順 DockerImageを作る DockerImageをECRに登録する Task Defini…

Amazon ECS 覚え書き

Amazon ECSとは Amazon Elastic Container Service (Amazon ECS) Docker コンテナをサポートする拡張性とパフォーマンスに優れたコンテナオーケストレーションサービスです (最近乱立しがちでK8Sに統合が向かうのかどうなのかわからない)コンテナオーケスト…

ruby:2.3.6-alpine3.4 に、postgresql-dev 9.6系をインストールしようとしたら conflict が発生した話

現象 alpine3.4 だと、postgresql-dev や client が 9.5 系 9.6 系を入れたくて、Dockerfileで /etc/apk/repositories を加工して、alpine3.5系のパッケージを入れるように変更した /etc/apk/repositories http://dl-cdn.alpinelinux.org/alpine/v3.5/main h…

springの子プロセスが `BUNDLE_APP_CONFIG` を無視するバグがある

現象 docker-compose を使って、run bin/rake を実行した時に、Could not find rake が発生 (ローカル環境では正しく動作する) $ docker-compose exec web bundle exec bin/rake --version Could not find rake-12.3.0 in any of the sources Run `bundle in…

docker-compose でよく使いそうなコマンドおぼえがき

ビルド docker-compose build # Build or rebuild services 起動、停止 docker-compose up # Create and start containers docker-compose up -d # デーモンとして起動 docker-compose start # サービスを開始 docker-compose restart # サービスを再起動 do…

Alpine Linuxで素のRailsが動くDockerfile を作った

DBはPostgreSQLで、他に余分なgemを入れなければこんな感じ FROM ruby:2.5.0-alpine COPY Gemfile* /myapp/ WORKDIR /myapp RUN apk upgrade --no-cache && \ apk add --update --no-cache \ postgresql-client \ nodejs \ tzdata && \ apk add --update --n…

危機感にかられて今更Dockerを学び直す人の記録(data volumeをおさらい)

今日やること data volume を理解し直す data volume ってなんぞ ボリュームは、Dockerコンテナによって生成され、使用されるデータを永続化するための推奨されるメカニズムです docs.docker.com Dockerコンテナの中のファイル/ディレクトリは、コンテナが終…

危機感にかられて今更Dockerを学び直す人の記録(Railsを動かしてみる編)

これまでのあらすじ 概要を理解して、Imageを作ってコンテナをうごかしてみました kasei-san.hatenablog.com kasei-san.hatenablog.com 今日やること 公式のクイックスタートガイドを元に、ローカルのDockerでRailsを動かしてみる docs.docker.com ワーキン…

危機感にかられて今更Dockerを学び直す人の記録(実践編)

Dockerエンジンのインストール OSXならばこちら → Docker Store 無償のcommunity editionと、有償のenterprise edition がある Dockerは、linuxカーネルの機能を使うので、macやwindowsで動かす場合は、小さいLinuxVMを内部で動かしているらしい 色々動かし…

危機感にかられて今更Dockerを学び直す人の記録(概要編)

そもそもDockerって何なの? コンテナ型仮想化サービス 仮想化サービスとは? サーバ上に仮想的なサーバを作り出す技術 ホスト型、ハイパーバイザ型、コンテナ型がある ホスト型 汎用的なOS上に専用のアプリを入れて、仮想化を実現 VirtualBox, VMware とか ハ…