20200630のLinuxに関する記事は6件です。

Dockerの不要コンテナを一括削除する

最近AWSのEC2(AmazonLinux2)上でDockerを入れて色々と遊んで勉強しているのですが、
centosのコンテナを作成する → ごにょごにょする → 終わる、mysqlのコンテナを作る → ごにょごにょする → 終わるなどを繰り返し行い、たまにdocker psコマンドでコンテナの稼働状況を確認してたんですが、ある時docker ps -aを実行したところなんじゃこりゃぁ!!となりました。
そこで「Dockerコンテナは終わっても、Dockerの事は嫌いにならないでください!」と
◯田敦子さんが言ったかどうかは定かではないですが、少なくともDockerコンテナは終わってもDockerコンテナは残っているという事を学んだわけです。

無駄な前置きが長くなりましたが、この溜まりに溜まったゴミDockerコンテナを削除するための
コマンドの覚書です。

awkを利用した不要コンテナの削除

削除前の状態

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                    NAMES
9ec50bb2ac79        mysql               "docker-entrypoint.s…"   4 days ago          Up 2 days                 3306/tcp, 33060/tcp      MYSQL
20cabc9db638        centos              "/bin/bash"              4 days ago          Up 2 days                 0.0.0.0:9989->8080/tcp   centos_container
149e47fc7182        mysql               "docker-entrypoint.s…"   4 days ago          Exited (0) 4 days ago                              silly_haibt
6d0b42666db1        mysql               "docker-entrypoint.s…"   4 days ago          Exited (0) 4 days ago                              stoic_panini
cc75432e283b        mysql               "docker-entrypoint.s…"   4 days ago          Exited (127) 4 days ago                            serene_merkle
e75ea014088a        mysql               "docker-entrypoint.s…"   4 days ago          Exited (0) 4 days ago                              laughing_allen
7f6d0144717d        centos              "/bin/bash"              4 days ago          Exited (0) 4 days ago                              zealous_haibt
b78d2f0c9b93        centos              "/bin/bash"              4 days ago          Exited (0) 4 days ago                              centos_1
a1adb31a4719        mysql               "docker-entrypoint.s…"   4 days ago          Exited (0) 4 days ago                              mysql_container
b977c75c9dd7        mysql               "docker-entrypoint.s…"   4 days ago          Exited (1) 4 days ago                              bold_nobel
6c590752cab8        mysql               "docker-entrypoint.s…"   4 days ago          Exited (1) 4 days ago                              gifted_nightingale

上記のうち、稼働中の上2つ以外を削除する。
※今回はdocker ps -f status=<ステータス>で"Exited"のコンテナのみを削除

docker ps -f status=exited | awk '{print $1}' | xargs docker rm

実行結果

149e47fc7182
6d0b42666db1
cc75432e283b
e75ea014088a
7f6d0144717d
b78d2f0c9b93
a1adb31a4719
b977c75c9dd7
6c590752cab8
Error: No such container: CONTAINER
[ ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
9ec50bb2ac79        mysql               "docker-entrypoint.s…"   4 days ago          Up 2 days           3306/tcp, 33060/tcp      MYSQL
20cabc9db638        centos              "/bin/bash"              4 days ago          Up 2 days           0.0.0.0:9989->8080/tcp   centos_container

無事不要なコンテナは消えましたが、ヘッダー行の"CONTAINER"でdocker rmをしようとしてエラーとなってますね。。(ま、いっか)

Docker公式ドキュメント方式(-_-) ※こちらおすすめしております!

上記コマンド作成後、Docker公式マニュアルに稼働していないコンテナ削除方法が載ってました。。
上のしょーもないawk方式なんかより先に載せろよと言われるかもしれませんが...

実行前状態(もう一度不要なコンテナを増産しました)

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                    NAMES
109839ada027        centos              "/bin/bash"              35 seconds ago      Exited (0) 34 seconds ago                            vibrant_bohr
cf2e8c41b2ee        centos              "/bin/bash"              36 seconds ago      Exited (0) 36 seconds ago                            brave_mestorf
fcfdaf35235d        centos              "/bin/bash"              37 seconds ago      Exited (0) 37 seconds ago                            gallant_faraday
bf7b9fa96291        centos              "/bin/bash"              38 seconds ago      Exited (0) 38 seconds ago                            zealous_morse
9ec50bb2ac79        mysql               "docker-entrypoint.s…"   4 days ago          Up 2 days                   3306/tcp, 33060/tcp      MYSQL
20cabc9db638        centos              "/bin/bash"              4 days ago          Up 2 days                   0.0.0.0:9989->8080/tcp   centos_container

削除コマンド

コマンド説明(公式マニュアルより)

このコマンドは停止しているコンテナを全て削除します。コマンド docker ps -a -q は終了した全てのコンテナ ID を rm コマンドに渡し、全て削除するものです。実行中のコンテナは削除されません。

docker rm $(docker ps -a -q)

実行結果

109839ada027
cf2e8c41b2ee
fcfdaf35235d
bf7b9fa96291
Error response from daemon: You cannot remove a running container 9ec50bb2ac797f3cfdbe827aa2793ba135f6f29e9fd2c1b179afa09d6be4b5ba. Stop the container before attempting removal or force remove
Error response from daemon: You cannot remove a running container 20cabc9db6380304c3c0c3b8a14f04e0bd60fd58c810ee4c02d6539fd5b4f3f3. Stop the container before attempting removal or force remove

実行中のコンテナは削除しようとしてエラーとなります。
試してはいませんが、docker rm -f $(docker ps -a -q)とするとコンテナ皆殺しの刑に処す!
となるはずですし、ここまで読んだ殆どの方はお気づきかと思いますが、上記awk方式で実施した
内容も下記コマンドで実現できます...

docker rm $(docker ps -f status=exited -q)

それでは、お後がよろしいようで。。。テケテン

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

サーバの時間を日本の時間にする方法

サーバの時間が世界の標準時間だった、ときのこと

何も設定していなければこうなるはず、だけど日本人で東京在住なので東京時間がいい。

$ date
Fri Jun 12 04:32:25 UTC 2020

CentOS7の場合

  • 環境 : CentOS Linux release 7.8.2003 (Core)
# localtimeはUTCにリンクされている
$ ls -la /etc/localtime
lrwxrwxrwx. 1 root root 25 Feb 29 12:11 /etc/localtime -> ../usr/share/zoneinfo/UTC

# ちょっと日本を探してみたら「Asia」「Japan」があった
$ ls -la /usr/share/zoneinfo/ | grep -e Asia -e Japan
drwxr-xr-x.  2 root root   4096 Feb 29 12:06 Asia
-rw-r--r--.  2 root root    292 Sep 26  2019 Japan

# `Asia/Tokyo`が`Japan`にリンクされているわけではないらしい
$ ls -la /usr/share/zoneinfo/Asia/ | grep Tokyo
-rw-r--r--.  2 root root  292 Sep 26  2019 Tokyo

今だけ日本の時間にする方法

参考 : 【Linux】タイムゾーン(Timezone)の変更 - Qiita

# Tokyoにシンボリックリンクを上書きではる
$ ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$  ls -la /etc/localtime
lrwxrwxrwx. 1 root root 30 Jun 15 10:45 /etc/localtime -> /usr/share/zoneinfo/Asia/Tokyo

$ date
Mon Jun 15 10:45:55 JST 2020

ずっと日本の時間にする方法

参考 : 【 timedatectl 】コマンド――時刻を表示/設定する:Linux基本コマンドTips(312) - @IT

$ timedatectl
      Local time: Tue 2020-06-30 06:20:07 UTC
  Universal time: Tue 2020-06-30 06:20:07 UTC
        RTC time: Tue 2020-06-30 06:20:07
       Time zone: UTC (UTC, +0000)
...省略...

# 日本っぽいのを探すと「Asia/Tokyo」があった
$ timedatectl list-timezones | grep -i -e japan -e tokyo
Asia/Tokyo

# タイムゾーンを「Asia/Tokyo」に設定する
$ sudo timedatectl set-timezone Asia/Tokyo

$ timedatectl
      Local time: Tue 2020-06-30 15:21:18 JST
  Universal time: Tue 2020-06-30 06:21:18 UTC
        RTC time: Tue 2020-06-30 06:21:18
       Time zone: Asia/Tokyo (JST, +0900)
...省略...

$ date
Tue Jun 30 15:21:31 JST 2020
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

サーバの時間を日本の時間に設定する方法

サーバの時間が世界の標準時間だった、ときのこと

何も設定していなければこうなるはず、だけど日本人で東京在住なので東京時間がいい。

$ date
Fri Jun 12 04:32:25 UTC 2020

CentOS7の場合

  • 環境 : CentOS Linux release 7.8.2003 (Core)
# localtimeはUTCにリンクされている
$ ls -la /etc/localtime
lrwxrwxrwx. 1 root root 25 Feb 29 12:11 /etc/localtime -> ../usr/share/zoneinfo/UTC

# ちょっと日本を探してみたら「Asia」「Japan」があった
$ ls -la /usr/share/zoneinfo/ | grep -e Asia -e Japan
drwxr-xr-x.  2 root root   4096 Feb 29 12:06 Asia
-rw-r--r--.  2 root root    292 Sep 26  2019 Japan

# `Asia/Tokyo`が`Japan`にリンクされているわけではないらしい
$ ls -la /usr/share/zoneinfo/Asia/ | grep Tokyo
-rw-r--r--.  2 root root  292 Sep 26  2019 Tokyo

今だけ日本の時間にする方法

参考 : 【Linux】タイムゾーン(Timezone)の変更 - Qiita

# Tokyoにシンボリックリンクを上書きではる
$ ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$  ls -la /etc/localtime
lrwxrwxrwx. 1 root root 30 Jun 15 10:45 /etc/localtime -> /usr/share/zoneinfo/Asia/Tokyo

$ date
Mon Jun 15 10:45:55 JST 2020

ずっと日本の時間にする方法

参考 : 【 timedatectl 】コマンド――時刻を表示/設定する:Linux基本コマンドTips(312) - @IT

$ timedatectl
      Local time: Tue 2020-06-30 06:20:07 UTC
  Universal time: Tue 2020-06-30 06:20:07 UTC
        RTC time: Tue 2020-06-30 06:20:07
       Time zone: UTC (UTC, +0000)
...省略...

# 日本っぽいのを探すと「Asia/Tokyo」があった
$ timedatectl list-timezones | grep -i -e japan -e tokyo
Asia/Tokyo

# タイムゾーンを「Asia/Tokyo」に設定する
$ sudo timedatectl set-timezone Asia/Tokyo

$ timedatectl
      Local time: Tue 2020-06-30 15:21:18 JST
  Universal time: Tue 2020-06-30 06:21:18 UTC
        RTC time: Tue 2020-06-30 06:21:18
       Time zone: Asia/Tokyo (JST, +0900)
...省略...

$ date
Tue Jun 30 15:21:31 JST 2020
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linuxのリダイレクト vol.3

リダイレクトの3つ目、まとめ。
今までのをテーブルに。

演算子(記号) 意味
> 標準出力の出力先を指定
>> 標準出力の出力先を指定し標準入力出力先に追記
<< (終了文字) 後に文字を入力すると、自動に入力が終わる
>& dev/null 呼び出せない

これ全部左寄りに統一できないのかな、見栄え悪すぎ

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

Raspberry PI シリーズで分散環境構築(その9: Webクラスタ構築のケース(後半))

序 (連載一覧)

  1. Raspberry PI シリーズで分散環境構築(その1:モデル別、ディスクレスクライアント化の可否まとめ)
  2. Raspberry PI シリーズで分散環境構築(その2: PiServer の解析と代替システムの設計まで)
  3. Raspberry PI シリーズで分散環境構築(その3: dnsmasq のインストールと設定)
  4. Raspberry PI シリーズで分散環境構築(その4: NFSサーバの構築とクライアント用OSのインポート)
  5. Raspberry PI シリーズで分散環境構築(その5: クラスタノード向け Raspberry PI OS のカスタマイズ(1))
  6. Raspberry PI シリーズで分散環境構築(その6: クラスタノード向け Raspberry PI OS のカスタマイズ(2))
  7. Raspberry PI シリーズで分散環境構築(その7: 各ラズパイ向けの tftp ルート設定と起動試験)
  8. Raspberry PI シリーズで分散環境構築(その8: Webクラスタ構築のケース(前半))
  9. Raspberry PI シリーズで分散環境構築(その9: Webクラスタ構築のケース(後半))

概要

本稿は連載のその9となります。
RaspiCloudSystem.png
前回までに、ディスクレスラズパイ側の設定は終了していますので、今回は上図の「分散環境コントローラ」または「PXEサーバ」にApache 2.4 をインストールし、ディスクレスラズパイをWebクラスタとして利用する部分を記載していきます。

このような内容なので、タイトルに「Raspberry PI」の文字が含まれているにもかかわらず、ラズパイ自体の設定とは一切関係ない記事になっております(苦笑)

本稿の前提条件

  • 上図 「PXEサーバ」にインストールしてもい良いのですが、本稿では上図の「分散環境コントローラ」に相当するマシン上に Apache2.4 をインストールすることにし(ルータ構成でなくても構いません)、以後、このホストを「コントローラ」と呼びます。
  • Apache2.4 がインストール可能であれば、コントローラのディストリビューション1は何でも構いません。
  • Apache 2.4 自身はコンテンツを提供せず、リバースプロキシ機能のみを実行します。
  • ただし、認証、SSL化、セッション管理の一部は担うものとします
  • ディストリビューションによって、Apache の設定ファイルである httpd.conf ファイルの記載方法は多様なので2、個別ディストリビューションに依存する方法では記述しません。設定するべきことは大して多くないので、本稿では全て1つの /etc/httpd.conf にまとめた形で、デフォルト状態から変更するべき箇所のみを記載します。
コントローラホストの IP アドレス(対ユーザーアクセス)
172.16.0.80/20
コントローラホストのIP(対ラズパイ)
192.168.172.18/24
ディスクレスラズパイ群のIP
192.168.172.32〜35/24
コントローラホストで開く TCP ポート
80/TCP, 443/TCP
ディスクレスラズパイ群で開く TCP ポート
8000/TCP
コントローラのホスト名(対ユーザーアクセス)
raspicluster.localdomain

実際の作業

1. Apache 2.4 のインストールとサービスの無効化

1.1. インストール作業

コントローラのOSに依存しますので、ここでは個別のインストール方法は記載しません。
apt-get/dnf/pacman/emerge といったお使いの Linux ディストリビューション固有のパッケージコマンドなり、Apache サイトからダウンロードした msi ファイルをWindows 上で実行するなりして、Apache 自体をインストールしてください。

1.2. (オプション)サービスの無効化

インストール直後の状況下ですと、電源投入時に Aapche が自動起動するような設定になってしまう環境が多くあります。ですが、設定が完了するまで起動しないほうが無難なので、各OS個別の方法で、自動起動サービスから除外しておいたほうがいいでしょう。(systemctl disable httpd 等)

2. httpd.conf の設定

以下、httpd.conf の内容を設定していきたいと思いますが、Apache の基本設定、SSL化、認証などの詳細は記載しません。Qiita の他のページや 本家をご覧ください。

2.1. mod_proxy(リバースプロキシ) + mod_proxy_balancer 向けのロードモジュール設定

全てが必要なわけではありませんが、以下のモジュールの追加読み込みが必要となります。

なお、OS/ディストリビューションによって、Apache 2.4 のモジュールが格納されている場所は異なりますが、本稿では Debian/Ubuntu のデフォルトである /usr/lib/apache2/modules にインストールされているものとします。

# mod_proxy_loadbalance が依存しているので、コメントアウトされていたら外す。
LoadModule alias_module /usr/lib/apache2/modules/mod_alias.so

# proxy モジュール本体(リバース/フォワード両対応。下記 proxy_http モジュール等が必要)
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so

# http proxy モジュール
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so

# (後ろにあるFTPサーバからファイルを提供するなら)
# ftp proxy モジュール
LoadModule proxy_ftp_module /usr/lib/apache2/modules/mod_proxy_ftp.so

# (ラズパイで Tomcat は無謀ですが、後ろで Tomcat を動かすなら。)
# ajp proxy モジュール
LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so

# (トンネリングさせたいなら必要)
LoadModule proxy_connect_module /usr/lib/apache2/modules/mod_proxy_connect.so

# mod_proxy_loadbalance が依存しているので必須
LoadModule slotmem_shm_module /usr/lib/apache2/modules/mod_slotmem_shm.so

# proxy_loadbalance モジュール本体 (これだけでは動かない。下記の分散タイプモジュールを最低でも1つロードする必要がある)
LoadModule proxy_balancer_module /usr/lib/apache2/modules/mod_proxy_balancer.so

# proxy_balancer 分散タイプモジュール(暇なホストに優先的に要求)
LoadModule lbmethod_bybusyness_module /usr/lib/apache2/modules/mod_lbmethod_bybusyness.so
# proxy_balancer 分散タイプモジュール(アクセス要求に大して単純なラウンドロビン)
LoadModule lbmethod_byrequests_module /usr/lib/apache2/modules/mod_lbmethod_byrequests.so
# proxy_balancer 分散タイプモジュール(通信量が少ないホストに要求)
LoadModule lbmethod_bytraffic_module /usr/lib/apache2/modules/mod_lbmethod_bytraffic.so
# proxy_balancer 分散タイプモジュール(クラスタ管理ソフトの HeartBeat を使用。本稿では利用しないので無視)
#LoadModule lbmethod_heartbeat_module /usr/lib/apache2/modules/mod_lbmethod_heartbeat.so

# 負荷分散マネージャを実行させたい場合は、mod_status を有効化する必要がある
LoadModule status_module /usr/lib/apache2/modules/mod_status.so


2.2. mod_proxy + mod_proxy_balancer を利用したリバースプロキシ専用バーチャルホスト設定

<VirtualHost *:80>
  # (ホスト名,ログ設定など省略。)
  # 全部クラスタノードに丸投げするので、ドキュメントルートは設定しなくて良い

  # <VirtualHost *:443> の場合は SSL/TLS の証明書関連設定がここに入る

  <IfModule proxy.c>
    # リバースプロキシの場合は off 必須
    ProxyRequests off

    <IfModule proxy_balancer.c>
       #   balanser://任意の名前(ラズパイ群を 'raspicluster' と名付けているがここ以外でこの名前は使わない)
       #   lbmethod=負荷分散方式(byrequest/bybusyness/bytraffic)
       #   timeout=秒数(ノードがダウンしていると判断するまでの時間)
       #   maxattempts=回数(ノードがダウンしているときの再挑戦の上限回数)
       ProxyPass / balancer://raspicluster lbmethod=byrequest timeout=1 maxattempts=1

       # なお、ノード側でサーバサイドプログラムを動かす場合等でセッション管理が必要な場合は以下の設定を利用すること。
       # stickysession に指定する値は、サーバサイド側のプログラムに依存。この例は PHP の例
       #ProxyPass / balancer://raspicluster lbmethod=bytraffic timeout=1 maxattempts=1 nofailover=On stickysession=PHPSESSIONID 

       <Proxy balancer://raspicluster>

          # ここに認証関連設定が入る

          # ラズパイ 4B を優先
          BalancerMember http://192.168.172.35:8000 loadfactor=6
          # ラズパイ 3B+
          BalancerMember http://192.168.172.34:8000 loadfactor=5
          # ラズパイ 3B
          BalancerMember http://192.168.172.33:8000 loadfactor=4
          # ラズパイ 2B
          BalancerMember http://192.168.172.32:8000 loadfactor=1
       </Proxy>


    </IfModule>

    # 負荷分散マネージャページを実行したい場合の設定
    # ここで分散タイプやノードの切り離しなどを行うことができるが、
    # 設定ファイルに反映されることはないので、Apache を再起動すると設定は初期状態に戻るので注意
    <IfModule mod_status.c>
      <Location /balancer-manager>
         SetHandler balancer-manager

         Order Deny,Allow
         Deny from all
         Allow from 127.0.0.1 172.16.0.
      </Location>
    </IfModule>
  </IfModule>
</VirtualHost>

とりあえず、負荷分散コントローラの設定は終了となります。
ここから、コントローラとディスクレスノード間の試験となるわけですが、スタティックコンテンツのみを返す設定なものですから、
どのノードが返事をしたのか不明ですよね。ノードの nginx が吐き出すログを見るしかありません。

(暫定的に公開。書き足す予定)


  1. Linuxである必要すらありません。BSD系や Windows でも OK。 

  2. 読み込みモジュール毎/バーチャルホスト毎に include を多用するスタイル,ファイルが巨大になっても全部を1つに収めるスタイルといったスタイルがメジャーです。 

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

[備忘録]Let's Encrypt でSSL化してからDocumentRootを変更する方法

問題定義

VPSサーバー(conohaのcentos7)をLet's EncryptでSSL化したもののDocumentRootをvar/www/htmlから変更できない。色々な記事を試したみたが、Apacheの仕組み理解度が薄く本質が読めなく難航したので書き記します。

環境

centos7
Apache/2.4.6

解決方法

SSLのポート番号が443になるので、そちらをVirtualHostで設定してあげましょう。

etc/httpd/conf/httpd.conf
Listen 80
-------下記に追加------
<VirtualHost *:443>
  ServerAdmin root@example.com
  ServerName example.com
  DocumentRoot /お好みのDocumentRoot/
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
  <Directory /お好みのDocumentRoot/
    AllowOverride all
    Require all granted
    Options -MultiViews
  </Directory>
</VirtualHost>
----------------------
#
# Dynamic Shared Object (DSO) Support

httpd.confに上記のコードを追加しましょう。

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