/// BANGBOO BLOG ///

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

July 24, 2022

Docker
どこでビルドしてもデプロイしてもImmutableインフラ・??不変の・??なので藹??更したい場合縺?Dockerfileの方を変える
コンテナ縺?OS上縺?DockerEngine上に配置する(コンテナは鐔??数配置できる、Dockerfileさえあれば再現可・??
Dockerfileでな縺?てもDockerイメージでもいいが、Dockerは可搬性をもたらすのである
 なおVM縺?OSをもシミュレート
1驛?: はじめに・??実霍? Docker - ソフトウェアエンジニアの「Docker よ縺?繧?からない」を終繧?りにする譛? (zenn.dev)
2驛?: Dockerfile の基軆??|実霍? Docker - ソフトウェアエンジニアの「Docker よ縺?繧?からない」を終繧?りにする譛? (zenn.dev)
3驛?: Docker Compose|実霍? Docker - ソフトウェアエンジニアの「Docker よ縺?繧?からない」を終繧?りにする譛? (zenn.dev)
 Dockerのチュートリア繝? - とほほ縺?WWW入門 (tohoho-web.com)
 Dockerコマンド - とほほ縺?WWW入門 (tohoho-web.com)
  コンテナ設鐔??方針をまとめてみた - Qiita
  社内縺?Dockerfileのベストプラクティスを公開します│FORCIA CUBE│フォルシア株藹??会遉?
  Docker完全に理解した | IIJ Engineers Blog
 ボリュームマウント=DockerEngine上にボリュームを作りコンテナにマウント(操作が面倒で仮使用や永軆??ファイル逕?)
 バインドマウント=LinuxOS上のファイルやディレクトリをマウント(ファイル編集が多い場合)
 dockerfile(イメージを作る)、docker compose(yamlで臀??括でコンテナ/nw/volを作る)
  dockerfile: dockerイメージを作る→runでコンテナ(アプ繝?)になる
  docker composer: コンテナを作る、NWやボリュームも作る→1台にまとめる
   マニフェスト: k8sを作る→複数台になる
    Dockerfileによるビルド - とほほ縺?WWW入門 (tohoho-web.com)
    Docker Compose - とほほ縺?WWW入門 (tohoho-web.com)

■Dockerインス繧?
/// BANGBOO BLOG /// - GCP script ここの臀??の方に鐔??載あり
docker --version
who 誰がログインしているか
sudo gpasswd -a [ユーザ名] docker dockerグループへ追加?

■Docker Engine起動
sudo systemctl start docker これ要る?

■オプショ繝?
-i キーボードを繋ぐ
-t 特觸??キーを使用可能にする
-e 環藹??変数名=値・??複数鐔??載可能・??
--net=ネットワーク名
-v ${pwd}:/app 縺?OSローカル環藹??とコンテナ内のディレクトリを同期
-p, -public 80:8000 ポートの軆??づけ
-d, -detach バックグラウンド実行(デタッチ)
-rm コンテナ実行後にコンテナを自動削除する(イメージは觸??る)
-dit  とまとめられる

■操作コマンド
docker images リスト
docker tag [イメー繧?ID] img_unco:latest 名前がつかない場合
docker rmi [イメー繧?ID]  削髯?
docker ps -a コンテナ一隕?
docker container ls コンテナのステータス確認
docker rm [コンテナID] 削髯?

■起動
httpd3つを1つのイメージで建てられる(以前縺?docker runだった)
docker container run --name コンテナ名001 -d -p 8081:80 イメージ名httpd
docker container run --name コンテナ名002 -d -p 8082:80 イメージ名httpd
docker container run --name コンテナ名003 -d -p 8083:80 イメージ名httpd

■仮諠?NW
コンテナ間をつなぐ(ネットワークタグ名で軆??づける感じ)
1)ブリッジネットワーク・??デフォルト
 同一縺? Docker Engine 上のコンテナ が互いに通信をする場合に利用する
 デフォルト:
  全てのコンテナ間をリンクする操作が必要
  コンテナ間の通信縺? IP アドレス縺?
 笳?(コレ使う)ブリッジネットワークを定義し作成:
  相臀??通信は同じネットワークを割り当てるだけ
  コンテナ間縺?DNS解決される
  ネットワークでコンテナは隔離され隔離度が上がる
2)オーバーレイネットワー繧?
 異なる Docker Engine 上のコンテナ が互いに通信をする場合に利逕?

docker network create ネットワーク名net001

docker container run --name mysql001 -dit --net=net001 ~~~ イメージ名mysql
docker container run --name wordpress001 -dit --net=net001 -p 8085:80 -e WORDPRESS_DB_HOST=mysql001 ~~~ イメージ名wordpress

Docker仮諠?NW一隕?
docker network ls
仮諠?NWの確認
docker network inspect net001

コンテナ間縺?service_nemeで通信し、コンテナ名ではない
http://unco-sv:8000 で通信できる
各コンテナで同番ポートを使っていても問題はない
docker info プロキシ軆??が確鐔??できる
.docker/config.json でプロキシやプロキシを使繧?ないnoProxyを設藹??

■停豁?
docker stop コンテナ名
docker rm コンテナ名
docker network rm ネットワーク名

■コピー OS⇔コンテナ
docker cp コピー元 コピー先
例)docker cp /home/a.txt コンテナ名:/app/

■ボリュームのマウント
データをコンテナ内に置縺?とコンテナが消えるとデータも消えてしまう
永軆??化1)ボリュームマウント:DockerEngine上
永軆??化2)バインドマウント:OS上
永軆??化3)一時メモリマウント:(tmpfs)

■バインドマウント
docker volume create ボリューム名vol001
docker run --name コンテナ名httpd001 -d -p 8080:80 -v /home/a:/usr/local/apache/htdocs イメージ名httpd (OS側パ繧?:コンテナ側パス、コンテナ側のパスをどこにすべきか縺?Dockerイメージのドキュメントを見よ)
docker volume inspect vol001 (確鐔??できる)
docker volume rm vol001

ホストディレクトリ共有ともいう
コンテナ縺?rootで動作しているものが多縺?
ホスト共有しているDir/Fileにコンテナから変更する縺?rootで藹??更しPermissionが変繧?るそのためホストディレクトリ共有は本番に向かない

■ボリュームマウント
ちょい面倒らしいのでバインドマウントでいいのでは・??
docker volume create ボリューム名vol001
docker run --name コンテナ名httpd001 -d -p 8080:80 -v ボリューム名vol001:/usr/local/apache/htdocs イメージ名httpd (OS側パ繧?:コンテナ側パス・??
docker volume inspect vol001 (確鐔??できる)
docker volume rm vol001

Dockerボリューム共有ともいう
コンテナが削除されても譏?示的に觸??さない限り保持される
永軆??化したいパスを指定してマウントできる
(通常コンテナ内で臀??成されたデータは永続化しない)

■揮発的データを退驕?
docker cp コンテナ名:ファイルパ繧? ホスト側退避パ繧?
 docker cp test-db-a:/opt/test.txt /tmp/config
消えるファイルをホスト側に退避したいときのコマンド

■ボリュームマウントの確認やOS側にバックアップ
アプリコンテナとは別縺?shellコンテナを用諢?し縺?lsしたりtar.gz等する
Apacheコンテナ <-> vol001 <- Linuxコンテナ -> vol002バックアップ
マウントを2つ・??DockerEngine上のマウント、OS上のマウント)
tar.gzコピー縺?DockerEngine上の指定フォルダにコピーするが其れ縺?OS側にもマウントされている、最後のドットも要る
イメージは軽驥?Linux縺?busyboxを使逕?
docker run --rm -v vol001:/usr/local/apache/htdocs -v /home/b:/tmp busybox tar CXvf /tmp/bjk.tar.gz -C /usr/local/apache/htdocs .

■ロ繧?
docker logs コンテナ名
docker logs -f コンテナ名 追藹??確鐔??
docker exec -t コンテナ名 /bin/bash ログファイル軆??はこれで入り確鐔??

■Appコンテナ(PHP)
docker container run \
    --name app \ コンテナ縺?appと名付る
    --rm \ コンテナ停止時に自動削髯?
    --detach \ バックグラウド実行
    --interactive \ 対話可能なセッション縺?
    --tty \ コンテナと縺?TTY接続しコマンド出力藹??
    --mount type=bind,src=$(pwd)/src,dst=/src \ osにバインドマウント
    --publish 18000:8000 \ ポートマッピン繧?
    --network docker-sample-network \ 仮諠?NWに割り当縺?
    docker-php:app \ Dockerイメージの名前とタ繧?
    php -S 0.0.0.0:8000 -t /src コンテナ内で藹??行するコマンド

※永続化バインドマウントos上
ホストマシンのディレクトリをコンテナ内のディレクトリにバインドマウント。ホストマシンのカレントディレクトリ・??$(pwd))縺?"src"ディレクトリが、コンテナ内縺?"/src"ディレクトリにマウントされます

※ポートマッピン繧?
-p, --publishがコンテナのポートをホストマシンに公開するオプショ繝?
ホストマシン縺?18000ポートを通じてコンテナ縺?8000ポートにアクセスさせる
ブラウザからhttp://localhost:18000 縺?phpにアクセ繧?

※起動コマンド
PHPのビルトインウェブサーバを起動し、IPアドレ繧? "0.0.0.0" およびポート "8000" でリクエストを藹??け付け、コンテンツを"/src"ディレクトリから觸??供します

■コンテナの詳細情報の確認
docker container inspect app

■DBコンテナ(MySQL)
docker container run \
 --name db \
 --rm \
 --detach \
 --platform linux/amd64 \
 --env MYSQL_ROOT_PASSWORD=rootpassword \
 --env MYSQL_USER=hoge \
 --env MYSQL_PASSWORD=password \
 --env MYSQL_DATABASE=event \
 --mount type=volume,src=docker-db-volume,dst=/var/lib/mysql \
 --mount type=bind,src=$(pwd)/docker/db/init.sql,dst=/docker-entrypoint-initdb.d/init.sql \
 --network docker-sample-network \
 --network-alias db \
 docker-db:db

※仮諠?NWでのエイリアス名
dbと名付ける

■コンテナの逍?通の確認
$ docker container exec --interactive --tty app ping db -c 3
appコンテナがdbに逍?通できるかping

■アプ繝?
/// BANGBOO BLOG /// - GCP script 下の方に鐔??載あり

■Dockerfile
ビルドしてイメージを作成
FROM イメージ名
COPY コピー元パ繧? コピー先パ繧?
RUN Linuxのコマンド

ENTRYPOINT イメージを実行するときのコマンド
CMD コンテナ起動時に藹??行する規定のコマンドを指定
 例えばこのコマンドを実行するCMD縺?
  $ go run /echo/main.go
  ↓空白で分割し配列化しCMD化される
  CMD["go", "run", "/echo/main.go"]
 ただCMDは臀??記のように藹??行中に臀??書き指定ができ echo yayの藹??行となる
  docker container run $(docker image build -q .) echo yay
ONBUILD ビルドが完了したときに任諢?の命令を実行する
EXPOSE 通信を想藹??するポートをイメージの利用者に臀??える
VOLUME 永軆??データが保存される場所をイメージ利用者に臀??える
ENV 環藹??変数を定義する
WORKDIR RUN/CMD/ENTRYPOINT/ADD/COPYの際の臀??業ディレクト繝?
SHELL ビルド時のシェルを指定
LABEL 名前やバージョンや制臀??者情報軆??を設藹??
USER RUN/CMD/ENTRYPOINT実行するユーザやグループを設藹??
ARG docker buildする際に指定できる引数を宣鐔??
STOPSIGNAL docker stopの際にコンテナで藹??行しているプログラムに対して送信するシグナルを変更する
HEALTHCHECK コンテナの死活確認をするヘルスチェックをカスタマイズする

Dockerセキュリティベストプラクティ繧? トップ20:究極ガイド
社内縺?Dockerfileのベストプラクティスを公開します│FORCIA CUBE│フォルシア株藹??会遉?
RUN adduser -D myuser && chown -R myuser /myapp
 (-Dはデフォルト設藹??で追加している、-Rは指定dir以臀??を再帰的に所有権藹??更・??
USER myuser
 (以降縺?RUNやENTRYPOINT等縺?INSTRUCTIONを実行するユーザを指定)

FROM ubuntu:latest
RUN mkdir /app
# "appuser" という専用のグループとユーザーを作成(ログイン臀??要のシェル設定)
RUN groupadd -r appgroup && useradd -r -s /usr/sbin/nologin -g appgroup appuser
WORKDIR /app
COPY . /app
# ユーザー権限を変更・??アプリケーションディレクトリの所有者を "appuser" に設定)
RUN chown -R appuser:appgroup /app
# 最蟆?特権ユーザーで藹??行
USER appuser
# アプリケーションの藹??行コマンド
CMD ["node", "index.js"]

Dockerfileの臀??り方を考え直したらすご縺?効軆??が上がった。 (zenn.dev)

■ビルドでイメージを作成
Dockerfileや材料ファイルのあるフォルダパスを最後に指定、-tはタグでイメージ名
docker build -t img_httpd001 ./

ビルド後縺?docker runが必要
docker container run -d --name cnt_httpd001 -v ${pwd}:/app img_httpd001:latest
↓これが便蛻?
docker container run -rm --name cnt_httpd001 -v ${pwd}:/app img_httpd001:latest

■commitでコンテナからイメージを作成
コンテナ縺?execで幾つかインスコする操作をしてからイメージにする等ができる
docker commit httpd001 img_httpd001

■コンテナ/イメージ縺?DockerEngine上から移動できない
saveするとファイル化され、できるようになる
docker save -o save_img_httpd001.tar img_httpd001
 ファイルからイメージとして藹??り込みたいとき縺?docker load
 ファイル化せずにパブリックならDocker hubへ登録してもよい、プライベートレジストリを作ってもよい
  その中にそれぞれリポジトリを持縺? > docker push レジスト繝?/リポジトリ名:バージョ繝?

■コンテナに命令する
2つの方觸??がある
1)docker exec → docker container execに藹??繧?った
起動中のコンテナ内でコマンドを実行する
docker container exec [option] <container> command
ファイルを見る
docker container exec ubuntu1 cat ~/hello.txt
コンテナに接続し縺?bashを使う
docker container exec --interactive --tty ubuntu1 bash

2)docker run に藹??数を付ける→ソフトウェ繧?(apache)が動いていない状態になり改め縺?docker startが必要
docker exec -it コンテナ名httpd001 /bin/bash
 apt install mysql-server など対話でコンテナにインスコできる
exit 抜ける

■Docker compose
docker runコマンドの集合体、コンテナ等作って觸??すだけ(k8sはコンテナ等を管理する)
以前縺?docker-composeコマンドで別ツールだったが今は統合済縺?
フォルダ縺?1つだけdocker-compose.yml
基本縺?docker runを実行せず縺?docker composeしたい
手順は、1)Docker run方觸??で臀??応の觸??險?>2)docker-compose.ymlの鐔??霑?>3)docker composeコマンドの藹??行

docker run~~に対するdocker-compose.yml縺?docker composeコマンド の対比
1)docker run --name cnt_wordpress001 -dit --net=net001 -v wordpress001vol2:/var/www/html -p 8080:80 -e WORDPRESS_DB_HOST=mysql001 -e WORDPRESS_DB_NAME=wpdb001 -e WORDPRESS_DB_USER=wpu001 -e WORDPRESS_DB_PASSWORD=my-secret-pw wordpress
2) docker-compose.ymlの鐔??霑?
version: "3"
services:
  cnt_wordpress001:
    depends_on:
      - cnt_mysql001
    image: wordpress
    networks:
      - net001
    volumes:
      - wordpress001vol2:/var/www/html
    ports:
      - 8080:80
    restart: always
    environment:
      WORDPRESS_DB_HOST=mysql001
      WORDPRESS_DB_NAME=wpdb001
      WORDPRESS_DB_USER=wpu001
      WORDPRESS_DB_PASSWORD=my-secret-pw

  cnt_mysql001:
    image: mysql:5.7
    networks:
      - net001
    volumes:
      - mysql001vol1:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD=my-root-pw
      MYSQL_DATABASE=wpdb001
      MYSQL_USER=wpu001
      MYSQL_PASSWORD=my-secret-pw
networks:
  net001
volumes:
  mysql001vol1:
  wordpress001vol2:

/// restartの設定値・??コンテナが停止した時にどうするか?)
no =何もしない
always =必ず再起動する
on-failure =プロセスが0以藹??のステータスで軆??了したときは再起動する
unless-stopped =停止していたときは再起動しないがそれ以藹??は再起動する
 Bashで軆??了ステータスよる条件分岐 | Codebase Blog
 窶?bashは前に藹??行されたコマンドの軆??了ステータスは「$?」で藹??得できるが慣軆??的にコマンドが正常終了した場合縺?0を返す

/// その臀??の藹??義項逶?
command =起動時の鐔??定コマンドを上書きする
entrypoint =起動時縺?ENTRYPOINTを上書きする
env_file =環藹??設藹??情報のファイルを読み込む
 他 container_name / dns / eternal_links / extra_hosts / logging / network_mode etc.

3)docker compose コマンド
 up=イメー繧?DL、コンテナ/nw/volの臀??成・起動
 down=コンテナ縺?nwの停止と削除、volとイメージは觸??る
 stop=削除せず停止の縺?

docker compose -f /home/a/docker-compose.yml up -d
docker compose up -d --scale unco001=3 (コンテナ名縺?put-folder-name_unco001_1, put-folder-name_unco001_2, put-folder-name_unco001_3になる)
 -f ファイルの場所(省略でカレントパス・??
 -d バックグラウンド実行
 --build コンテナ開始前にビルド
 --no-build イメージが見つからな縺?てもビルドしない
 -t コンテナ停止のタイムアウト(デフ繧?10S)
 --force-recreate 設藹??やイメージに藹??更が無縺?てもコンテナを再生成
 --no-create コンテナが存在していれば再生成しない
 --abort-on-container-exit コンテナが一つでも停止したら全てのコンテナを停豁?
 --remove-orphans 定義ファイルで藹??義されていないコンテナを削髯?
 --scale 同じコンテナを複数臀??る

docker compose -f /home/a/docker-compose.yml down
 --rmi {all | local} 破觸??後にイメージも削除、localの時縺?imageにカスタムタグが無いイメージのみを削髯?
 -v volumesに鐔??載されているボリュームを削除、但しexternalの指定を除縺?
 --remove-orphans 定義ファイルで藹??義されていないコンテナを削髯?

docker compose -f /home/a/docker-compose.yml stop
 コンテナを停豁?

■Docker composeはコンテナ名を勝手につける
docker-compose.yml内は臀??記の通り、DockerEngine上のコンテナ名は藹??繧?るがdocker-compose.yml内のコンテナ名は藹??繧?ず指定できる
services:
  unco001

  unco002
    depends_on:
      - unco001
    environment:
      WORDPRESS_DB_HOST: unco001

DockerEngine上のコンテナ名縺? put-folder-name_unco001_1 となる
DockerEngine上で操作したいとき縺? docker ps -a 等で藹??際の名前を確鐔??して操作する

■コンテナ デバッ繧?
3驛?: デバッグ繝?ウ繝?繧? ( 番藹??邱? )|実霍? Docker - ソフトウェアエンジニアの「Docker よ縺?繧?からない」を終繧?りにする譛? (zenn.dev)

====================
基本縺?Linuxの觸??能を使っている
namespaceで分離し
ファイル觸??造、ユーザ繝?ID、グループID、コマンド、ライブラリなど諸々を
ラップしコンテナ化し(単一縺?)プロセスとして動縺?

Dockerがやっている仕事は藹??ない
区切ってコンテナ
それら仮想ネットワークで軆??ぐ
ボリュームの永続化
Dockerfileでイメージからイメージを作成
Docker compose縺?docker runを記霑?
docker execでコンテナを操作
etc.

twitter
Hatena
Google Buzz
newsing
Yahoo!
Buzzurl
Technorati
del.icio.us
Choix
Iza!
Livedoor Clip
Facebook
Evernote
 

Posted by funa : 03:46 AM | Web | Comment (0) | Trackback (0)