---
# System prepended metadata

title: シス管勉強会 Docker編

---

# シス管勉強会 Docker編
## チートシート
| 説明 | コマンド |
----|---- 
| コンテナを生成して起動 | docker run |
| 名前指定 | docker run -name "hoge" [イメージ名] |
| バックグランド実行 | docker run -d [イメージ名] |
| コンソールに結果を出力 | docker run -it [イメージ名] |
| ポートフォワーディング | docker run -p 8080:80 [イメージ名] |
| 実行中のコンテナ一覧 | docker ps |
| コンテナの一覧(停止中含む) | docker ps -a |
| コンテナ作成 | docker create [イメージ名] |
| コンテナ確認 | docker stats [コンテナ] | 
| コンテナ起動 | docker start [コンテナ] |
| コンテナ停止 | docker stop [コンテナ] |
| コンテナ再起動 | docker restart [コンテナ] |
| コンテナ接続 | docker attach [コンテナ] |
| コンテナログ | docker logs [コンテナ] |
| 稼働コンテナのプロセス確認 | docker top [コンテナ] |
| 停止中のコンテナ削除 | docker rm [コンテナ] |
| 停止中の全てのコンテナ削除 | docker container prune |
| プロセス実行 | docker exec -it [コンテナ] /bin/bash |
| Dockerfileをimage化 | docker build -t name . or docker build .|
| イメージ一覧 | docker images |
| イメージ検索 | docker search [イメージ名] |
| イメージ取得 | docker pull [イメージ名] |
| イメージ削除 | docker rmi [イメージ名 or イメージID] |
| 未使用イメージ削除 | docker image prune |

## Nginxを立ち上げてみよう

```
# コンテナの起動
# -d: バックグラウンドで起動
# --name: コンテナに名前をつける（省略する場合は自動で名前を割り当てる)
# -p 8080:80: コンテナの80番ポートをホストの8080番ポートにバインド
$ docker run -d --name mynginx -p 8080:80 nginx:latest

# 起動しているコンテナの確認
$ docker ps

# curlでWelcome to nginx!が返ってくるかの確認
# Webで確認することも可能
$ curl localhost:8080

# ログの確認
$ docker logs mynginx

# コンテナの停止
$ docker stop mynginx

# コンテナの削除
$ docker rm mynginx
```

## コンテナに入ってみる

```
# ubuntuコンテナ上でbashを実行する
# -it: コンソールに結果を出力
# -rm: コンテナ終了時にコンテナを自動削除
$ docker run -it --rm ubuntu:18.04 /bin/bash

# コマンドを叩いて，コンテナ内のプロセスやファイルシステムの状態などを確認してみる
$ ls
$ hostname
$ cat /proc/meminfo
$ cat /proc/cpuinfo
$ free -mth
$ ps aux
```

## ホストとのファイル共有

```
# 適当なHTMLファイルを作成
$ mkdir ~/html
$ cd html
$ touch index.html
$ vim index.html
###
<!DOCTYPE html>
<html>
<head>
<title>シス管</title>
</head>
<body>
<h1>シス管勉強会 Docker編</h1>
</body>
</html>
###

# ホストの~/htmlをコンテナの/usr/share/nginx/htmlにバインド
$ docker run -d --name mynginx -p 8080:80 \
         -v $HOME/html:/usr/share/nginx/html \
         nginx:latest

# curlで確認
$ curl localhost:8080

# 削除
$ docker stop mynginx
$ docker rm mynginx
```

## Dockerfile
### コンテナイメージのビルド方法
```
# Dockerfileのあるディレクトリ実行
$ docker build .

# イメージ名，タグを指定する場合
$ docker build -t myapp:v1.0.0 .
```

### NginxのDockerfileを書いてみる

```
$ vim Dockerfile
###
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y nginx 
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
###

$ docker build -t mynginx .
$ docker run -d --name mynginx -p 8080:80 mynginx
$ curl localhost:8080

# 削除
$ docker stop mynginx
$ docker rm mynginx
```

### Container Registryにpush・pullする
知能情報コースのgitlabでリポジトリを作成する

https://gitlab.ie.u-ryukyu.ac.jp/

```
$ docker login registry.ie.u-ryukyu.ac.jp
$ docker build -t registry.ie.u-ryukyu.ac.jp/[学籍番号]/[リポジトリ名] .
$ docker push registry.ie.u-ryukyu.ac.jp/[学籍番号]/[リポジトリ名]

# imageの確認
$ docker images 

# imageの削除
$ docker rmi registry.ie.u-ryukyu.ac.jp/[学籍番号]/[リポジトリ名]

# pushしたものをpullしてる
$ docker pull registry.ie.u-ryukyu.ac.jp/[学籍番号]/[リポジトリ名]:latest
```

## docker-compose
参考文献
> http://docs.docker.jp/compose/wordpress.html
> http://docs.docker.jp/compose/django.html
> http://docs.docker.jp/compose/rails.html

- docker-compose.ymlについて
> https://docs.docker.com/compose/compose-file/
> https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa
> https://qiita.com/yuta-ushijima/items/d3d98177e1b28f736f04


### チートシート
| 説明 | コマンド |
----|---- 
| 起動 | docker-compose up |
| バックグランド起動 | docker-compose up -d |
| 停止 | docker-compose stop |
| 再起動(ソースコードの変更のみ) | docker-compose restart |
| プロセス確認 | docker-compose ps |
| Dockerfileの変更反映 | docker-compose build |
| ログの確認 | docker-compose logs |
| 停止と削除 | docker-compose down |

### 既存のDockerイメージを使用する

```
$ vim docker-compose.yml
###
version: '3'
services:

  wordpress:
    image: wordpress
    container_name: some-wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_PASSWORD: my-secret-pw

  mysql:
    image: mysql:5.7
    container_name: some-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: my-secret-pw
###

# 起動
$ docker-compose up

# localhost:8080/wordpress にアクセスする
```

### Dockerイメージを作成する場合
#### Python
Djangoの環境を作る

```
# ディレクトリ構成
/python-sample
　　docker-compose.yml
　　/python
　　　Dockerfile
     requirements.txt
```

```
$ mkdir python-sample
$ cd python-sample
$ mkdir python
$ cd python
$ vim Dockerfile

###
FROM python:3.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
###

$ vim requirements.txt

###
Django
psycopg2
###

$ cd ..
$ vim docker-compose.yml

###
version: '3'
services:
  db:
    image: postgres
    
  web:
    build: ./python
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
###

$ docker-compose run web django-admin startproject sample . 
$ vim sample/settings.py

###
# 28行
ALLOWED_HOSTS = ['*']

# 73行
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
###

$ docker-compose up
```

#### Ruby
Railsの環境を作る

```
# ディレクトリ構成
/ruby-sample
　　docker-compose.yml
　　/ruby
　　　Dockerfile
```

```
$ mkdir ruby-sample
$ cd ruby-sample
$ mkdir ruby
$ cd ruby
$ vim Dockerfile

###
FROM ruby:2.6
RUN apt-get update \
    && apt-get install -y --no-install-recommends build-essential libpq-dev nodejs curl\
	&& curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
	&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
	&& apt-get update \
	&& apt-get install -y yarn \
    && rm -rf /var/lib/apt/lists/*
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
###

$ cd ..
$ vim Gemfile

###
source 'https://rubygems.org'
gem 'rails', '6.0.0'
###

$ vim docker-compose.yml

###
version: '3'
services:
  db:
    image: postgres

  web:
    build:
        context: .
        dockerfile: ./ruby/Dockerfile
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
###

$ docker-compose run web rails new . --force --database=postgresql --skip-bundle
$ vim config/database.yml

###
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  database: postgres
  pool: 5
  username: postgres
  password:
  host: db

development:
  <<: *default
#  database: myapp_development
###

$ docker-compose run web bundle exec rails webpacker:install
$ docker-compose up
```

#### Golang
Beegoの環境を作る

```
# ディレクトリ構成
/go-sample
　　docker-compose.yml
　　/go
　　　Dockerfile
```

```
$ mkdir go-sample
$ cd go-sample
$ mkdir go
$ cd go
$ vim Dockerfile

###
FROM golang:1.13
ENV GOPATH /go
ENV PATH $PATH:$GOPATH/bin
RUN mkdir -p /go/src/myapp
WORKDIR /go/src/myapp

RUN go get github.com/beego/bee \
    && go get github.com/astaxie/beego \
	&& go get github.com/lib/pq

COPY . /go/src/myapp
###

$ vim docker-compose.yml

###
version: '3'
services:
  db:
    image: postgres

  web:
    build:
      context: .
      dockerfile: ./go/Dockerfile
    command: bee run -downdoc=true -gendoc=true
    ports:
      - 8080:8080
    volumes:
      - .:/go/src/myapp
    depends_on:
      - 'db'
###

$ docker-compose run web bee new .  
$ docker-compose up
```

## 演習
1時間くらい時間があればやります

- Dockerfileとdocker-composeを使って学科と同じような構成を作ってみよう
    - LDAP
    - DNS
    - WordPress