Docker
参考
色々あって複雑
table:docker
Dockerデーモン Dockerが動作する環境。常駐アプリ。
Docker CLI Dockerデーモンに対して指示を出す対話アプリ。 docker xxx
Docker Compose 複数のコンテナを一度に操作するタイプのCLI。docker compose xxx
Docker HUB Dockerイメージを配布してるサイト
table:docker用語
イメージ 環境のテンプレみたいなもの
コンテナ 実際に動作している環境
ボリューム ハードディスクのようなもの。DBコンテナは作り直すけどデータは残すといった事が出来る
dockerコマンド
table:Docker Imageの操作
docker pull {image_name} docker imageのダウンロード
docker images ダウンロード済みのイメージ一覧
docker rmi {image_name} イメージの削除
docker build -t {image_name} . カレントディレクトリのDockerfileからイメージをビルド。末尾のドットを忘れずに
table:Docker Containerの操作
docker run {image_name} -name {container_name} docker containerの作成と起動
docker exec -it {image_name} /bin/sh コマンドラインの起動
docker start {container_name} docker containerの起動
docker stop {container_name} docker containerの停止|
docker ps 動いているdocker containerの一覧
docker ps -a docker containerの一覧
docker rm {container_name} docker containerの削除
docker logs {container_name} dockerの標準出力を参照
docker logs -f {container_name} tail -f みたいな事ができる
table:Docker Volumeの操作
docker volume ls ボリュームの一覧を表示
docker volume rm {volume_name} ボリュームの削除^
Docker Compose コマンド
table:commands
コマンド 概要
docker-compose build docker-compose.ymlに記載のコンテナ達をビルド
docker-compose up コンテナ達の起動
docker-compose down コンテナ達の破棄
docker-compose exec {service} bash docker execコマンドと同等のことができます
docker compose restart コンテナの再起動
docker-compose service run docker runとしてコンテナを起動する
docker-compose service run bash コマンドラインの起動
docker-compose ps コンテナの状態確認。ポート割り当て状況なんかも見れる
docker-compose stop コンテナ達の停止
バルク的な操作
docker system prune 停止コンテナ、タグ無しイメージ、未使用ボリューム、未使用ネットワーク一括削
docker container prune 停止コンテナの一括削除
docker rmi docker images -q 未使用イメージ一括削除
docker runとdocker execはほぼ同じ動作をするが、runは新規コンテナを立ち上げて実行、execは既存コンテナに別プロセスで実行という違いがある
docker-compose service runは複数コマンドを一括実行したりもできる
ただし、デフォルトではポートの割り当てを行わないので、必要に応じて--service-portsの付与が必要
docker-compose経由でrails db:migrate等
docker-compose run web bin/rake db:create db:migrate db:seed
他の人からdocker環境を渡されたら、最初に`docker-compose build`をする
docker attachとdocker exec -it *** /bin/sh はほぼ同じ振る舞いをするが、
前者はDockerfileに記載されたCMDプロセスの標準入出力を取り出す一方、後者は新規にshプロセスを立ち上げる。
なので、前者の場合にデタッチしようとCtrl+Cなんかをするとdockerコンテナを巻き込んで終了する。
あまり使わない方が良い(標準出力が見たいならdocker logsがある)
Docker環境構築
Windows
現状でDockerを使う際にインストールするソフトが2種類。
Docker for windows
新しい方、推奨。 WindowsのHiper-V上にDocker環境を構築するため、Hiper-Vの入ったWindowsでないと使えない。
Docker toolbox
古い方。Hiper-Vの代わりにVertualBoxを使用する。
インストール時に合わせてVirtualBoxのインストールもできる。
出てくるショートカットは次の二つ。
Docker Quickstart Terminal(CUIクライアント)
Kitematic (Alpha)(GUIクライアント)
要点としては
dockerで単体のコンテナについて操作する。
docker-composeで複数のコンテナを一度に操作する。
Mac
普通にDocker for Macを使う
CentOS
古いバージョンをアンインストールする
code:sh
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
リポジトリを使用してインストールする
code:sh
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
sudo yum-config-manager \
--add-repo \
sudo yum install docker-ce
Dockerを起動
code:sh
sudo systemctl start docker
sudo systemctl enable docker
Dockerが動くことを確認
code:sh
sudo docker run hello-world
とりあえず何かDockerのVMを立ち上げてみる
以下の内容でdockerfile(という名前のファイル)を作成
code:dockerfile
FROM ruby:2.3.0-alpine
RUN apk --no-cache --update add \
libstdc++ \
build-base \
openssl-dev \
sqlite \
sqlite-dev \
ruby-dev && \
gem install mailcatcher && \
apk del build-base ruby-dev && \
rm -rf /tmp/* /var/tmp/* /var/cache/apk/*
EXPOSE 1025 1080
code:sh
# dockerfileをビルド image_nameには任意の名前
docker build -t image_name .
# ビルドしたdockerコンテナを起動
docker run image_name -name container_name -d -p 1080:1080 -p 1025:1025
# アクセステスト
curl localhost:1080
#### Docker-composeのインストール
バージョンが変わるとURLが死ぬらしいので注意
code:sh
chmod +x /usr/local/bin/docker-compose
---
---
いくつか用語
Images
DockerImage。コンテナの作成に使うアプリケーションの構成。dokcer pull alpineで落としたのがこれ
コンテナ
実行中のDockerImageの事、ClassとInstanceの違いみたいな
DockerDaemon
Docker環境を動かしてるサービス
DockerClient
dockerコマンド
DockerStore
Dockerにおけるgemみたいな物
イメージ名とコンテナ名は異なる。コンテナ名は物によってはランダムになるみたい?
下の例だと、Image名はpostgres、コンテナ名は01rails_db_1 docker stopで指定するのはコンテナ名またはコンテナID
code:docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4fec142e026e postgres "docker-entrypoint.s…" 19 minutes ago Up 18 minutes 5432/tcp 01rails_db_1
---
## ゲストとの通信
|command|description|
|:---|:---|
|docker run -P|起動したコンテナのポートを、ホストのランダムなポートに紐づけ|
|docker run -p 8888:80|ホストの8888番をゲストの80番に割り当て|
Docker for Windowsを使っている場合はlocalhostで、Docker-toolboxの場合はdocker-machine ip defaultで確認したIPで接続できる
---
## フォルダ共有
DockerはデフォルトだとC:¥Users¥<user>¥配下にあるフォルダしか連携出来ない・・・?
---
## Docker Imageについて
ローカルに落としたImageはdocker imagesで参照できる。
Imageのダウンロードはdocker pull [image]:[version]versionはデフォルトでは latestを落とす
ダウンロード元はDocker Storeから。
DokerImageには親子関係を設けられる。公式ImageとユーザImageとに分けられ、公式Imageは
ユーザImageは公式Image または 他のユーザImageを元に作る
---
---
【mioga関連】
・miogaフォルダ直下にdocker-compose.ymlが有るのでこれを実行する
→特に編集しなければdevelop環境、.env.devを利用する
docker-compose up --build
・Gemfileが見当たらないエラーになる
→Docker-Toolboxでは、C:¥Users¥ 以下でないとホスト-ゲスト間共有フォルダにできないのでプロジェクトを移動する
(Docker for windowsだと設定すれば出来る)
・bundler絡みで失敗したら、もう一度実施する(何度かやると進む)
・dbに繋がらないエラーが出る
→database.ymlがenvを参照していない模様、host: dbを追加
※docker-compose.ymlによって、DBのホスト名がdbになっている
・パスワードを入れろと怒られる
→database.ymlにpassword: passwordを追加
・ブラウザで見るときはhttp://192.168.99.100:3000/
---
## Redis
---
## Docker-composeのリファレンス
### doker-compose.ymlのcommand節
コマンドライン全量入れるのではなく、コマンドラインオプションだけを入れるのでもOK
mysqlだと
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
が、katsubushiだと
command: -redis redis://redis:6379/0
で良い
### DockerCompose.yml
`yml
version: '3'
services:
mailcatcher:
image: schickling/mailcatcher
ports:
- 1080:1080
mysql:
image: mysql:5.6
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: password
ports:
- 8000:3306
katsubushi:
image: katsubushi/katsubushi
command: -redis redis://redis:6379/0
ports:
- 11212:11212
links:
- redis
redis:
image: redis
ports:
- 6379:6379
`
## Docker環境でbinding.pry
docker-compose.ymlに色々書いておく。
その状態で普通にbinding.pryをして止めたら、別ターミナルからdocker attach [sirvice]でアタッチできる。
そのまま抜けると、dockerが終了してしまうので、デタッチするときはCtrl-P Ctrl-Qで抜ける。
## dcokerコンテナの中のログを取り出す
## Docker周りで出くわした妙な振る舞い
docker-composeに、always restart的な定義をしていたがため、
docker-compose run rails db:seed_fuみたいなコマンドを送信すると、延々と初期データ設定を繰り返すコンテナができてしまった。
この状態でWebアプリを利用しようとすると、DBのデッドロックがおきたりする
## docker-compose上で動いているDBへアクセスする
docker-compose.ymlに、ポートフォワードの設定を書いておく
`yml
db:
image: mysql:5.7
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
volumes:
- dbdata:/var/lib/mysql
ports:
- "3306:3306" <- これ
`
この場合、localhost:3306へ来た通信は、コンテナの方へ流れていくので、localhost:3306に向けてクライアントを接続すれば、DBの中身が見える
すげー