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の方法をやっているだけなので、参考程度にみていただければと思う。
また、私の環境ではシェルに 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 クエリログ記録機能がある
パブリックホストゾーンならばここに書いてある方法で設定できる
しかし、プライベートホストゾーンではここに書いてある方法では設定できない
ここにも書いてあるように、プライベートホストゾーンでDNS クエリログ記録するには、リゾルバークエリログ記録の設定をする必要がある
やり方はここに書いてある
リゾルバークエリログ記録の設定を記録として残していく
ちなみにプライベートホストゾーンではボタンが押せない

方法
VPC選択

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

設定する

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

JSONで出力されている
{$.query_name="ec2.xixix.aws.local."}とかやって検索できる
設定は以上です
余談
なぜこの設定をしようと思ったかの話をする
とあるプライベートホストゾーンに、DNSレコードが存在していた
その向き先は現在NLBに向くように設定してあるのだが、別に作ったALBに向き先を変更したいという要件がでてきた
別に作ったALBというのは、現在設定してあるものと接続先は同じになる想定ではある
ただ、どこに影響があるのかは把握しておきたいので、この設定が必要だったのだ
typescript elasticsearch helloworld
make project dir
mkdir sampleopen vscode
code samplemake 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
```
npm init
sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm init -ynpm install
sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm install -D typescript ts-nodetsc init
sudo docker-compose run -u (id -u $USER):(id -g $USER) app npx tsc --init --target ES2020npm install
sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm install --save @elastic/elasticsearchcreate 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",
},
});
})();
```
- edit package.json file
package.json
```
+"start": "ts-node index.ts",
```
docker-compose up
sudo docker-compose up -dnpm start
sudo docker-compose exec app npm startopen kibana
create index pattern

discover index

typescript mongodb helloworld
make project dir
mkdir sampleopen vscode
code samplemake 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
```
npm init
sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm init -ynpm install
sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm install -D typescript ts-nodetsc init
sudo docker-compose run -u (id -u $USER):(id -g $USER) app npx tsc --init --target ES2020npm install
sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm install mongodb @types/mongodb --savedocker run
sudo docker-compose up -dsetup mongo db


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();
})();
```
metabaseをdockerで試す
ようこそ画面が映るまで
プロジェクト用のディレクトリを作る
mkdir metabase-sample cd metabase-samplepostgres用のdataディレクトリをつくる
mkdir -p docker/postgres/datadocker-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
```
docker-compose up
sudo docker-compose upアクセス

これでいろいろ試す
ちなみに
これをやろうと思ったのはAthenaにつなげるかどうかを確認したかったから
metabase ← athena ← s3
ということがしたくて、もしこれができたら、例えばJSONファイルをS3に貯めるだけためておいて、athena経由でクエリを投げてmetabaseで可視化できると思った
JSONを放り込むだったりALBのログファイルとかにも応用できると、可視化がいろいろ楽になると思った
いろいろ調べたけど無理っぽかった...
Issueはある
開発中の模様
参考
ちょっとnodejsを試したいときにdockerで環境を作る
最近ubuntu20.04にしてから、ホスト側にnodejsを入れずにどこまでいけるのかというのを試しています。
nodejsに限った話ではないのですが、言語の環境を作りたいときにそれぞれの言語のバージョン管理システムを入れるのが邪魔くさいという問題があったからです。
せっかくLinuxのディストリビューションを使っているのだから、dockerを使ったほうが楽になりそうだということで、最小限の環境を作るのにどうやったら楽になるのかを考えてみました。
手順
作業ディレクトリを作成
mkdir sandbox cd sandboxdocker-composeを作る
``` version: '3' services: app: image: node volumes:
- .:/app working_dir: /app```
dockerコンテナでbashを立ち上げる
sudo docker-compose run -u $(id -u $USER):$(id -g $USER) app bashnpm init
npm init -y
使い方
ホスト側でファイルを編集して、実行はdockerコンテナ上でします。
そのためにホストのカレントディレクトリをマウントしておきます。
docker-compose run で -u オプションをつけておかないとコンテナ上でファイルを作った場合にrootユーザーで作られるので、ホスト側のユーザーのidとあわせます。
おわりに
とりあえず触ってみたいときにさっと環境を作る方法について紹介しました。
ただしこれは最小構成です。
これで環境構成が事足りるということは無いので、ここからいろいろ足していくことになると思います。
例えばmysqlを service に足したり、 ports の設定を足したり、.env の設定を足したりなどなどです。
そういうときに、どう書くのかいつも忘れるので docker-composeのリファレンスも貼っておきます。
ノシ
ubuntuにコピペツールを入れる(CopyQの紹介)
最近Ubuntu20.04をインストールしたので環境整備をしています。
それでコピペをするときに便利になるツールを探していました。
私が探していたのはコピーした履歴を管理してくれるようなツールです。
例えば3つ前にコピーしたものを貼り付けるみたいなことがしたいのです。
Macでいうとclipyというツールがあり、Macのときはこれを使っています。
Ubuntuでもそのようなツールが無いかを探していて、CopyQというツールが便利だったので紹介します。
インストール方法
aptでインストールします。
sudo apt install copyq
使い方
CopyQを起動するとCopyQのアプリケーションが常駐するようになり、コピーした履歴が表示されるようになります。

設定
ちょっとだけ設定します。
自動起動の設定

ショートカットの設定

まとめ
以上、CodeQというツールの紹介でした。
Macを使っているときはClipyに頼り切っていたので、似たツールがあってよかったです。