sql >> データベース >  >> RDS >> PostgreSQL

DockerコンテナへのPostgreSQLのデプロイ

    はじめに

    Dockerは、アプリケーションのビルドとデプロイの方法を最新化しました。これにより、あらゆるアプリケーションを簡単に実行できる、軽量でポータブルな自己完結型のコンテナを作成できます。

    このブログは、Dockerを使用してPostgreSQLデータベースを実行する方法を説明することを目的としています。 Dockerのインストールや構成については説明していません。こちらのDockerのインストール手順を参照してください。いくつかの追加の背景は、MySQLとDockerに関する以前のブログにあります。

    詳細に入る前に、いくつかの用語を確認しましょう。

    • Dockerfile
      アプリケーション/ソフトウェアをインストールまたは構成するための一連の手順/コマンドが含まれています。
    • Dockerイメージ
      Dockerイメージは、Dockerfileからの命令を表す一連のレイヤーから構築されます。 Dockerイメージは、コンテナーを作成するためのテンプレートとして使用されます。
    • コンテナとユーザー定義のネットワーキングのリンク
      Dockerは、デフォルトのネットワークメカニズムとしてブリッジを使用し、-linksを使用してコンテナーを相互にリンクしました。アプリケーションコンテナからPostgreSQLコンテナにアクセスするには、作成時に両方のコンテナをリンクする必要があります。この記事では、リンク機能が間もなく廃止されるため、ユーザー定義のネットワークを使用しています。
    • Dockerでのデータの永続性
      デフォルトでは、コンテナ内のデータは一時的なものです。コンテナが再起動されるたびに、データは失われます。ボリュームは、Dockerコンテナによって生成および使用されるデータを永続化するための推奨メカニズムです。ここでは、すべてのデータが保存されているコンテナ内にホストディレクトリをマウントしています。

    PostgreSQLイメージの作成を開始し、それを使用してコンテナを実行しましょう。

    PostgreSQL Dockerfile

    # example Dockerfile for https://docs.docker.com/engine/examples/postgresql_service/
    
    
    FROM ubuntu:14.04
    
    # Add the PostgreSQL PGP key to verify their Debian packages.
    # It should be the same key as https://www.postgresql.org/media/keys/ACCC4CF8.asc
    RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
    
    # Add PostgreSQL's repository. It contains the most recent stable release
    #     of PostgreSQL, ``9.3``.
    RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list
    
    # Install ``python-software-properties``, ``software-properties-common`` and PostgreSQL 9.3
    #  There are some warnings (in red) that show up during the build. You can hide
    #  them by prefixing each apt-get statement with DEBIAN_FRONTEND=noninteractive
    RUN apt-get update && apt-get install -y python-software-properties software-properties-common postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3
    
    # Note: The official Debian and Ubuntu images automatically ``apt-get clean``
    # after each ``apt-get``
    
    # Run the rest of the commands as the ``postgres`` user created by the ``postgres-9.3`` package when it was ``apt-get installed``
    USER postgres
    
    # Create a PostgreSQL role named ``postgresondocker`` with ``postgresondocker`` as the password and
    # then create a database `postgresondocker` owned by the ``postgresondocker`` role.
    # Note: here we use ``&&\`` to run commands one after the other - the ``\``
    #       allows the RUN command to span multiple lines.
    RUN    /etc/init.d/postgresql start &&\
        psql --command "CREATE USER postgresondocker WITH SUPERUSER PASSWORD 'postgresondocker';" &&\
        createdb -O postgresondocker postgresondocker
    
    # Adjust PostgreSQL configuration so that remote connections to the
    # database are possible.
    RUN echo "host all  all    0.0.0.0/0  md5" >> /etc/postgresql/9.3/main/pg_hba.conf
    
    # And add ``listen_addresses`` to ``/etc/postgresql/9.3/main/postgresql.conf``
    RUN echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf
    
    # Expose the PostgreSQL port
    EXPOSE 5432
    
    # Add VOLUMEs to allow backup of config, logs and databases
    VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
    
    # Set the default command to run when starting the container
    CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]

    Dockerfileをよく見ると、PostgreSQLをインストールし、ubuntuOSでいくつかの構成変更を実行するために使用されるコマンドで構成されています。

    PostgreSQLイメージの構築

    dockerbuildコマンドを使用してDockerfileからPostgreSQLイメージをビルドできます。

    # sudo docker build -t postgresondocker:9.3 .

    ここでは、名前やバージョンなどのタグ(-t)を画像に指定できます。末尾のドット(。)は現在のディレクトリを指定し、現在のディレクトリにあるDockerfileを使用します。Dockerファイル名は「Dockerfile」である必要があります。 Dockerファイルのカスタム名を指定する場合は、dockerbuildコマンドで-fを使用する必要があります。

    # sudo docker build -t postgresondocker:9.3 -f <your_docker_file_name>

    出力:(オプションで、可能であればスクロールバーのテキストウィンドウを使用)

    Sending build context to Docker daemon  4.096kB
    Step 1/11 : FROM ubuntu:14.04
    14.04: Pulling from library/ubuntu
    324d088ce065: Pull complete 
    2ab951b6c615: Pull complete 
    9b01635313e2: Pull complete 
    04510b914a6c: Pull complete 
    83ab617df7b4: Pull complete 
    Digest: sha256:b8855dc848e2622653ab557d1ce2f4c34218a9380cceaa51ced85c5f3c8eb201
    Status: Downloaded newer image for ubuntu:14.04
     ---> 8cef1fa16c77
    Step 2/11 : RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
     ---> Running in ba933d07e226
    .
    .
    .
    fixing permissions on existing directory /var/lib/postgresql/9.3/main ... ok
    creating subdirectories ... ok
    selecting default max_connections ... 100
    selecting default shared_buffers ... 128MB
    creating configuration files ... ok
    creating template1 database in /var/lib/postgresql/9.3/main/base/1 ... ok
    initializing pg_authid ... ok
    initializing dependencies ... ok
    creating system views ... ok
    loading system objects' descriptions ... ok
    creating collations ... ok
    creating conversions ... ok
    creating dictionaries ... ok
    setting privileges on built-in objects ... ok
    creating information schema ... ok
    loading PL/pgSQL server-side language ... ok
    vacuuming database template1 ... ok
    copying template1 to template0 ... ok
    copying template1 to postgres ... ok
    syncing data to disk ... ok
    
    Success. You can now start the database server using:
    
        /usr/lib/postgresql/9.3/bin/postgres -D /var/lib/postgresql/9.3/main
    or
        /usr/lib/postgresql/9.3/bin/pg_ctl -D /var/lib/postgresql/9.3/main -l logfile start
    
    Ver Cluster Port Status Owner    Data directory               Log file
    9.3 main    5432 down   postgres /var/lib/postgresql/9.3/main /var/log/postgresql/postgresql-9.3-main.log
    update-alternatives: using /usr/share/postgresql/9.3/man/man1/postmaster.1.gz to provide /usr/share/man/man1/postmaster.1.gz (postmaster.1.gz) in auto mode
    invoke-rc.d: policy-rc.d denied execution of start.
    Setting up postgresql-contrib-9.3 (9.3.22-0ubuntu0.14.04) ...
    Setting up python-software-properties (0.92.37.8) ...
    Setting up python3-software-properties (0.92.37.8) ...
    Setting up software-properties-common (0.92.37.8) ...
    Processing triggers for libc-bin (2.19-0ubuntu6.14) ...
    Processing triggers for ca-certificates (20170717~14.04.1) ...
    Updating certificates in /etc/ssl/certs... 148 added, 0 removed; done.
    Running hooks in /etc/ca-certificates/update.d....done.
    Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...
    Removing intermediate container fce692f180bf
     ---> 9690b681044b
    Step 5/11 : USER postgres
     ---> Running in ff8864c1147d
    Removing intermediate container ff8864c1147d
     ---> 1f669efeadfa
    Step 6/11 : RUN    /etc/init.d/postgresql start &&    psql --command "CREATE USER postgresondocker WITH SUPERUSER PASSWORD 'postgresondocker';" &&    createdb -O postgresondocker postgresondocker
     ---> Running in 79042024b5e8
     * Starting PostgreSQL 9.3 database server
       ...done.
    CREATE ROLE
    Removing intermediate container 79042024b5e8
     ---> 70c43a9dd5ab
    Step 7/11 : RUN echo "host all  all    0.0.0.0/0  md5" >> /etc/postgresql/9.3/main/pg_hba.conf
     ---> Running in c4d03857cdb9
    Removing intermediate container c4d03857cdb9
     ---> 0cc2ed249aab
    Step 8/11 : RUN echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf
     ---> Running in fde0f721c846
    Removing intermediate container fde0f721c846
     ---> 78263aef9a56
    Step 9/11 : EXPOSE 5432
     ---> Running in a765f854a274
    Removing intermediate container a765f854a274
     ---> d205f9208162
    Step 10/11 : VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
     ---> Running in ae0b9f30f3d0
    Removing intermediate container ae0b9f30f3d0
     ---> 0de941f8687c
    Step 11/11 : CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]
     ---> Running in 976d283ea64c
    Removing intermediate container 976d283ea64c
     ---> 253ee676278f
    Successfully built 253ee676278f
    Successfully tagged postgresondocker:9.3

    コンテナネットワークの作成

    以下のコマンドを使用して、ブリッジドライバを使用してユーザー定義のネットワークを作成します。

    # sudo docker network create --driver bridge postgres-network

    ネットワーク作成の確認

    # sudo docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    a553e5727617        bridge              bridge              local
    0c6e40305851        host                host                local
    4cca2679d3c0        none                null                local
    83b23e0af641        postgres-network    bridge              local

    コンテナの作成

    Dockerイメージからコンテナーを作成するには、「dockerrun」コマンドを使用する必要があります。 -dオプションを使用して、postgresコンテナをデーモンモードで実行しています。

    # sudo docker run --name postgresondocker --network postgres-network -d postgresondocker:9.3

    以下のコマンドを使用して、コンテナの作成を確認します。

    # sudo docker container ls 
    CONTAINER ID        IMAGE                  COMMAND                  CREATED              STATUS              PORTS               NAMES
    06a5125f5e11        postgresondocker:9.3   "/usr/lib/postgresql…"   About a minute ago   Up About a minute   5432/tcp            postgresondocker

    公開するポートを指定していないため、内部使用のためにデフォルトのpostgresポート5432を公開します。 PostgreSQLはDockerネットワーク内からのみ利用可能であり、ホストポートでこのPostgresコンテナにアクセスすることはできません。

    この記事の後のセクションで、ホストポートのPostgresコンテナにアクセスする方法を説明します。

    Dockerネットワーク内のPostgreSQLコンテナへの接続

    以前に作成した同じDockerネットワーク内の別のコンテナからPostgresコンテナに接続してみましょう。ここでは、psqlクライアントを使用してPostgresに接続しました。 Dockerファイルに存在するホスト名、ユーザー、パスワードとしてPostgresコンテナ名を使用しました。

    # docker run -it --rm --network postgres-network postgresondocker:9.3 psql -h postgresondocker -U postgresondocker --password
    Password for user postgresondocker: 
    psql (9.3.22)
    SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
    Type "help" for help.
    
    postgresondocker=# 

    runコマンドの--rmオプションは、psqlプロセスを終了するとコンテナを削除します。

    # sudo docker container ls 
    CONTAINER ID        IMAGE                  COMMAND                  CREATED              STATUS              PORTS               NAMES
    2fd91685d1ea        postgresondocker:9.3   "psql -h postgresond…"   29 seconds ago       Up 30 seconds       5432/tcp            brave_spence
    06a5125f5e11        postgresondocker:9.3   "/usr/lib/postgresql…"   About a minute ago   Up About a minute   5432/tcp            postgresondocker

    データの永続性

    Dockerコンテナーは本質的に一時的なものです。つまり、コンテナーによって使用または生成されるデータは、暗黙的にどこにも保存されません。コンテナが再起動または削除されるたびにデータが失われます。 Dockerは、永続データを保存できるボリュームを提供します。これは、災害時に同じボリュームまたはデータを使用して別のコンテナーをプロビジョニングできる便利な機能です。

    データボリュームを作成し、その作成を確認しましょう。

    # sudo docker volume create pgdata
    pgdata
    
    # sudo docker volume ls
    DRIVER              VOLUME NAME
    local                   pgdata

    ここで、Postgresコンテナの実行中にこのデータボリュームを使用する必要があります。ボリュームなしで実行されている古いpostgresコンテナを必ず削除してください。

    # sudo docker container rm postgresondocker -f 
    postgresondocker
    
    # sudo docker run --name postgresondocker --network postgres-network -v pgdata:/var/lib/postgresql/9.3/main -d postgresondocker:9.3

    データボリュームがアタッチされたPostgresコンテナを実行しました。

    Postgresで新しいテーブルを作成して、データの永続性を確認します。

    # docker run -it --rm --network postgres-network postgresondocker:9.3 psql -h postgresondocker -U postgresondocker --password
    Password for user postgresondocker: 
    psql (9.3.22)
    SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
    Type "help" for help.
    
    postgresondocker=# \dt
    No relations found.
    postgresondocker=# create table test(id int);
    CREATE TABLE
    postgresondocker=# \dt 
                List of relations
     Schema | Name | Type  |      Owner       
    --------+------+-------+------------------
     public | test | table | postgresondocker
    (1 row)

    Postgresコンテナを削除します。

    # sudo docker container rm postgresondocker -f 
    postgresondocker

    新しいPostgresコンテナを作成し、テストテーブルが存在するかどうかを確認します。

    # sudo docker run --name postgresondocker --network postgres-network -v pgdata:/var/lib/postgresql/9.3/main -d postgresondocker:9.3
    
    
    # docker run -it --rm --network postgres-network postgresondocker:9.3 psql -h postgresondocker -U postgresondocker --password
    Password for user postgresondocker: 
    psql (9.3.22)
    SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
    Type "help" for help.
    
    postgresondocker=# \dt
                List of relations
     Schema | Name | Type  |      Owner       
    --------+------+-------+------------------
     public | test | table | postgresondocker
    (1 row)
    今日のホワイトペーパーをダウンロードするClusterControlを使用したPostgreSQLの管理と自動化PostgreSQLの導入、監視、管理、スケーリングを行うために知っておくべきことについて学ぶホワイトペーパーをダウンロードする

    PostgreSQLサービスをホストに公開します

    以前にPostgreSQLコンテナのポートを公開していないことに気付いたかもしれません。つまり、PostgreSQLは、以前に作成したpostgres-networkにあるコンテナにのみアクセスできます。

    PostgreSQLサービスを使用するには、-portオプションを使用してコンテナポートを公開する必要があります。ここでは、ホストの5432ポートにPostgresコンテナポート5432を公開しました。

    # sudo docker run --name postgresondocker --network postgres-network -v pgdata:/var/lib/postgresql/9.3/main -p 5432:5432 -d postgresondocker:9.3
    # sudo docker container ls
    CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                    NAMES
    997580c86188        postgresondocker:9.3   "/usr/lib/postgresql…"   8 seconds ago       Up 10 seconds       0.0.0.0:5432->5432/tcp   postgresondocker

    これで、ローカルホスト上のPostgreSQLに直接接続できます。

    # psql -h localhost -U postgresondocker --password
    Password for user postgresondocker: 
    psql (9.3.22)
    SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
    Type "help" for help.
    
    postgresondocker=#

    コンテナの削除

    コンテナを削除するには、最初に実行中のコンテナを停止してから、rmコマンドを使用してコンテナを削除する必要があります。

    # sudo docker container stop postgresondocker 
    
    # sudo docker container rm postgresondocker
    postgresondocker

    -f(--force)オプションを使用して、実行中のコンテナーを直接削除します。

    # sudo docker container rm postgresondocker -f
    postgresondocker

    うまくいけば、PostgreSQL用の独自のドッキングされたローカル環境ができました。

    注: この記事では、開発/POC環境でDocker上でPostgreSQLを使用する方法の概要を説明します。実稼働環境でPostgreSQLを実行するには、PostgreSQLまたはDockerの構成に追加の変更が必要になる場合があります。

    結論

    Dockerコンテナ内でPostgreSQLデータベースを実行する簡単な方法があります。 Dockerは、デプロイメント、構成、および特定の管理手順を効果的にカプセル化します。 Dockerは、最小限の労力でPostgreSQLをデプロイするのに適しています。事前に構築されたDockerコンテナを起動するだけで、PostgreSQLデータベースをサービスに使用できるようになります。

    参照

    • Dockerのインストール:https://docs.docker.com/install
    • ボリューム:https://docs.docker.com/storage/volumes
    • ユーザー定義のネットワーク:https://docs.docker.com/network/
    • Postgres Dockerファイル:https://docs.docker.com/engine/examples/postgresql_service
    • Docker上のMySQL:基本を理解する:https://severalnines.com/blog/mysql-docker-containers-understanding-basics

    1. SQL-varcharデータ型を日時データ型に変換した結果、値が範囲外になりました

    2. Access2016で空のデータベースを作成する方法

    3. SQLServerのタイムスタンプ列を日時形式に変換する方法

    4. SQL UPDATE:テーブルの値を更新する方法を学ぶ