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
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」ボタンクリックで、削除される。
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が使われる。
これらのメリットは、
という点にある。
両者の違いは
SCPの方が高速
人間が操作するならどちらもさほど変わらないが、cronで実行するならSCPの方が記述が単純
使用例
秘密鍵でパスワードが必要ない状態において
$ scp data.dat hoge2@hoge.hoge.com:/home/hoge2/doko
あて先はhoge.hoge.comサーバ。ローカル側のログインユーザの秘密鍵で鍵認証して、data.datファイルを/home/hoge2/doko に転送。 SFTPのインタラクティブな仕組みにくらべて非常に単純に記述できる。
次の記事
オリジナルイメージ(3) Apache+PHP+ソースファイルのイメージ作成 Docker入門-11
ApacheとPHPをインストールして、phpのソールファイル(index.phpのみ)をコピーしたイメージを作ってみる。
ApacheとPHPは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
パスワードなしで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
できた。
次の記事