Carpe Diem

備忘録

Docker

Go + Alpine でtzdataはapk addしなくていい

背景 Alpine Linuxはデフォルトではtzdataが含まれていないため、以下のような package main import ( "log" "time" ) func main() { loc, err := time.LoadLocation("Asia/Tokyo") if err != nil { log.Fatal("%w", err) } log.Printf("%v", loc) } time.Lo…

Bazelを使ってみる その3(docker imageのビルド)

概要 Bazel解説第3弾です。 Bazelを使ってみる その1(Goのビルド) - Carpe Diem Bazelを使ってみる その2(protobufのビルド) - Carpe Diem 今回はDocker imageをビルドしてみます。 環境 Bazel v4.2.2 前提知識 通常docker imageを作成する際はDocker…

CPU CFS Quotaを制限している場合の適切なGOMAXPROCS

概要 christina04.hatenablog.com 以前上の記事でGOMAXPROCSはCPU数程度が適切に動くという話をしました。 これはこれで正しいのですが、一方でdockerのようにcgroupsでCPU Quotaを制限するケースではこれに当てはまらなくなります。 Kubernetesでいうと Kub…

Network Namespaceから外部ネットワークへアクセスする

概要 前回の christina04.hatenablog.com の続きで、今回はネットワーク名前空間から外部ネットワークへアクセスできるようにします。 環境 Ubuntu 18.04 以下の状態からスタートします。

cgoを使わないGoのクロスコンパイル時に -installsuffix cgo が不要になってた

背景 以前Docker multi stage buildなどビルド環境と実行環境が異なる(クロスコンパイル)時に、単純にGOOSやGOARCHをセットするだけではなく $ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ go build -a -installsuffix cgo -o main main.go のように CGO_ENA…

Kubernetesのresource requests, limits

概要 Kubernetesには以下のフィールドでCPUやメモリを制限することが可能です。 spec.containers[].resources.limits.cpu spec.containers[].resources.limits.memory spec.containers[].resources.requests.cpu spec.containers[].resources.requests.memor…

Dockerの--initフラグについて

概要 dockerのコンテナは指定したコマンドがPID 1で起動されており、使い方によってはシグナルハンドリングできないことがありますよ、という話です。 それによってプロセスをGracefulに終了できなかったりリソースリークが起きたりするので注意する必要があ…

Dockerの埋め込みDNSサーバを使ったService Discovery

概要 Docker 1.10からユーザ定義のネットワークでは内蔵DNSサーバが用意され、名前解決ができるということを以下の記事で述べました。 christina04.hatenablog.com 実は単に名前解決ができるだけでなく、Service Discoveryとしても機能するのでその紹介をし…

ホストからdockerのvolumeにファイルをコピー

概要 ホストからコンテナ(が持ってるvolume)へのコピーはdocker cpでできます。 しかしホストから直接volume単体にコピーするのはどうすれば良いのだろう?と思って調べたところ地味にサポートされていなかったのでメモとして残します。 環境 Docker v18.03.…

TerraformでECSのawsvpcモードを使って各コンテナにPrivate IPを振る

概要 これまでは1インスタンス上に複数のコンテナを使うときは動的ポートマッピングのような方法で対応する必要がありました。 christina04.hatenablog.com しかしawsvpcモードが使えるようになったことでコンテナ毎にPrivateIPを振れるようになり、ポート…

AWSのCost Explorerをスクレイピングして毎日の利用料金をslackへ通知

概要 使っていないインスタンスが起動しっぱなしだったせいで、AWSの利用料がいつの間にか大きくなっていたことがきっかけです。 一方毎日CostExplorerを見に行くのも手間が多いので、slackに通知するようにしたいと思い作ってみました。 また環境構築が面倒…

Scratch imageでtime: missing Location

概要 以前以下の記事でscratch imageの作成方法を紹介しました。 christina04.hatenablog.com しかしGoのコードによっては以下のpanicが起きることがあります。 panic: time: missing Location in call to Time.In 今回はその対応方法です。 環境 golang 1.8…

ScratchイメージでGoアプリの超軽量イメージをビルド

概要 Alpineベースのイメージが軽量イメージとして認知されていますが、Goの場合は単一バイナリで動くのでイメージ内にgolangが入っている必要はありません。 なので最も軽量と言われているScratch imageを利用することで、dockerイメージを軽量化することが…

Docker Imageのバージョン管理について

概要 development, staging, productionといった環境に分けてdocker imageを利用する場合のバージョン管理について考えてみました。 環境 AWS ECS AWS ECR Docker 17.03.1 要件 今回対応する時に考慮した要件は以下。 gitのtagと連動 ただし最新のimageのTAG…

docker-compose で Kibana 5.x を使う

概要 Kibanaを5.xにメジャーアップデートする際、Elastic社公式のdocker imageも用意されたのでdocker-composeでまとめて作ることにしました。 その際調べたこと、ハマったことをまとめます。 環境 docker 17.03.1-ce docker-compose 1.11.2 Elasticsearch 5…

Dockerでのdev, stg, prd環境分け

概要 dockerを扱う上で、dev, stg, prdの環境で動かす際の分け方について考えてみました。 環境 docker 1.13.1 docker-compose 1.11.1 主な分け方 思いつくのは以下の5つです。 imageを分ける 全環境のconfigファイルをimageに保持させ、RUN時に指定 templa…

ECSでコンテナのrolling update

概要 ECS上のコンテナをダウンタイム0で更新(デプロイ)する方法をまとめます。 環境 ALB ECS container agent 1.13.0 Docker 1.11.2 Amazon ECS Container Agent Versions - Amazon EC2 Container Service ポイント minimumHealthyPercentとmaximumPercen…

dockerのlog周りの対応

概要 dockerを本番運用する際にログの扱いに悩んだので情報をまとめてみました。 環境 docker v1.12.1 コンテナのログは何処に渡すべきか 主に以下の3通りになると思います。 コンテナ内に保存 volume先に指定してに永続保存 log driverを使って転送

remote_addrとかx-forwarded-forとかx-real-ipとか

背景 ECSでNginxのコンテナをプロキシとして立てたところ、APIサーバのアクセスログのクライアントIPがNginxのコンテナIPになっていたのでその修正をしたのがきっかけです。 環境 Nginx 1.10.2 Docker1.12.1 構成 Client -> ELB -> Nginx -> API という構成…

DockerでMongoDBのレプリカセットを構築

概要 MongoDBのレプリカセットを組んで検証する必要があったのでdockerを使って構築することにしてみました。 環境 Docker 1.12.0 Mongo 3.2.9 構成 コンテナ名 役割 ホスト側ポート mongo1 Primary 30001 mongo2 Secondary 30002 arbiter Arbiter。データは…

Dockerのネットワークを理解するために覚えたことまとめ

概要 Dockerのネットワーク周りを勉強していると、 docker0 仮想ブリッジ VXLAN link機能 など色んな要素が出てくるのですが、ちゃんと理解していないとすぐ忘れるため一度しっかり学んでみました。 今回はその時に疑問に思ったことをまとめてみました。 環…

Kubernetes を使ったマルチホスト環境でのクラスタを構築する【flannel編】

概要 前回の続きです。 今回はflannelを導入してマルチホストでのコンテナ間通信を可能にします。 マスターの設定 flannelの設定 flannel.json ネットワークの設定ファイルを用意します。適当にflannel.jsonとします。 { "Network": "10.20.0.0/16", "Subnet…

Kubernetes を使ったマルチホスト環境でのクラスタを構築する【基礎編】

概要 Kubernetesを使ってDockerのクラスタを構築します。Kubernetesを使うことで以下のような本番環境を意識したシステムを構築できます。 フェイルオーバー(コンテナが異常終了したことを検知し再起動させる) スケーリング(起動しているコンテナの数を自…

マルチホスト上にoverlay networkを構築してコンテナ間で疎通

概要 以前はWeaveというツールを使ってマルチホストをまたいだコンテナ間通信ができるように構築しました。 Docker 1.9.0からVXLANという仮想でL2ネットワークを構築する技術を用い、Docker自身がマルチホストネットワークに対応したので、今度はそちらで構…

Docker Swarmでマルチホストでクラスタ構築

概要 Docker Swarmでマルチホスト環境上でDockerクラスタを構築します。 事前知識 Docker Swarmで構築する際は以下の3つの要素が必要になります。 ノードを管理するDiscovery backend Swarm Manager(マスターノード) Swarm Node(子ノード) 環境 Docker …

Docker Compose で複数コンテナを管理

概要 単一ホスト上で複数のコンテナを起動するときはDocker Composeを使うのが便利です。 今回はその基本的な使い方を紹介します。 環境 Docker 1.11.0 Docker-Compose 1.7.0 Docker Composeのメリット 複数コンテナを管理しやすい スケールアウト、スケール…

Docker Data Volume を理解する

概要 Dockerのデータをホスト側に保持する方法をまとめます。 Dockerはコンテナの破棄・再作成が簡単にできる一方、そのままだとデータも消えてしまいます。 今回のDate Volumeはデータの永続性を保つべきシーンで必要となる知識です。 環境 OSX 10.11.4 doc…

UnionFS で Docker のレイヤ構造を理解する

概要 DockerではAUFSという技術が使われています。 こちらはUnionFS(ディレクトリを重ね合わせることができる)の一つで、親のファイルシステムをすべてReadOnlyにして、その上に書き込み可能なレイヤを重ねて1つのファイルシステムのように扱います。 Docker…

最新のDockerをインストール

概要 Ubuntuのデフォルトパッケージはすでにsupportされていないため、公式サイトのやり方で最新のものを入れます。 環境 Vagrant 1.8.0 Ubuntu 14.04 Docker 1.9.1 事前準備 Ubuntu Wily 15.10 Ubuntu Vivid 15.04 Ubuntu Trusty 14.04 (LTS) 上記のバージ…

MacでDocker環境構築

概要 MacでDocker環境を構築するためのメモです。 バージョンアップでも同じ進め方になります。 最新版は以下で確認します。 Release notes 環境 Docker 1.9.1 Docker Machine 0.5.1 Docker Compose 1.5.0 Docker Toolboxのインストール WindowsとMacにはAll…