LoginSignup
0
0

More than 1 year has passed since last update.

Docker 初歩の初歩

Last updated at Posted at 2023-04-01

知っておく用語

ゲートウェイ 異なるネットワーク同士を接続する
NAT プライベートIPとグローバルIPの変換をする
ポート 通信先番号

Dockerに関して

Dockerは今までの仮想化とは異なりOSの中核はホストOS、つまりローカルのものを使う
アプリごとにゲストOSを入れるvagrant等とは異なる、処理にかかるコストを軽減する

ただしコンテナにはまったくOSを入れないわけでは無く一部を担うソフトウェアは入れる
また、DockerはLinuxで動かします、つまりローカルの開発ではwindows上で動くLinuxが必要

コンテナは可搬性が高いので環境差異による不具合を避けれる
コンテナはイメージから作られる、一つのイメージから複数コンテナを作れる

コンテナはdocker hubから取得(pull)する方法と自身でdockerfileというテキストファイルを作成して
そこからビルド(build)をする事でイメージを構築する事も可能
ちなみに他の人に自分が作成したイメージを使って欲しい時はpushをする。

tagがバージョン名となる、Docker HubにもTagsとある。

docker image pull イメージ名:タグ名

ライフサイクル

作成→実行→停止→削除
ここで注意点としては仮にコンテナに対して変更がある場合はコンテナに作成したコンテナに対して修正
ではなく削除して新たに作成するほうが手間がかからない。しかしデータの保持が必要な場合は別途対策が必要(ボリュームに保存する)

下記のいずれかが必要
dockerfileはイメージを構築する際に利用
compose.yamlは

クライアントがデーモンに指示を出してdockerの処理をする
レジストリはイメージが置いてある場所、プルしたりする

docker desktopのcontainersは現在稼働しているコンテナを起動停止削除する
imagesはコンテナイメージが一覧で表示される。
vluemeはコンテナのデータの保存場所、ライフサイクル確認

コンテナイメージの取得から起動~削除

docker hubから取得する場合は

dokcker image pull イメージ名:タグ名
docker 対象 操作
docker container runはイメージがローカルに無い場合一度pullしてからコンテナを作成します。
docker container run --name apache01 -p 8080:80 -d httpd
localhost:8080で表示されます。

コンテナの停止、削除

docker container stop apache01
docker container rm apache01

上記では複数のコンテナが欲しい時毎回同じコマンドを打つ必要がある。
対策がDockerCompose、yamlファイルを参照してコンテナを立ち上げてくれる

Docker Composeでyamlファイルからコンテナを生成

composeコマンドはcomposeで立ち上げたコンテナを対象とする

複数のコンテナを一度に起動出来る。
yamlという拡張子のファイルに必要なコンテナ情報を記載する
yamlファイルを置くディレクトリ名がプロジェクト名となる。

  • 作成したいコンテナの情報を整理する
  • Docker composeファイルを作成する
  • コマンドを使ってコンテナを作成・実行する

コマンドは使用するyamlファイルがある場所で実行

下記はdocker container run --name apache -p 8080:80 -d httpdをイメージしている
インデントに注意、またversion:"3"等の表記は不必要

services:
  web: →コンテナ名
    image: httpd:2.4 →使用するimage
    ports: 
        - "8080:80" →Dockerホストとポートを紐づける

対象のディレクトリで下記コマンドで起動する
起動後コンテナが生成される

docker compose up -d →dでデタッチモード
docker container ls →起動確認
docker container ls -a →全てのコンテナを確認
docker compose stop →コンテナを停止する
docker compose stop →起動

他にもyamlにはnetoworkだったりボリュームを定める事も可能

ファイルのアップロード・ダウンロード CPコマンド

ファイルをコンテナへアップロードする

docker compose cp ホストのファイルパス コンテナ名:コンテナ内ファイルパス
docker compose cp index.html web:/usr/local/apache2/htdocs/index.html

コンテナ内にあるファイルをローカルにコピーする

docker compose cp コンテナ名:コンテナ内のファイルパス ホストのファイルパス
docker-compose cp web:/usr/local/apache2/htdocs/index.html .

コンテナの削除・イメージの削除 downコマンド

rmコマンドが別途あるが紐づくネットワークの削除はしません。
ネットワークとコンテナを一度に削除するdownコマンドがあります。

docker compose down

イメージを削除する。
イメージを使用中のコンテナがある場合は削除できない

apache>docker compose down --rmi all

composeを使ってDBの起動

services:
  db:
    image: mariadb:10.7
    environment:
      MARIADB_ROOT_PASSWORD: rootpass
      MARIADB_DATABASE: testdb
      MARIADB_USER: testuser
      MARIADB_PASSWORD: testpass
    volumes:
      - db-data:/var/lib/mysql
volumes:
  db-data:
docker compose up -d

コンテナに対しての操作コマンド shellの立ち上げ

dokcer compose exec コンテナ名 コンテナで実行したいコマンド

dbのバージョン確認
docker compose exec db mariadb --version

コンテナ内でShellコマンドを入力したい場合は下記

docker compose exec db /bin/bash
mariadb --version
mariadb -u testuser -D testdb -p

Docker ComposeでWordPressを立ち上げる

depends_onで作成順番がdb→wordpressとなる
理由としてはワードプレスはデータベースが無いと利用できない為

services:
# データベース
  db:
    image: mariadb:10.7
    environment:
      MARIADB_ROOT_PASSWORD: rootpass
      MARIADB_DATABASE: wordpress
      MARIADB_USER: wordpress
      MARIADB_PASSWORD: wordpress
    volumes:
      - db-data:/var/lib/mysql
  # ワードプレス
  wordpress:
    image: wordpress:6.0
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
    ports:
      - "8080:80"
    volumes:
      - wordpress-data:/var/www/html
volumes:
  db-data:
  wordpress-data:
docker compose up -d

基本的にはひとつのコンテナに一つのサービスとする
dbとwordpressまとめる事はしない方が保守としては柔軟性がある。

コンテナデータの永続化 ボリュームとバインド

バインド

ファイルの変更が多い場合はバインドを利用ローカルの変更がコンテナにも反映される
一番下のvolumes: db-data:の後ろを削除してservices配下のvolumesにバインドを定義する

services:
# データベース
  db:
    image: mariadb:10.7
    environment:
      MARIADB_ROOT_PASSWORD: rootpass
      MARIADB_DATABASE: wordpress
      MARIADB_USER: wordpress
      MARIADB_PASSWORD: wordpress
    volumes:
      - db-data:/var/lib/mysql
  # ワードプレス
  wordpress:
    image: wordpress:6.0
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
    ports:
      - "8080:80"
    volumes:
    #ローカルhtmlというフォルダが生成される。
    #コンテナ内のhtmlをバインドしている
      - ./html:/var/www/html
volumes:
  db-data:

DockerFileを使ってのイメージ作成

ここで確認したいのはDockerComposeはあくまでコンテナ生成の為に使用している、
Dockerfileはカスタムイメージの作成である。カスタムイメージとはソフトウェアのインストールやファイルのコピーを実施したイメージ

つまりDockerfileでイメージを作成してDockerComposeでコンテナの生成が可能

Flaskのイメージ

flaskのDockerfile

# pythonをインストール
FROM python:3.10
# 作業ディレクトリを作成
WORKDIR /usr/src/app
# flaskをインストール
RUN pip install flask==2.1.0
# flaskに組み込まれているwebサーバーを起動
CMD ["flask", "run", "--host=0.0.0.0"]

flaskのComponentファイル

services:
  web:
  # 同一ディレクトリのDockerfileを元にコンテナを作成する今回はcompose.yamlと
  # 同じディレクトリな為 .と記載
    build: .
    environment:
      FLASK_ENV: development
    ports:
    # Flaskのデフォルトポート
      - "5000:5000"
    volumes:
      - ./src:/usr/src/app

Dockerfileからイメージのビルドを実施

docker compose up -d

Dockerのネットワークに関して

dokcerは自動でネットワークを作成する。
bridge:コンテナ間とコンテナ外を通信する
host::Dockerホストのネットワークをそのまま使う
none:コンテナ間、コンテナ外とも通信できない。

下記ではservicesに記載されているのがコンテナ名となる
そしてwordpressコンテナではWORDPRESS_DB_HOST: dbと記載がある
つまりdbコンテナ名を指定する事でwordpressコンテナとdbコンテナが通信出来るようになっている

# Docker Composeでは、
# 同じDocker Composeファイル内で定義されたサービスは、
# デフォルトで同じ内部ネットワークに属します
services:
# データベースコンテナ
  db:
    image: mariadb:10.7
    # 環境変数
    environment:
      MARIADB_ROOT_PASSWORD: rootpass
      MARIADB_DATABASE: wordpress
      MARIADB_USER: wordpress
      MARIADB_PASSWORD: wordpress
    volumes:
      - db-data:/var/lib/mysql
  # ワードプレスコンテナ
  wordpress:
    image: wordpress:6.0
  #dbとする事でデータベースが生成されてからワードプレスのコンテナが起動する
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
    ports:
      - "8080:80"
    volumes:
    #コンテナを起動するとローカルにhtmlというフォルダが生成される。
    #コンテナ内のhtmlをバインドしている
      - ./html:/var/www/html
volumes:
  db-data:
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0