- 投稿日:2021-01-05T23:23:51+09:00
NextJS・NestJS・PostgreSQL・Dockerでフルスタックアプリを開発してみよう!ハンズオン②(フロントエンド・Docker編)
はじめに
お待たせしました! 前回のハンズオン記事の第2弾です。
今回は、フロントエンド(NextJS)、Nginx サーバーとDocker周りの設定に着手します。
これからこの技術スタックを試したい方のためにテンプレート的なコードになればいいと思いこの記事を書きました。
では、早速やっていきましょう!
前提条件
- Dockerがインストールされていること。(Dockerhubをインストールした方が楽)
- Nodeがインストールされていること(使用するパッケージの都合上、v12.0.0を推奨します。nvmをインストールしておくとバージョンの切り替えが便利です。)
- ハンズオンをしたい方は、サーバーサイド編を読み終えていること
対象読者
- Docker、React、NodeJSなど単独で勉強してきたが、全てを網羅的に学習したい方
- とりあえず、フルスタックのアプリをTypescriptだけで開発してみたい方
- NextJS・NestJS・Dockerは聞いたことあるけれど、使ったことがない方・使ってみたい方
本編
前回は、サーバーサイド(NestJS)周りを中心に実装しました。NestJSというフレームワークの特殊な記法・アーキテクチャーを用いて、データベースへの接続コードやHTTPリクエスト(GETやPOST)に対応したコードを書いていきました。
今回はNextJSを使ってフロントエンドから開発していきましょう!
その前に、前回のおさらいとして、アプリの構成図を載せておきます!
アプリ構成
- ポイント①:nginxサーバーをブラウザとシステムの間に挟むことで、プロキシサーバー・ルーターとしての役割を与えたこと。リクエストのパラメーターに「/」だけ指定してある場合はNextJS、パラメータに「/api」が指定されている場合はNestJSに振り分けるように設定します。
- ポイント②:Dockerコンテナ内でアプリを起動すること。こうすることで、環境依存しない開発が可能になります。
NextJSでフロントエンドを実装しよう!
プロジェクトの作成
まずは、フロントエンド! 以下のコマンドを叩いてプロジェクトを作成しましょう!
# npm派はこちら npx create-next-app # yarn派はこちら yarn create next-appすると、以下のようにプロジェクトが作成されます!
Typescriptの設定ファイルを作成
ただ、今回はTypescriptを使っていきたいので
tsconfig.json
設定ファイルをルートディレクトリーに作成していきましょう!touch tsconfig.json # yarn run devで試しに実行してみると、以下のdependenciesをインストールする ように怒られるのでしておく yarn add --dev typescript @types/react @types/nodetsconfig.jsonファイルも以下のように修正
tsconfig.json{ "compilerOptions": { "sourceMap": true, "noImplicitAny": true, "module": "esnext", "target": "es6", "jsx": "preserve", "lib": [ "dom", "dom.iterable", "esnext" ], "allowJs": true, "baseUrl": "./", "skipLibCheck": true, "strict": false, "forceConsistentCasingInFileNames": true, "noEmit": true, "esModuleInterop": true, "resolveJsonModule": true, "isolatedModules": true, "moduleResolution": "node" }, "include": [ "pages/**/*", ], "exclude": [ "node_modules" ] }今回は、
pages/
配下の全てのフォルダやファイルを対象に再帰的にチェックするよう設定しました。もし、厳しめにTypescriptの確認をする場合はstrict:true
にしてください。これでNextJSのプロジェクトはTypescriptに対応するようになっています。あとは、
pages
配下の拡張子を全て.ts
に設定しておきましょう。ついでにESLINTとPrettierの設定もしておく
開発コードは予め可読性を高くしておきたいです、、、ウムウム
個人の好みはあると思いますが、最低限の設定はしておきましょう!
私はVSCodeをエディタとして使用しているので、ESLintとPrettierのプラグインを入れておきます。
prettierrc.jsmodule.exports = { semi: true, trailingComma: 'es5', singleQuote: true, printWidth: 100, tabWidth: 2, useTabs: false, }eslintrc.jsmodule.exports = { overrides: [ { files: ['*.ts', '*.tsx'], parserOptions: { project: ['./tsconfig.json'], tsconfigRootDir: __dirname, sourceType: 'module', }, }, ], extends: [ 'eslint:recommended', 'plugin:react/recommended', 'plugin:@typescript-eslint/recommended', 'plugin:@typescript-eslint/eslint-recommended', 'plugin:prettier/recommended', 'prettier/@typescript-eslint', ], plugins: ['@typescript-eslint', 'react', 'prettier'], parser: '@typescript-eslint/parser', env: { browser: true, node: true, es6: true, }, parserOptions: { sourceType: 'module', ecmaFeatures: { jsx: true, }, }, rules: { 'react/prop-types': 'off', 'react/react-in-jsx-scope': 'off', '@typescript-eslint/no-explicit-any': 'off', 'prettier/prettier': 'error', }, settings: { react: { version: 'detect', }, }, };トラブルシューティング: もし、ESLintやPrettierが上手く動作しない場合は、package.jsonに必要なdependenciesがないかVSCodeの設定で「formatOnSave」がfalseのどちらかの場合が多いので注意してくださいね!
pagesのファイルを修正
今回は意図的にアプリの構成をシンプルにしました。なので、
_app.ts
とindex.ts
の修正だけで十分です。_app.tsximport React from 'react'; import type { AppProps /*, AppContext */ } from 'next/app'; import '../styles/global.scss'; function MyApp({ Component, pageProps }: AppProps): JSX.Element { return <Component {...pageProps} />; } // Only uncomment this method if you have blocking data requirements for // every single page in your application. This disables the ability to // perform automatic static optimization, causing every page in your app to // be server-side rendered. // // MyApp.getInitialProps = async (appContext: AppContext) => { // // calls page's `getInitialProps` and fills `appProps.pageProps` // const appProps = await App.getInitialProps(appContext); // return { ...appProps } // } export default MyApp;index.tsximport Head from 'next/head'; import React, { useEffect, useState } from 'react'; import axios from 'axios'; import { MovieListType } from '../interface/movie'; export default function Home(): React.ReactElement { const [movieName, setMovieName] = useState<string>(''); const [movieList, setMovieList] = useState<Array<MovieListType>>([]); useEffect(() => { console.log(movieList); }, [movieList]); useEffect(() => { let tmp: any = ''; const fetchMovieList = async (): Promise<void> => { const { data } = await axios.get('/api/movielist'); tmp = data; setMovieList(tmp); }; fetchMovieList(); }, []); function onMovieNameInput(event: React.ChangeEvent<HTMLInputElement>) { const inputValue = (event.target as HTMLInputElement).value; setMovieName(inputValue); } async function onClickWatchLater() { await axios.post('/api/movielist', { movieName, }); const { data } = await axios.get('/api/movielist'); setMovieList(data); } return ( <div> <Head> <title>I Theater</title> <link rel="icon" href="/favicon.ico" /> <link rel="preconnect" href="https://fonts.gstatic.com" /> <link href="https://fonts.googleapis.com/css2?family=Unlock&display=swap" rel="stylesheet" /> </Head> <div className="wrapper"> <div className="search"> <div> <h1 className="title">ITheater</h1> </div> <div> <input className="input u-margin-bottom-medium" value={movieName} onChange={onMovieNameInput} /> </div> <div> <button className="btn" onClick={onClickWatchLater}> Watch Later! </button> </div> </div> <div> {movieList.map((el: MovieListType, index: number) => { if (movieList.length === 0) { return <div></div>; } else { return ( <div key={index} className="result result__element"> <div className="result__row--number">{el.id}</div> <div className="result__row--border"></div> <div className="result__row--title">{el.movieName}</div> </div> ); } })} </div> </div> </div> ); }ポイントとしては、新しい映画の名前を登録するときのリクエスト先のパス名を「/api」から始めていることです。後ほど実装するnginxサーバーが識別できるようにするために必要なコードになります!
次に、型安全としてインタフェースも定義しておきましょう。基本的に、サーバーサイドのエンティティクラスに合わせておきます。
movielist.tsexport type MovieListType = { id: number; movieName: string; };CSSの設定
CSSファイルにはSCSS/SASS(CSSのコンパイラ)を使用しています。今回は、フロントエンドの設計記法として「BEM」を採用しました。
アーキテクチャーとしては、「7−1」パターンを使っています。
こちらのリンクからソースをダウンロードし、stylesフォルダを置き換えておきましょう。
これでフロントエンドの実装は終わりです!
Nginxサーバーの実装
さて、nginxの実装に取り掛かるとしますか〜
と意気込んだものの、nginxの設定は本当に初歩的な部分にしか触れませんw
まぁ、正確にはそこしかまだ触れられませんw
基本的に、URIのパスによってクライアント(∴ NextJS)かサーバー(∴NestJS)にリクエストを送るか判断するための仲介人的な役割をはたしていただきます。
追々、単発の記事でnginxを深掘りしていきたいですが、このアプリにはルート機能だけで十分、、、ク、スミマセンマケオシミデス
では気を取り直して、ルートディレクトリーに
nginx
フォルダを作成し、設定ファイルdefault.conf
を作成しましょう!default.conf# NextJS upstream client { # ここでいう、clientは後ほど作成するdocker-compose.ymlで定義しているエンドポイントです。 server client:3000; } # NestJS upstream api { # ここでいう、apiは後ほど作成するdocker-compose.ymlで定義しているエンドポイントです。 server api:5000; } server { listen 80; # ここで振り分けのルールを定義します location / { proxy_pass http://client; } location /api { rewrite /api/(.*) /$1 break; proxy_pass http://api; } }Dockerの設定
いよいよ終盤です。それぞれのDockerfileを指定の場所に配置しましょう!
client/ │ ├ ... │ └ Dockerfile.dev │ nginx/ │ ├ default.conf │ └ Dockerfile.dev │ server/ │ ├ ... │ └ Dockerfile.dev │ └ docker-compose.ymlプロダクション用のDockerfileではないので、拡張子に
.dev
をつけます。AWSやHerokuにデプロイする場合はDockerfile.devとは別に拡張子なしのDockerfileを作成するのが一般的です。
/client/Dockerfile.dev
FROM node:alpine WORKDIR /app COPY ./package.json ./ RUN yarn COPY . . CMD ["yarn", "dev"]
/nginx/Dockerfile.dev
FROM nginx COPY default.conf /etc/nginx/conf.d/default.conf
/server/Dockerfile.dev
FROM node:alpine WORKDIR /app COPY ./package.json ./ RUN yarn COPY . . CMD ["yarn", "start:dev"]ポイント①: clientとserverにnode:alpineを使用していること。このイメージ内にnodeがインストール済みなので、nodeアプリケーションを扱う場合に利点がある。
ポイント②: clientとserverのDockerfileでCOPYを2回に分けて行っていること。COPY ./package.json ./ RUN yarn COPY . .これは、ホスト内でコードに修正を加えた際に、一々パッケージをインストール(yarn)し直さないようにするためです。開発コストを抑えることができます。
docker-compose.yml
docker-compose.ymlversion: "3.9" services: postgres: image: "postgres:latest" environment: - POSTGRES_PASSWORD=postgres_password client: build: context: ./client dockerfile: Dockerfile.dev volumes: - /app/node_modules - ./client:/app api: build: context: ./server dockerfile: Dockerfile.dev volumes: - /app/node_modules - ./server:/app environment: - PGUSER=postgres - PGHOST=postgres - PGDATABASE=postgres - PGPASSWORD=postgres_password - PGPORT=5432 nginx: depends_on: - client - api restart: always build: context: ./nginx dockerfile: Dockerfile.dev ports: - "3050:80"ポイント①:clientとapiのコンテナにvolumes値を設定していること。ホストパス上のファイルをDocker上にマウントすることで、修正後のコードを保存時に自動的にアップデートしてくれます。
volumes: - /app/node_modules - ホストパス:/appポイント②:apiの環境変数にpostgresの設定用に必要な値を予め登録しておくこと。こうすることで、nest.js(サーバーサイド)は環境変数から必要な情報を取得することができます。
api: build: context: ./server dockerfile: Dockerfile.dev volumes: - /app/node_modules - ./server:/app environment: - PGUSER=postgres - PGHOST=postgres - PGDATABASE=postgres - PGPASSWORD=postgres_password - PGPORT=5432サーバーサイド側だと
process.env.PGUSER
という感じで取得することができるようになります。ポイント③:nginxをclientとapiに関連づけること。
nginx: depends_on: - client - api restart: always
restart: always
を指定することで、他のコンテナが起動し終わるまで再起動し続けることができます。いざ、起動してみよう!
ここまで読んでくれた皆さん、ありがとうございます。そして、お疲れ様です!
いよいよ運命の時、、、
実行してみましょう!
docker-compose up --build # 一回でnginxが起動できない場合があります。その場合は、もう一度以下のコマンドを叩いてください! docker-compose down && docker-compose up成功したら映画を登録できるはずです!
終わりに
ここまでお付き合いして下さった皆さん!お疲れ様です!
これで、あなたもフルスタックエンジニアですw今回このブログを書くことで、この分野についてかなり理解が深まったと実感しています。
このブログ記事がこれからNextJS、NestJS、Typescript、Dockerなどで開発を考えている方にとって少しても助けになれば嬉しいです。
正直、NestJSはまだまだ奥が深いです。GraphQL、MicroService、Prisma等々、今ホットな技術スタックにも対応しています。
そこら辺を単発で深掘りするような記事をこれからかけていけたらと思います。
このハンズオンシリーズですが、次回はKubernetesを使用したバージョンの記事も書いていきます。正直、こっちの方がDockerより実践的だと思うので!
ではまた次の機会でお会いしましょう!
- 投稿日:2021-01-05T20:23:49+09:00
DockerToolBoxでSQLServerを実行する
DockerToolBoxを利用してSQLServerを構築しました。
SQLServer構築
イメージをプルしてランします。
docker pull mcr.microsoft.com/mssql/server:2019-latestdocker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" -p 1433:1433 --name testdb -h testdb -d mcr.microsoft.com/mssql/server:2019-latestこれで構築完了なはずなので、状態を確認してみました。
docker ps -a実行結果です。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 729b8cba68bc mcr.microsoft.com/mssql/server:2019-latest "/opt/mssql/bin/perm…" 28 seconds ago Exited (1) 27 seconds ago testdbSTATUSがExited (1) なので、コンテナを開始しました。
docker start 729b8cba68bcしかし、STATUSが変わりません。
ログを確認してみます。
docker logs 729b8cba68bc以下のログが出力されていました。
sqlservr: This program requires a machine with at least 2000 megabytes of memory.
翻訳します。
sqlservr:このプログラムには、少なくとも2000メガバイトのメモリを搭載したマシンが必要です。
エラーの原因は仮想マシンのメモリ不足でした。この問題を解消したら、STATUSも正常になしました。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fb1e9681fd36 mcr.microsoft.com/mssql/server:2019-latest "/opt/mssql/bin/perm…" 3 seconds ago Up 2 seconds 0.0.0.0:1433->1433/tcp sql1感想
よくわからないところで躓いてしまった。。。
- 投稿日:2021-01-05T19:30:28+09:00
ラズパイKubernetesとDockerのバージョンを下げた話
0.はじめに
2020年〜2021年の冬休みを使って
Qiitaにたくさん存在するラズパイによるKubernetes環境を
諸先輩方の投稿を参考に構築してみました。
が。。。。。
インストールはできたけど超不安定。
初心者には手に負えるわけもなく、
最終的にはKubernetesとDockerのバージョンを下げるという負け犬の話です。※2020年の年末の話です。将来のバージョンでは普通に動くんだと思います。
※あと、超初心者なので何か忘れているとか、余計なことやっているとか
その他諸々あるのかもしれません。ゴメンナサイ。
※もっとこうすればいいのにとかこうやれば解決できますよ〜とかありましたら、
こっそり教えてください^^
※作ったときの話はまた今度〜
1.そもそもインストール時
1-1. Docker編
早速インストール!
$ curl -sSL https://get.docker.com/ | sh # Executing docker install script, commit: 3d8fe77c2c46c5b7571f94b42793905e5b3e42e4 ーーー中略ーーー + sudo -E sh -c docker version Client: Docker Engine - Community Version: 20.10.1 API version: 1.41 Go version: go1.13.15 Git commit: 831ebea Built: Tue Dec 15 04:35:27 2020 OS/Arch: linux/arm Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.1 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: f001486 Built: Tue Dec 15 04:33:02 2020 OS/Arch: linux/arm Experimental: false containerd: Version: 1.4.3 GitCommit: 269548fa27e0089a8b8278fc4fc781d7f65a939b runc: Version: 1.0.0-rc92 GitCommit: ff819c7e9184c13b7c2607fe6c30ae19403a7aff docker-init: Version: 0.19.0 GitCommit: de40ad0 ーーー以下略ーーーというわけでDockerのバージョンは20.10.1
あとから思えばここから、ずれていたんだなぁ。
今(2020年の年末)のKubernetesの対応外だけど何とかなるでしょと、、、
Workerになるラズパイにも同じようにインストール!1-2. Kubernetes編
Dockerのインストールが終わったので次はKubernetes!
Dockerのusermodやapt-mark、googleのapt-key取り込みなんかを済ませ、$ sudo apt-get install kubelet kubeadm kubectl kubernetes-cni ーーー中略ーーー Unpacking kubeadm (1.20.1-00) ... Setting up conntrack (1:1.4.5-2) ... Setting up kubectl (1.20.1-00) ... Setting up ebtables (2.0.10.4+snapshot20181205-3) ... Setting up socat (1.7.3.2-2) ... Setting up cri-tools (1.13.0-01) ... Setting up kubernetes-cni (0.8.7-00) ... Setting up kubelet (1.20.1-00) ...``` Created symlink /etc/systemd/system/multi-user.target.wants/kubelet.service → /lib/systemd/system/kubelet.service. Setting up kubeadm (1.20.1-00) ... Processing triggers for man-db (2.8.5-2) ... Processing triggers for libc-bin (2.28-10+rpi1) ...まぁ、これは普通にインストール終了。
というわけで、Kubernetesは1.20.1。
Workerになるラズパイにも同じようにインストールここから初心者による戦いがはじまりますw
2. kubeadm initができない
今回使ったラズパイは
Raspberry Pi 4 Model B / 8GB
というわけでGUIのOSでもメモリはこんな感じ$ free -h total used free shared buff/cache available Mem: 7.7Gi 617Mi 5.8Gi 574Mi 1.3Gi 6.3Gi Swap: 0B 0B 0Bというわけでマスターになるラズパイで早速kubeadm initを〜
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16 [init] Using Kubernetes version: v1.20.1 [preflight] Running pre-flight checks [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/ [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.1. Latest validated version: 19.03 [WARNING SystemVerification]: missing optional cgroups: hugetlb error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR Mem]: the system RAM (1 MB) is less than the minimum 1700 MB [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` To see the stack trace of this error execute with --v=5 or higherなんじゃこりゃ。。。
Dockerのバージョンが高いぜ!は良いとして(良くない)
このシステム、メモリが1MBしかないんですが、最低でも1700MB要ります〜!
ってどういうこと???
さっきの空きメモリはどこ行ってしまったんだ。。。
というわけでいろいろ漁ってみたんですがよくわからないので、
オプションに
--ignore-preflight-errors=Mem
を指定して、エラー無視して逃げちゃおうw$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Mem [init] Using Kubernetes version: v1.20.1 [preflight] Running pre-flight checks [WARNING Mem]: the system RAM (1 MB) is less than the minimum 1700 MB [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/ [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.1. Latest validated version: 19.03 [WARNING SystemVerification]: missing optional cgroups: hugetlb [preflight] Pulling images required for setting up a Kubernetes cluster ーーー中略ーーー Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: ーーー以下略ーーー今度はうまくインストールできた模様(できてないw)
もろもろ環境設定を済ませ、Workerの各ラズパイからkubeadm join!!!joinできたら早速ノードをみてみよう!
$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-m Ready control-plane,master 5m23s v1.20.1 k8s-w1 Ready <none> 3m56s v1.20.1 k8s-w2 Ready <none> 3m41s v1.20.1 k8s-w3 Ready <none> 3m20s v1.20.1なぁーんだ、普通に動くじゃないか〜
(と、このときは思っていた。。。)3. なんかおかしいぞ
masterからnodeもすべてみられたので、
k8sインストール、恐るるに足らずとか
ほくそ笑みながらメシ食べて戻ってきて
もう一度ノードみてみるかな〜$ kubectl get node The connection to the server <IP>:6443 was refused - did you specify the right host or port? $ kubectl get node The connection to the server <IP>:6443 was refused - did you specify the right host or port? ... ーーー2,3分この状態ーーー $ kubectl get node Unable to connect to the server: net/http: TLS handshake timeout $ kubectl get node Unable to connect to the server: net/http: TLS handshake timeout ... ーーー数10秒この状態ーーー $ kubectl get node NAME STATUS ROLES AGE VERSION k8s-m Ready control-plane,master 1h v1.20.1 k8s-w1 Ready worker 1h v1.20.1 k8s-w2 Ready worker 1h v1.20.1 k8s-w3 Ready worker 1h v1.20.1 ーーー復活ーーー???なんだ???
ログ見てもFatalErrorが出て、再起動しているのはわかるのだけど、手に負えず。。。
上の状態を10分おきくらいに繰り返すので、これを使うのはツライ。。。
散々悩んだ結果、バージョンを下げるということに。4. Kubernetes アンインストール
master, worker全てのノードで行います。
ホントはサービス止めたりした方がいいんだろうけど。ムシムシw4-1. Kubernetesの設定削除
これをやらないと再インストール後に古い設定を参照してしまう >オレ
$ sudo kubeadm reset4-2. hold解除
apt updateなどでバージョンが勝手に上がらないようにしていたので
まずはhold状態の確認をして、該当するモノをunhold$ sudo apt-mark showhold $ sudo apt-mark unhold kubelet kubeadm kubectl kubernetes-cni4-2. Kubernetesアンインストール
purgeして関連もautoremoveで消します
$ sudo apt-get purge -y kubeadm kubectl kubelet kubernetes-cni kube* $ sudo apt-get autoremove -y4-3. ラズパイ再起動
なんか気持ち悪いのでラズパイ全台再起動w
(というかホントはココでKubernetesの1.19.6を入れたけど、
上のget nodeのconnection refused問題が改善しなかったのさw)5. Dockerアンインストール
これも全台やります
5-1. hold解除
Dockerもapt updateなどでバージョンが勝手に上がらないようにしていたので
まずはhold状態の確認をして該当するモノをunhold$ sudo apt-mark showhold $ sudo apt-mark unhold docker-ce docker-ce-cli5-2. Dockerアンインストール
purgeして関連削除
$ sudo apt-get purge -y docker-ce docker-ce-cli $ sudo apt-get autoremove -y5-3. ラズパイ再起動
なんか気持ち悪いのでラズパイ全台再起動w
6. 再インストール
Dockerを19.03系、
Kubernetesを1.19系で再インストールしてみる6-1. Docker
6-1-1. バージョン選定
まずは19.03系で一番新しいのは何か調べてみる。
$ apt-cache madison docker-ce docker-ce | 5:20.10.1~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages docker-ce | 5:20.10.0~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages docker-ce | 5:19.03.14~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages docker-ce | 5:19.03.13~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages docker-ce | 5:19.03.12~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages ーーー中略ーーー docker-ce | 5:19.03.2~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages docker-ce | 5:19.03.1~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages19.03系だと
5:19.03.14~3-0~raspbian-buster
が良さそう。
(念の為、docker-ce-cliも調べたけど、同じ19.03.14だった)
というわけで、Dockerは19.03.14に決定!6-1-2. バージョン指定してインストール
$ sudo apt-get install -y --no-install-recommends docker-ce=5:19.03.14~3-0~raspbian-buster docker-ce-cli=5:19.03.14~3-0~raspbian-buster6-1-3. 確認
$ docker version Client: Docker Engine - Community Version: 19.03.14 API version: 1.40 Go version: go1.13.15 Git commit: 5eb3275d40 Built: Tue Dec 1 19:21:06 2020 OS/Arch: linux/arm Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.14 API version: 1.40 (minimum version 1.12) Go version: go1.13.15 Git commit: 5eb3275d40 Built: Tue Dec 1 19:19:00 2020 OS/Arch: linux/arm Experimental: false containerd: Version: 1.4.3 GitCommit: 269548fa27e0089a8b8278fc4fc781d7f65a939b runc: Version: 1.0.0-rc92 GitCommit: ff819c7e9184c13b7c2607fe6c30ae19403a7aff docker-init: Version: 0.18.0 GitCommit: fec36836-2. Kubernetes
6-2-1. バージョン選定
こちらもバージョン確認
$ sudo apt-cache madison kubeadm kubeadm | 1.20.1-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubeadm | 1.20.0-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubeadm | 1.19.6-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubeadm | 1.19.5-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubeadm | 1.19.4-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubeadm | 1.19.3-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages ーーー中略ーーー kubeadm | 1.6.0-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubeadm | 1.5.7-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubeadm | 1.5.6-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages $ $ $ sudo apt-cache madison kubelet kubelet | 1.20.1-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubelet | 1.20.0-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubelet | 1.19.6-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubelet | 1.19.5-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubelet | 1.19.4-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubelet | 1.19.3-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages ーーー中略ーーー kubelet | 1.5.2-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubelet | 1.5.1-01 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubelet | 1.5.1-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages $ $ $ sudo apt-cache madison kubectl kubectl | 1.20.1-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubectl | 1.20.0-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubectl | 1.19.6-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubectl | 1.19.5-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubectl | 1.19.4-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubectl | 1.19.3-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages ーーー中略ーーー kubectl | 1.5.3-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubectl | 1.5.2-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubectl | 1.5.1-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages1.19系だと
1.19.6-00
が良さそう。
というわけで、Kubernetesは1.19.6に決定!
kubernetes-cniは。。。$ sudo apt-cache madison kubernetes-cni kubernetes-cni | 0.8.7-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubernetes-cni | 0.8.6-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubernetes-cni | 0.7.5-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubernetes-cni | 0.6.0-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubernetes-cni | 0.5.1-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages kubernetes-cni | 0.3.0.1-07a8a2-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages最新でもいいやw(適当)
6-2-2. バージョン指定してインストール
sudo apt-get install -y --no-install-recommends kubelet=1.19.6-00 kubeadm=1.19.6-00 kubectl=1.19.6-00 kubernetes-cni6-2-3. バージョン確認
$ kubelet --version Kubernetes v1.19.6 $ $ kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.6", GitCommit:"fbf646b339dc52336b55d8ec85c181981b86331a", GitTreeState:"clean", BuildDate:"2020-12-18T12:07:25Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/arm"} $ $ kubectl version Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.6", GitCommit:"fbf646b339dc52336b55d8ec85c181981b86331a", GitTreeState:"clean", BuildDate:"2020-12-18T12:09:30Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/arm"} Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.6", GitCommit:"fbf646b339dc52336b55d8ec85c181981b86331a", GitTreeState:"clean", BuildDate:"2020-12-18T12:01:36Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/arm"}6-3. というわけで
無事
Docker:19.03.14
Kubernetes:1.19.6
になりましたー\(^O^)/で、kubeadm initもいくつかWARNINGがでているけど、
Memory 1MB問題も起こらず、インストールできました!$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16 I0102 01:10:31.569593 5226 version.go:252] remote version is much newer: v1.20.1; falling back to: stable-1.19 W0102 01:10:31.967024 5226 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io] [init] Using Kubernetes version: v1.19.6 [preflight] Running pre-flight checks [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/ [WARNING SystemVerification]: missing optional cgroups: hugetlb [preflight] Pulling images required for setting up a Kubernetes cluster [preflight] This might take a minute or two, depending on the speed of your internet connection [preflight] You can also perform this action in beforehand using 'kubeadm config images pull'get nodeもconnection refusedを繰り返さなくなりましたー\(^O^)/
$ kubectl get node NAME STATUS ROLES AGE VERSION k8s-m Ready master 10h11m v1.19.6 k8s-w1 Ready <none> 10h15m v1.19.6 k8s-w2 Ready <none> 10h16m v1.19.6 k8s-w3 Ready <none> 10h18m v1.19.6おしまい。
- 投稿日:2021-01-05T18:23:04+09:00
docker / docker-compose バージョン指定 インストール (アップ|ダウン)
インストール 覚え書き
function version () { [ -e $1 ] && $1 -v | sed -r 's/.* ([\.0-9]+), .*$/\1/' } VER=19.03.8 BIN=/usr/bin/docker if [ $(version $BIN) != $VER ]; then curl -s -fsSL https://get.docker.com \ | sed 's/sleep [0-9]*//' \ | sed 's/apt-get install/apt-get install --allow-downgrades/' \ | VERSION=${VER} sh fi VER=1.24.1 BIN=/usr/bin/docker-compose if [ $(version $BIN) != $VER ]; then URL=https://github.com/docker/compose/releases/download/${VER}/docker-compose-$(uname -s)-$(uname -m) curl -s -L $URL -o ${BIN} chmod +x ${BIN} fiリリースノート
https://docs.docker.com/engine/release-notes/
https://docs.docker.com/compose/release-notes/
- 投稿日:2021-01-05T18:16:32+09:00
m1向けdocker-desktop previewが出たので、手持ちのmacbook pro 15inchと対決してみた
スペック
- MacBook Pro 15インチ i7-8750H 6cores メモリ16GB
- MacBook Pro 13インチ m1 メモリ16GBdocker-compose upでnode:12でアプリビルド x 4コンテナ
毎回事前にdocker-compose down
3回ストップウォッチ計測
1回目 2回目 3回目 i7 55s 57s 61s m1 32s 31s 31s m1速いな!!
- 投稿日:2021-01-05T17:48:11+09:00
ARM64(ラズパイ/Mac M1)用のKibanaコンテナイメージを作る
はじめに
KibanaのARM64コンテナイメージがないので自作しているのですが、嬉しい事にARM64のtarball版が提供されるようになっていたので、それを利用してコンテナイメージを作成します。
環境
Raspberry Pi 4B (RAM 4GB)
- RaspiOS 64bit (Buster)
- podman (dockerでも可)
Mac mini 2020 Apple M1 (RAM 16GB)
- macOS Big Sur 11.1
- Docker 2.10.1 AppleSilicon Preview7
手順
githubにelasticのdockerfileが公開されているので、cloneしてきます。
# git clone --depth=1 -b 7.10 https://github.com/elastic/dockerfiles Cloning into 'dockerfiles'... remote: Enumerating objects: 30, done. remote: Counting objects: 100% (30/30), done. remote: Compressing objects: 100% (23/23), done. remote: Total 30 (delta 0), reused 17 (delta 0), pack-reused 0 Unpacking objects: 100% (30/30), done.DockerfileをARM64に合うよう編集します。
# cd dockerfiles/kibana/ ~/dockerfiles/kibana# cp Dockerfile Dockerfile.org ~/dockerfiles/kibana# vi Dockerfile ~/dockerfiles/kibana# diff Dockerfile Dockerfile.org 16c16 < curl --retry 8 -s -L -O https://artifacts.elastic.co/downloads/kibana/kibana-7.10.1-linux-aarch64.tar.gz && \ --- > curl --retry 8 -s -L -O https://artifacts.elastic.co/downloads/kibana/kibana-7.10.1-linux-x86_64.tar.gz && \ 22c22 < RUN tar --strip-components=1 -zxf /opt/kibana-7.10.1-linux-aarch64.tar.gz --- > RUN tar --strip-components=1 -zxf /opt/kibana-7.10.1-linux-x86_64.tar.gz 43c43 < fontconfig freetype shadow-utils nss && \ --- > fontconfig freetype shadow-utils libnss3.so && \ 50,51c50,51 < RUN curl -L -o /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_aarch64 < RUN echo "45b1bbf56cc03edda81e4220535a025bfe3ed6e93562222b9be4471005b3eeb3 /usr/local/bin/dumb-init" | sha256sum -c - --- > RUN curl -L -o /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_amd64 > RUN echo "37f2c1f0372a45554f1b89924fbb134fc24c3756efaedf11e07f599494e0eff9 /usr/local/bin/dumb-init" | sha256sum -c -あとはbuildします。多数のファイルをchmodしてたりするので、結構時間がかかります。
あと、もう時代はpodmanです。(dockerでもかまいません)~/dockerfiles/kibana# podman build -t kibana:7.10.1 . STEP 1: FROM centos:8 AS builder STEP 2: RUN cd /opt && curl --retry 8 -s -L -O https://artifacts.elastic.co/downloads/kibana/kibana-7.10.1-linux-aarch64.tar.gz && cd - / --> 19830fe514e STEP 3: RUN mkdir /usr/share/kibana --> 0a09e9dffcc STEP 4: WORKDIR /usr/share/kibana --> 4ef0fa15c55 STEP 5: RUN tar --strip-components=1 -zxf /opt/kibana-7.10.1-linux-aarch64.tar.gz --> c25c4684458 STEP 6: RUN chmod -R g=u /usr/share/kibana --> 1dd443d53d0 STEP 7: RUN find /usr/share/kibana -type d -exec chmod g+s {} \; --> 3ff7718b298 STEP 8: FROM centos:8 STEP 9: EXPOSE 5601 --> 14b28faf60f STEP 10: RUN for iter in {1..10}; do yum update --setopt=tsflags=nodocs -y && yum install --setopt=tsflags=nodocs -y fontconfig freetype shadow-utils nss && yum clean all && exit_code=0 && break || exit_code=$? && echo "yum error: retry $iter in 10s" && sleep 10; done; (exit $exit_code) CentOS Linux 8 - AppStream 4.7 MB/s | 5.3 MB 00:01 CentOS Linux 8 - BaseOS 2.2 MB/s | 1.9 MB 00:00 CentOS Linux 8 - Extras 3.3 kB/s | 8.6 kB 00:02 Last metadata expiration check: 0:00:01 ago on Tue Jan 5 01:43:32 2021. Dependencies resolved. Nothing to do. Complete! Last metadata expiration check: 0:00:03 ago on Tue Jan 5 01:43:32 2021. Package shadow-utils-2:4.6-11.el8.aarch64 is already installed. Dependencies resolved. ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: fontconfig aarch64 2.13.1-3.el8 baseos 273 k freetype aarch64 2.9.1-4.el8_3.1 baseos 370 k nss aarch64 3.53.1-11.el8_2 appstream 682 k Installing dependencies: crypto-policies-scripts noarch 20200713-1.git51d1222.el8 baseos 67 k dejavu-fonts-common noarch 2.35-6.el8 baseos 74 k dejavu-sans-fonts noarch 2.35-6.el8 baseos 1.5 M file aarch64 5.33-16.el8 baseos 77 k fontpackages-filesystem noarch 1.44-22.el8 baseos 16 k gettext aarch64 0.19.8.1-17.el8 baseos 1.1 M gettext-libs aarch64 0.19.8.1-17.el8 baseos 296 k grub2-common noarch 1:2.02-90.el8 baseos 884 k grub2-tools aarch64 1:2.02-90.el8 baseos 1.8 M grub2-tools-minimal aarch64 1:2.02-90.el8 baseos 194 k libcroco aarch64 0.6.12-4.el8_2.1 baseos 108 k libgomp aarch64 8.3.1-5.1.el8 baseos 196 k libpng aarch64 2:1.6.34-5.el8 baseos 119 k nspr aarch64 4.25.0-2.el8_2 appstream 135 k nss-softokn aarch64 3.53.1-11.el8_2 appstream 466 k nss-softokn-freebl aarch64 3.53.1-11.el8_2 appstream 263 k nss-sysinit aarch64 3.53.1-11.el8_2 appstream 71 k nss-util aarch64 3.53.1-11.el8_2 appstream 131 k os-prober aarch64 1.74-6.el8 baseos 55 k which aarch64 2.21-12.el8 baseos 48 k Installing weak dependencies: grubby aarch64 8.40-41.el8 baseos 49 k Transaction Summary ================================================================================ Install 24 Packages Total download size: 8.8 M Installed size: 36 M Downloading Packages: (1/24): nspr-4.25.0-2.el8_2.aarch64.rpm 1.4 MB/s | 135 kB 00:00 (2/24): nss-softokn-freebl-3.53.1-11.el8_2.aarc 3.6 MB/s | 263 kB 00:00 (3/24): nss-3.53.1-11.el8_2.aarch64.rpm 3.5 MB/s | 682 kB 00:00 (4/24): nss-sysinit-3.53.1-11.el8_2.aarch64.rpm 2.7 MB/s | 71 kB 00:00 (5/24): nss-util-3.53.1-11.el8_2.aarch64.rpm 4.9 MB/s | 131 kB 00:00 (6/24): nss-softokn-3.53.1-11.el8_2.aarch64.rpm 2.0 MB/s | 466 kB 00:00 (7/24): crypto-policies-scripts-20200713-1.git5 1.2 MB/s | 67 kB 00:00 (8/24): dejavu-fonts-common-2.35-6.el8.noarch.r 1.5 MB/s | 74 kB 00:00 (9/24): file-5.33-16.el8.aarch64.rpm 2.2 MB/s | 77 kB 00:00 (10/24): fontpackages-filesystem-1.44-22.el8.no 939 kB/s | 16 kB 00:00 (11/24): fontconfig-2.13.1-3.el8.aarch64.rpm 2.9 MB/s | 273 kB 00:00 (12/24): freetype-2.9.1-4.el8_3.1.aarch64.rpm 3.0 MB/s | 370 kB 00:00 (13/24): gettext-libs-0.19.8.1-17.el8.aarch64.r 2.8 MB/s | 296 kB 00:00 (14/24): dejavu-sans-fonts-2.35-6.el8.noarch.rp 4.4 MB/s | 1.5 MB 00:00 (15/24): gettext-0.19.8.1-17.el8.aarch64.rpm 3.7 MB/s | 1.1 MB 00:00 (16/24): grub2-tools-minimal-2.02-90.el8.aarch6 2.3 MB/s | 194 kB 00:00 (17/24): grub2-common-2.02-90.el8.noarch.rpm 4.2 MB/s | 884 kB 00:00 (18/24): grubby-8.40-41.el8.aarch64.rpm 1.1 MB/s | 49 kB 00:00 (19/24): libcroco-0.6.12-4.el8_2.1.aarch64.rpm 2.0 MB/s | 108 kB 00:00 (20/24): libpng-1.6.34-5.el8.aarch64.rpm 2.4 MB/s | 119 kB 00:00 (21/24): libgomp-8.3.1-5.1.el8.aarch64.rpm 2.5 MB/s | 196 kB 00:00 (22/24): os-prober-1.74-6.el8.aarch64.rpm 1.9 MB/s | 55 kB 00:00 (23/24): which-2.21-12.el8.aarch64.rpm 1.3 MB/s | 48 kB 00:00 (24/24): grub2-tools-2.02-90.el8.aarch64.rpm 5.2 MB/s | 1.8 MB 00:00 -------------------------------------------------------------------------------- Total 4.1 MB/s | 8.8 MB 00:02 warning: /var/cache/dnf/appstream-37e43cd1a3e4f490/packages/nspr-4.25.0-2.el8_2.aarch64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY CentOS Linux 8 - AppStream 1.2 MB/s | 1.6 kB 00:00 Importing GPG key 0x8483C65D: Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>" Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial Key imported successfully Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : nspr-4.25.0-2.el8_2.aarch64 1/24 Running scriptlet: nspr-4.25.0-2.el8_2.aarch64 1/24 Installing : nss-util-3.53.1-11.el8_2.aarch64 2/24 Installing : libgomp-8.3.1-5.1.el8.aarch64 3/24 Running scriptlet: libgomp-8.3.1-5.1.el8.aarch64 3/24 Installing : libcroco-0.6.12-4.el8_2.1.aarch64 4/24 Running scriptlet: libcroco-0.6.12-4.el8_2.1.aarch64 4/24 Installing : grub2-common-1:2.02-90.el8.noarch 5/24 Installing : fontpackages-filesystem-1.44-22.el8.noarch 6/24 Installing : dejavu-fonts-common-2.35-6.el8.noarch 7/24 Installing : dejavu-sans-fonts-2.35-6.el8.noarch 8/24 Installing : gettext-libs-0.19.8.1-17.el8.aarch64 9/24 Installing : gettext-0.19.8.1-17.el8.aarch64 10/24 Running scriptlet: gettext-0.19.8.1-17.el8.aarch64 10/24 install-info: No such file or directory for /usr/share/info/gettext.info.gz Installing : grub2-tools-minimal-1:2.02-90.el8.aarch64 11/24 Installing : nss-softokn-freebl-3.53.1-11.el8_2.aarch64 12/24 Installing : nss-softokn-3.53.1-11.el8_2.aarch64 13/24 Installing : which-2.21-12.el8.aarch64 14/24 Installing : os-prober-1.74-6.el8.aarch64 15/24 Installing : libpng-2:1.6.34-5.el8.aarch64 16/24 Installing : freetype-2.9.1-4.el8_3.1.aarch64 17/24 Installing : file-5.33-16.el8.aarch64 18/24 Running scriptlet: grub2-tools-1:2.02-90.el8.aarch64 19/24 Installing : grub2-tools-1:2.02-90.el8.aarch64 19/24 Running scriptlet: grub2-tools-1:2.02-90.el8.aarch64 19/24 install-info: No such file or directory for /usr/share/info/grub2.info.gz install-info: No such file or directory for /usr/share/info/grub2-dev.info.gz Installing : grubby-8.40-41.el8.aarch64 20/24 Installing : crypto-policies-scripts-20200713-1.git51d1222.el8. 21/24 Installing : nss-3.53.1-11.el8_2.aarch64 22/24 Installing : nss-sysinit-3.53.1-11.el8_2.aarch64 23/24 Installing : fontconfig-2.13.1-3.el8.aarch64 24/24 Running scriptlet: fontconfig-2.13.1-3.el8.aarch64 24/24 Running scriptlet: crypto-policies-scripts-20200713-1.git51d1222.el8. 24/24 Running scriptlet: nss-3.53.1-11.el8_2.aarch64 24/24 Running scriptlet: fontconfig-2.13.1-3.el8.aarch64 24/24 Verifying : nspr-4.25.0-2.el8_2.aarch64 1/24 Verifying : nss-3.53.1-11.el8_2.aarch64 2/24 Verifying : nss-softokn-3.53.1-11.el8_2.aarch64 3/24 Verifying : nss-softokn-freebl-3.53.1-11.el8_2.aarch64 4/24 Verifying : nss-sysinit-3.53.1-11.el8_2.aarch64 5/24 Verifying : nss-util-3.53.1-11.el8_2.aarch64 6/24 Verifying : crypto-policies-scripts-20200713-1.git51d1222.el8. 7/24 Verifying : dejavu-fonts-common-2.35-6.el8.noarch 8/24 Verifying : dejavu-sans-fonts-2.35-6.el8.noarch 9/24 Verifying : file-5.33-16.el8.aarch64 10/24 Verifying : fontconfig-2.13.1-3.el8.aarch64 11/24 Verifying : fontpackages-filesystem-1.44-22.el8.noarch 12/24 Verifying : freetype-2.9.1-4.el8_3.1.aarch64 13/24 Verifying : gettext-0.19.8.1-17.el8.aarch64 14/24 Verifying : gettext-libs-0.19.8.1-17.el8.aarch64 15/24 Verifying : grub2-common-1:2.02-90.el8.noarch 16/24 Verifying : grub2-tools-1:2.02-90.el8.aarch64 17/24 Verifying : grub2-tools-minimal-1:2.02-90.el8.aarch64 18/24 Verifying : grubby-8.40-41.el8.aarch64 19/24 Verifying : libcroco-0.6.12-4.el8_2.1.aarch64 20/24 Verifying : libgomp-8.3.1-5.1.el8.aarch64 21/24 Verifying : libpng-2:1.6.34-5.el8.aarch64 22/24 Verifying : os-prober-1.74-6.el8.aarch64 23/24 Verifying : which-2.21-12.el8.aarch64 24/24 Installed: crypto-policies-scripts-20200713-1.git51d1222.el8.noarch dejavu-fonts-common-2.35-6.el8.noarch dejavu-sans-fonts-2.35-6.el8.noarch file-5.33-16.el8.aarch64 fontconfig-2.13.1-3.el8.aarch64 fontpackages-filesystem-1.44-22.el8.noarch freetype-2.9.1-4.el8_3.1.aarch64 gettext-0.19.8.1-17.el8.aarch64 gettext-libs-0.19.8.1-17.el8.aarch64 grub2-common-1:2.02-90.el8.noarch grub2-tools-1:2.02-90.el8.aarch64 grub2-tools-minimal-1:2.02-90.el8.aarch64 grubby-8.40-41.el8.aarch64 libcroco-0.6.12-4.el8_2.1.aarch64 libgomp-8.3.1-5.1.el8.aarch64 libpng-2:1.6.34-5.el8.aarch64 nspr-4.25.0-2.el8_2.aarch64 nss-3.53.1-11.el8_2.aarch64 nss-softokn-3.53.1-11.el8_2.aarch64 nss-softokn-freebl-3.53.1-11.el8_2.aarch64 nss-sysinit-3.53.1-11.el8_2.aarch64 nss-util-3.53.1-11.el8_2.aarch64 os-prober-1.74-6.el8.aarch64 which-2.21-12.el8.aarch64 Complete! 21 files removed --> f21d1615b18 STEP 11: RUN curl -L -o /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_aarch64 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 647 100 647 0 0 1937 0 --:--:-- --:--:-- --:--:-- 1937 100 71256 100 71256 0 0 48838 0 0:00:01 0:00:01 --:--:-- 95645 --> 723e82b056a STEP 12: RUN echo "45b1bbf56cc03edda81e4220535a025bfe3ed6e93562222b9be4471005b3eeb3 /usr/local/bin/dumb-init" | sha256sum -c - /usr/local/bin/dumb-init: OK --> 3febee5eb18 STEP 13: RUN chmod +x /usr/local/bin/dumb-init --> bc0487b93b5 STEP 14: RUN mkdir /usr/share/fonts/local --> 4ec111a772d STEP 15: RUN curl -L -o /usr/share/fonts/local/NotoSansCJK-Regular.ttc https://github.com/googlefonts/noto-cjk/raw/NotoSansV2.001/NotoSansCJK-Regular.ttc % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 159 100 159 0 0 460 0 --:--:-- --:--:-- --:--:-- 459 100 19.3M 100 19.3M 0 0 5909k 0 0:00:03 0:00:03 --:--:-- 10.8M --> a4ef4dfcb8a STEP 16: RUN echo "5dcd1c336cc9344cb77c03a0cd8982ca8a7dc97d620fd6c9c434e02dcb1ceeb3 /usr/share/fonts/local/NotoSansCJK-Regular.ttc" | sha256sum -c - /usr/share/fonts/local/NotoSansCJK-Regular.ttc: OK --> 4b91efb6b5d STEP 17: RUN fc-cache -v /usr/share/fonts: skipping, existing cache is valid: 0 fonts, 2 dirs /usr/share/fonts/dejavu: skipping, existing cache is valid: 9 fonts, 0 dirs /usr/share/fonts/local: skipping, existing cache is valid: 10 fonts, 0 dirs /usr/share/X11/fonts/Type1: skipping, no such directory /usr/share/X11/fonts/TTF: skipping, no such directory /usr/local/share/fonts: skipping, no such directory /root/.local/share/fonts: skipping, no such directory /root/.fonts: skipping, no such directory /usr/share/fonts/dejavu: skipping, looped directory detected /usr/share/fonts/local: skipping, looped directory detected /usr/lib/fontconfig/cache: cleaning cache directory /root/.cache/fontconfig: not cleaning non-existent cache directory /root/.fontconfig: not cleaning non-existent cache directory /usr/bin/fc-cache-64: succeeded --> e799200b93c STEP 18: COPY --from=builder --chown=1000:0 /usr/share/kibana /usr/share/kibana --> 95d34b78229 STEP 19: WORKDIR /usr/share/kibana --> af91a2e64e0 STEP 20: RUN ln -s /usr/share/kibana /opt/kibana --> ff975005e0f STEP 21: ENV ELASTIC_CONTAINER true --> 913ef578b8c STEP 22: ENV PATH=/usr/share/kibana/bin:$PATH --> 10f708b5548 STEP 23: COPY --chown=1000:0 config/kibana.yml /usr/share/kibana/config/kibana.yml --> 3f9ddd395b3 STEP 24: COPY --chown=1000:0 bin/kibana-docker /usr/local/bin/ --> d9a73a2b085 STEP 25: RUN chmod g+ws /usr/share/kibana && find /usr/share/kibana -gid 0 -and -not -perm /g+w -exec chmod g+w {} \; --> d31ea9b1844 STEP 26: RUN find / -xdev -perm -4000 -exec chmod u-s {} + --> a8808cae581 STEP 27: RUN groupadd --gid 1000 kibana && useradd --uid 1000 --gid 1000 --home-dir /usr/share/kibana --no-create-home kibana --> f2bc3dd0ed3 STEP 28: LABEL org.label-schema.build-date="2020-12-05T02:04:38.350Z" org.label-schema.license="Elastic License" org.label-schema.name="Kibana" org.label-schema.schema-version="1.0" org.label-schema.url="https://www.elastic.co/products/kibana" org.label-schema.usage="https://www.elastic.co/guide/en/kibana/reference/index.html" org.label-schema.vcs-ref="608c5e5dd32659e8afadd520d0cdc58766ba505b" org.label-schema.vcs-url="https://github.com/elastic/kibana" org.label-schema.vendor="Elastic" org.label-schema.version="7.10.1" org.opencontainers.image.created="2020-12-05T02:04:38.350Z" org.opencontainers.image.documentation="https://www.elastic.co/guide/en/kibana/reference/index.html" org.opencontainers.image.licenses="Elastic License" org.opencontainers.image.revision="608c5e5dd32659e8afadd520d0cdc58766ba505b" org.opencontainers.image.source="https://github.com/elastic/kibana" org.opencontainers.image.title="Kibana" org.opencontainers.image.url="https://www.elastic.co/products/kibana" org.opencontainers.image.vendor="Elastic" org.opencontainers.image.version="7.10.1" --> 1ce105128f5 STEP 29: USER kibana --> c59ed1347f4 STEP 30: ENTRYPOINT ["/usr/local/bin/dumb-init", "--"] --> 954ff1f374b STEP 31: CMD ["/usr/local/bin/kibana-docker"] STEP 32: COMMIT kibana:7.10.1 --> 434eac9bb86 434eac9bb866c223f31e7ba8e0ac715249ac18746a09cc6be727381ed04806fe出来上がりです。
~/dockerfiles/kibana# podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/kibana 7.10.1 434eac9bb866 9 minutes ago 1.12 GBM1搭載のMacでも同じDockerfileでbuildできる事を確認しています。Preview版だからなのか30分以上かかってます。(ラズパイの倍...)
使い方
公式マニュアルを参照してください。
https://www.elastic.co/guide/en/kibana/current/docker.html環境変数でほとんどの設定ができると思います。
環境変数名は、bin/kibana-docker内の「kibana_vars」に書かれてある変数名(kibanaの設定ファイルに定義する変数名)を、全部大文字にして「.」を「_」に変えれば良いようです。~/dockerfiles/kibana# cat bin/kibana-docker : kibana_vars=( console.enabled console.proxyConfig console.proxyFilter ops.cGroupOverrides.cpuPath ops.cGroupOverrides.cpuAcctPath cpu.cgroup.path.override cpuacct.cgroup.path.override csp.rules csp.strict csp.warnLegacyBrowsers elasticsearch.customHeaders elasticsearch.hosts elasticsearch.logQueries elasticsearch.password elasticsearch.pingTimeout elasticsearch.requestHeadersWhitelist elasticsearch.requestTimeout :私の環境の例ですが、kubernetesでは以下のようなyamlでデプロイしています。
一応、「NODE_OPTIONS」も設定しています。# cat kibana.yaml apiVersion: apps/v1 kind: Deployment metadata: name: kibana namespace: elastic labels: app: kibana spec: replicas: 1 selector: matchLabels: app: kibana template: metadata: labels: app: kibana spec: containers: - name: kibana image: localhost/kibana:7.10.1 resources: requests: cpu: 1 memory: 1Gi limits: cpu: 1 memory: 1.5Gi env: - name: SERVER_HOST value: "0.0.0.0" - name: I18N_LOCALE value: "ja-JP" - name: ELASTICSEARCH_URL value: "http://elasticsearch:9200" - name: ELASTICSEARCH_USERNAME value: "kibana" - name: ELASTICSEARCH_PASSWORD value: "password" - name: NODE_OPTIONS value: "--max-old-space-size=1024" ports: - name: kibana containerPort: 5601OSの空きメモリーが「limits.memory」の値で、「Memory Size(GB)」グラフの「Heap size Limit」も「1.0GB」で「NODE_OPTIONS」が効いてると思います。
M1 Macでも、ARM64版のelasticsearchと組み合わせて問題なく実行もできます。
おわりに
ARM64のコンテナイメージが増えるといいですね。
- 投稿日:2021-01-05T16:03:09+09:00
マイクロサービス 101 - DockerをUbuntuに入れてみた -
はじめに
マイクロサービスを勉強しているとコンテナとかDockerって言葉が出てきて、ちょっと面白そうなのでUbuntuにDockerを入れてみました。そのときのメモです。よかったら見てください。
因みに、Windowsに入れる場合はWindowsのバージョンによって準備するモノが違うようなので注意が必要です。やり方はdocker docs(参考2)にあります。これも後日やってみたいと思います。コンテナ型仮想環境とハイパーバイザ型仮想環境の違い
コンテナとは何でしょうか?Dockerのウェブサイト(参考6)から引用すると
A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another.
要するに、ソフトウェアが安定して素早く複数の環境で動かす仕組みって事ですね。w
従来型の仮想環境技術がハイパーバイザだとすると、コンテナ型の仮想環境技との違いはなんでしょうか。
下の図でみていきましょう。
ハイパーバイザもコンテナも仮想化をする為の層です。それぞれの層の一つ上の層をみてみましょう。ハイパーバイザの上にはOS(ゲスト)が載かっています。OS(ゲスト)からみるとハイパーバイザはハードウェアの役割をはたしているように見えるはずですね。次に、コンテナですがアプリケーションが上に載かっています。アプリケーションからみるとコンテナはOSの役割をはたしているように見えるはずですよね。何の代わり・何の役割を仮想化の層が担っているのかが大きな違いだと思います。ハイパーバイザ型はそれぞれ仮想環境にOSが入っていてCPUやメモリの割当を行っています。コンテナ型にはアプリケーションしか入っておらずCPUやメモリを共有しています。なんとなく、コンテナ型の方が軽量で柔軟性がありそうですね。w
コンテナ/Dockerの仕様を決めているのはOpen Container Initiative(参考3)という所でLinux Foundationの一部だそうです。因みにオーケストレーションツールのKubernetesの仕様を決めているのはCLOUD NATIVE COMPUTING FOUNDATION(参考4)で、こちらもLinux Foundationの一部らしいです。次にインストール方法をみていきましょう。
インストール
Dockerの公式ドキュメントを元にインストールしていきます。(参考7)今回はリポジトリを使ってインストールします。2021年01月07日時点での方法です。
1.まず、古いバージョンが入っていたら削除します。
sudo apt-get remove docker docker-engine docker.io containerd runc
2.リポジトリのセットアップを行います。
おきまりのおまじない。wsudo apt-get update
HTTPSでリポジトリが使えるように必要なパッケージをインストールします。
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
Doker公式のGPG鍵をインストールします。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
インストールしたGPG鍵が正しいかハッシュ値(フィンガープリント)を確認します。この鍵とハッシュ値は変わる可能性があるので、この作業をするときは、公式ドキュメント(参考7)でハッシュ値を確認する事をおすすめします。この記事を書いているときは 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 だったので、最後の8桁で鍵を確認します。
いよいよリポジトリのセットアップ
ここでは、安定版のx86_64/amd64をセットアップします。sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
3.Docker Engineをインストールします。
またおまじない。wsudo apt-get update
そしてインストール
sudo apt-get install docker-ce docker-ce-cli containerd.io
終了です。お疲れ様した。
すこし遊ぶ
Dockerのバージョンを確認するにはこんな感じです。
docker --version
実行中のコンテナを表示するにはこんな感じです。おしりに-aとつけると全てのコンテナが表示されます。
sudo docker ps
イメージのリストを表示します。
sudo docker image ls
hello-worldイメージを試しに実行してみましょうか。
sudo docker run hello-world
初めて実行する場合はdocker hub(参照8)からイメージを取得しコンテナを作って起動します。
この後、コンテナリストとイメージリストを表示させると、こんな感じになるかと思います。
もう一つだけ、ubutuを入れてみましょうか。
コンテナにUbuntu1と名前を付けてみました。docker run --name="Ubuntu1" ubuntu
下記のコマンドでubuntuを起動してシェルが使えるようになります。ただ、Ubuntu1と名前を付けたコンテナではなく新規でコンテナが作成されます。wwコンテナを削除する方法
docker rm コンテナID
イメージを削除する方法
docker rmi イメージID
アンインストール
Dockerをアンインストールする方法
sudo apt-get purge docker-ce docker-ce-cli containerd.io
イメージやコンテナは/var/lib/dockerの下に保存されているみたなので、きれいに消したい場合はここのファイルも消すみたいです。
sudo rm -rf /var/lib/docker
原因はわからないのですが、きれいにアンインストールした後、再度インストールしたらエラーが出たんですよね。
クラッシュレポートが出てたんですけど・・・・見なかった。ごめんなさい、ごめんなさい、ごめんなさい。最後にまとめ
コンテナの管理をどうすれば良いのかは次回以降の投稿にしたいと思います。ありがとうございました。
参考
1.Dockerとは何かを入門者向けに解説!基本コマンドも、https://udemy.benesse.co.jp/development/system/docker.html
2.docker docs、https://docs.docker.com/
3.Open Container Initiative、https://opencontainers.org/about/overview/#
4.CLOUD NATIVE COMPUTING FOUNDATION、https://www.cncf.io/
5.THE LINUX FOUNDATION、https://linuxfoundation.org/
6.What is a Container?、https://www.docker.com/resources/what-container
7.Install Docker Engine on Ubuntu、https://docs.docker.com/engine/install/ubuntu/
8.docker hub、https://hub.docker.com/関連
変更・更新
2021/01/08 早速追記w
docker runはイメージに対して作成&実行するのに対して、docker startはコンテナの実行を行うみたいです。
シンタックス
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
docker start [OPTIONS] CONTAINER [CONTAINER...]
既にUbuntuのイメージで作成済みのコンテナがある場合はdocker start コンテナIDもしくはコンテナ名
docker exec -it コンテナIDもしくはコンテナ名 bash
docker stop コンテナIDもしくはコンテナ名とやれば、コンテナの起動→コンテナに接続(bashシェルを実行)→コンテナの停止が出来ます。
コンテナに自分で名前を付けた場合、この限りではなかったの調べてみたいと思います。起動しても直ぐに停止してしまうんです。
- 投稿日:2021-01-05T15:36:25+09:00
docker psの表示を絞りたい
なにこれ
docker ps
の結果のうち、一部だけを表示するメモ- まとめ:書ききれないのでOfficial Documentationを読もう。特にフィルタリング。
準備
ヘルプ表示$ docker ps -h Flag shorthand -h has been deprecated, please use --help Usage: docker ps [OPTIONS] List containers Options: -a, --all Show all containers (default shows just running) -f, --filter filter Filter output based on conditions provided --format string Pretty-print containers using a Go template -n, --last int Show n last created containers (includes all states) (default -1) -l, --latest Show the latest created container (includes all states) --no-trunc Don't truncate output -q, --quiet Only display container IDs -s, --size Display total file sizeshello-worldコンテナを5つ作成$ for i in `seq 1 5`; do docker run hello-world; done $ docker ps -a -n 5 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bcca4b50f397 hello-world "/hello" About a minute ago Exited (0) About a minute ago cool_hertz e6d3616b5a67 hello-world "/hello" About a minute ago Exited (0) About a minute ago clever_chatelet bd7678b95d36 hello-world "/hello" About a minute ago Exited (0) About a minute ago zealous_maxwell e68109080f0b hello-world "/hello" About a minute ago Exited (0) About a minute ago agitated_fermi d59d057989ce hello-world "/hello" About a minute ago Exited (0) About a minute ago vigilant_kilbyRunningのコンテナだけ表示する
全部Exitedなので表示されない$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
CONTAINER IDで絞る
idが236858d287f8であるものを表示$ docker ps -a -f id=bcca4b50f397 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bcca4b50f397 hello-world "/hello" About a minute ago Exited (0) About a minute ago cool_hertzNAMEで絞る
NAMEがcool_hertzであるものを表示$ docker ps -a -f name=cool_hertz CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bcca4b50f397 hello-world "/hello" About a minute ago Exited (0) About a minute ago cool_hertzNAMEがcで始まるものを表示$ docker ps -a -f name=^c.* CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bcca4b50f397 hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago cool_hertz e6d3616b5a67 hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago clever_chateletCONTAINER IDだけ出力する
NAMEがcで始まるもののCONTAINER_IDを出力$ docker ps -a -f name=^c.* -q bcca4b50f397 e6d3616b5a67IMAGEだけ出力する
- formatのPlaceHolderについて記事末尾を参照。
NAMEがcで始まるもののIMAGEを出力$ docker ps -a -f name=^c.* --format '{{.Image}}' hello-world hello-worldカラムを限定する
- formatのPlaceHolderについて記事末尾を参照。
CONTAINER_IDとNAMESとPORTSカラムのみ表示$ docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}" CONTAINER ID NAMES PORTS bcca4b50f397 cool_hertz e6d3616b5a67 clever_chatelet bd7678b95d36 zealous_maxwell e68109080f0b agitated_fermi d59d057989ce vigilant_kilby〇〇より前・後に作られたコンテナ
NAME=zealous_maxwellよりまえ$ docker ps -a -f before=zealous_maxwell CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e68109080f0b hello-world "/hello" 4 minutes ago Exited (0) 4 minutes ago agitated_fermi d59d057989ce hello-world "/hello" 4 minutes ago Exited (0) 4 minutes ago vigilant_kilbyNAME=zealous_maxwellよりあと$ docker ps -a -f since=zealous_maxwell CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bcca4b50f397 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago cool_hertz e6d3616b5a67 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago clever_chatelet最後からn番目まで
最後に作られたコンテナdocker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bcca4b50f397 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago cool_hertz最後から3番目まで$ docker ps -a -n 3 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bcca4b50f397 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago cool_hertz e6d3616b5a67 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago clever_chatelet bd7678b95d36 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago zealous_maxwellラベルで絞る
- 参照:クエリ・ラベル
com.example.is-betaがのラベルが存在するものすべて$ docker ps --filter "label=com.example.is-beta"colorラベルの値がblueのもの$ docker ps --filter "label=color=blue"PlaceHolderについて
Placeholder (だいたい対応する)カラム名 Description .ID CONTAINER ID コンテナID .Image IMAGE イメージID .Command COMMAND コマンド .CreatedAt CREATED コンテナの作成日時 .RunningFor CREATEDから計算 コンテナの開始からの時間 .Ports PORTS 開放するポート .State STATUS コンテナのステータス (例えば; “created”, “running”, “exited”). .Status STATUS コンテナのステータス(詳細付き) .Size SIZE コンテナのサイズ .Names NAMES コンテナ名 .Labels - コンテナについたすべてのラベル .Label - コンテナについた特定のラベル。 例えば '{{.Label "com.docker.swarm.cpu"}}' .Mounts - マウントされたボリューム .Networks - アタッチされたネットワーク ついでに
絞った結果のコンテナをすべて削除する
直近3個のコンテナを削除する# とりあえずxargsでdocker rmにCONTAINER IDをすべて渡せば消せる $ docker ps -a -n 3 -q | xargs docker rmサイズで絞るのは面倒
失敗例# 一番左にsizeカラムが来るようにしたうえで、sortコマンドに処理させたらいいかと思ったが、 # 単位が邪魔だし、size/virtual sizeかも邪魔で区別できないので失敗する $ docker ps -a -n 3 --format "table {{.Size}}\t{{.ID}}\t{{.Names}}\t{{.Ports}}" | (read -r; printf "%s\n"; sort -k 1)
- 投稿日:2021-01-05T15:24:24+09:00
AWS SSMエージェント起動
SSMエージェントを起動する。
自分はFargateを利用してRailsアプリケーションをデプロイしました。
そこで、Fargateでサーバ内にターミナルで入る手段にSSMというのを発見したので、
これを活用しましたが、少し躓いた点があったので共有します。自分の場合ディレクトリ構成はこんな感じです。
今回使用するのはDockerfile.producionとentrypoint.shのみです。
※Dockerfileはdevelopment用で、Dockerfile.productionが今回利用するものです。
staging環境は用意していません。/application L /app L /bin ... L Dockerfile L Dockerfile.production L entrypoint.sh ...1.entrypoint.shからハイブリットアクティベーションを作成する。
まず、SSMエージェントを起動するにはハイブリットアクティベーションというのを作成する必要があります。
AWS→SystemsManager→ハイブリッドアクティベーションから手動で作成することもできますが、自分はentrypoint.shでハイブリットアクティベーションを作成しました。entrypoint.shSSM_ACTIVATE_INFO=`aws ssm create-activation --iam-role service-role/AmazonEC2RunCommandRoleForManagedInstances --registration-limit 1 --region ap-northeast-1 --default-instance-name medley-blog-fargate-container` SSM_ACTIVATE_CODE=`echo $SSM_ACTIVATE_INFO | jq -r '.ActivationCode'` SSM_ACTIVATE_ID=`echo $SSM_ACTIVATE_INFO | jq -r '.ActivationId'`2.マネージドインスタンスを登録する。
次に先程作成したハイブリットアクティベーションを使いマネージドインスタンスを登録します。
entrypoint.sh# 一番下に次を追加 amazon-ssm-agent -register -code $SSM_ACTIVATE_CODE -id $SSM_ACTIVATE_ID -region "ap-northeast-1"※自分でハイブリットアクティベーションを作成した場合は環境変数にIDとCODEを保存し利用してください。
3.SSMエージェントを起動
entrypoint.sh# 一番下に次を追加 amazon-ssm-agent &
これでSSMエージェントが起動できるはずですがECSのタスク定義から起動しようとしても起動しませんでした。
そこでDockerfileからentrypint.shを起動するとどうかと思い、Dockerfileから起動してみたところ無事起動しました。
Dockerfile.productionCOPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"]原因は定かではありませんが、ハイブリットアクティベーションの登録まではECSのタスク定義からでも出来ていたので、「Dockerコンテナ自体はECS側にデプロイされていて、ただそのコンテナが動くようなコマンドがコンテナ内にない」という感じでしょうか?
ただ、他の記事ではECSタスク定義のエントリポイントからも出来ている記事があったので謎です。
もし、分かる人がいれば教えて下さい。まあ、DockerfileからENTRYPOINTで起動できたので良かったです。
参考記事
- 投稿日:2021-01-05T07:57:16+09:00
dockerを使うときはバージョンを指定しよう
- 投稿日:2021-01-05T07:54:23+09:00
AWS上にDockerで環境構築コマンドメモ
AWS上にDockerで環境構築したときのメモです。
AWS上にDocker環境構築方法
方法 備考 Dockerレジストリを使う Docker Hubにイメージをpullして、pushする。 Dockerfileを送る build contextを変えたい、サーバー上で編集したいとき。GitHubを使ったり。 Docker imageをtarにして送る サーバーがインターネットにアクセスできないとき。 以下、送る方法について使ったコマンドメモです。
AWSにSSHアクセス
鍵をダウンロード:mydocker.pem
鍵のアクセス権限を変更
$ chmod 400 mydocker.pem各パーミッションの数値は、所有者、所有グループ、その他。数字の意味は、以下の合計値(全権限は7、readのみなら4)。
数値 権限 4 read 2 write 1 execute 0 no permission SSHアクセス
$ ssh -i mydocker.pem <username>@<hostname>ubuntuのawsインスタンスの場合ははubuntu、はPublic DNS。
SFTPでファイル転送
SFTPはSecure File Transfer Protocol。
SFTPでアクセス
$ sftp -i mydocker.pem <username>@<hostname>ファイルをアップロード
$ put local/path <remote/path><remote/path>を指定しない場合はアップロード先のカレントディレクトリ。
ファイルをダウンロード
$ get remote/path <local/path><local/path>を指定しない場合は、sftpを実行したときのディレクトリ。
Docker imageをtarに
Docker imageをtarファイルに
$ docker save <image> > <filename>tarファイルからDocker imageに
$ docker load < <tar filename>その他
ディスク容量を確認するLinuxコマンド
$ df -h
- 投稿日:2021-01-05T02:33:11+09:00
簡単にできるgit導入からdocker起動まで python編
これは何?
作業を忘れる俺のための備忘録
pycharmからgitを操作する予定
これをやれば自分のパソコンを汚さず作業ができるようになるだからやれ
とにかくやれgit導入
gitはいろいろと便利だから使えるようになってるといいね
1.インストール
まずは、以下のサイトからGitをダウンロード
https://git-for-windows.github.io/あとは道なりに進めばインスト―ル完了
詳しい道のりは説明がめんどくさいから調べて2.ユーザ名とメールアドレスの登録
コンソールで
$ git config --global user.name "ユーザー名"
$ git config --global user.email "メールアドレス"
を打ち込むと登録が完了するgithub側の作業
githubのアカウントを作成し、githubのホームページへ行き右上の"+"からnew repositoryでリポジトリを作成する
Repository nameで名前を決める
publicかprivateか決めてcreate repositoryをクリックすると画面に意味深なurlが出てくるからそれをコピーしてターミナルへ
Codeからでもurlを発行できるからcloneしたときとかはここからやろう
gitのプロジェクトを置きたいディレクトリに移動をして
git clone <url>
こうすることでgitと繋がったディレクトリができるのでpycharmでもなんでも開く.gitignoreの作成
ディレクトリは完成したがこのままではなんでもgithubで共有されるので
.gitignore
を作る
ディレクトリ直下に.gitignore
って名前のファイルを作るhttps://github.com/github/gitignore/blob/master/Global/JetBrains.gitignore
JetBeain系列のIDEを使ってるなら上のソースコードをコピペする
他のIDEは知らん共有したくないファイルのパスをここに追記する
これでメモなどの他人と共有したくないファイルがgit側に共有されなくなるDocker側の作業
github側の作業が終わったら次はdockerの作業
インストール
これにDocker for desktopのインストールからpycharm連携まですべてが詰まってる
https://qiita.com/Denpa_Ghost/items/caeddaa29bd9d7514ccedocker-compose.ymlの作成
ディレクトリ直下にdocker-conpose.ymlを作って以下をコピペする
docker-compose.ymlversion: '3' services: app: build: docker/python tty: true volumes: - ./app/:/app working_dir: /app
build:
がdockerfileの格納先の指定
tty:
が起動後待機状態にするか
falseや未記入で動いてるものがないとすぐに落ちるため必須
volumes:
がホスト機のフォルダとコンテナ内のフォルダをつなげる役割を持つ
左がホスト機、右がコンテナ内
ホスト側でフォルダがない場合新規に作成される
working_dir:
はデフォルトの作業場の指定dockerfileの作成
docker-compose.ymlを作ったら
build:
で指定したパスにdockerfileを作る
slackのbotを動かすなら以下をコピペするdockerfileFROM python:latest RUN mkdir -p /app RUN pip install slackbot
FROM
はdocker imageを設定する
RUN
はコンテナ生成後に入力するコマンドを入れる
docker imageに入ってない他のパッケージを入れたい場合などに使うといい上記のならコンテナ生成後、appディレクトリを作成してslackbotのパッケージをインストールをする
主にlinuxのターミナルでできることならなんでもできるコンテナの生成
ここまで来たらあとはコンテナを作るだけ
docker-compose.ymlがあるディレクトリ内で
docker-compose up --build -d
をすることでコンテナを生成できる初回起動
docker-compose up --build -d
次回以降
docker-compose up -d
コンテナをまとめて止める
docker-copose stop
コンテナをまとめて消す
docker-compose down
コンテナとイメージをまとめて消す
docker-compose down --rmi
.pyの実行
プログラム作った実行したいときは
docker ps
で実行したいコンテナのnameをコピーして
docker exec -it <name> bash
でコンテナ内のターミナルへアクセスできる
あとは普通にpython main.py
などでpythonの実行をするターミナルへアクセスせずに実行をしたい場合は
docker exec -it <name> <プログラム名>
でターミナルへ入らずに実行ができる終わりに
質問や文句があるなら荒川までお願いします
対応したりしなかったりしますこれで快適python生活を楽しもう!