- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2022-01-06T00:33:17+00:00","default:wikiadmin","wikiadmin")
#author("2022-01-27T00:52:54+00:00","default:wikiadmin","wikiadmin")
-Dockerやってみよう
#contents
*Spring boot Docker [#zeebb55c]
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 [#g721aeb5]
|ARG|シェル環境変数をそのまま引き継げるようだ|
|ENV|Dockerに渡す環境変数|
|WORKDIR|Docker内部での作業ディレクトリ、なかったら作成してくれる。相対パスだと今いる場所から移動|
|ADD|COPYのほうが良いので非推奨|
|COPY|ローカル Dockerでコピーする。キャッシュがきくので. . などとやるとローカルのファイル変更があるたびにビルドされるのでファイル指定で|
*リソース制限 [#pbe8b68e]
**CPU [#n0ee80f6]
--cpusをつけることにより制限可能。1を指定すると物理CPU一個分は保証される。指定しない場合は200%とか余裕で言ったので物理コアいっぱい使うのかも?
***実験結果 [#k9001a8a]
-DBはもともとスカスカなので0.1でも問題なし
-Sonarqubeは重いので0.1だと起動すらしない(諦めた)。0.5にしたら起動はする。
-docker statsで見るとCPU使用率が0.1だと10%程度,0.5だと50%程度で頭打ちなので効いているし体感できる
*はまりどころ [#a520a2d6]
-ローカルポートマッピングしないとアクセスできない。ローカルPort:Docker Portの順である。ボリュームも一緒
33306:3306
${HOME}/.aws/credentials:/home/spring/.aws/credentials:ro
*コマンド [#obbee8d3]
|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)|
*インストール [#q4f8be84]
-Windows,MacであればDocker toolboxを使うべし
-CentOS7であればyum install dockerでOK
-Macはbrew cast install docker
**Docker build [#fe8774c2]
デフォルトのファイル名なら-f不要。-tでイメージ名 ./そこにあるパスから指定されたファイルを探すと言うもの
docker build -f Dockerfile-xxx -t mydocker ./
docker run mydocker
**Docker toolbox [#p08ffa98]
若干時代遅れ感があるが、Windows10以外の場合はこれしかない。仮想マシンを介してDockerを操作する。仮想マシンのIPはデフォルト192.168.99.100になる。アクセスする場合もこのIPを利用する。
docker run -d --name httpd -p 80:80 httpd
**kitematic [#h374fea5]
GUIツールだが、最近の情報がないのであまり使われてない印象。
*ミドルウェアを使ってみる [#za418117]
**Jenkins [#h49c13f9]
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 [#u8b74a62]
実態はホストの/var/lib/docker/volumes/ボリューム名にある。macの場合は仮想マシン上で動いているため以下のコマンドで接続する。
docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
ボリュームはコンテナ停止中だと削除できないので、docker rmした後に削除する。
**コマンド一覧 [#bebcc536]
|ボリューム使用率 概要|docker system df|
|ボリューム使用率 詳細|docker system df -v|
|ボリューム一覧|docker volume ls|
|未使用のボリューム削除|docker volume prune|
**Volume copy [#t9f0e9d5]
新しいボリューム(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 [#k86c8003]
|設定を確認|docker-compose config|
|pull|docker-compose pull|
|ビルド|docker-compose build|
|全部まとめて再起動|docker-compose restart|
|全部まとめて実施|docker-compose up -d|
|全部まとめてログ表示|docker-compose logs|
|作成されたdockerイメージの確認|docker-compose images|
|Multi stage build|中間成果物を無くして、イメージスリム化。例えばコンパイル系言語であればビルドイメージはライブラリが肥大化するが成果物だけいただいて、実行ランタイムはコンパクトなものを選べる|
**nginxをローカルボリュームにマウントする [#p5bcb032]
https://takatorix.hatenablog.com/entry/2017/04/27/012516
*用語集 [#tffa9306]
|Docker Hub|PUBLICに公開されているDockerイメージリポジトリ|
|Docker repository|公開できないのであればPrivateリポジトリを立てる。AWSなどではAmazon ECRとして提供されている。コンテナでもregistryで提供されている|
|Dockerfile|Dockerコンテナーの構成とDockerイメージの作成を一括で行う。イメージ上でコマンドを実施したりできる|
|Volume Container|永続データを配置したいときに利用する|
*いろいろ試してみる [#s60bcbdd]
**共通手順 [#ncc3e451]
+docker pull イメージ名
+docker run オプション イメージ名
**オプション [#bb4e7d07]
|デーモン起動|-d|
|ホストのボリュームマウント |-v /var/tmp:/var/www/html|
|ポート|-p 8080:80|
|環境変数|-e foo=var|
**Dockerの内部にbashで接続 [#i619e230]
docker exec -it コンテナID bash
そのほかにもport, top,などがある。
***様々なミドルウェアを試してみた [#s7918881]
|軽くやってみる|docker run -it --name "test" centos /bin/bash||
|httpdを8080でデーモン起動|docker run -d -p 8080:80 httpd||
|jenkins|docker 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/solr4|http://localhost:8983/solr/#/|
**MySQL [#u38b30c3]
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 [#o8e89459]
docker pull eugeneware/docker-wordpress-nginx
docker run -p 80:80 --name docker-wordpress-nginx -d eugeneware/docker-wordpress-nginx
*ファイルシステムへの保存 [#x66cc831]
docker export でtarファイルへ
docker importでtarファイルからdockerイメージへ
*ツール [#u2310ef7]
**Docker for Mac and Windows [#x9b1ab6a]
2016/03現在ベータ版だが、ネイティブでDockerを動かせるというもの。Hyper-Vを利用しているためWindows10以降
**Docker toolbox [#b4dd7743]
VirtualBox経由のDockerを操作するがそれをひとまとめにしてくれているツール。
**CentOS6(非推奨) [#haab25f4]
yum install docker-io
*起動してみる [#c7f820ad]
systemctl start docker
Error starting daemon: Error initializing network controller: Error creating default \"bridge\" "network: package not installed"とでて失敗。OpenVZには入れられないということで終了!
*基本操作 [#q14e67c8]
|docker search キーワード|Docker Hubからイメージ検索|
|docker pull centos|centosイメージを持ってくる|
|docker images|今ローカルにあるイメージ一覧|
|docker ps|動いているDockerプロセス|
|ctrl+p,ctrl+q|抜ける|
|docker attach [CONTAINER ID]|再びアタッチ|
**試しにやってみる [#o47dd014]
|docker run hello-world|表示するだけ|
|docker run -d -P --name web nginx|web|
*トラブルシューティング [#gcca1968]
**dockerのphpアプリからhostのDB接続 [#bda0ebe6]
|Driverがない|Dockerbuildファイルでインストール|
|SQLSTATE[HY000][2002] No such file or directory|localhostを127.0.0.1|
**docker: you are not authorized to perform this operation: server returned 401.. [#s21b87b1]
DockerImageTrustを有効にしている場合、自作のイメージは署名なしでは実行できない。
export DOCKER_CONTENT_TRUST=0で解消。
*さくらのVPSにインストール [#z332ceea]
*Azureの仮想マシンにインストール [#s05af2b0]
*Oracle on Docker [#o02464a7]
https://github.com/oracle/docker-images