DamienKarrus’s blog

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

LAPP on コンテナ on WSL2

WSLを使って開発環境(LAPP)をコンテナで作ってみようと思う。 ホスト側環境は以下の通り

Windows11
WSL2 (Ubuntu-20.04)
Docker (20.10.14)

デバッグの効率性を考えて、PHPのソースはWindows上のフォルダに置き、それをUbuntuがマウントしてくれるので、そのUbuntuディレクトリをコンテナがbindして使う。

Windows:C:\Users\kakimoto\mpses
 ↓
Ubuntu:/mnt/c/Users/kakimoto/mpses

フォルダ構成

作業フォルダ(mpses)下にDBとウェブアプリ(apache+php)のサブフォルダを作って、イメージはそれぞれの中で作成定義しておき、全体をdocker-composeでコントロールする。

docker-compose.yaml
postgres/
web/

postgres

postgresフォルダ内は

Dockerfile
docker-entrypoint-initdb.d/

Dockerfileは

FROM postgres:14-alpine
ENV LANG ja_JP.utf8

docker-entrypoint-initdb.d には、データベースの初期データを data.out というファイル名でおいておくことにする(後ほどリストアして使用する)。
Postgresのデータはボリュームを作成しておきvolumeマウントして使う。

$ docker volume create --name mps-db-data

web

webフォルダは

Dockerfile
php.ini
apache2.conf
src/

apachephpの設定ファイルはbindして使用する。apacheはlatest、phpは7.4を指定した。srcはwindows上のソースファイルがあるフォルダ。
Dockerfileは

FROM debian
EXPOSE 80
RUN apt-get update
RUN apt-get install -y sudo
RUN apt-get install -y curl ca-certificates gnupg \
&& sudo apt-get install -y build-essential apt-transport-https \
&& sudo apt-get install -y php7.4 php7.4-intl php7.4-mbstring php7.4-pgsql php7.4-fpm php7.4-cli php7.4-zip \
&& sudo apt-get install -y apache2 libapache2-mod-php \
&& sudo apt-get install -y iputils-ping net-tools dnsutils \ ←疎通確認などに使用するツール
&& sudo apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& rm /var/www/html/index.html
COPY php.ini /usr/local/etc/php/
COPY apache2.conf /etc/apache2/
CMD /usr/sbin/apachectl -DFOREGROUND
STOPSIGNAL SIGWINCH

php.iniは

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

docker-compose

doker-compose.yaml

version: '3'
services:
  web:
    build: ./web
    volumes:
      - ./web/php.ini:/usr/local/etc/php/php.ini
      - ./web/src:/var/www/html
    ports:
      - 8080:80
  db:
    build: ./postgres
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
    volumes:
      - ./postgres/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
      - mps-db-data:/var/lib/postgresql/data
volumes:
  mps-db-data:
    external: true

まずは疎通確認

# ping db
PING db (192.168.160.2) 56(84) bytes of data.
64 bytes from mpses_db_1.mpses_default (192.168.160.2): icmp_seq=1 ttl=64 time=0.081 ms
...(snip)...

では、webコンテナからdbコンテナに対してSQLを発行してみる。次のphpを作ってブラウザでアクセスしてみる。内容はテーブル一覧を表示するというもの。
mpses/web/src/test.php

<?php
        ini_set( 'display_errors' , 'On' );
        $str = "host=db port=5432 dbname=admin user=admin password=admin";
        $db = pg_connect( $str );
        if($db == FALSE):
                echo "DB connection failed DAME";
                exit;
        endif;
        $q = "select schemaname, tablename, tableowner from pg_tables where schemaname not like 'pg_%' and schemaname != 'information_schema'";
        $res = pg_query( $db , $q );
        $rows = pg_num_rows( $res );
        for( $i=0 ; $i<$rows ; $i++ ):
                $e = pg_fetch_array( $res , $i , PGSQL_ASSOC );
                print( "$i: {$e['schemaname']} , {$e['tablename']} , {$e['tableowner']} <br />" );
        endfor;
?>

1行目はエラーが出た場合にメッセージを画面に表示すための指定。 2行目がpg_connect()に渡すパラメータ。今回の接続内容は、

キー パラメータ 説明
host db postgresコンテナのホスト名=docker-compose.yaml内のdbコンテナのサービス名
port 5432 docker-compose.yaml内で指定した外向けport番号
dbname admin db名称:今回は明示的に指定しなかったので、USER名と同じ名称となっている
user admin docker-compose.yaml内で指定したユーザ名
password admin docker-compose.yaml内で指定したパスワード

ここまでで一応、apacheが動き、phpが動き、それぞれの設定ファイルを自由に設定でき、postgresのコンテナを分離でき、データベースクラスタ(物理的記憶領域)を外部のボリュームに逃がしてみることができた。基本的な開発環境としては最低限なところは構築できたとおもう。

PostgreSQLのコンテナを作る Docker実践-1 

DBのコンテナを作ってみる。 PostgreSQLの14.xで作成することにする。カレントディレクトリを mpses とする。 Dockerfileはpostgresフォルダを作りその中に入れる

mpses/postgres/

Dockerfileを作る

FROM postgres:14-alpine
ENV LANG ja_JP.utf8

debian版とalpine版があるが、alpineのほうががサイズが小さい
次に docker-compose.yaml で起動時の初期設定を書く。Dockerfile 内で docker run しないのは、起動時の設定を覚えるのが大変だから。 docker-compose.yaml にその設定を書いてしまえばよい。

version: '3'
services:
  db:
    build: ./postgres
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin

dbという名称は任意に付けたもの。ユーザ名を指定しないとデフォルトのpostgresになる。
コンテナを起動する

$ docker-compose up -d ←デタッチモード

面倒なパラメータはdocker-composeに入っているので何も指定しなくてよい。起動されているか確認してみる。

$ docker-compose exec db bash ← dbはdocker-compose.yaml内のサービス名
bash-5.1# psql -U admin
psql (14.2)
Type "help" for help.

admin=# select version();
                                                   version
--------------------------------------------------------------------------------------------------------------
 PostgreSQL 14.2 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.3.1_git20211027) 10.3.1 20211027, 64-bit
(1 row)

admin=# \q
bash-5.1# exit
$ docker-compose down

version14.2が稼働していることが確認できた。
次はコンテナ起動時にDBにデータを入れてみる。なお、adminというユーザを登録した場合はadminというデータベースも作られているので、データベースをcreateする必要はない。
postgres の docker image は、docker-entrypoint-initdb.d 内に.sh を置いておくと起動時にその内容を実行してくれる。 postgresフォルダ内に docker-entrypoint-initdb.d フォルダを作り、以下のinit.shファイルを置いてみる。
init.sh

set -e
psql -U admin admin <<EOF
CREATE TABLE m_user(
id TEXT PRIMARY KEY,
name TEXT,
password TEXT
);
EOF

docker-composeファイルに、volume設定を定義してこのファイルを参照させる。

version: '3'
services:
  db:
    build: ./postgres
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
    volumes:
      - ./postgres/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d

コンテナを立ち上げて、DBを確認してみる。

$ docker-compose up -d
$ docker-compose exec db bash
bash-5.1# psql -U admin
psql (14.2)
Type "help" for help.

admin=# \d
        List of relations
 Schema |  Name  | Type  | Owner
--------+--------+-------+-------
 public | m_user | table | admin
(1 row)

admin=# \d m_user
              Table "public.m_user"
  Column  | Type | Collation | Nullable | Default
----------+------+-----------+----------+---------
 id       | text |           | not null |
 name     | text |           |          |
 password | text |           |          |
Indexes:
    "m_user_pkey" PRIMARY KEY, btree (id)

admin=#

指定した通りに生成できているようだ。 ここで一旦コンテナを削除する。

$ docker-compose down

次に、既存のDBをリストアしてみる。
バックアップファイルを docker-entrypoint-initdb.d フォルダに data.out というファイル名で用意する。init.shは不要なので削除しておく。
また、データを永続的に保存するため、ホスト側のディレクトリをマウントしたい。ところが、ホスト側(Windows)をマウントしても、書き込み権限エラーやSYNCエラーが多発する。おそらくLinuxが仮想ファイルシステムWindows上で動かしているとおもわれるがこれが良くないみたいだ。そこでdockerでvolumeを作り、それを利用することにする。

$ docker volume create mps-db-data

docker-compose.yamlは以下の通り

version: '3'
services:
    db:
        build: ./postgres
            ports:
                - 5432:5432
            environment:
                POSTGRES_USER: admin
                POSTGRES_PASSWORD: admin
            volumes:
                - mps-db-data:/var/lib/postgresql
                - ./postgres/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
volumes:
  mps-db-data:
    external:true

コンテナに入り、バックアップデータをリストアする。

$ docker-compose up -d
$ docker-compose exec db bash
# cd /docker-entrypoint-initdb.d
# psql -U admin < data.out
...(snip)...
# psql -U admin
admin=# \d
テーブルやレコードの存在することを確認する
admin=# \q
# exit

これでデータベースの内容はvolume内に保存されたはずである。確認のため、コンテナを削除してから再構築し、データが保存されていることを確認してみる。

$ docker-compose down
$ docker container ls ←消えている
$ docker network ls ←消えている
$ docker volume ls ←volumeは残っている
DRIVER    VOLUME NAME
local     mps-db-data
$ docker-compose up -d
$ docker-compose exec db bash
# psql -U admin
admin=# \d
テーブルやレコードの存在することを確認する
admin=# \q
# exit
$ docker-compose down

DBデータの永続化ができた。くれぐれもdocker volume prune で消しませんように......

PHP8.1+PostgreSQL14.2の最新LAPP環境構築

本日時点での最新PHPと最新PostgresでLAPP環境を構築するにはこうします

sudo apt-get update 
sudo apt-get install -y curl ca-certificates gnupg 
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt-get install -y postgresql 
sudo apt-get install -y build-essential apt-transport-https 
sudo add-apt-repository -y ppa:ondrej/php 
sudo apt-get install -y php8.1 php8.1-intl php8.1-mbstring php8.1-pgsql php8.1-fpm php8.1-cli php8.1-zip
sudo apt-get install -y apache2 libapache2-mod-php 
sudo apt-get clean 
rm -rf /var/lib/apt/lists/* 

PHPのバージョンを確認します。

$ php -v
PHP 8.1.3 (cli) (built: Feb 21 2022 14:48:42) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.3, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.3, Copyright (c), by Zend Technologies

無事8.1が入っています。 Posgreのバージョンを確認します。

$ sudo -u postgres -i
$ psql
psql (14.2 (Ubuntu 14.2-1.pgdg20.04+1)) ←psqlのバージョンです。本体のバージョンではない。
Type "help" for help.
postgres=# select version();
                                                             version                                                            
----------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 14.2 (Ubuntu 14.2-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit
(1 row)

SELECT version(); として表示されるのが本体のバージョンで、14.2がインストールされました。

WSL2のインストール(windows11)

WSL2(Windows Subsystem for Linux2)はWindowsOS上で仮想マシンとしてLinuxカーネルを動作させるサブシステムである。
インストールするWindowsエディションやバージョンによってインストール工程は異なる。今回インストールの対象としたのは、以下のマシンである。

エディション:Windows 11 Home
バージョン:21H2 (OSビルド 22000.556)

Windows11 (21H2)へのWSL2インストールは容易である。 Windows PowerShellを管理者権限で立ち上げる。 wslのインストール指示をする。

> wsl --install

以下のようにメッセージが出てインストールが終了するので、再起動する。

インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
ダウンロード中: WSL カーネル
インストール中: WSL カーネル
WSL カーネル はインストールされました。
ダウンロード中: GUI アプリ サポート
インストール中: GUI アプリ サポート
GUI アプリ サポート はインストールされました。
ダウンロード中: Ubuntu
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。

再起動すると、Ubuntuのインストールが始まり、使用するユーザ名とパスワードの入力が求められる。

Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: ubuntu
New password:
Retype new password:
passwd: password updated successfully
Installation successful!

これで完了である。ただ、su はできない。sudo を使えと言っている。

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

以上のやりかたでUbuntuの最新バージョンがインストールされるが、Ubuntuの最新以外をインストールしたい場合は、インストール時にディストリビューションを指定すればよい。 ディストリビューションの一覧は次のように確認できる。

> wsl -l -o
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl --install -d <Distro>' を使用してインストールします。

NAME            FRIENDLY NAME
Ubuntu          Ubuntu
Debian          Debian GNU/Linux
kali-linux      Kali Linux Rolling
openSUSE-42     openSUSE Leap 42
SLES-12         SUSE Linux Enterprise Server v12
Ubuntu-16.04    Ubuntu 16.04 LTS
Ubuntu-18.04    Ubuntu 18.04 LTS
Ubuntu-20.04    Ubuntu 20.04 LTS

メッセージにあるように、仮にDebianをインストールする場合は

> wsl --install -d Debian 

とすればよい。
ディストリビューションのアンインストールは unregisterを使用する。

> wsl --unregister ディストリビューション名

PowerShellからUbuntuのシェルを起動するにはwslコマンドを実行する

> wsl

ただwslとした場合はデフォルトのディストリビューションのシェルが起動する。ディストリビューション名を指定することによって切り替えることができる。

これだけではWSLとして動作しているのか、それともWSL2として動作しているaかよくわからない。確認してみる。

> wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2

VERSION欄に2と表示されているので、どうやら大丈夫そうである。 では、まっさらなUbuntuを調整していく。まずはバージョンの確認。

$ lsb_release -a

aptのリポジトリを最新に更新

$ sudo apt update 
$ sudo apt upgrade -y

新しいユーザを登録する

$ sudo adduser mpses
$ sudo passwd mpses

wslで起動時に特定ユーザでログインしたい場合は-uを使用する

> wsl -u mpses

デフォルトユーザを変更したい場合はubuntu2004コマンド(ubuntu-20.04のexe)で行う

> ubuntu2004 config --default-user mpses

また、rootでログインするには

> wsl  -u root

ネットワークについて
ホスト(Windows)側
IPアドレスは固定ではない

> ipconig
...(snip)...
イーサネット アダプター vEthernet (WSL):

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: fe80::59b4:3821:1389:e888%31
   IPv4 アドレス . . . . . . . . . . . .: 172.17.224.1
   サブネット マスク . . . . . . . . . .: 255.255.240.0
   デフォルト ゲートウェイ . . . . . . .:

ゲスト(WSL2)側
IPアドレスは固定ではない

$ ip addr | grep eth0
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 172.17.226.110/20 brd 172.17.239.255 scope global eth0

Ubuntu内で立ち上げたhttpdwindows側からアクセスしてみる

$ sudo apt-get install -y apache2
$ apache2 -v
$ sudo service apache2 restart
$ sudo service apache2 status
$ curl http://localhost/

これでhtmlがバラバラ表示されればokだ Windows側からアクセスしてみる。ブラウザでhttp://localhost/で表示される。
あれ? ホスト側IPアドレスじゃなくてlocalhost? ちょっと不思議ですね。
Ubuntuの日本語化
使用できるロケールを確認

$ locale -a
C
C.UTF-8
POSIX
en_US.utf8

日本語がないので、日本語言語パックをインストールする

$ sudo apt install -y language-pack-ja
...(snip)...
$ locale -a
C
C.UTF-8
POSIX
en_US.utf8
ja_JP.utf8

日本語が入った。ロケールをja_JP.UTF-8に設定する。

$ sudo update-locale LANG=ja_JP.UTF-8

ここで一旦ログアウトする。 タイムゾーンJSTに設定する。

$ sudo dpkg-reconfigure tzdata

アジア→東京 TABで<了解>を選ぶ。
日本語manページのインストールをしておく。

$ sudo apt -y  install manpages-ja manpages-ja-dev

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する手順が正常に動作した。

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」ボタンクリックで、削除される。

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

サーバを移行した後、SSH / SCP / 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を削除してもいい。