Docker最低限知識

# Docker CLI

## DockerHub連携
```
docker login 
docker logout
```

## Docker Help使用
```
docker help
docker image --help
```

## Docker Image
```
# 一覧
docker images
docker image ls

# Image取得
docker pull repoName/ImageName:[TagName]

# Imageプッシュ
docker push repoName/ImageName:[TagName]

# Image詳細
docker inspect ImageName

# Imageタグ付け
docker tag ImageName:[TagName] repoName/ImageName:[TagName]

# Image削除
docker rmi ImageName
docker image prune -a
```

## Docker Container
```bash
# コンテナ起動
docker run \
    -d \ # ディスパッチモード
    -p <HostPort>:<ContainerPort> \ # パブリック設定ポート番号
    -v <ContainerPath> \ # AnonymousVolume設定
    -v <NamedVolume>:<ContainerPath> \ # Named Volume設定
    -v <HostPath>[$(pwd)]:<ContainerPath>[:ro] \ # Bind Mount設定
    --name ContainerName \ # コンテナ名指定
    --rm \ # 終了後削除設定
    --env PORT=3000 \ # 環境変数指定
    --env-file .env \ # 環境変数ファイル指定
    --network name \ # ネットワーク指定
    ImageName:[TagName] # イメージ指定

# コンテナ一覧確認
docker ps -a

# コンテナへのログイン
docker exec -it ContainerName bash

# ファイルコピー
docker cp <HostFiles> ContainerName:<ContainerPath>
docker cp ContainerName:<ContainerPath> <HostFiles>

# コンテナからDockerイメージ作成
docker commit ContainerName repoName/ImageName:[TagName]

# コンテナ起動、停止
docker start [-a] ContainerName
docker stop ContainerName

# ログ確認
docker logs [-f] ContainerName

# アタッチモード
docker attach ContainerName

# コンテナ削除
docker rm (-f) ContainerName
docker container prune

```

## Docker Network
```bash
docker network ls
docker network create --subnet=172.19.0.0/16 mynet
docker network rm xx
```

## Docker Volume
```bash
docker volume ls
docker volume create xx
docker volume rm xx
```

## 実例
```bash
docker run --name php74 -d -p 80 -v "C:\Acquia\docker\static":/var/www/html php:7.4-apache
docker run --name php56 -d -p 80 -v "C:\Acquia\docker\static":/var/www/html php:5.6-apache

docker run --name my-nginx -v "C:\Acquia\docker\static":/usr/share/nginx/html -d -p 80 nginx
docker tag ...
docker push 
ほかの人docker pull

docker run -v "C:\Acquia\docker\mysql":/var/lib/mysql --name my-mysql -e MYSQL_ROOT_PASSWORD=aquaring -d --net=mynet --ip=172.19.0.33 mysql

docker run --name my-drupal --net mynet -p 80 -d drupal
```


# Dockerfile
```docker
FROM php:7.4-fpm

WORKDIR /var/www

COPY php.ini /usr/local/etc/php/

ARG DEFAULT_PORT=80

RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim
RUN apt-get update \
    && docker-php-ext-install pdo_mysql

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
ENV PORT=${DEFAULT_PORT}

EXPOSE ${PORT}

RUN composer global require "laravel/installer"
```

## CLI
```
docker build \
    --build-arg PORT=80
    -t repoName/ImageName:[TagName] \
    .
```

## .dockerignoreファイル(ビルド時に除外設定)
```bash
Dockerfile
node_modules
.env
.git
.gitignore
.dockerignore
```

# Docker Compose
- compose使用するのは否定的だったが、docker runで実行した内容をドキュメント化する意味では単一コンテナでもcompose使用推奨
```yml
version: "3.8"
services:
  mongodb:
    image: 'mongo'
    volumes: 
      - data:/data/db
    environment: 
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: password
  backend:
    build: ./backend
    ports:
      - '80:80'
    volumes: 
      - logs:/app/logs
      - ./backend:/app
      - /app/node_modules
    env_file: 
      - ./env/backend.env
    depends_on:
      - mongodb
  frontend:
    build: ./frontend
    ports: 
      - '3000:3000'
    volumes: 
      - ./frontend/src:/app/src
    stdin_open: true
    tty: true
    depends_on: 
      - backend

volumes: 
  data:
  logs:
```

## CLI
```bash
docker-compose build
docker-compose up -d [--build]
docker-compose down
docker-compose run --rm npm init
```