2020/08/17

Docker のコンテナからホストOSに接続するのに「host.docker.internal」というホストが用意されています。

Docker for Mac Stable release notes

Docker For Mac での機能なので、Linux ベースでは利用できないかと思います。

Dockerコンテナから Mac の MySQL に接続

mysql コマンドで Dockerコンテナから、ホストOS(Mac)の MySQL に接続する場合、ホスト名に「host.docker.internal」を指定します。


# mysql -u ユーザ名 -h host.docker.internal -p
mysql>

よって、開発のプログラム上でも「host.docker.internal」をホストで設定して利用できます。

Dockerコンテナから PHP で MySQL の PDO接続


$db_name = 'DB名';
$user_name = 'ユーザ名';
$password = 'パスワード';
$host = 'host.docker.internal';
$dsn = "mysql:dbname={$db_name};host={$host}";

try {
    $pdo = new PDO($dsn, $user_name, $password);
    echo "接続成功" . PHP_EOL;
} catch (PDOException $e) {
    echo "接続失敗: " . $e->getMessage() . PHP_EOL;
    exit;
}

Dockerコンテナから Mac の PostgreSQL に接続


# psql -l -h host.docker.internal -U ユーザ名
                         List of databases
   Name    | Owner | Encoding | Collate | Ctype | Access privileges 
-----------+-------+----------+---------+-------+-------------------
 postgres  | yoo   | UTF8     | C       | C     | 
 sample    | yoo   | UTF8     | C       | C     | 
 template0 | yoo   | UTF8     | C       | C     | =c/yoo           +
           |       |          |         |       | yoo=CTc/yoo
 template1 | yoo   | UTF8     | C       | C     | =c/yoo           +
           |       |          |         |       | yoo=CTc/yoo

  2020/08/17

ホストOS から Docker の MySQLコンテナにログインする場合、以下の方法があります。

  • MySQL コンテナに bash でログイン
  • mysql コマンドでログイン

MySQL コンテナにログイン

他のコンテナ同様、docker-compose で MySQL コンテナに直接ログインします。


$ docker-compose exec コンテナ名 bash

コンテナ名が mysql だった場合


$ docker-compose exec mysql bash

Docker コンテナにログインしたら、MySQL にログインします。


# mysql -u root -p

この方法は、docker-compose が動作するパスで実行する必要があり、MySQL コンテナ内でも mysql でログインします。

mysql コマンドでログイン

次にホスト OS から mysql コマンドでログインしてみます。

つまりは、Docker の MySQL を外部ホストでログインする方法です。


$ mysql -u root -p -h localhost -P 3306 --protocol=tcp

mysql で localhost を指定すると自分の PC を指すため、--protocol で TCP ソケットを指定する必要があります。

  2020/03/28

今回は、複数のコンテナを docker-compose を利用して起動してみます。

Docker/Kubernetes 実践コンテナ開発入門

を参考に、Jenkins のMaster、Slave で複数のコンテナを構築します。

Jenkins(Master)コンテナ作成

まず、Jenkins(Master)を以下の設定で作成します。

  • Dockerイメージ:Jenkinsci/jenkins:latest
  • ポートフォワーディング:8080 <==> 8080
  • 共有ボリューム:./jenkins_home <==> /var/jenkins_home

ポートフォワーディング、共有ボリュームは、左がホスト(Mac)、右がDockerの設定となります。

docker-compose.yml の設定


version: "3"
services:
  master:
    container_name: master
    image: jenkinsci/jenkins:2.142-slim
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home

このように、volumes を設定することで、Dockerのデータをホスト側と共有させて、永続化することができます。

docker-compose の起動

docker-compose.yml を作成したら、 --build でイメージ構築と同時に起動をします。


$ docker-compose up --build

Jenkinsのパスワードを控える

途中で、Jenkins の管理者パスワードが表示されるため、控えておきましょう。
忘れた場合は、Docker内の「/var/jenkins_home/secrets/initialAdminPassword」に記載されています。


...
master    | Jenkins initial setup is required. An admin user has been created and a password generated.
master    | Please use the following password to proceed to installation:
master    | 
master    | パスワード
master    | 
master    | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
...

この時点で、ホスト側のルートにも「jenkins_home」ディレクトリが作成されます。

Docker側でSSH認証キーを作成

Jenkins(Master)コンテナ内で、SSH認証キーを作成します。

dockerコンテナに対して、シェルコマンドを実行します。


$ docker container exec -it コンテナ名 シェルコマンド

今回は、ssh-keygen を利用するので、


$ docker container exec -it master ssh-keygen -t rsa -C ""
Generating public/private rsa key pair.
Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa):        
Created directory '/var/jenkins_home/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
...
SHA256:SSHキー

すると、jenkins_home/.ssh/ に id_rsa、id_rsa.pub が作成されます。

docker-compose の停止

Jenkins(Slave)を設定するため、一旦、コンテナを停止します。


$ docker-compose down

Jenkins(Slave)コンテナ作成

Jenkins(Slave)を設定を行います。

docker-compose.yml の設定


version: "3"
services:
  master:
    container_name: master
    image: jenkinsci/jenkins:2.142-slim
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
    links:
      - slave01

   slave01:
     container_name: slave01
     image: jenkinsci/ssh-slave
     enviloment:
       - JENKINS_SLAVE_SSH_PUBKEY=id_rsa.pub のキー

enviloment は環境変数の設定で、「JENKINS_SLAVE_SSH_PUBKEY」に「jenkins_home/.ssh/id_rsa.pub」のキーを設定します。

また、Jenkins(Master)で、links を設定して master から slave01 を名前解決できるようにします。

docker-compose の起動

コンテナをバックグランドで起動します。


$ docker-compose up -d

docker-compose の起動

設定したポートで、http://localhost:8080/ にアクセスすると、Jenkins の画面が表示されます。

パスワードは、Jenkins(Master)の起動で表示されたものを利用します。

手っ取り早く、Install suggested plugins を選択してインストールします。

Jenkins のユーザを作成してログインします。

Jenkins のノード(slave01)の設定

本の通りにノードの管理で、slave01 の認証情報(id_rsa、パスフレーズ)などを設定していきますが、slave01 の起動がエラーになってしまいました。
(Jenkins の Jenkinsの管理 > ノードの管理 で slave01 の設定の箇所)


...
java.io.IOException: Java not found on hudson.slaves.SlaveComputer
...

調べたところ、slave01 で java のパスを通す必要があるようです。

Slave に Java のパスを通す

ホスト(Mac)側から、slave01 へログイン


$ docker exec -it slave01 bash

slave01 の Java のパスを調べる


# which java
/usr/local/openjdk-8/bin/java

このパスを、slave01 の「高度な設定 > Javaのパス」に設定します。

これで、ノード再起動すると同期が完了します。

 

ちなみに、Docker For Mac で利用してみましたが、結構CPU負荷が高いです。


$ docker-compose stats

  2020/03/28

Qiita とか調べていると、いきなり docker と docker-compose が混在してなんだこりゃ?となったりします。
(少なくとも自分は)

特に、他人の作ったdocker-compose.yml を docker の基礎がわからないと何をしているのか読み取れません。

例えば、Laravel を Docker で動かす Laradock はすごく便利で少しの知識があれば開発環境を動作せることが可能ですが、「やっぱり自分で構築したい!」となると、その設定を全部把握するのはかなりの時間がかかりそうです。

docker-compose が必要になる段階

  • docker の基本コマンドを覚える
  • Dockerファイルを記述
  • 複数のコンテナの設定が必要になる
  • Dockerファイルの管理が必要となる
  • docker-compose があると一度に管理できる

最初は docker の基本コマンドを繰り返し実感するのが良いのでは?と思います。

docker-compose を使ってみる

まず、docker-compose コマンドが存在するか確認します。


$ docker-compose version
docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.1d  10 Sep 2019

あらかじめ、Dockerfile でイメージを作成済みであることを前提とします。

hello:latest イメージの シェルスクリプト「hello.sh」


#!/bin/sh
echo "Hello Shell Script"

hello:latest イメージの Dokcerfile


FROM ubuntu:18.04

COPY hello.sh /usr/local/bin
RUN chmod +x /usr/local/bin/hello.sh

CMD ["hello.sh"]

docker-compose を利用する前にまず docker コマンドでの起動を確認します。
 

docker コマンドによるビルド&起動コマンド


$ docker image build -t 

起動確認ができたら、一度 dockerコンテナを落としておきます。


$ docker stop コンテナID

docker-compose.yml を設定して実行する

docker-compose を利用するには、「docker-compose.yml」の設定が必要となります。

docker-compose.yml


version: "3"
services:
   hello:
     image: example/hello:latest
     ports:
       - 9000:8080

docker-compose で起動(フォアグランド)

docker-compose up で、docker-compose.yml を読み込み、「hello.sh」が実行されます。

version

docker-compose.yml のフォーマットバージョンで、「3」は2020/3時点での最新です。

services

services: の第一階層に、各コンテナの名前を複数定義します。

例では、hello がコンテナ名となります。

image

Dockerイメージ名を設定します。

ports

ホストと docker のポートフォワーディング設定(ホストポート:dockerポート)


$ docker-compose up
Creating network "docker-hello_default" with the default driver
Creating docker-hello_hello_1 ... done
Attaching to docker-hello_hello_1
hello_1  | Hello Shell Script
docker-hello_hello_1 exited with code 0

ちなみに、このサンプルは hello.sh を実行したのちに exit しているため、状態は「Exit 0」となっています。

プロセスを確認する

docker のプロセス確認は docker-compose コマンドでも可能です。


$ docker-compose ps
       Name           Command    State    Ports
-----------------------------------------------
docker-hello_echo_1   hello.sh   Exit 0   

コンテナを停止

docker-compose.yml で設定しているコンテナを全て停止します。


$ docker-compose down

  2020/03/12

Dockerイメージとコンテナの関係

Dockerイメージ

Dockerコンテナを作成するための元となるテンプレート
Dockerfile を作成して設定する

Dockerコンテナ

Dockerイメージを元に複数作成して、システム、アプリケーションを構成・実行されます。

Docker イメージをダウンロード

Docker イメージはDocker Hub で検索できます。
※ユーザ登録はしておいた方が良いです

利用したいイメージやバージョンを「イメージ名:バージョン」でダウンロードできます。


$ docker image pull alpine:latest

latest は文字通り最新版なので、明示的にバージョンを指定する場合は、Docker Hub に記載されているバージョンを利用します。

Dockerfile と docker コマンドを使う

確認用シェルスクリプト「hello.sh」の作成

Dockerイメージを作成する前に、Dockerコンテナ内で動作させるシェルスクリプトにサンプルを作成してみます。


#!/bin/sh
echo "Hello Shell Script"

Dockerfile でイメージ作成

次にDockerイメージを作成しますが、一般的に Dockerfile ファイルを利用しして設定します。

※今回は「ubuntu:18.04」イメージを利用します。


FROM ubuntu:18.04

COPY hello.sh /usr/local/bin
RUN chmod +x /usr/local/bin/hello.sh

CMD ["hello.sh"]

インストラクション(命令)

Dockerfile は DSL(ドメイン固有言語)を利用して、イメージを作成します。
その際、でてくるのがインストラクションです。

FROM

Dockerイメージ(OS)を指定(ビルド前)

COPY

ホスト側(Mac)から、Dockerコンテナの指定パスにコピーします。
上記はイメージビルド前に、ホスト側の「hello.sh」を「/usr/local/bin/」にコピーします。

類似的にリモート追加や自動解凍できる ADD インストラクションもある。

RUN

Dockerコンテナ内で、指定のコマンドを実行します。
上記は、コンテナにコピーした「/usr/local/bin/hello.sh」に実行権限を与えます。

CMD

完成したDockerイメージに対して、コマンドを実行します。
「,」で区切って引数を与えることもできます。
RUN との違いは、CMDはイメージビルド後に実行します。

Dockerイメージビルド

hello:latest とラベルをつけて Dockerイメージをビルドします。


$ docker image build -t hello:latest .

引数はイメージ名と Dockerfile の配置したパスを指定します。


$ docker image build -t イメージ名:タグ名 Dockerfile配置パス
タグ名は、一般的にバージョンとして利用されます。

Dockerコンテナ起動


$ docker container run hello:latest
Hello Shell Script

「hello:latest」コンテナが起動後に、shell.sh が実行されました。

Docker イメージの確認


$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
hello                latest              05e3eb5ff03b        5 minutes ago       64.2MB
...

リポジトリが「hello」、タグ「latest」、イメージID「05e3eb5ff03b」で作成されています。

Docker コンテナの確認


$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62faba8c4477 hello:latest "hello.sh" 8 minutes ago Exited (0) 8 minutes ago admiring

hello:latest コンテナが、コンテナID「62faba8c4477」で作成されていることがわかります。

Dockerイメージのタグ変更

実際に運用する場合、Github のように namespace や バージョンをつける必要がでてきます。
例えば、イメージ名「hello」は、namespace(空間名)をつけて「sample/hello」、 バージョンは「:」で区切って、「hello:latest」、「hello:0.1.0」のような書き方ができます。

namespace をつける


$ docker image tag hello:latest example/hello:latest

バージョンをつける


$ docker image tag hello:latest example/hello:0.1.0

$ docker images
REPOSITORY                                                 TAG                 IMAGE ID            CREATED             SIZE
example/hello                                              0.1.0               ca00cb953947        2 hours ago         64.2MB
example/hello                                              latest              ca00cb953947        2 hours ago         64.2MB
...

不要になったコンテナ&イメージの削除

Docker を利用しているとイメージやコンテナを作りすぎて、パソコンの容量を圧迫しがちです。

また、イメージやコンテナリストが大量になり確認もしづらくなるので、リスト検索して不要なものは削除しましょう。

  • コンテナIDの一覧「docker ps -a」
  • イメージIDの一覧「docker images」

Docker コンテナ一覧


$ docker container list

Docker コンテナ削除


$ docker rm コンテナID

Docker イメージ一覧


$ docker image list
//または
$ docker images

Docker イメージ削除


$ docker rmi イメージID

  2020/03/11

Docker もう一度を最初から学ぶ為に、シリーズで書いていきます。

今回は、

  • Docker for Mac インストール&起動
  • docker コマンドを確認

Docker For Mac をインストール

Mac で Docker を始めるには「Docker For Mac」を利用するのがお手軽です。

公式のページの Docker For Mac から dmgファイル(※2020-03-02時点:version 2.2.2.0)をダウンロードします。

Docker for Mac

Docker for Mac のメニュー

Docker for Mac の基本設定

Docker の自動起動

Start Docker when you log in

自動アップデート

Automatically check for updates

CPU・メモリ設定

個人差がありますが、デフォルトで使用してみて足りないようなら変更してみると良いでしょう。

ホストOS側のマウント

「File Sharing」で、Dockerコンテナ側がマウントするディレクトリを設定できます。
差し当たり、デフォルトのままで良いと思います。

ネットワーク

Dockerコンテナが利用する、IPアドレスの範囲をしていします。
自分でカスタマイズしても構いませんが、差し当たりデフォルトにしておきます。

docker コマンドを使ってみる

Docker for Mac がインストールできたら、Mac のターミナルで docker コマンドを実行してみます。

Docker バージョン確認


$ docker --version
Docker version 19.03.5, build 633a0ea

Docker Getting Started コンテナ起動

今度はあらかじめ作成されている Dockerコンテナを起動してみます。

docker/getting-started というコンテナが Docker Hub に用意されているので、これを起動してみます。


$ docker run -dp 80:80 docker/getting-started

色々とオプションが入ってますが、わかりやすく書くと以下の通りとなります。


$ docker run オプション コンテナ名

run:コンテナを起動

今回の場合、docker/getting-started​ がコンテナイメージとなります。

-d:バックグラウンド起動

通常はこのバックグラウンドで起動します。

-p:ポート番号マッピング

ホスト側のポート番号と、コンテナ側のポート番号をマッピングします。


ホストポート番号:コンテナポート番号

コンテナ起動のオプションは、


$ docker run --help

で調べることができます。

起動中のコンテナ確認

コンテナを起動したら、コンテナの起動状況(プロセス)を確認します。


$ docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                NAMES
4abe131793c6        docker/getting-started   "nginx -g 'daemon of…"   31 minutes ago      Up 31 minutes       0.0.0.0:80->80/tcp   unruffled_roentgen

上記は、コンテナIDが「4abe131793c6」、コンテナイメージが「docker/getting-started」で起動しています。

Docker Getting Started をブラウザで確認

Mac側のポート80 と Docker側のポート80 がマッピングされているため、

http://localhost/

にアクセスすると、Webサーバを介してチュートリアルが表示されます。

Docker Getting StartedイメージのWebサーバは「nginx」が起動しているようです。

Docker Getting Started コンテナを停止

コンテナを停止します。


$ docker stop 4abe131793c6

引数は docker ps で記載されたコンテナIDを指定して


$ docker stop コンテナID

Docker For Mac は遅い?

Docker を利用する場合、Mac(ホスト) と Dockerコンテナ 間でディスク共有します。
ディスクマウントの仕様上、Docker For Mac は他のDocker環境に比べて速度が遅い(レイテンシー)傾向があります。
これは個人差があるので一概に言えませんが、開発できないレベルではありません。

  2020/01/18

事前準備

Install Docker Desktop on Macをダウンロードしてインストール

Laradock ダウンロード

$ git clone https://github.com/Laradock/laradock.git

ディレクトリ構成

laradock/.env  #Dockerコンテナイメージ & 設定
projects/ #Laracelプログラムソース

自分が開発する場合、複数のプロジェクトを一つのサーバで管理するため、projects とした。

例) projects/blog/ projects/shop/ ※Laravelプロジェクト直下に、.htaccess でmod_rewirte(Apacheの場合)

.env を作成(コピー)

$ cd laradock/
$ cp env-example .env

.env の設定

#Dockerのwebサーバーの同期ディレクトリ
#ホスト側のディレクトリを指定
APP_CODE_PATH_HOST=../projects/ 

#Dockerのstorage等を保存
#ホスト側のディレクトリを指定
DATA_PATH_HOST=../.laradock/data

#PHP
PHP_VERSION=7.3

PHP_INTERPRETER=php-fpm

# php-fpm で PostgreSQLドライバをインストール(MySQLはインストールしない)
PHP_FPM_INSTALL_PGSQL=true

PHP_FPM_INSTALL_MYSQLI=false

ホストの設定

コンテナー名が自動的にホスト名になるので、docker-compose.yml で明示的にホスト名を設定します。


### PHP-FPM ##############################################
    php-fpm:
      hostname: laradock    //ホスト名を明示的に設定
      build:
        context: ./php-fpm

Docker ビルド & 起動

必要に応じてコンテナを指定して、ビルド & 起動(初回は時間がかかります)

$ docker-compose up --build -d apache2 postgres

Docker 起動確認

$ docker-compose ps
           Name                          Command               State                    Ports                  
---------------------------------------------------------------------------------------------------------------
laradock_apache2_1            /opt/docker/bin/entrypoint ...   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
laradock_docker-in-docker_1   dockerd-entrypoint.sh            Up      2375/tcp, 2376/tcp                      
laradock_php-fpm_1            docker-php-entrypoint php-fpm    Up      9000/tcp                                
laradock_postgres_1           docker-entrypoint.sh postgres    Up      0.0.0.0:5432->5432/tcp                  
laradock_workspace_1          /sbin/my_init                    Up      0.0.0.0:2222->22/tcp  

ネットワーク情報の確認


$ docker network list
NETWORK ID          NAME                   DRIVER              SCOPE
1f2d988e2454        bridge                 bridge              local
c2ddd125b91c        docker-hello_default   bridge              local
7376c045c61c        host                   host                local
48598c23f7d5        laradock_backend       bridge              local
63cead02763c        laradock_default       bridge              local
1954ef460361        laradock_frontend      bridge              local
f8f6d3c3cfe3        none                   null                local

Docker 内部にアクセスしてLaravelプロジェクト作成


$ docker-compose exec workspace bash

IPアドレス確認


# hostname -i

プロジェクト作成


# composer create-project laravel/laravel project-name

Laravelプロジェクトの PostgreSQL 設定

指定したPostgreSQL ホスト、ユーザ情報を Laravelプロジェクトの .env を設定

DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=blog
DB_USERNAME=default
DB_PASSWORD=secret

.htadcess の設定

複数のLaravelプロジェクトを Dockerで動かしたいので、プロジェクト直下に .htaccess を作成して、server.php に mod_rewrite をします。

<ifmodule mod_rewrite.c="">
    <ifmodule mod_negotiation.c="">
        Options -MultiViews
    </ifmodule>

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php
</ifmodule>

ブラウザアクセス

localhost にルーティングされているので、ブラウザで アクセスします。

http://localhost/

Docker 停止

$ docker-compose stop

  2020/01/18

Dockerでディスク容量を圧迫してしまいがちで、タグのついていない不要なイメージを削除します。

コンテナ

不要なコンテナ一覧


$ docker ps -f "status=exited"

停止コンテナ一括削除


$ docker container prune

イメージ

不要なイメージ一覧


$ docker images --filter "dangling=true"

不要なイメージを削除


$ docker image prune

ちなみに、v1.2.5 以前では以下のコマンドで削除していました。


$ docker rmi $(docker images -f "dangling=true" -q)

ネットワーク

ネットワーク一覧


$ docker network ls

不要なネットワーク削除


$ docker network prune

イメージ・コンテナなどを削除

不要なイメージ・コンテナ・ボリューム・ネットワークを削除するには、「system」を利用します。

$ docker system prune

  2019/08/20

インストール

$ docker pull postgres

確認

$ docker images postgres REPOSITORY TAG IMAGE ID CREATED SIZE postgres latest c3fe76fef0a6 6 days ago 313MB $ docker inspect postgres [ { "Id": "sha256:c3fe76fef0a611a53dfc8d3ca21fa51bf8ba03cf84c593e50dfe6cc830c69de6", "RepoTags": [ "postgres:latest" ], ....

起動

初回起動

$ docker run -d --name postgres -p 5432:5432 postgres

2回目以降

$ docker start postgres

起動確認

$ docker ps
もしくは
$docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f44a3f9f944a postgres "docker-entrypoint.s…" 13 minutes ago Up 5 seconds 0.0.0.0:5432->5432/tcp postgres
Macからホスト:0.0.0.0 で接続可能となる

Mac の psql コマンドを利用

psqlコマンドを直接利用するために、HomeBrewでPostgreSQLをインストール
$ brew install postgresql
確認
$ psql --host 0.0.0.0 -l --user postgres List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | ....

Docker の psql コマンドを利用

Dockerにログイン

$ docker exec -ti postgres bash

Docker上で操作

# su -u postgres $ psql --version psql (PostgreSQL) 11.5 (Debian 11.5-1.pgdg90+1) postgres@f44a3f9f944a:/$ psql -l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | ...
<< Top < Prev Next > Last >>