20190307のdockerに関する記事は12件です。

pysparkをnotebookで書けるspark clasterをかんたんに構築できるdockerfile作ったったwww

これだとjupyternotebookがspark clasterで立ち上がらないので手直しする必要があります!!!

はじめに

学部3年、現在就活中の大木です。
現在インターン先でレコメンドシステムをsparkをもちいて構築しているのですが、
EMRでsparkを動かしてゴニョゴニョする前にローカルで色々試してみたく、
またどうせならspark clasterを構築してワチャワチャやりたいと思いそのためにdockerfileを作ったので共有します。

こちら
2357gi/apache-spark-cluster: localでspark clasterを立ち上げて遊ぶ用 pyspark用のnotebookもあるヨ!

?使い方

$ git clone https://github.com/2357gi/apache-spark-cluster

git cloneして

make run

docker imageを作成し、composeを構築します。

後、make notebookでjupyter notebookが起動するのでUrlをコピーしてlocalhostで接続すればおkです。

解説

Dockerfile

FROM ubuntu:18.04

ベースとなるイメージはUbuntu18.04を使用しています。
採用理由は個人的に使い慣れているだけです。

python等のイメージを使用しても良かったのですが、理解しながら作業を進めたかったのであえてこちらを使用しました。

# Environment variables
ENV SPARK_VERSION=2.4.0 \
    HADOOP_VERSION=2.7 \
    SPARK_HOME=/spark \
    PATH=$SPARK_HOME/bin:$PATH \
    PYSPARK_PYTHON=/usr/bin/python3 \
    PYSPARK_DRIVER_PYTHON=/usr/local/bin/jupyter \
    PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser --port 8888 --ip=0.0.0.0 --allow-root"

環境変数を設定します。
SPARK_VERSIONやHADOOP_VERSIONを変数として登録し、後のsparkをダウンロードする際のダウンロードUrlに変数を使用しています。
これによりバージョン変更に強くなります。

ミソとなるのがPYSPARK_PYTHON, PYSPARK_DRIVER_PYTHON, PYSPARK_DRIVER_PYTHON_OPTS
このへんで、
ここでpysparkのpythonのバージョン指定や$SPARK_HOME/bin/pysparkが実行されたときにjupyter notebookが立ち上がるようになっています。

notebookの引数諸々はdocker内で起動したjupyter notebookをホスト側から接続するための諸々です。
この辺はすこしセキュアではないのですが、ローカルで遊ぶだけなので許容範囲としました。

# Install required apt package and ensure that the packages were installed
RUN apt-get update && apt-get install -y \
    bc \
    curl \
    default-jdk \
    git \
    python3 \
    python3-pip \
    scala

(説明略)

# Install spark
RUN mkdir spark &&\
    curl -sL \
    http://ftp.tsukuba.wide.ad.jp/software/apache/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz \
    | tar zx -C spark --strip-components 1

sparkを引っ張ってきて展開し、/sparkに設置しています。
近さ的に筑波のミラーから引っ張ってきていますがココらへんはあんまりよくないかもしれません。

展開の方法ですがcurlで引っ張ってきたものをtarにパイプで渡すことによってcurl &&tar &&mv && rmなどといったナンセンスなコマンドの羅列にならないように工夫しましたがココらへんは悔しさが残ります。(詳細

RUN pip3 install jupyter


RUN pip3 install ipyparallel \
    && ipcluster nbextension enable

jupyterをpipでinstallします。
pipでjupyterを導入するとpython3のkernelを読み込んでくれない?ここがすこしうまく行かなかったので
別途ipyparallelをpipでインストールしてnbextensiionをenableします。
これでjupyter notebook上でpython3がつかえるようになります。

Docker-compose

みんな大好きdocker-compose
Docker でお試し Spark クラスタを構築する - Qiita
ほぼほぼこちらを参考にさせていただき、
jupyter notebook用に8888番だけ穴を開けた感じになっております。

Makefile

WORKER=1

build_docker: Dockerfile
    @echo "\n? build 2357gi/apache-spark"
    @docker build ./ -t 2357gi/apache-spark

build_compose:
    @echo "\n?  Pile up containers"
    @docker-compose up -d --scale worker=$(WORKER)

run: docker-compose.yml
    @echo "\n✨ apache-spark cluster setup is start!"
    @make build_docker
    @make build_compose
    @echo "\n? set up is finished! \n you wanna access ⚡spaek shell, hit it! \n$$ make  s-shell"
    @echo "or you wanna start ? pyspark notebook, hit it! \n$$ make notebook"
    @echo "... if u wanna open ? shell? do this. \n$$ make shell"

s-shell:
    @echo "\n⚡ start spark-shell...."
    @docker-compose exec master /spark/bin/spark-shell --master spark://localhost:7077

notebook:
    @echo "\n? start pyspark notebook...."
    @docker-compose exec master /spark/bin/pyspark
    @docker-compose exec

shell:
    @echo "\n? start master shell...."
    @docker-compose exec master /bin/bash

WORKERを変数にすることによって$ make run WORKER=<任意のworker node数を指定できるようにしました。
あとは普通な感じです。

makefileに絵文字を入れると可愛くていいですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerのexposeとpublishの違い

dockerのexposeとpublishの違いを簡単にまとめます。

dockerのexposeとpublishの指定方法は以下の3パターンがあります。

Dockerのexposeとpublishの設定

1.exposeもpublishも指定しない
2.expose
3.publishの指定をする

1.どちらも指定しない

containerの外部からアクセスできない

2.exposeののみ指定

exposeしたportにはdockerの内部のネットワークに公開したportとなる。
他のcontainerからアクセス可能。dockerの外部にはportを公開しない。

3.exposeとpublishを指定する場合

exposeしたportを、publishによってDocker外部のネットワークに公開する。

その為

1.-Pオプション

expose した全てのportを外部公開。

docker run image --expose=3000 --expose=2000 -P

=> port3000と2000をdockerの外部に公開

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

OSS版 Coder (code-server) を Docker、GKE で動かす

Docker

$ docker run -p 8443:8443 -v "${PWD}:/root/project" codercom/code-server code-server --allow-http --no-auth

ブラウザから http://localhost:8443/ または http://<DockerサーバIP>:8443/ にアクセス

Docker Compose

docker-compose.yml 作成

docker-compose.yml
version: '2'
services:
  server:
    container_name: code-server
    image: codercom/code-server
    command: code-server --allow-http --no-auth
    #command: code-server --allow-http    #認証が必要な場合は `--no-auth` を削除
    volumes:
      - "${PWD}:/root/project"
    ports:
      - "8443:8443"
    restart: always

コンテナ起動

$ docker-compose up -d

ブラウザから http://localhost:8443/ または http://<DockerサーバIP>:8443/ にアクセス

GKE(K8s)

Dockerイメージのアップロード

次のシェルスクリプトgcr.sh を実行し GCR(Google Container Registry)へ Docker イメージをアップロード
※環境変数 GCR_HOSTPROJECT の値は、環境に合わせて変更してください。

gcr.sh
#!/bin/bash

GCR_HOST=asia.gcr.io #Container Registryホスト名
PROJECT=my-project   #GCRプロジェクト名

set -eu

docker pull codercom/code-server
docker tag codercom/code-server ${GCR_HOST}/${PROJECT}/code-server
gcloud docker -- push ${GCR_HOST}/${PROJECT}/code-server
docker rmi ${GCR_HOST}/${PROJECT}/code-server
docker rmi codercom/code-server

GKE へデプロイ

次のシェルスクリプト deployment.sh を実行し、GKE 上に Coder 環境をデプロイ
※環境変数 PV_SIZEGCR_HOSTPROJECT の値は、環境に合わせて変更してください。

deployment.sh
#!/bin/bash

PV_SIZE=10Gi         #永続ディスクサイズ
GCR_HOST=asia.gcr.io #Container Registoryホスト名
PROJECT=my-project   #GCRプロジェクト名

set -eu

cat <<EOS | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-code-server
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: ${PV_SIZE}
  storageClassName: regpd
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  generation: 1
  labels:
    run: code-server
  name: code-server
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: code-server
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: code-server
    spec:
      containers:
      - image: ${GCR_HOST}/${PROJECT}/code-server
        imagePullPolicy: Always
        name: code-server
        env:
        - name: TZ
          value: "Asia/Tokyo"
        command: ["code-server"]
        args: ["--allow-http", "--no-auth"]
        ports:
        - containerPort: 8443
          protocol: TCP
        volumeMounts:
        - mountPath: /root/project
          name: pvc-code-server
        securityContext:
          privileged: true
        resources:
          requests:
            cpu: 20m
      volumes:
      - name: pvc-code-server
        persistentVolumeClaim:
          claimName: "pvc-code-server"
---
apiVersion: v1
kind: Service
metadata:
  name: code-server
  namespace: default
  annotations:
    cloud.google.com/load-balancer-type: "internal"
  labels:
    run: code-server
spec:
  type: LoadBalancer
  #loadBalancerIP: [IP-ADDRESS]
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8443
  selector:
    run: code-server
EOS

デプロイ後、Service に割り当てられた EXTERNAL-IP を確認
※今回は EXTERNAL-IP にはセキュリティを考慮してプライベートIP が割り当てられる設定にしています。

$ kubectl get svc hoge-code-server
NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
code-server    LoadBalancer   10.1.XXX.XXX  10.1.XXX.XXX  80:32304/TCP   3m

ブラウザから http://<EXTERNAL-IP>/ へアクセス

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[ dockerコンテナ内 ] にいるか判別してプロンプトをわかりやすくする 【Ubuntu】

結論

.bashrcと.bashrc_profileファイルに以下の分を追加すればOK.

.bashrc
if [ -f /.dockerenv ]; then
    PS1='[${debian_chroot:+($debion_chroot)}\u@\h:\w]\$'
fi
.bash_profile
source ~/.bashrc

補足

dockerコンテナを立ち上げると自動的にコンテナ内に.dockerenvというファイルが作られるので、そのファイルがあるかどうか判別して、あるときだけプロンプトに[ ]を追加.

dockerコンテナ内
[usr@hostname:/]$cd /
[user@hostname:/]$ls -la
total 96
drwxr-xr-x   1 root root 4096 Mar  4 11:08 .
drwxr-xr-x   1 root root 4096 Mar  4 11:08 ..
-rwxr-xr-x   1 root root    0 Mar  4 11:07 .dockerenv
drwxr-xr-x   1 root root 4096 Feb  3 16:39 bazel
drwxr-xr-x   2 root root 4096 Oct 18 21:03 bin
drwxr-xr-x   2 root root 4096 Apr 24  2018 boot
drwxr-xr-x   5 root root  460 Mar  7 07:05 dev
drwxr-xr-x   1 root root 4096 Mar  7 07:05 etc
drwxr-xr-x   1 root root 4096 Mar  4 11:08 home
-rw-r--r--   1 root root  782 Sep 13 18:12 intelpython3-2019.0-047_amd64.deb
drwxr-xr-x   1 root root 4096 Nov 13 00:13 lib
drwxr-xr-x   2 root root 4096 Oct 18 21:02 lib64
drwxr-xr-x   2 root root 4096 Oct 18 21:02 media
drwxr-xr-x   2 root root 4096 Oct 18 21:02 mnt
drwxr-xr-x   1 root root 4096 Feb  3 18:04 opt
dr-xr-xr-x 411 root root    0 Mar  7 07:05 proc
drwx------   1 root root 4096 Feb  3 18:03 root
drwxr-xr-x   1 root root 4096 Mar  4 11:08 run
-rwxr-xr-x   1 root root  733 Jan  9 08:00 run_jupyter.sh
drwxr-xr-x   1 root root 4096 Jan  9 08:00 sbin
drwxr-xr-x   2 root root 4096 Oct 18 21:02 srv
dr-xr-xr-x  13 root root    0 Feb  2 13:11 sys
drwxrwxrwt   1 root root 4096 Mar  4 11:08 tmp
drwxr-xr-x   1 root root 4096 Oct 18 21:02 usr
drwxr-xr-x   1 root root 4096 Feb  3 16:40 var
drwxr-xr-x   1 root root 4096 Feb  3 18:04 workspace

まだ知識ミジンコなので,もっと賢い方法がございましたら、ぜひご指導ください...

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[ dockerコンテナ内 ] にいるかどうかわかりやすくする

.bashrcと.bashrc_profileファイルに以下の分を追加すればOK.

.bashrc
if [ -f /.dockerenv ]; then
    PS1='[${debian_chroot:+($debion_chroot)}\u@\h:\w]\$'
fi
.bash_profile
source ~/.bashrc

dockerコンテナを立ち上げると自動的にコンテナ内に.dockerenvというファイルが作られるので、そのファイルがあるかどうか判別して、あるときだけプロンプトに[ ]を追加.

dockerコンテナ内
[usr@hostname:/]$cd /
[user@hostname:/]$ls -la
total 96
drwxr-xr-x   1 root root 4096 Mar  4 11:08 .
drwxr-xr-x   1 root root 4096 Mar  4 11:08 ..
-rwxr-xr-x   1 root root    0 Mar  4 11:07 .dockerenv
drwxr-xr-x   1 root root 4096 Feb  3 16:39 bazel
drwxr-xr-x   2 root root 4096 Oct 18 21:03 bin
drwxr-xr-x   2 root root 4096 Apr 24  2018 boot
drwxr-xr-x   5 root root  460 Mar  7 07:05 dev
drwxr-xr-x   1 root root 4096 Mar  7 07:05 etc
drwxr-xr-x   1 root root 4096 Mar  4 11:08 home
-rw-r--r--   1 root root  782 Sep 13 18:12 intelpython3-2019.0-047_amd64.deb
drwxr-xr-x   1 root root 4096 Nov 13 00:13 lib
drwxr-xr-x   2 root root 4096 Oct 18 21:02 lib64
drwxr-xr-x   2 root root 4096 Oct 18 21:02 media
drwxr-xr-x   2 root root 4096 Oct 18 21:02 mnt
drwxr-xr-x   1 root root 4096 Feb  3 18:04 opt
dr-xr-xr-x 411 root root    0 Mar  7 07:05 proc
drwx------   1 root root 4096 Feb  3 18:03 root
drwxr-xr-x   1 root root 4096 Mar  4 11:08 run
-rwxr-xr-x   1 root root  733 Jan  9 08:00 run_jupyter.sh
drwxr-xr-x   1 root root 4096 Jan  9 08:00 sbin
drwxr-xr-x   2 root root 4096 Oct 18 21:02 srv
dr-xr-xr-x  13 root root    0 Feb  2 13:11 sys
drwxrwxrwt   1 root root 4096 Mar  4 11:08 tmp
drwxr-xr-x   1 root root 4096 Oct 18 21:02 usr
drwxr-xr-x   1 root root 4096 Feb  3 16:40 var
drwxr-xr-x   1 root root 4096 Feb  3 18:04 workspace

まだにわか以下なのでもっと賢い方法があったら、ぜひご指導ください...

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[ dockerコンテナ内 ] にいるか判別してプロンプトをわかりやすくする

.bashrcと.bashrc_profileファイルに以下の分を追加すればOK.

.bashrc
if [ -f /.dockerenv ]; then
    PS1='[${debian_chroot:+($debion_chroot)}\u@\h:\w]\$'
fi
.bash_profile
source ~/.bashrc

dockerコンテナを立ち上げると自動的にコンテナ内に.dockerenvというファイルが作られるので、そのファイルがあるかどうか判別して、あるときだけプロンプトに[ ]を追加.

dockerコンテナ内
[usr@hostname:/]$cd /
[user@hostname:/]$ls -la
total 96
drwxr-xr-x   1 root root 4096 Mar  4 11:08 .
drwxr-xr-x   1 root root 4096 Mar  4 11:08 ..
-rwxr-xr-x   1 root root    0 Mar  4 11:07 .dockerenv
drwxr-xr-x   1 root root 4096 Feb  3 16:39 bazel
drwxr-xr-x   2 root root 4096 Oct 18 21:03 bin
drwxr-xr-x   2 root root 4096 Apr 24  2018 boot
drwxr-xr-x   5 root root  460 Mar  7 07:05 dev
drwxr-xr-x   1 root root 4096 Mar  7 07:05 etc
drwxr-xr-x   1 root root 4096 Mar  4 11:08 home
-rw-r--r--   1 root root  782 Sep 13 18:12 intelpython3-2019.0-047_amd64.deb
drwxr-xr-x   1 root root 4096 Nov 13 00:13 lib
drwxr-xr-x   2 root root 4096 Oct 18 21:02 lib64
drwxr-xr-x   2 root root 4096 Oct 18 21:02 media
drwxr-xr-x   2 root root 4096 Oct 18 21:02 mnt
drwxr-xr-x   1 root root 4096 Feb  3 18:04 opt
dr-xr-xr-x 411 root root    0 Mar  7 07:05 proc
drwx------   1 root root 4096 Feb  3 18:03 root
drwxr-xr-x   1 root root 4096 Mar  4 11:08 run
-rwxr-xr-x   1 root root  733 Jan  9 08:00 run_jupyter.sh
drwxr-xr-x   1 root root 4096 Jan  9 08:00 sbin
drwxr-xr-x   2 root root 4096 Oct 18 21:02 srv
dr-xr-xr-x  13 root root    0 Feb  2 13:11 sys
drwxrwxrwt   1 root root 4096 Mar  4 11:08 tmp
drwxr-xr-x   1 root root 4096 Oct 18 21:02 usr
drwxr-xr-x   1 root root 4096 Feb  3 16:40 var
drwxr-xr-x   1 root root 4096 Feb  3 18:04 workspace

まだにわか以下なのでもっと賢い方法があったら、ぜひご指導ください...

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[ dockerコンテナ内 ] にいるか判別してプロンプトをわかりやすくする Ubuntu

結論

.bashrcと.bashrc_profileファイルに以下の分を追加すればOK.

.bashrc
if [ -f /.dockerenv ]; then
    PS1='[${debian_chroot:+($debion_chroot)}\u@\h:\w]\$'
fi
.bash_profile
source ~/.bashrc

補足

dockerコンテナを立ち上げると自動的にコンテナ内に.dockerenvというファイルが作られるので、そのファイルがあるかどうか判別して、あるときだけプロンプトに[ ]を追加.

dockerコンテナ内
[usr@hostname:/]$cd /
[user@hostname:/]$ls -la
total 96
drwxr-xr-x   1 root root 4096 Mar  4 11:08 .
drwxr-xr-x   1 root root 4096 Mar  4 11:08 ..
-rwxr-xr-x   1 root root    0 Mar  4 11:07 .dockerenv
drwxr-xr-x   1 root root 4096 Feb  3 16:39 bazel
drwxr-xr-x   2 root root 4096 Oct 18 21:03 bin
drwxr-xr-x   2 root root 4096 Apr 24  2018 boot
drwxr-xr-x   5 root root  460 Mar  7 07:05 dev
drwxr-xr-x   1 root root 4096 Mar  7 07:05 etc
drwxr-xr-x   1 root root 4096 Mar  4 11:08 home
-rw-r--r--   1 root root  782 Sep 13 18:12 intelpython3-2019.0-047_amd64.deb
drwxr-xr-x   1 root root 4096 Nov 13 00:13 lib
drwxr-xr-x   2 root root 4096 Oct 18 21:02 lib64
drwxr-xr-x   2 root root 4096 Oct 18 21:02 media
drwxr-xr-x   2 root root 4096 Oct 18 21:02 mnt
drwxr-xr-x   1 root root 4096 Feb  3 18:04 opt
dr-xr-xr-x 411 root root    0 Mar  7 07:05 proc
drwx------   1 root root 4096 Feb  3 18:03 root
drwxr-xr-x   1 root root 4096 Mar  4 11:08 run
-rwxr-xr-x   1 root root  733 Jan  9 08:00 run_jupyter.sh
drwxr-xr-x   1 root root 4096 Jan  9 08:00 sbin
drwxr-xr-x   2 root root 4096 Oct 18 21:02 srv
dr-xr-xr-x  13 root root    0 Feb  2 13:11 sys
drwxrwxrwt   1 root root 4096 Mar  4 11:08 tmp
drwxr-xr-x   1 root root 4096 Oct 18 21:02 usr
drwxr-xr-x   1 root root 4096 Feb  3 16:40 var
drwxr-xr-x   1 root root 4096 Feb  3 18:04 workspace

まだにわか以下なのでもっと賢い方法があったら、ぜひご指導ください...

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerfileのベースイメージをmysqlに指定した時に、sequel proに接続する方法

はじめに

Dckerfile

FROM mysql:5.7
docker-compose.yml
version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - .:/data
    ports:
      - '3000:3000'
    environment:
      - MYSQL_ROOT_PASSWORD=password

ベースイメージをmysqlにしているときに
webアプリケーションにlocalhost:3000で接続でき、sequel proにも接続したい。

Sequel Proの接続情報
host: 127.0.0.1
user: root
pass: password
port: 3000

これで接続できると思っていたが、接続できなかった。

解決方法

アプリ側のポートに"3306"を追加する

docker-compose.yml
version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - .:/data
    ports:
      - '3000:3000'
      - '3306:3306' # 追加
    environment:
      - MYSQL_ROOT_PASSWORD=password

Sequel Proの接続情報
host: 127.0.0.1
user: root
pass: password
port: 3306

これで接続できた。めでたし、めでたし。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker Community Edition for Windows を入れる前に確認すること

Docker Community Edition for Windows をインストールしてみよ~っと…
と思っているそこのアナタ。

ちょっと待ってください。

Docker Community Edition for Windows を利用するためには CPU が ハイパーバイザー(Hypervisor) に対応している必要があります。

インストール前に以下の手順で CPU が ハイパーバイザー(Hypervisor)に対応しているか確認してみましょう。

(私はそのことを知らずに Docker Community Edition for Windows をインストールしようとしてエラーに見舞われ、少しのあいだ格闘した末に自身のパソコンの CPU がハイパーバイザー(Hypervisor)対応していないことを知りました…)

Coreinfo のダウンロード

※Coreinfo は、CPUの各機能や情報を確認するツールです
下記URLから Coreinfo をダウンロードして解凍します
https://technet.microsoft.com/ja-jp/sysinternals/cc835722

コマンドプロンプトを起動し、Coreinfo を解凍したディレクトリまで移動して以下のコマンドを実行します

> Coreinfo.exe -v

すると以下のような情報が表示されるので、
HYPERVISOR の欄が「*」となっていれば CPU が ハイパーバイザー(Hypervisor)に対応しているということです。

HYPERVISOR      -       Hypervisor is present
VMX             *       Supports Intel hardware-assisted virtualization
EPT             *       Supports Intel extended page tables (SLAT)

無事「*」であれば Docker Community Edition for Windows をインストールしてみましょう。
残念ながら「-」だった場合は、諦めてVirtualBoxなどの仮想環境を立ち上げてDockerを弄りましょう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[入門] GoでAPIを書いて,k8sにデプロイするまで [随時更新]

概要

新しい技術を使ってみたいけど, 何がいいの?どう使うの?時間ないよ と躊躇してしまうこともあると思います.
本記事では,自分が躓いたポイントも踏まえつつ題材を元にガシガシ書いていこうかなと思います.
自分自身も最近学び始めた技術ですので,入門として書かせていただきます!

構成

Go編

Docker編

  • Dockerとは(お待ち下さい?)
  • Dockerfileの書き方(お待ち下さい?)
  • Dockerの使い方(お待ち下さい?)

Kubernetes(k8s)編

  • Kubernetes(k8s)とは (お待ち下さい?)
  • ログの収集 (お待ち下さい?)
  • kubectlコマンド
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

最小構成の Airflow で DB を切り替える

はじめに

  • 最小構成の Airflow を GKE に deploy する を LocalExecutor を利用するため DB を MySQL に変更します

  • kubernetes のドキュメントにおいて v1.10 を参照しているのは Google Kubernetes Engine で利用しているバージョンと合わせています

Deploy MySQL

ハマりどころ

  • API Reference で目的のものが見つけづらく komposer を利用して docker-compose の YAML を変換し参考にした

    • ただし komposer は v2.1 が対応していなかったり、一部の記述が対応していなかったので 2 に書き換えたり、コメントアウトして変換を行った
  • GKE では PersistentVolume は基本的に不要だった

  • Lost+Found directory 問題

    • log に --initialize specified but the data directory has files in it. Aborting. が出力される
    • /var/lib/mysql directory に loast+found が含まれてしまうため
    • mysqld 起動時に --ignore-db-dir=lost+found を指定する
    • https://github.com/docker-library/mysql/issues/186

docker image の更新について

実装

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GCRでイメージをgcr.ioに置いて、各リージョンでダウンロード時間を測定してみた

はじめに

  • GCRって、リージョン意識しないの?各リージョンにインスタンス立ててみて、docker pullの時間を測定してみました
  • 利用ホスト場所は gcr.io (※ あとで補足)
    • 以下、公式ドキュメントより
    • > gcr.io は現時点では米国でイメージをホストしていますが、今後はロケーションが変更される可能性があります。
  • コンテナイメージは2GBのファイルを突っ込んだやつです
  • ※ 関係ないはずですが、pushはTokyoから行いました

image.png

結論

  • リージョン間でダウンロード時間は、1%程度しか差がありませんでした。 (数secくらい違うかという予想であったが)
  • また、ダウンロード時間はそれぞれバラツキも少ない測定結果となりました

image.png

Trial Num oregon london tokyo
1 27.1 28.5 28
2 28 27 27.7
3 27.3 27.6 27.9
4 27.3 27.4 27.9
5 27.3 27.5 28.2
Ave. 27.4 27.6 27.94

考察

GCR で利用できるリージョン

高速で可用性の高いアクセス
世界各地域に広がる非公開リポジトリを使用することで、世界中どこでも最適なレスポンス時間を実現できます。ヨーロッパ、アジア、米国の中で、自社の Compute インスタンスに近い場所にイメージを保存し、Google の高パフォーマンス グローバル ネットワークにアクセスすることで、迅速にデプロイできます。

  • 実はホストの場所は以下を選ぶことができました。(知らなかった)

    • gcr.io は現時点では米国でイメージをホストしていますが、今後はロケーションが変更される可能性があります。
    • us.gcr.io は米国でイメージをホストしますが、その場所は、gcr.io によってホストされるイメージからは独立したストレージ バケットです。
    • eu.gcr.io は、欧州連合でイメージをホストします。
    • asia.gcr.io は、アジアでイメージをホストします。
  • gcr.io は 米国 にホストされていたのですね。

リージョンを指定した場合どうなるか

  • となれば試してみたくなります。 追加検証です。
  • asia.gcr.io を利用して、Tokyoリージョン からダウンロードしてみます

image.png

# time docker pull asia.gcr.io/michelle214/gcr-test:2gb
  • 結果.... 優位な差はありませんでした。(1%程度の差)

image.png

Trial Num tokyo (from asia.gcr.io)
1 28.1
2 27.5
3 27.5
4 27.4
5 27.5
Ave. 27.6

まとめ

  • とりあえず、gcr.io を使っておくでよさそう!

補足

  • ちなみに、やっぱりきになってしまったので、Londonからだけ、asia.gcr.io からダウンロードしてみました
  • ..若干..? いやでも2%くらいの差ですね。 image.png

image.png

Trial Num london (from asia.gcr.io)
1 28.8
2 27.9
3 27.9
4 27.9
5 28.1
Ave. 28.12

検証条件 (参考までに)

Server

Instance Region Machine type OS Docker version
Oregon us-west1-a n1-standard-1 CentOS7 18.09.3
London europe-west2-a n1-standard-1 CentOS7 18.09.3
Tokyo asia-northeast1-a n1-standard-1 CentOS7 18.09.3

Docker pull

  • timeで測定しました
# time docker pull gcr.io/<myproject>/gcr-test:2gb
2gb: Pulling from <myproject>/gcr-test
48ecbb6b270e: Pull complete 
a1dc9d380f7a: Pull complete 
Digest: sha256:26c924244b387232b2a4eec5bb3a25184ca9f6e8db6e6ddbb008370ed5a41189
Status: Downloaded newer image for gcr.io/<myproject>/gcr-test:2gb

real    0m28.023s
user    0m0.325s
sys     0m0.094s
  • imageは毎回削除で5回繰り返し
# docker images -q | xargs docker rmi -f

準備の手順メモ

Docker Image

FROM alpine:3.7

COPY 2GB-file /

ENTRYPOINT ["/bin/sh", "-c", "while true; do echo hello world; sleep 1; done"]
  • 2GBのファイル作った
# dd if=/dev/zero of=2GB-file bs=1024k count=2000
# ll -h
total 2.0G
-rw-r--r--. 1 root root 2.0G Mar  6 14:20 2GB-file
-rw-r--r--. 1 root root  125 Mar  6 14:18 Dockerfile
  • docker build
# docker build -t gcr-test:2gb .
Sending build context to Docker daemon  2.097GBBB
Step 1/3 : FROM alpine:3.7
3.7: Pulling from library/alpine
48ecbb6b270e: Pull complete 
Digest: sha256:4013ae48be82862082484fc3cc68120d42b752c156abad5fd3877543116994ce
Status: Downloaded newer image for alpine:3.7
 ---> bc8fb6e6e49d
Step 2/3 : COPY 2GB-file /
 ---> fc9d4e7b87bc
Step 3/3 : ENTRYPOINT ["/bin/sh", "-c", "while true; do echo hello world; sleep 1; done"]
 ---> Running in 924f15d78ebf
Removing intermediate container 924f15d78ebf
 ---> 4befdff419f4
Successfully built 4befdff419f4
Successfully tagged gcr-test:2gb
  • 確認
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
gcr-test            2gb                 4befdff419f4        About a minute ago   2.1GB
alpine              3.7                 bc8fb6e6e49d        4 weeks ago          4.21MB

docker push

  • login
# gcloud auth configure-docker
The following settings will be added to your Docker config file 
located at [/root/.docker/config.json]:
 {
  "credHelpers": {
    "gcr.io": "gcloud", 
    "us.gcr.io": "gcloud", 
    "eu.gcr.io": "gcloud", 
    "asia.gcr.io": "gcloud", 
    "staging-k8s.gcr.io": "gcloud", 
    "marketplace.gcr.io": "gcloud"
  }
}

Do you want to continue (Y/n)?  y

Docker configuration file updated.
  • tag
# docker tag gcr-test:2gb gcr.io/<myproject>/gcr-test:2gb
  • push
    • pushはtokyo regionのサーバからやりました
# docker push gcr.io/<myproject>/gcr-test:2gb
The push refers to repository [gcr.io/<myproject>/gcr-test]
9b76a49972c2: Pushed 
629164d914fc: Layer already exists 
2gb: digest: sha256:26c924244b387232b2a4eec5bb3a25184ca9f6e8db6e6ddbb008370ed5a41189 size: 739
  • Image確認 ちゃんとアップロードされていますね

image.png

image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む