Below you will find pages that utilize the taxonomy term “Docker”
insecure registry of Docker(GWアドベントカレンダー 8日目)
この記事は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のままで対処しました。
PC上でのIaC環境の概要(GWアドベントカレンダー 4日目)
この記事はGWアドベントカレンダーの4日目の記事です。
自宅のPCにIaC環境を構築中ですが、その環境について少し説明します。
使用するツール
1台の物理Linuxサーバ上にすべての環境を構築します。 仮想マシンはVagrant + Virtual Boxで構築します。 コンテナはDockerで構築します。 構築ツールとしてAnsibleを使います。 CI/CDを実現するためのツールとしてGitlab、Gitlab Runnerを使います。
Gitlab、Gitlab Runnerの構築
GitlabとGitlab RunnerはAnsibleを使って、仮想マシンから作成します。 本番用とテスト用があり、テスト用の構築は本番用のGitlabのバックアップデータを使ってリストアすることで本番と同じデータを持つようにしています。
物理Linuxサーバの構築
OSインストール後の各種設定類はAnsibleにまとめようと思っていますが、まだできていません。
AnsibleとVagrantの連携
Ansibleのプレイブック(Gitlabのパイプラインからの呼び出しや手動実行)によって、Vagrant経由で仮想マシンを作成することがあります。 しかし、AnsibleのInventory PluginとしてはVagrant用のものが正式にはありません。そのため、作成した仮想マシンに対してプレイブックを実行するためには何らかの方法を考える必要があります。 一つはInventory PluginもしくはScriptを作ること、もう一つは作成する仮想マシン情報をあらかじめインベントリファイルに記載しておくことが考えられます。 どちらの方法でも実現できそうですが、どのようにするか検討中です。
今後の展望
- 物理Linuxサーバ構築用のパイプライン構築
- Kubernetesを動かす。 その上で、各種アプリケーションを動かす予定です。
Docker Desktop for Windowsの導入
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
その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
作成したものを削除する。
kubenetes導入顛末記 その1
前置き
コンテナに触れようと思い、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の導入。