okinawa

IT勉強メモ

Dockerの基本

参考書籍

めちゃくちゃわかりやすくて感動した。

Linux系の用語解説もあってよかった。

サポートサイト(AWSでのDocker構築あり)
https://book.mynavi.jp/supportsite/detail/9784839972745.html

参考サイト集

Dockerで環境構築する時はここを見ながらやる。

docker-compose.ymlの参考サイト

日本語公式がある!
docs.docker.jp

Dockerfileの参考サイト

こちらも公式
docs.docker.jp

Dockerコマンド一覧の参考サイト

公式!
docs.docker.jp

Docker Network(コンテナ間通信)の参考サイト

qiita.com

久しぶりにdocker-compose.yml書くと忘れてしまうのがnetwork。

networkに所属していればコンテナ名だけで通信可能。

Dev Container参考サイト

Dev ContainerはVsCode拡張機能

qiita.com

dodosu.hatenablog.jp

メチャクチャ便利だが、まだ紹介記事が少ない。

DockerとVsCodeをインストールすれば、あとはyml・Dockerfile・devcontainer.jsonだけで環境構築できてしまう。流行ってほしい!

サーバは遠隔操作できるPC

Dockerではないんだけど、この本を読んでサーバに対するイメージが変わったのでメモ。

何となくサーバには苦手意識というか、得体のしれないものという感覚があった。

でも、家で使っているPCと大して変わらないのだ。

PCに入っているOS(LinuxOS)が違うのと、サーバ用のソフト(ApatcheやNginx)がインスコされているってだけなのよね。

ほんでサーバに置いてあるファイルにインターネット経由でアクセスできる。

大体のサーバソフトはhtdocsディレクトリというのが公開用ディレクトリ。

ここにHTMLやCSSなどを置く。

Dockerのコンテナも大雑把に言えば1つのPCとみなせる。

なのでコンテナにApatcheを入れればWebサーバに、DBを入れればDBサーバに、Ubuntuを入れればGUI操作できる普通のPCみたいに扱えるのかな?

動作環境

LinuxOSの上でしか動かせない。

なぜならコンテナの中にLinuxOSぽいものがあり、コンテナ外のLinuxOSのカーネルとやり取りするから。

コンテナ内もLinuxOS対応ソフトしか使えない。

つまりLinuxマシンの中に、さらに隔離されたLinux環境を作る。

今回はWindows11のWSL2を使用。

カーネルとは

カーネルとはLinuxOSの核の部分。

周辺部分がディストリビューションUbuntuRedHatCentOsなど。

ディストリビューションRed Hat系とDebian系)

RedHat
Red Hat Enterprise Linux
CentOS
Fedora

DebianDebian
Ubuntu

イメージとは

CD/DVD等のインストールファイルみたいなもの。

イメージからコンテナが作られる。

Docker Hubとは

イメージの配布サイト。

OSっぽいもの + Apatche + MySQLみたいなよくある開発環境が色々配布されている。

Dockerfileでイメージ作成

Dockerfileはイメージ作成用のコマンドが記述されたファイルのこと。

dockerfileコマンドというのが用意されている。

Dockerfileのファイル名は拡張子なしで「Dockerfile」

・Dockerfileの記述例
FROM イメージ名
COPY コピー元 コピー先

下記は、Apatcheのイメージ利用する。
index.htmlをコンテナ内の/usr/local/apatche2/htdocs/にコピーする↓

FROM httpd
COPY index.html /usr/local/apatche2/htdocs/

・Dockerfileからイメージをビルド

docker build -t コンテナ名 Dockerfileのパス

コンテナのライフサイクル

下記の一連の流れがライフサイクル。

コンテナを 作る→起動する→停止する→破棄する→作る→

コンテナ内のソフトをアップデートすることはせず、コンテナ破棄して新しいのを作り直すのが一般的らしい。

バンバン作っては破棄を繰り返すものだそうで。

マウント(ホストとコンテナ接続)

コンテナ外部、つまりホストマシンの保存領域とコンテナを接続することをマウントと言う。

マウントしておけばコンテナ内のデータをホストに保存できる。

開発だとソースファイルなどは全てマウントして外部に保存しておく。

コンテナを破棄してもマウントしたデータは無事。

マウント対象の保存領域のことをボリュームという。

マウントはDocker用語ではなくて、取り付けるという意味で、USBメモリを接続することもマウント。

ボリュームマウント・バインドマウント

ボリュームマウントはDocker Engineが管理している領域内にボリュームを作成して保存する。
手軽に扱えるが、直接操作しづらい。

バインドマウントはホストマシンのディレクトリやファイルに保存する。
普通のファイルと同じように扱えるので、頻繁に編集したいファイルはここに置く。

docker volume create ボリューム名(ボリュームマウント)
docker run (省略) -v ホストの記憶領域パス:コンテナの記憶領域パス(バインドマウント)

dockerコマンドの文法

peguinという名前のコンテナを起動。

docker 上位コマンド 副コマンド 対象名
docker container run penguin

※containerを省略して「run penguin」でもOK

・container:上位コマンド(12種類)
対象の種類

・run:副コマンド
動詞

・penguin:対象(名前)
目的語

オプションと引数

penguinというコンテナをバックグラウンドで(オプション)モード1(引数)で起動。

docker container run -d peguin --mode=1

・-d:オプション
オプションはコマンドに対して、細かい設定をするもの。
オプションはまとめて書ける。
-d -i -tをまとめて-dit。

・mode=1:引数
対象に持たせたい値を書く。
文字コードの指定やポート番号指定など。

docker run

docker runは以下3つをまとめて実行してくれる。

docker image pull

docker container create

docer container start

デーモンとは

UNIXLinuxで動くプログラムで、常に裏で動き続けるもののこと。

メーラーデーモンとか。

コンテナと通信する

デフォルトではコンテナは外部との通信ができない。

そのため、外部通信可能なコンテナを作成する。

apa000ex2という名前のApatche入りコンテナを、ポート番号8080(ホスト)から80(コンテナ内のApatche)へ接続できるようにして作成。

docker run --name apa000ex2 -d -p 8080:80 httpd

httpd:Apatcheのイメージ

どんな感じで通信するのか

container内のApatcheはポート80で通信を待機している。

しかし、未設定だとコンテナは通信を受け付けない。

そのため、ホストマシン(ポート番号は8080でなくても良い)からポート80番で通信しますよと設定する。

container同士の仮想ネットワーク

異なるcontainerを接続する仮想ネットワークを作る。

docker network create ネットワーク名

↓作ったネットワークに接続するコンテナを作成する

docker run --name test_container --net ネットワーク名

ファイルコピー(コンテナ⇔ホスト)

docker cp ホスト側パス コンテナ名:コンテナ側パス(ホストからコンテナ)
docker cp コンテナ名:コンテナ側パス ホスト側パス(コンテナからホスト)

コンテナ内でbashを使う(コンテナ内部に入る)

docker execでbash使用モードに入る。

exitでbash使用モードを終了する。

docker exec -it コンテナ名 /bin/bash

echo "Hello World!"

exit

Docker compose(一括命令)

構築に関わるコマンド文を定義ファイルに書き込んで、一括実行する。

拡張子はyaml yml

ファイル名は「docker-compose.yml」

Docker composeは1つのフォルダに1つしか置かない。複数置きたいときはフォルダ分ける。

YAML Ain't Markup Language。YAMLマークアップ言語ではないの略らしい。

Dockerfileはイメージを作るもの。Docker composeは命令の集合。

docker-comose.ymlの記述例

MySQLWordpressの環境構築。

version: "3"
services:
  mysql000ex11:
    image: mysql:5.7
    networks:
      - wordpress000net1
    volumes:
      - mysql000vol11:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: myrootpass
      MYSQL_DATABASE: wordpress000db
      MYSQL_USER: wordpress000kun
      MYSQL_PASSWORD: wkunpass
  wordpress000ex12:
    depends_on:
      - mysql000ex11
    image: wordpress
    networks:
      - wordpress000net1
    volumes:
      - wordpress000vol12:/var/www/html
    ports:
      - 8085:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: mysql000ex11
      WORDPRESS_DB_NAME: wordpress000db
      WORDPRESS_DB_USER: wordpress000kun
      WORDPRESS_DB_PASSWORD: wkunpass
networks:
  wordpress000net1:
volumes:
  mysql000vol11:
  wordpress000vol12:

Docker Composeのコマンド

docker compose -f yamlファイルのパス up -d (コンテナ作成&起動)
docker compose -f yamlファイルのパス down (コンテナ破棄。ボリュームとイメージは残る)