• Dockerやってみよう

Spring boot Docker

git clone https://github.com/spring-guides/gs-spring-boot-docker.git
cd gs-spring-boot-docker/complete
mvn package
#mvn
mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar)
# gradle
mkdir -p build/dependency && (cd build/dependency; jar -xf ../libs/*.jar)
docker build -t springio_xxx .
docker run -p 8080:8080 -t springio_xxx

Dockerfile

ARGシェル環境変数をそのまま引き継げるようだ
ENVDockerに渡す環境変数
WORKDIRDocker内部での作業ディレクトリ、なかったら作成してくれる。相対パスだと今いる場所から移動
ADDCOPYのほうが良いので非推奨
COPYローカル Dockerでコピーする。キャッシュがきくので. . などとやるとローカルのファイル変更があるたびにビルドされるのでファイル指定で

リソース制限

CPU

  • cpusをつけることにより制限可能。1を指定すると物理CPU一個分は保証される。指定しない場合は200%とか余裕で言ったので物理コアいっぱい使うのかも?

実験結果

  • DBはもともとスカスカなので0.1でも問題なし
  • Sonarqubeは重いので0.1だと起動すらしない(諦めた)。0.5にしたら起動はする。
  • docker statsで見るとCPU使用率が0.1だと10%程度,0.5だと50%程度で頭打ちなので効いているし体感できる

はまりどころ

  • ローカルポートマッピングしないとアクセスできない。ローカルPort:Docker Portの順である。ボリュームも一緒
33306:3306
${HOME}/.aws/credentials:/home/spring/.aws/credentials:ro

コマンド

docker statコンテナ状態確認
docker exec -it コンテナ名 /bin/bash入る
全コンテナ停止docker stop $(docker ps -q)
全コンテナ削除docker rm $(docker ps -q -a)
停止済みコンテナ削除docker container prune
全イメージ削除docker rmi $(docker images -q)

インストール

  • Windows,MacであればDocker toolboxを使うべし
  • CentOS7であればyum install dockerでOK
  • Macはbrew cast install docker

Docker build

デフォルトのファイル名なら-f不要。-tでイメージ名 ./そこにあるパスから指定されたファイルを探すと言うもの

docker build -f Dockerfile-xxx -t mydocker ./
docker run mydocker

Docker toolbox

若干時代遅れ感があるが、Windows10以外の場合はこれしかない。仮想マシンを介してDockerを操作する。仮想マシンのIPはデフォルト192.168.99.100になる。アクセスする場合もこのIPを利用する。

docker run -d --name httpd -p 80:80 httpd 

kitematic

GUIツールだが、最近の情報がないのであまり使われてない印象。

ミドルウェアを使ってみる

Jenkins

docker pull jenkins/jenkins:lts
cd /tmp

tfujiinoMacBook-Pro:tmp t_fujii$ docker run -d -v `pwd`/jenkins_home: /var/jenkins_home -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts

/tmpとかじゃないとエラーが出る!

Docker volume

実態はホストの/var/lib/docker/volumes/ボリューム名にある。macの場合は仮想マシン上で動いているため以下のコマンドで接続する。

docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh

ボリュームはコンテナ停止中だと削除できないので、docker rmした後に削除する。

コマンド一覧

ボリューム使用率 概要docker system df
ボリューム使用率 詳細docker system df -v
ボリューム一覧docker volume ls
未使用のボリューム削除docker volume prune

Volume copy

新しいボリューム(new_volume)を作成して、古いもの(old_volume)からCOPYする。

docker volume create --name new_volume
  • コピー内容を見なくていいならvオプションを抜く
docker container run --rm -it -v old_volume:/from -v new_volume:/to alpine ash -c "cd /from ; cp -av . /to"

Docker compose

設定を確認docker-compose config
pulldocker-compose pull
ビルドdocker-compose build
全部まとめて再起動docker-compose restart
全部まとめて実施docker-compose up -d
全部まとめてログ表示docker-compose logs
作成されたdockerイメージの確認docker-compose images
Multi stage build中間成果物を無くして、イメージスリム化。例えばコンパイル系言語であればビルドイメージはライブラリが肥大化するが成果物だけいただいて、実行ランタイムはコンパクトなものを選べる

nginxをローカルボリュームにマウントする

https://takatorix.hatenablog.com/entry/2017/04/27/012516

用語集

Docker HubPUBLICに公開されているDockerイメージリポジトリ
Docker repository公開できないのであればPrivateリポジトリを立てる。AWSなどではAmazon ECRとして提供されている。コンテナでもregistryで提供されている
DockerfileDockerコンテナーの構成とDockerイメージの作成を一括で行う。イメージ上でコマンドを実施したりできる
Volume Container永続データを配置したいときに利用する

いろいろ試してみる

共通手順

  1. docker pull イメージ名
  2. docker run オプション イメージ名

オプション

デーモン起動-d
ホストのボリュームマウント-v /var/tmp:/var/www/html
ポート-p 8080:80
環境変数-e foo=var

Dockerの内部にbashで接続

docker exec -it コンテナID bash

そのほかにもport, top,などがある。

様々なミドルウェアを試してみた

軽くやってみるdocker run -it --name "test" centos /bin/bash
httpdを8080でデーモン起動docker run -d -p 8080:80 httpd
jenkinsdocker run -p 8080:8080 -p 50000:50000 jenkins
jenkins外部ボリュームdocker run -p 8080:8080 -p 50000:50000 -v /var/tmp:/var/jenkins_home jenkins
Solr4 ボリュームマウントdocker run -p 127.0.0.1:8983:8983 -v /var/tmp:/etc/opt/solr/cores/your-awesome-core:ro 2degrees/solr4http://localhost:8983/solr/#/

MySQL

docker pull mysql
docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql
#停止して削除
docker stop mysql
docker rm mysql
  • 削除しないと以下のエラー Error response from daemon: Conflict. The name "mysql" is already in use by container 2b37289bb606. You have to remove (or rename) that container to be able to reuse that name.
  • 接続するにはDockerマシンのIPに対して
mysql -u root -pmysql 

Wordpress/Nginx

docker pull eugeneware/docker-wordpress-nginx
docker run -p 80:80 --name docker-wordpress-nginx -d eugeneware/docker-wordpress-nginx

ファイルシステムへの保存

docker export でtarファイルへ docker importでtarファイルからdockerイメージへ

ツール

Docker for Mac and Windows

2016/03現在ベータ版だが、ネイティブでDockerを動かせるというもの。Hyper-Vを利用しているためWindows10以降

Docker toolbox

VirtualBox経由のDockerを操作するがそれをひとまとめにしてくれているツール。

CentOS6(非推奨)

yum install docker-io

起動してみる

systemctl start docker
Error starting daemon: Error initializing network controller: Error creating default \"bridge\" "network: package not installed"とでて失敗。OpenVZには入れられないということで終了!

基本操作

docker search キーワードDocker Hubからイメージ検索
docker pull centoscentosイメージを持ってくる
docker images今ローカルにあるイメージ一覧
docker ps動いているDockerプロセス
ctrl+p,ctrl+q抜ける
docker attach [CONTAINER ID]再びアタッチ

試しにやってみる

docker run hello-world表示するだけ
docker run -d -P --name web nginxweb

トラブルシューティング

dockerのphpアプリからhostのDB接続

DriverがないDockerbuildファイルでインストール
SQLSTATE[HY000][2002] No such file or directorylocalhostを127.0.0.1

docker: you are not authorized to perform this operation: server returned 401..

DockerImageTrustを有効にしている場合、自作のイメージは署名なしでは実行できない。 export DOCKER_CONTENT_TRUST=0で解消。

さくらのVPSにインストール

Azureの仮想マシンにインストール

Oracle on Docker

https://github.com/oracle/docker-images


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-01-27 (木) 09:52:54