"Dockerって何？　簡単な言葉で解説するDockerの基本"

# はじめに

> Dockerを使って開発環境を共有している現場が多くあります。
未経験エンジニアで現場に入った際、Dockerについて理解していると、スムーズに作業に入ることができると思います。
Dockerの基本について、かなり嚙み砕いてまとめたので、備忘録として残します。

# 目次
- Docker（ドッカー）とは
- Dockerの機能と用語説明
- Dockerコマンド（基本）

## Docker（ドッカー）とは

1台のサーバー上で様々なアプリケーションを手軽に仮想化・実行できるようにするためのプラットフォームのこと。
Dockerコンテナと呼ばれるアプリケーションの実行環境を、1台のサーバー上に作成することができる。
Dockerコンテナを作成するための設計図であるDockerイメージを共有することで、他ユーザーでも簡単に同じ開発環境のDockerコンテナを使ってアプリケーションを実行できる。
![20231018-Dockerのイメージ図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574782/dcfea589-151a-5ee9-e905-5ccecfeb87cd.png)



## Dockerの機能と用語説明
#### Dockerコンテナ
システムの他の部分に影響を与えることなく、アプリケーションを実行できる仮想空間のような隔離された環境で、すべてのコードと依存関係がパッケージ化されている。

#### Dockerイメージ
アプリケーションの実行に必要なソースコード、依存関係、ツールを含んだパッケージで、コンテナ作成時に指示を出す読み取り専用のファイル。

#### Dockerfile
Dockerイメージを構成するテキストデータで、Dockerfileを読み込むことでDockerイメージが構築される。
```dockerfile:dockerfile
FROM gradle:7.4.1-jdk11 AS builder

WORKDIR /tmp

COPY ./src ./src

COPY ./build.gradle .

RUN gradle build

FROM openjdk:11.0.14.1-oracle

COPY --from=builder /tmp/build/libs/app.jar /app/app.jar

EXPOSE 8080
```

#### Docker Compose
複数のコンテナを１度に操作することができるツール。Docker Composeの設定ファイルであるdocker-compose.ymlファイルは複数のコンテナ間の関係や環境変数などを記述する。
```yaml:docker-compose.yml
version: "3"
services:
  spring-boot:
    build:
      context: ./web-spring2
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      mysql:
        condition: service_started
    entrypoint: "java -jar /app/app.jar"
    networks:
      - app-net
  mysql:
    build:
      context: ./mysql
      dockerfile: Dockerfile
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/settings:/etc/mysql/conf.d/
      - ./mysql/data/:/var/lib/mysql/
    environment:
      MYSQL_DATABASE: study
      MYSQL_ROOT_PASSWORD: riku0456
    networks:
      - app-net
networks:
  app-net:
    driver: bridge
```

#### Docker Desktop
Windows・MacOS上でDocker環境を構築・利用するためのツールで、画面上でコンテナの停止や再開、廃止といった操作が可能。
![20231018-dockerDesktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574782/6eb283b0-4b26-c652-f012-f1992ff57a51.png)


#### Docker Hub
Dockerイメージの共有サービス。Dockerイメージ（Dockerfile）が公開されており、Docker Hubから任意のイメージ（Dockerfile）を取得できる。自身で作成したイメージ（Dockerfile）をリポジトリにアップし、他ユーザーと共有することも可能。
![20231018-DockerHub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574782/e24e9a7b-b3a2-80f8-28dc-1c0f5d600db1.png)


## Dockerコマンド（基本）

##### build
DockerfileからDockerイメージを作成する
```
docker image build [オプション] Dockerfileのパス

//例
docker image build -t imagename/nginx：latest .
```
>[-t] イメージ名・タグ名を指定するオプション

##### run
Dockerイメージを使いDockerコンテナを起動（作成）する
```
docker container run [オプション] imagename

//例
docker container run --name containername -d -p 8080:80 imagename
```
>[--name] コンテナ名を指定するオプション
[-d] コンテナをバックグラウンドで実行するオプション
[-p] コンテナのポート番号と、サーバーのポート番号を紐づけるオプション

##### start
作成済（停止中）のコンテナを起動する
```
docker container start [オプション] containername

//例
docker container start containername
```

##### stop
Dockerコンテナを停止する
```
docker container stop [オプション] containername

//例
docker container stop containername
```

##### rm
停止中のコンテナを削除する
```
docker container rm [オプション] containername

//例
docker container rm containername
```
>[-f] コンテナ起動中でも削除

##### restart
コンテナを再起動する
```
docker container restart [オプション] containername

//例
docker container restart containername
```

##### exec
起動中のコンテナ内でコマンドを実行する
```
docker container exec [オプション] containername コマンド

//例
docker container exec -it containername bash
```
>[-it] コンテナ側のコマンドの入出力を手元のターミナルに移行する

## 参考サイト
https://kinsta.com/jp/knowledgebase/what-is-docker/

https://www.kagoya.jp/howto/cloud/container/docker/

https://knowledge.sakura.ad.jp/13265/

https://www.kagoya.jp/howto/cloud/container/dockercommand/


## 最後に
この記事では、Dockerの基本について噛み砕いて説明してみました。
Dockerは開発環境を共有し、アプリケーションの実行をスムーズに行うための強力なツールなので、使えるとかなり便利ですね。
次回は実際にDockerを導入する記事も投稿したいと思います！