DamienKarrus’s blog

プログラミングとクライミングの足跡

Amazon ECRでプライベートなレジストリを構築する Docker入門-13

Docker Hubのフリープランだと、プライベートなレジストリは1つしか使えない。そこでAmazon ECRを使用してみる。 Amazon ECRは1年間の無料利用枠で500MBまで無料。

ECRを使うための準備をする。まずはIAMユーザの登録。ECRにアクセスするためにはこのIAMアカウントが必要である。さらに、IAMは12時間有効のパスワードを発行してからアクセスしなければならない。

■IAMユーザの登録

AWSの画面でIAMを検索してIAMのダッシュボードを呼び出し「アクセス管理」の「ユーザー」を選び「ユーザーを追加」をクリック。 ユーザ名を入力し、AWSアクセスの種類をアクセスキー・プログラムによるアクセスにする。 「次のステップ」 「既存のポリシーを直接アタッチ」を選択して「ポリシーのフィルタ」でcontainerregと検索すると AmazonEC2ContainerRegistryPowerUser というポリシーが表示される。のでチェックマークをつけて「次のステップ」 タブは追加せずに 「次のステップ」 確認画面にて 「ユーザーの作成」 ユーザが作成されるとユーザ名・アクセスキーID・シークレットアクセスキーが表示されるので記録しておく。

Amazon ECRでリポジトリを作る

AWSのコンソールからECRを検索して、ECRのコンソール画面を呼び出す(現在はAmazon Container Servicesの中にECRが入っている)。 「使用方法」をクリックするとリポジトリの作成がはじまる。 リポジトリ名を決める「myphp_ecr」として「リポジトリを作成」クリック。 Privateのタグの中に今作成したリポジトリが入っている。URIをメモしておく

12345678.dkr.ecr.us-east-1.amazonaws.com/myphp_ecr

リポジトリ名「myphp_ecr」をクリックするとリポジトリ一覧の画面が出てくる。「プッシュコマンドの表示」をクリックすると、認証トークンの取得からイメージをpushするまでのコマンドの使用例が表示されるので、メモしておく。

トークン取得
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 12345678.dkr.ecr.us-east-1.amazonaws.com
イメージ構築
docker build -t myphp_ecr .
イメージ名の調整(タグ付け)
docker tag myphp_ecr:latest 12345678.dkr.ecr.us-east-1.amazonaws.com/myphp_ecr:latest
イメージをpush
docker push 12345678.dkr.ecr.us-east-1.amazonaws.com/myphp_ecr:latest
■ECRを使うためのローカル環境の整備

必要なawsコマンドをインストールする。unzipが入ってないので最初に入れておく。awsのサイトからzipをダウンロードして、解凍してインストールし、不要ファイルを削除する。手順は次の通り。

$ sudo apt install -y unzip
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" 
$ unzip awscliv2.zip
$ sudo ./aws/install
$ aws --version
$ rm -f -r aws awscliv2.zip

ここまで出来たらawsコマンドに認証情報を設定する。 IAMユーザのアクセスキーID・シークレットアクセスキーを入力する。リージョンと出力フォーマットはここでは指定しない。

$ aws configure
AWS Access Key ID [None]: AKIARC-----(snip)-----FTWPS
AWS Secret Access Key [None]: rl3Leo-----(snip)------AyMQ7i
Default region name [None]:
Default output format [None]:

動作確認してみる。pemのようなパスワードが表示されれば正常動作している。

$ aws ecr get-login-password
eyJwYXlsb2FkIjoiK3VOT3hVcXhSY3ZkGR1VWY1KzZCMlJlTGNrUEhaZ...(snip)...
リポジトリにpushする

リポジトリにログインする。awsコマンドでパスワードを取得してlocker loginに渡す。先ほどコピーしたものをペーストして利用する。

$ aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 12345678.dkr.ecr.us-east-1.amazonaws.com

イメージをビルドする

$ docker build -t myphp_ecr .

タグ付けする

$ docker tag myphp_ecr:latest 12345678.dkr.ecr.us-east-1.amazonaws.com/myphp_ecr:latest

pushする

docker push 12345678.dkr.ecr.us-east-1.amazonaws.com/myphp_ecr:latest

Amazon ECRのコンソールで確認するとlatestとして登録されている。

リポジトリからpullする

Amazon ECRにログインする。

$ aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 12345678.dkr.ecr.us-east-1.amazonaws.com

pullするにはpullコマンドの次にAmazon ECRのURIをつける

$ docker pull 12345678.dkr.ecr.us-east-1.amazonaws.com/myphp_ecr:latest

pullできたことを確認して走らせてみる

$ docker image ls
$ docker run -dit --name myphp -p 8080:80 12345678.dkr.ecr.us-east-1.amazonaws.com/myphp_ecr:latest

以上でAmazon ECRを使ったレジストリリポジトリをpush/pullする手順が正常に動作した。

次の記事 damienkarrus.hatenablog.com

Docker Hubにイメージを登録する Docker入門-12

Docker Hubにイメージを登録するには
まずはSign Upする
https://hub.docker.com/
にアクセスして、Sign Inを選び
アカウント名:damienkarras
Email:hogehoge@gmail.com
パスワード:**************
プラン選択画面で、無料プランのpersonalを選ぶ
Create a Repositoryをクリックするとリポジトリの登録画面が出てくる
リポジトリ名:myexample
Descripton:drill
Visibility:Private
Createボタンクリック
リポジトリは「自分のDockerID/リポジトリ名」で作成される。
damienkarras/myexample
この名称はpushするときに必要なのでメモしておくこと。
pushするイメージの名称を上記名称に変更する

$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
myimg        latest    c1bd71a6b6bc   3 days ago    254MB
$ docker tag myimg damienkarras/myexample
$ docker image ls
REPOSITORY               TAG       IMAGE ID       CREATED       SIZE
damienkarras/myexample   latest    c1bd71a6b6bc   3 days ago    254MB

Docker Hubにログインしてpushする、、、前に、Docker Hubを使用するために2つパッケージが必要なのでインストールしておく。

$ sudo apt install gnupg2 pass

このパッケージがないと
Error saving credentials: error storing credentials - err: exit status 1, out: Cannot autolaunch D-Bus without X11 $DISPLAY
というエラーがでる。
Docker Hubにログインするしてpushする

$ docker login
...(snip)...
Username: damienkarras
Password:
...(snip)...
Login Succeeded
$ docker push damienkarras/myexample
Using default tag: latest
The push refers to repository [docker.io/damienkarras/myexample]
6496040d87b1: Pushed
3c7e8c6e8516: Pushed
89fda00479fc: Mounted from library/debian
latest: digest: sha256:e6832f5b393b6e2f2c9b9b4dbd51f1aed0534075b9e305d449a4d692fe93e91c size: 948

登録作業は以上で終了。サイトのリポジトリのところを表示すると今pushしたものがlatestとして表示されている。ローカルのイメージを削除した後、リポジトリからpullしてみる

$ docker image rm damienkarras/myexample
$ docker pull damienkarras/myexample
Using default tag: latest
latest: Pulling from damienkarras/myexample
Digest: sha256:e6832f5b393b6e2f2c9b9b4dbd51f1aed0534075b9e305d449a4d692fe93e91c
Status: Downloaded newer image for damienkarras/myexample:latest
docker.io/damienkarras/myexample:latest

走らせて見る

$ docker run -dit --name junk -p 8080:80 damienkarras/myexample

リポジトリの削除方法
リポジトリを消すには、リポジトリの画面を開いて「Settings」をクリック。画面下の「Delete repository」をクリック。するとリポジトリ名を入力するように促されるのでmyexampleと入力して「Delete」ボタンクリックで、削除される。

次の記事 damienkarrus.hatenablog.com

postgresのユーザ、パスワードの設定・変更

postgresにapacheというユーザを追加してパスワードを設定しようとした。

$ createuser apache -P
Enter password for new role:
Enter it again:
createuser: creation of new role failed: ERROR:  role "apache" already exists

パスワードを入力した後になって、apacheはもういるよと怒られた。最初に言えよ。
ということでパスワードを設定する。現在のユーザ一覧をみるには

postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of
-----------+------------------------------------------------+-----------
 apache    |                                                | {}
 kandp     | Superuser, Create role, Create DB              | {}
 kpses     | Superuser, Create role, Create DB              | {}
 nas       | Superuser, Create role, Create DB              | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}

確かにapacheはすでにいる。パスワードを設定しよう。

postgres=# alter role apache with password 'hogehoge';

無事終了した

SSH / SCP / SCP をしようとした際にWARNING: POSSIBLE DNS SPOOFING DETECTED! とでる

サーバを移行した後、SSH / SCP をしようとした際に以下のメッセージが出る。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for hoge.hoge.com has changed,
and the key for the according IP address 155.46.126.XXX
is unknown. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.

リモートホストIPアドレスが変わるとknouwn_hostsの記録内容と一致しなくなるために出ているエラーである。
解決方法はknown_hosts内のIPアドレスを修正する

hoge.hoge.com,155.46.126.XXX ssh-rsa dfgfzaC1yc2EAAAADAQABAAABAQC/mtvnA/snl/oZY5SOphT5cYzowFyj283PRcYBYOH7sdfasdfvysaCe7MNb01COAvWdWdNk8DZMzUZh5kOE9s2q4fMPZPIWTtYZLC89jsldfjasdlfkjQjpdXRt91fh5WOT2Ad0eH9JKdUpWOTNC1F/pp3dka0bAHTe7v8+CrJ1UNH3Vq+fTxey3ObpC0cRvdb3bwUAAieLYyNa9PvzoTFftfMUpb8Rm2M2n5CWvAX0UtCES8EVeseW/rTn7OSmrisc9q6tHUumqN9gdATsvQNpfkZxQu7v9VohO9N4WVruqLarSEevwZqx+JzXEAUDqzWt6wzfaskjhsadkfjhas

他に影響が出ないのならいったんknown_hostsを削除してもいい。

サーバ間のファイルコピー SCP

サーバ間でのファイル転送には、一般的にSFTP、SCPが使われる。
これらのメリットは、

  • SSHプロトコルを使用しているので、認証情報とデータの両方が暗号化される。

  • 秘密鍵を用いての通信が可能

という点にある。
両者の違いは
SCPの方が高速
人間が操作するならどちらもさほど変わらないが、cronで実行するならSCPの方が記述が単純
使用例
秘密鍵でパスワードが必要ない状態において

$ scp data.dat hoge2@hoge.hoge.com:/home/hoge2/doko

あて先はhoge.hoge.comサーバ。ローカル側のログインユーザの秘密鍵で鍵認証して、data.datファイルを/home/hoge2/doko に転送。 SFTPのインタラクティブな仕組みにくらべて非常に単純に記述できる。

次の記事

damienkarrus.hatenablog.com

オリジナルイメージ(3) Apache+PHP+ソースファイルのイメージ作成 Docker入門-11

ApachePHPをインストールして、phpのソールファイル(index.phpのみ)をコピーしたイメージを作ってみる。
ApachePHPはaptを使ってインストールし、その後DocumentRootにPHPをコピーする。
ワークディレクトリをapとする。この中に用意するファイルは2つ。
index.php

<html>
<body>
Your IP <?php echo $_SERVER['REMOTE_ADDR']; ?>
</body>
</html>

Dockerfile

FROM debian
EXPOSE 80
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update \
&& apt install -y apache2 php libapache2-mod-php \
&& apt clean \
&& rm -rf /var/lib/apt/lists/* \
&& rm /var/www/html/index.html
COPY index.php /var/www/html/
CMD /usr/sbin/apachectl -DFOREGROUND
STOPSIGNAL SIGWINCH

内容は次の通り
(1) debianイメージをベースに構築する
(2) ポート80で通信をすることを想定している
(3) aptでワーニングが出ないように変数設定 ← 設定したのにワーニング出た
(4) RUNコマンドにてapache2 php libapache2-mod-php をインストールし、ワークワイルをクリアした後、デフォルトのindex.htmlを削除
(5) ソースファイルであるindex.phpをDocumentRootにコピー
(6) Apacheをフォアグラウンドで実行するよう指定
(7) 終了シグナルをSIGWINCHに変更
イメージを作成してみる

$ cd ap
$ docker build . -t myimg
...(snip)...
Successfully built 90c2d82e3463
Successfully tagged myimg:latest

出来たイメージを確認する

$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
myimg        latest    90c2d82e3463   3 minutes ago   254MB

コンテナを起動する

$ docker container run -dit --name myphpimg -p 8080:80 myimg

ブラウザでアクセスして動作確認したら削除しておく

$ docker container stop myphpimg
$ docker container rm myphpimg

なお、続けて同じようにビルドをかけると一瞬で出来上がる。これはキャッシュを使用しているためである。もしキャッシュを使用せずに新たにビルドしたいときは --no-cache オプションをつける。

$ docker build . -t myimg --no-cache

次の記事 damienkarrus.hatenablog.com

パスワードなしでSSH/SFTP接続する方法 CentOS

クライアント側で公開鍵と秘密鍵を作成してサーバとクライアントにそれぞれ配置することによってパスワード認証なしでSSH接続できるようになる。
環境はクライアントがCentOS 5.9 (Final)、サーバがCentOS 7.9.2009 (Core)
手順は以下の通り  
クライアント側にて

$ cd ~
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ ssh-keygen -t rsa
$ cat id_rsa.pub

ここで表示された公開鍵の内容をコピペしたいのでコピーしておく   サーバ側にてパスワードなしでログインしたいアカウントにログインする

$ cd ~
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ vi a
(先ほどコピーしたものをペーストする)
:wq
$ touch authorized_keys
$ chmod 600 authorized_keys
$ cat a >> authorized_keys
$ rm a

SSHの設定ファイルに公開鍵による認証の設定をする

# vi /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
:wq
# service sshd restart

これで設定は完了。クライアントから接続してみる

$ ssh hoge@hoge.hoge.hoge
[hoge]$

パスワードなしでログイン完了
これで、SFTPも同様にできるはず。

$ cat sendfile.txt
lcd /home/hoge
cd backup
put hogehoge.gz
bye

$ sftp hoge@hoge.hoge.hoge -b sendfile.txt
sftp> lcd /home/hoge/backup
sftp> cd backup
sftp> put hogehoge.gz
Uploading hogehoge.gz to /home/hoge/backup/hogehoge.gz
sftp> bye

できた。

次の記事

damienkarrus.hatenablog.com