タグ「docker」が付けられているもの

insecure registry of Docker(GWアドベントカレンダー 8日目)

  • 投稿日:
  • by
  • カテゴリ:

この記事はGWアドベントカレンダーの8日目の記事です。

GitLabのパイプラインでdocker loginしようとすると以下のエラーで失敗しました。

 docker -l debug login -u gitlab-ci-token -p ${CI_BUILD_TOKEN} http://${CI_REGISTRY}
 Error response from daemon: Get https://xxx.xxx.xxx.xxx:4567/v2/: http: server gave HTTP response to HTTPS client

以下にあるdaemon.jsonの設定をrunnerに追加することで解決しました。 registryをHTTPS化することも考えましたが、このregistryがリバースプロキシ配下になく、一旦HTTPのままで対処しました。

Test an insecure registry

Docker Desktop for Windowsの導入

  • 投稿日:
  • by
  • カテゴリ:

Docker Desktop for Windowsを導入してみました。

dockerコンテナを作って動かしたいのが目的です。 Windowsを使うのは、普段使っているOSがWindowsだからで、コンテナはLinuxのものを使います。 そうしたときに、docker Engineをどこで動かすかの選択肢があります。

  • Windows (Docker Desktop for Windows)
  • Windows上のLinux VM(Hyper-VやVirtual Box上のLinux VMでLinux用のDocker Engineを動かす)

開発用にLinux VMを動かしているのでそちらでDockerを使っても良いのですが、わざわざVMを起動して使うのも面倒そうなのでWindows上で動かすことにしました。 ただ、Windows上で動かすと言っても、実際にはDocker用のLinux VMがHyper-Vを使って起動します。 そのため、自分でLinux VMを用意して動かすのと仕組みはそれほど変わりません。

Docker Desktop for Windowsの場合、Docker ClientはWindows上で動きますが、Docker EngineはLinux VM上で動きます。 自分でLinux VMを用意して使う場合はDocker ClientもDocker EngineもLinux VM上で動きます。 コンテナそのものはどちらもLinux VM上で動きます。

Docker Desktop for Windowsを使う場合、DockerfileやコンテナにコピーするファイルをLinux VMから利用できるようにする必要があります。 どのドライブをアクセス可能にするかは、settingsから設定できます。 なお、コンテナからマウントして使うようなデータ領域としてはWindows上の領域は不向きで、data volumeやdata containerを使う方が良いようです。これには二つの理由があって、一つはWindows上の領域はLinux上からみて、rwxrwxrwxのモードで見えます。もう一つは、SMBを使ってLinux VMに領域を見せる際、NOBRLオプションが付いているため、ロックができない場合がある点です。 これらはDocker Desktop for Windowsのドキュメントの最初の方(Shared drives)に書いてあります。

と、ここまでやってから大事なことに気づきました。 開発用にLinux VMを動かしていますが、そちらはVirtual Boxを使っています。 Docker Desktop for WindowsはHyper-Vを使います。 これらの共存はできないので、どちらを使うか選ぶ必要があります。。つづく。。

kubenetes導入顛末記 その2

  • 投稿日:
  • by
  • カテゴリ:

その1でとりあえず動作するところまで確認できたので、ここからはチュートリアルに沿ってやってみる。

https://kubernetes.io/docs/tutorials/hello-minikube/

nodeアプリケーション作成

server.jsというhello worldを作成。

node server.jsで動作確認して問題ないことを確認。

Docker Containerイメージ作成

Dockerfileを作成。

以下のコマンドで環境変数を設定。そしてビルド。

eval $(minikube docker-env)
docker build -t hello-node:v1 .


Deployment作成

以下のコマンドでPodも作成されて動いているらしい。

でも、ローカルIPからしか接続できないらしい。試しにminikube sshでログインしてみたけども8080ポートで待ち受けているプロセスはなかった。。nodeコマンドは動作中だったので他のポートで待っているみたいだけど。どこで変換しているのか。。

kubectl run hello-node --image=hello-node:v1 --port=8080 --image-pull-policy=Never

Service作成

外からもアクセスできるようにServiceを作成する。

kubectl expose deployment hello-node --type=LoadBalancer

以下のコマンドで得られるURLにアクセスすると無事に表示される。どのポートで待っているのかの謎はこれで解ける。でも、ポートが8080ではないんだな。なんでだろ。

minikube service --url hello-node

アクセスログは以下で参照できた。pod-nameも補完してくれて良い感じ。

kubectl logs <POD-NAME>

アプリの更新

Docker Containerイメージを作成してDeploymentを更新。

docker build -t hello-node:v2 .
kubectl set image deployment/hello-node hello-node=hello-node:v2

これだけで新しいイメージが使われるようになった。Dashboardでも確認。

heapster addonの有効化

性能監視用のaddonらしい。以下で有効にするとdashboardのoverviewでCPUとメモリのグラフが表示されて、ほかのところにもそういった情報が追加される。

minikube addons enable heapster

Clean up

作成したものを削除する。

kubectl delete service hello-node
kubectl delete deployment hello-node
docker rmi hello-node:v1 hello-node:v2 -f
minikube stop
eval $(minikube docker-env -u)

kubenetes導入顛末記 その1

  • 投稿日:
  • by
  • カテゴリ:

前置き

コンテナに触れようと思い、kubenetesを導入することにしたので、その記録。
導入先はUbuntu 16.04の物理サーバ1台です。

導入方法の決定

kubenetesの導入方法はいろいろあるようですが、とりあえず動かしたいならminikubeがおすすめと記載があるのでそれに従う。

選び方はこちら

選んだのは、Running Kubernetes Locally via Minikube

Kubenetes導入の前にHypervisor導入

手順を見ていくと最初にHypervisorを入れろとある。ただ、VM上に構築しないという手もあるらしい。
記載順などからVirtual Boxが良さそうなのでVirtualBoxを採用。

ということで、まずはVirtualBoxの導入。以下のURLに従ってaptのsourceを指定してインストール。

https://www.virtualbox.org/wiki/Linux_Downloads

minikube導入の前にkubectl導入

以下の通り、こちらもaptのsourceを設定してinstall。

https://kubernetes.io/docs/tasks/tools/install-kubectl/

ちなみにこの状態で kubectl cluster-infoを実行すると以下の通り。

$ kubectl cluster-info
Kubernetes master is running at http://localhost:8080

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
The connection to the server localhost:8080 was refused - did you specify the right host or port?

kubectlのautocompletion設定

ここも前述のガイドにならって設定する。

echo "source <(kubectl completion bash)" >> ~/.bashrc

minikubeの導入

ここでようやくminikubeの導入。

https://github.com/kubernetes/minikube/releases

まだ開発中なのでバージョン毎の導入手順を参考にする。

今回はMinikube v0.28.2を導入する。

と言っても、ダウンロードするだけ。最後のmv先はご自由に。

curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.28.2/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube

とりあえずここまでで導入はできたみたい。

試しに起動

以下のコマンドを実行すると160MBのISOイメージをダウンロード開始するので要注意。その後の処理も時間が掛かり、15分くらい返ってこなかった。。

$ minikube start
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Downloading Minikube ISO
 160.27 MB / 160.27 MB [============================================] 100.00% 0s
Getting VM IP address...
Moving files into cluster...
Downloading kubeadm v1.10.0
Downloading kubelet v1.10.0
Finished Downloading kubelet v1.10.0
Finished Downloading kubeadm v1.10.0
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.

このタイミングでkubectl get podしてもリソース無し。

$ kubectl get pod [26/73]
No resources found.

$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080 deployment.apps/hello-minikube created $ kubectl expose deployment hello-minikube --type=NodePort service/hello-minikube exposed

上記コマンド実行後30秒くらいでReadyになった。

$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-minikube-7c77b68cff-9zpv8 0/1 ContainerCreating 0 22s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-minikube-7c77b68cff-9zpv8 0/1 ContainerCreating 0 26s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-minikube-7c77b68cff-9zpv8 0/1 ContainerCreating 0 28s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-minikube-7c77b68cff-9zpv8 0/1 ContainerCreating 0 28s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-minikube-7c77b68cff-9zpv8 0/1 ContainerCreating 0 29s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-minikube-7c77b68cff-9zpv8 1/1 Running 0 30s

以下のコマンドで動作確認。

$ curl $(minikube service hello-minikube --url)


Hostname: hello-minikube-7c77b68cff-9zpv8

Pod Information:
-no pod information available-

Server values:
server_version=nginx: 1.13.3 - lua: 10008

Request Information:
client_address=172.17.0.1
method=GET
real path=/
query=
request_version=1.1
request_scheme=http
request_uri=http://192.168.99.100:8080/

Request Headers:
accept=*/*
host=192.168.99.100:32678
user-agent=curl/7.47.0

Request Body:
-no body in request-

最後にゴミ掃除して終了。

$ kubectl delete services hello-minikube
service "hello-minikube" deleted
$ kubectl delete deployment hello-minikube
deployment.extensions "hello-minikube" deleted
$ minikube stop
Stopping local Kubernetes cluster...
Machine stopped.

つづき(その2)はこちら。