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

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を使ってフロントエンドから開発していきましょう!

その前に、前回のおさらいとして、アプリの構成図を載せておきます!

アプリ構成

Architecture.png

  • ポイント①:nginxサーバーをブラウザとシステムの間に挟むことで、プロキシサーバー・ルーターとしての役割を与えたこと。リクエストのパラメーターに「/」だけ指定してある場合はNextJS、パラメータに「/api」が指定されている場合はNestJSに振り分けるように設定します。
  • ポイント②:Dockerコンテナ内でアプリを起動すること。こうすることで、環境依存しない開発が可能になります。

NextJSでフロントエンドを実装しよう!

プロジェクトの作成

まずは、フロントエンド! 以下のコマンドを叩いてプロジェクトを作成しましょう!

NextJSのドキュメンテーションはこちら

# npm派はこちら
npx create-next-app
# yarn派はこちら
yarn create next-app

すると、以下のようにプロジェクトが作成されます!

スクリーンショット 2021-01-05 17.26.34.png

Typescriptの設定ファイルを作成

ただ、今回はTypescriptを使っていきたいのでtsconfig.json設定ファイルをルートディレクトリーに作成していきましょう!

touch tsconfig.json

# yarn run devで試しに実行してみると、以下のdependenciesをインストールする
ように怒られるのでしておく

yarn add --dev typescript @types/react @types/node

tsconfig.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に設定しておきましょう。

ついでにESLINTPrettierの設定もしておく

開発コードは予め可読性を高くしておきたいです、、、ウムウム

個人の好みはあると思いますが、最低限の設定はしておきましょう!

私はVSCodeをエディタとして使用しているので、ESLintとPrettierのプラグインを入れておきます。

prettierrc.js
module.exports = {
  semi: true,
  trailingComma: 'es5',
  singleQuote: true,
  printWidth: 100,
  tabWidth: 2,
  useTabs: false,
}
eslintrc.js
module.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.tsx
import 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.tsx
import 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.ts
export 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.yml
version: "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

成功したら映画を登録できるはずです!

ezgif.com-video-to-gif.gif

終わりに

ここまでお付き合いして下さった皆さん!お疲れ様です!
これで、あなたもフルスタックエンジニアですw

今回このブログを書くことで、この分野についてかなり理解が深まったと実感しています。

このブログ記事がこれからNextJS、NestJS、Typescript、Dockerなどで開発を考えている方にとって少しても助けになれば嬉しいです。

正直、NestJSはまだまだ奥が深いです。GraphQL、MicroService、Prisma等々、今ホットな技術スタックにも対応しています。

そこら辺を単発で深掘りするような記事をこれからかけていけたらと思います。

このハンズオンシリーズですが、次回はKubernetesを使用したバージョンの記事も書いていきます。正直、こっちの方がDockerより実践的だと思うので!

ではまた次の機会でお会いしましょう!

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

DockerToolBoxでSQLServerを実行する

DockerToolBoxを利用してSQLServerを構築しました。

SQLServer構築

イメージをプルしてランします。

docker pull mcr.microsoft.com/mssql/server:2019-latest
docker 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                                       testdb

STATUSが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

感想

よくわからないところで躓いてしまった。。。

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

ラズパイKubernetesとDockerのバージョンを下げた話

0.はじめに

2020年〜2021年の冬休みを使って
Qiitaにたくさん存在するラズパイによるKubernetes環境を
諸先輩方の投稿を参考に構築してみました。
IMG_4092.jpg
が。。。。。
インストールはできたけど超不安定。
初心者には手に負えるわけもなく、
最終的には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全てのノードで行います。
ホントはサービス止めたりした方がいいんだろうけど。ムシムシw

4-1. Kubernetesの設定削除

これをやらないと再インストール後に古い設定を参照してしまう >オレ

$ sudo kubeadm reset

4-2. hold解除

apt updateなどでバージョンが勝手に上がらないようにしていたので
まずはhold状態の確認をして、該当するモノをunhold

$ sudo apt-mark showhold
$ sudo apt-mark unhold kubelet kubeadm kubectl kubernetes-cni

4-2. Kubernetesアンインストール

purgeして関連もautoremoveで消します

$ sudo apt-get purge -y kubeadm kubectl kubelet kubernetes-cni kube*
$ sudo apt-get autoremove -y

4-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-cli

5-2. Dockerアンインストール

purgeして関連削除

$ sudo apt-get purge -y docker-ce docker-ce-cli
$ sudo apt-get autoremove -y

5-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 Packages

19.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-buster
6-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:        fec3683

6-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 Packages

1.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-cni
6-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

おしまい。

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

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/

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

m1向けdocker-desktop previewが出たので、手持ちのmacbook pro 15inchと対決してみた

スペック
- MacBook Pro 15インチ i7-8750H 6cores メモリ16GB
- MacBook Pro 13インチ m1 メモリ16GB

docker-compose upでnode:12でアプリビルド x 4コンテナ
毎回事前にdocker-compose down
3回ストップウォッチ計測

1回目 2回目 3回目
i7 55s 57s 61s
m1 32s 31s 31s

m1速いな!!

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

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 GB

M1搭載のMacでも同じDockerfileでbuildできる事を確認しています。Preview版だからなのか30分以上かかってます。(ラズパイの倍...)

スクリーンショット 2021-01-05 12.50.57.png

使い方

公式マニュアルを参照してください。
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: 5601

OSの空きメモリーが「limits.memory」の値で、「Memory Size(GB)」グラフの「Heap size Limit」も「1.0GB」で「NODE_OPTIONS」が効いてると思います。

スクリーンショット 2021-01-05 11.21.22.png

M1 Macでも、ARM64版のelasticsearchと組み合わせて問題なく実行もできます。

スクリーンショット 2021-01-05 13.01.00.png

おわりに

ARM64のコンテナイメージが増えるといいですね。

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

マイクロサービス 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
 従来型の仮想環境技術がハイパーバイザだとすると、コンテナ型の仮想環境技との違いはなんでしょうか。
下の図でみていきましょう。
スクリーンショット 2021-01-07 20-10-07.png
 ハイパーバイザもコンテナも仮想化をする為の層です。それぞれの層の一つ上の層をみてみましょう。ハイパーバイザの上には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.リポジトリのセットアップを行います。
おきまりのおまじない。w

sudo 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桁で鍵を確認します。

sudo apt-key fingerprint 0EBFCD88
スクリーンショット 2021-01-07 22-45-38.png

いよいよリポジトリのセットアップ
ここでは、安定版のx86_64/amd64をセットアップします。

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

3.Docker Engineをインストールします。
またおまじない。w

sudo 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)からイメージを取得しコンテナを作って起動します。
スクリーンショット 2021-01-07 23-24-32.png
この後、コンテナリストとイメージリストを表示させると、こんな感じになるかと思います。
スクリーンショット 2021-01-07 23-46-26.png

もう一つだけ、ubutuを入れてみましょうか。
コンテナにUbuntu1と名前を付けてみました。

docker run --name="Ubuntu1" ubuntu

スクリーンショット 2021-01-07 23-54-37.png
下記のコマンドでubuntuを起動してシェルが使えるようになります。ただ、Ubuntu1と名前を付けたコンテナではなく新規でコンテナが作成されます。ww

docker run -it ubuntu
スクリーンショット 2021-01-08 00-08-50.png

コンテナを削除する方法

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シェルを実行)→コンテナの停止が出来ます。
 コンテナに自分で名前を付けた場合、この限りではなかったの調べてみたいと思います。起動しても直ぐに停止してしまうんです。

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

docker psの表示を絞りたい

なにこれ

準備

ヘルプ表示
$ 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 sizes
hello-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_kilby

Runningのコンテナだけ表示する

全部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_hertz

NAMEで絞る

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_hertz
NAMEが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_chatelet

CONTAINER IDだけ出力する

NAMEがcで始まるもののCONTAINER_IDを出力
$ docker ps -a -f name=^c.* -q
bcca4b50f397
e6d3616b5a67

IMAGEだけ出力する

  • 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_kilby

NAME=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)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.sh
SSM_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のタスク定義から起動しようとしても起動しませんでした。
スクリーンショット 2021-01-05 15.10.10.png

そこでDockerfileからentrypint.shを起動するとどうかと思い、Dockerfileから起動してみたところ無事起動しました。

Dockerfile.production
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

原因は定かではありませんが、ハイブリットアクティベーションの登録まではECSのタスク定義からでも出来ていたので、「Dockerコンテナ自体はECS側にデプロイされていて、ただそのコンテナが動くようなコマンドがコンテナ内にない」という感じでしょうか?

ただ、他の記事ではECSタスク定義のエントリポイントからも出来ている記事があったので謎です。
もし、分かる人がいれば教えて下さい。

まあ、DockerfileからENTRYPOINTで起動できたので良かったです。

参考記事

https://developer.medley.jp/entry/2020/09/18/180404

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

dockerを使うときはバージョンを指定しよう

開発環境をDocker+docker-composeで構築していましたが、環境を作り直したら動かなくなったのでメモ

やったこと

  • docker-compose downでコンテナ削除
  • docker rmiでイメージ削除
  • docker-compose upでコンテナ再作成

原因

コンテナイメージのバージョンを指定しておらず、latestでプルされるイメージが更新されたことにより動かなくなっていた。

結論

dockerコンテナ作成時はちゃんとイメージのバージョンを指定しましょう

※docker imagesで見てもlatestとしか出ないので、バージョンが分からない。。。

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

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

簡単にできる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が出てくるからそれをコピーしてターミナルへ

image.png (51.7 kB)

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/caeddaa29bd9d7514cce

docker-compose.ymlの作成

ディレクトリ直下にdocker-conpose.ymlを作って以下をコピペする

docker-compose.yml
 version: '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を動かすなら以下をコピペする

dockerfile
FROM 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生活を楽しもう!

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