Ubuntu 20.04.2 LTS (Focal Fossa)のdockerをRootless modeでインストールしなおす

はじめに

私のマシンでは、dockerをインストールするのに、公式のリポジトリからインストールしていた。

ところが、この方法でインストールすると、dockerデーモンのプロセスがrootでうごいてしまっているために、sudoを使用する必要がある。

sudoを使用すれば、動かすことは可能なのだが、問題が出てきた。

  • dockerコンテナ内で生成したファイルがrootユーザーで作成されてしまうこと
  • ある種のフレームワークによって docker build を動かすときにsudoをつけることができないこと
    • 私が問題に直面したのは serverless framework 内で docker build するときにつまづいた

そういうわけで、sudo をつけてdockerを動かすことには問題が出てきたのだが、dockerには Rootless mode というモードが存在するらしい。

Rootless モード(Rootless mode)は Docker デーモンとコンテナを root 以外のユーザが実行できるようにするもので、デーモンやコンテナ・ランタイムにおける潜在的脆弱性を回避します。

https://docs.docker.jp/engine/security/rootless.html

Rootless modeを使用することによって、sudoをつけなくても良くなりそうなので、この記事ではその方法を記載していく。

なお、ここに記載の方法は、ほぼ下記URLの方法をやっているだけなので、参考程度にみていただければと思う。

docs.docker.jp

また、私の環境ではシェルに fish を使っているので、fish 用の設定が出てくるので、あしからず

方法

1 現在インストール中のdockerをアンインストールする

sudo apt list --installed | grep docker
sudo apt remove 'docker*'

2 rootlessモードでインストールする

bash
curl -fsSL https://get.docker.com/rootless | sh

3 fishのパス設定

nvim ~/.config/fish/config.fish
set -x PATH /home/$USER/bin $PATH
set -x DOCKER_HOST unix:///run/user/(id -u $USER)/docker.sock

4 dockerコマンド確認

docker -v

5 docker-composeをインストールする

sudo apt install python3-pip
pip3 install docker-compose

6 fishのパス設定

nvim ~/.config/fish/config.fish
set -x PATH $HOME/.local/bin $PATH

7 docker-composeコマンド確認

docker-compose -v

以上

Route53のプライベートホストゾーンでログを取る設定をする

はじめに

Route53にはDNS クエリログ記録機能がある

docs.aws.amazon.com

パブリックホストゾーンならばここに書いてある方法で設定できる

しかし、プライベートホストゾーンではここに書いてある方法では設定できない

ここにも書いてあるように、プライベートホストゾーンでDNS クエリログ記録するには、リゾルバークエリログ記録の設定をする必要がある

やり方はここに書いてある

docs.aws.amazon.com

ゾルバークエリログ記録の設定を記録として残していく

ちなみにプライベートホストゾーンではボタンが押せない

f:id:kytiken:20210221014229p:plain

方法

  1. VPC選択

    f:id:kytiken:20210221015102p:plain

  2. クエリログ記録の設定ボタンを押す

    f:id:kytiken:20210221015542p:plain

  3. 設定する

    f:id:kytiken:20210221015859p:plain

  4. クエリログの設定ができたらcloudwatchを見に行く

    f:id:kytiken:20210221020926p:plain

    JSONで出力されている

    {$.query_name="ec2.xixix.aws.local."}

    とかやって検索できる

設定は以上です

余談

なぜこの設定をしようと思ったかの話をする

とあるプライベートホストゾーンに、DNSレコードが存在していた

その向き先は現在NLBに向くように設定してあるのだが、別に作ったALBに向き先を変更したいという要件がでてきた

別に作ったALBというのは、現在設定してあるものと接続先は同じになる想定ではある

ただ、どこに影響があるのかは把握しておきたいので、この設定が必要だったのだ

typescript elasticsearch helloworld

  1. make project dir

    mkdir sample

  2. open vscode

    code sample

  3. make docker-compose.yml

docker-compose.yml

```
version: "3"
services:
  app:
    image: node
    volumes:
      - .:/app
    working_dir: /app
    depends_on:
      - elasticsearch
    tty: true
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.7.0
    environment:
      - discovery.type=single-node
    ports:
      - 9200:9200
    expose:
      - 9300
  kibana:
    image: docker.elastic.co/kibana/kibana:7.7.0
    ports:
      - 5601:5601

```
  1. npm init

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm init -y

  2. npm install

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm install -D typescript ts-node

  3. tsc init

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npx tsc --init --target ES2020

  4. npm install

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm install --save @elastic/elasticsearch

  5. create index.ts file

index.ts

```
import { Client } from "@elastic/elasticsearch";

(async () => {
  const client = new Client({ node: "http://elasticsearch:9200" });
  await client.index({
    index: "game-of-thrones",
    body: {
      character: "Ned Stark",
      quote: "hello",
    },
  });
})();
```
  1. edit package.json file

package.json

```
+"start": "ts-node index.ts",
```
  1. docker-compose up

    sudo docker-compose up -d

  2. npm start

    sudo docker-compose exec app npm start

  3. open kibana

    http://localhost:5601/

  4. create index pattern

    Screenshot_2020-05-24 Elastic Kibana.png (87.4 kB)

  5. discover index

    Screenshot_2020-05-24 Discover - Elastic Kibana.png (81.4 kB)

typescript mongodb helloworld

  1. make project dir

    mkdir sample

  2. open vscode

    code sample

  3. make docker-compose.yml

docker-compose.yml

```
version: "3"
services:
  app:
    image: node
    volumes:
      - .:/app
    working_dir: /app
    depends_on:
      - mongo
    tty: true
  mongo:
    image: mongo
    ports:
      - 27017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
```
  1. npm init

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm init -y

  2. npm install

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm install -D typescript ts-node

  3. tsc init

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npx tsc --init --target ES2020

  4. npm install

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm install mongodb @types/mongodb --save

  5. docker run

    sudo docker-compose up -d

  6. setup mongo db

    http://localhost:8081/

    Screenshot_2020-05-23 Home - Mongo Express(1).png (91.8 kB)

    Screenshot_2020-05-23 sandbox - Mongo Express.png (65.8 kB)

  7. create index.ts file

index.ts

```
import mongodb, { MongoClient } from "mongodb";

(async () => {
  const MongoClient = mongodb.MongoClient;
  const url = "mongodb://root:example@mongo:27017";
  const dbName = "sandbox";
  const connectOption = {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  };

  const client = await MongoClient.connect(url, connectOption);
  const db = client.db(dbName);

  const collection = db.collection("hello")
  await collection.insertOne({ title: "hello", content: "hello" });
  await collection.insertMany([
    { title: "hello_1", content: "hello_1" },
    { title: "hello_2", content: "hello_2" },
  ]);
  await collection.updateOne({ title: "hello_1" }, { $set: { content: "hello changed" } });

  const helloCollection = await collection.find({}).toArray();
  for (let i = 0; helloCollection.length > i; i++) {
    const hello = helloCollection[i];
    console.log(hello);
  }

  await collection.deleteMany({});

  await client.close();
})();
```
  1. edit package.json file

    package.json

    "start": "ts-node index.ts",

  2. npm start

    sudo docker-compose exec app npm start

https://hub.docker.com/_/mongo

metabaseをdockerで試す

ようこそ画面が映るまで

  1. プロジェクト用のディレクトリを作る

    mkdir metabase-sample cd metabase-sample

  2. postgres用のdataディレクトリをつくる

    mkdir -p docker/postgres/data

  3. docker-compose.ymlを作る

docker-compose.yml

```
version: '3'
services:
  metabase:
    image: metabase/metabase
    environment:
      - MB_DB_TYPE=postgres
      - MB_DB_DBNAME=metabase
      - MB_DB_PORT=5432
      - MB_DB_USER=postgres
      - MB_DB_PASS=your_password
      - MB_DB_HOST=postgres
    ports:
      - 3000:3000  
    depends_on:
      - postgres
  postgres:
    image: postgres
    environment:
      - POSTGRES_PASSWORD=your_password
      - POSTGRES_USER=postgres
      - POSTGRES_DB=metabase
    volumes:
      - ./docker/postgresql/data:/var/lib/postgresql/data
```
  1. docker-compose up

    sudo docker-compose up

  2. アクセス

    http://localhost:3000

f:id:kytiken:20200517103222p:plain

これでいろいろ試す

ちなみに

これをやろうと思ったのはAthenaにつなげるかどうかを確認したかったから

metabase ← athena ← s3

ということがしたくて、もしこれができたら、例えばJSONファイルをS3に貯めるだけためておいて、athena経由でクエリを投げてmetabaseで可視化できると思った

JSONを放り込むだったりALBのログファイルとかにも応用できると、可視化がいろいろ楽になると思った

いろいろ調べたけど無理っぽかった...

Issueはある

github.com

github.com

開発中の模様

参考

ちょっとnodejsを試したいときにdockerで環境を作る

最近ubuntu20.04にしてから、ホスト側にnodejsを入れずにどこまでいけるのかというのを試しています。

nodejsに限った話ではないのですが、言語の環境を作りたいときにそれぞれの言語のバージョン管理システムを入れるのが邪魔くさいという問題があったからです。

せっかくLinuxディストリビューションを使っているのだから、dockerを使ったほうが楽になりそうだということで、最小限の環境を作るのにどうやったら楽になるのかを考えてみました。

手順

  1. 作業ディレクトリを作成

    mkdir sandbox cd sandbox

  2. docker-composeを作る

    ``` version: '3' services: app: image: node volumes:

       - .:/app
     working_dir: /app
    

    ```

  3. dockerコンテナでbashを立ち上げる

    sudo docker-compose run -u $(id -u $USER):$(id -g $USER) app bash

  4. npm init

    npm init -y

使い方

ホスト側でファイルを編集して、実行はdockerコンテナ上でします。

そのためにホストのカレントディレクトリをマウントしておきます。

docker-compose run-u オプションをつけておかないとコンテナ上でファイルを作った場合にrootユーザーで作られるので、ホスト側のユーザーのidとあわせます。

おわりに

とりあえず触ってみたいときにさっと環境を作る方法について紹介しました。

ただしこれは最小構成です。

これで環境構成が事足りるということは無いので、ここからいろいろ足していくことになると思います。

例えばmysqlservice に足したり、 ports の設定を足したり、.env の設定を足したりなどなどです。

そういうときに、どう書くのかいつも忘れるので docker-composeのリファレンスも貼っておきます。

docs.docker.com

ノシ

ubuntuにコピペツールを入れる(CopyQの紹介)

最近Ubuntu20.04をインストールしたので環境整備をしています。

それでコピペをするときに便利になるツールを探していました。

私が探していたのはコピーした履歴を管理してくれるようなツールです。

例えば3つ前にコピーしたものを貼り付けるみたいなことがしたいのです。

Macでいうとclipyというツールがあり、Macのときはこれを使っています。

Ubuntuでもそのようなツールが無いかを探していて、CopyQというツールが便利だったので紹介します。

インストール方法

aptでインストールします。

sudo apt install copyq

使い方

CopyQを起動するとCopyQのアプリケーションが常駐するようになり、コピーした履歴が表示されるようになります。

f:id:kytiken:20200505080715p:plain

設定

ちょっとだけ設定します。

自動起動の設定

f:id:kytiken:20200505082534p:plain

ショートカットの設定

f:id:kytiken:20200505083226p:plain

まとめ

以上、CodeQというツールの紹介でした。

Macを使っているときはClipyに頼り切っていたので、似たツールがあってよかったです。