# シス管勉強会 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