ググるとquitaで即解説してくれてるわかりやすい内容あるけど、必要な箇所は日本語ドキュメントを読む。
docker-compose日本語ドキュメント
docker-composeのインストール#
前はyumやdnf, aptなどパッケージ管理ツールで入れたけど、今はcurlやwgetで特定のバージョンを取得して入れる(いろいろやったのでyumやdnf使ってないかも)。
大事なのは、利用OSのバージョンがどのdocker-composeを使えるのか調べてから導入すること。見放されているOSバージョンもあるので注意。
けれどcentos8が公開された直後、dockerもdocker-composeもサポート範囲外だったのが、無理して入れたら入って使えた。
centos8とredhat8は色々気に入らない箇所が多くなってきたので、思い切って2020年に見切りをつけてubuntuにベースOSを切り替えた。
docker-composeのバージョン上げ#
今は
curlで取ってきて
/usr/local/binあたりに置いてる。
centosはxrdpでよく行き詰まってたけど、aptでのOS更新がスイスイ進んでくれて気持ちいい。
curlとかgitでソースやバイナリ取ってくるのも、行き詰らずストレートに動くとなんか心地いい。
docker-compose.ymlのサンプル#
docker-compose.ymlにはバージョンがある。
dockerのバージョンアップに引きずられて書ける内容が変わっていく。
docker-compose.ymlのバージョンについて
dockerを覚え始めた頃は、まだcentos6からcentos7への移行時期だったので練習環境がcentos6のときもあった。
使い方を探してググったときにdocker-compose.ymlの1行目に「version: ‘2’」として書いておられるものもあった。
あるときdocker-composeの新バージョンを入れるときに、「centos6はサポートから外れるよん」という情報を見つけcentos6とは決別してcentos7に完全移行して、docker-compose.ymlも「version ‘3’」を使うように統一した。
2020年には、ローカルPCでもGoogleCloudでもcentos8をメインで使うようになったけど、centosはredhat系でdockerではなく、よく似たpodという仕組みを採用したらしい。
dockerを使い続けるので、centosとお別れしてubuntuにベースの利用OSを変えた。
2022年はubuntuを22LTSに変えて、楽しくdocker使い続けてる。
docker-compose.ymlの書き方バージョンは3.8にまで進んでた。
xrdp/django+ssl/db/ldapsを起動して使うとき#
普段はコレを使う。Google Cloudでインスタンス上げてこの内容を使う。
ついでにgitlab-ceも使っててバージョン管理してる。
xrdp経由でphpのページを使っていて事前にdocker imageをビルドしておく必要がある。
ローカルPCのlinux上に同じdocker-compose.ymlを展開しておいて、mariadbのデータフォルダを丸々tar&zipしてGoogle Cloudから持ってきたら、同じDB内容をローカルでも使える。
本番環境とテスト環境みたいな感じで使い分けてる。
phpやmariadbのバージョン上げたかったら、ローカルPCで練習してDockerfileとdocker-compose.ymlを作っておき、うまく動いたらそのファイルをGoogle Cloudに持って行って動かす。
2022年はphpと使うのやめてdjangoに引っ越した。
基本的なページ遷移とかblob列へのpdf保管・ブラウザ表示とかたいへんやったけど金額1円も狂わず円グラフも描けるようになっていったん完成。
ミドルウェアのバージョンアップってたいへんだったのが、docker使うようになったら1日で動作確認まで行けるようになった。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
version: '3'
services:
sv_mariadb:
image: mariadb:10.5.7
hostname: svmariadb
ports:
- 3306:3306
env_file:
- ./nariDockerDat/env_sv_mariadb.txt
volumes:
- ./nariDockerDat/sv_mariadb:/var/lib/mysql
- ./nariDockerDat/sv_mariadbconf:/etc/mysql/conf.d
extra_hosts:
- gcp-gvis-dkLinux.intra.gavann-it.com:192.168.100.218
SVgitlab2022:
image: gitlab/gitlab-ce:14.6.3-ce.0
ports:
- 10881:80
volumes:
- ./nariDockerDat/sv_gitlab2022/config:/etc/gitlab
- ./nariDockerDat/sv_gitlab2022/logs:/var/log/gitlab
- ./nariDockerDat/sv_gitlab2022/data:/var/opt/gitlab
extra_hosts:
- gcp-gvis-dkLinux.intra.gavann-it.com:192.168.100.218
cl_ubu20:
image: ubu:20gvis
privileged: true
hostname: clubu20
user: "1000:1000"
ports:
- "30022:22"
- "33389:3389"
volumes:
- ./nariDockerDat/cl_ubun18:/gvis
environment:
- USER=nari
- PASSWD=hogehoge
tty: true
shm_size: 512m
extra_hosts:
- gcp-gvis-dklinux.intra.gavann-it.com:192.168.100.218
sv_https-portal:
image: steveltn/https-portal:1
ports:
- "40080:80"
- "40443:443"
environment:
DOMAINS: 'gcp-gvis-dklinux.intra.gavann-it.com -> http://svdjango:8080'
STAGE: 'local' # or 'production'
volumes:
- ./nariDockerDat/sv_django-ssl_certs:/var/lib/https-portal
depends_on:
- sv_django
extra_hosts:
- gcp-gvis-dklinux.intra.gavann-it.com:192.168.100.218
sv_django:
image: sv_django:4
build: ./nariDockerDat/sv_django-uwsgi-nginx
hostname: svdjango
volumes:
- ./nariDockerDat/sv_django-uwsgi-nginx/app:/code/app
ports:
- "48080:8080"
depends_on:
- sv_mariadb
extra_hosts:
- gcp-gvis-dklinux.intra.gavann-it.com:192.168.100.218
|
本番環境とテスト環境の切り替え#
コンテナ起動にはdocker-compose使うけど、本番とテスト環境ではコンテナ起動の直前でcssとsetting.pyにあるDB向き先ファイルをひな形から上書きコピーして起動させるようにしてる。
こうすると本番とテスト環境で、ブラウザ表示の色合いとかDB接続先を変えられる。
Google Cloudの本番環境の場合#
コンテナ起動スクリプトはこんな感じ。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
## -------------------------------------------------------------------------
## Script Name :dockerStart.sh
## Created by : T.Naritomi
## on : 2019.08.07
## Updated by : 2022.03.04
## on :
## Parameters :
## Return Code : 0=Normal End
## Comments :
## -------------------------------------------------------------------------
## ---detail----------------------------------------------------------------
DOCKER_ROOT=/gvis/nari/nariDocs/Docker
DOCKER_CONF1=${DOCKER_ROOT}/nariDockerDat/sv_django-uwsgi-nginx/app/website
DOCKER_CONF2=${DOCKER_ROOT}/nariDockerDat/sv_django-uwsgi-nginx/app/website/static/admin
DOCKER_CONF3=${DOCKER_ROOT}/nariDockerDat/sv_django-uwsgi-nginx/app/templates
cd ${DOCKER_ROOT}
cp -p docker-compose-GVISweb.yml docker-compose.yml
cp -p ${DOCKER_CONF1}/settings-gcp-gvis-dklinux.py ${DOCKER_CONF1}/settings.py
rm -fR ${DOCKER_CONF2}/commonColor
cp -pR ${DOCKER_CONF2}/commonBlue ${DOCKER_CONF2}/commonColor
cp -p ${DOCKER_CONF3}/Header-gcp-gvis-dklinux.html ${DOCKER_CONF3}/Header.html
### cp -p docker-compose-DBMS.yml docker-compose.yml
### cp -p docker-compose-Client.yml docker-compose.yml
docker-compose up -d
exit
|
ローカルlinuxのテスト環境の場合#
コンテナ起動スクリプトはこんな感じ。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#!/bin/sh
## -------------------------------------------------------------------------
## Script Name :dockerStart.sh
## Created by : T.Naritomi
## on : 2019.08.07
## Updated by :
## on :
## Parameters :
## Return Code : 0=Normal End
## Comments :
## -------------------------------------------------------------------------
## ---detail----------------------------------------------------------------
DOCKER_ROOT=/docker
DOCKER_CONF1=${DOCKER_ROOT}/nariDockerDat/sv_django-uwsgi-nginx/app/website
DOCKER_CONF2=${DOCKER_ROOT}/nariDockerDat/sv_django-uwsgi-nginx/app/website/static/admin
DOCKER_CONF3=${DOCKER_ROOT}/nariDockerDat/sv_django-uwsgi-nginx/app/templates
cd ${DOCKER_ROOT}
cp -p docker-compose-current.yml docker-compose.yml
cp -p ${DOCKER_CONF1}/settings-nafslinux.py ${DOCKER_CONF1}/settings.py
rm -fR ${DOCKER_CONF2}/commonColor
cp -pR ${DOCKER_CONF2}/commonGreen ${DOCKER_CONF2}/commonColor
cp -p ${DOCKER_CONF3}/Header-nafslinux.html ${DOCKER_CONF3}/Header.html
/usr/local/bin/docker-compose up -d
exit
|
xrdpがubuntu18の場合#
ubuntu18はまだ慣れない。aptとapt-getの違いもわかってないぐらい。
centos7日本語環境をxrdpで使うためのdockerfileを作った後、「ubuntu18でも同じようなことできないかなぁ」と思ったら、dockerhubに公開されたものがあって、そのままdocker image作って使わせていただくことにした。
別途ビルド必要。shm_sizeってのを指定しておくとGUI環境でchromeなどのブラウザがクラッシュしなくなる。
これはcentos7をxrdpで使うときも同じ。
ubuntu20のイメージをdockerhubで発見して単発起動したら動いてくれたけど、安定してるかどうかまだテストしてないので切り替えてない。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
cl_ubu18:
image: ubu:18gvis
privileged: true
hostname: clubu18
user: "1000:1000"
ports:
- "10022:22"
- "13389:3389"
volumes:
- ./nariDockerDat/cl_ubun18:/gvis
environment:
- USER=nari
- PASSWD=hogehoge
tty: true
shm_size: 512m
|
その後、ubuntu20のxrdp&日本語環境が公開されてたので変更。
作者さんがubuntu22の作ってくれんかなぁ。
時間できたら自分でdockerfile書き換え挑戦して22にしよっかなぁ。
今ではここにvscode入れて業務ファイルとかdjango開発結果を、gitlabに入れてってる。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
cl_ubu20:
image: ubu:20gvis
privileged: true
hostname: clubu20
user: "1000:1000"
ports:
- "10022:22"
- "13389:3389"
volumes:
- ./nariDockerDat/cl_ubun18:/gvis
environment:
- USER=nari
- PASSWD=hogehoge
tty: true
shm_size: 512m
|
データベースにoracleを使う場合の追記#
業務でしかoracleは使わない。というか昔に比べるとoracle嫌いになった。
jenkinsで自動テストするときにDB必要になったので、oracle12/18/19をdockerコンテナとして動かす場面があったので書いた。
別途ビルド必要。
ハードウェアリソースたくさん必要なので、コンテナ起動するときは他のほぼ全部のコンテナ停止させてoracleだけ起動させておき、windows側からa5sqlとかsqldeveloperみたいなクライアントソフトを使ってsql試す。
oracle社が公開している手順での産物。データベースのライセンス料高価なのに、こんなのでホイホイ動いていいのか???
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
sv_ora12:
image: oracle/database:12.2.0.1-ee
container_name: ora12ee
hostname: svora12
ports:
- 11521:1521
- 15500:5500
- 15501:5501
volumes:
- ./nariDockerDat/sv_ora12/oradata:/opt/oracle/oradata
environment:
- ORACLE_PWD=oracle
- ORACLE_PDB=GVISORCL
- ORACLE_SID=ORCL
- TZ=Asia/Tokyo
sv_ora18:
image: oracle/database:18.3.0-ee
container_name: ora18ee
hostname: svora18
ports:
- 21521:1521
- 25500:5500
volumes:
- ./nariDockerDat/sv_ora18/oradata:/opt/oracle/oradata
environment:
- ORACLE_PWD=oracle
- ORACLE_PDB=GVISORCL
- ORACLE_SID=ORCL
- TZ=Asia/Tokyo
- NLS_LANG=Japanese_Japan.AL32UTF8
sv_ora19:
image: oracle/database:19.3.0-ee
container_name: ora19ee
hostname: svora19
ports:
- 31521:1521
- 35500:5500
- 35501:5501
volumes:
- ./nariDockerDat/sv_ora19/oradata:/opt/oracle/oradata
environment:
- ORACLE_PWD=oracle
- ORACLE_PDB=GVISORCL
- ORACLE_SID=ORCL
- TZ=Asia/Tokyo
- NLS_LANG=Japanese_Japan.AL32UTF8
|
oracleは毎年出すらしいからoracle22とか23とかあるんかもしれんけど、要るときしか使わん。
大昔にsolaris8のメディアを注文したら英語版のoracle8がついてて、intelマシンのsolaris作ったら即座にoracle8入れてDBの取り扱い勉強してた。
solaris入れるのは時間も手間もかかるし、oracleインストールするのも時間かかったのが、仮想マシンとdockerコンテナのおかげで小一時間で全部終わる。
oracleのコンテナ作るときのdockerfileを見ると、「あー、こんなコマンド打ってたなぁ」って思い出す。
dockerがあれば構築をスクリプト化できるから、動的にコンテナ作ってテストを自動化してくれるjenkinsと組み合わせると開発品質が上がりやすくなる。
ソースや文書管理のためのgitlabを入れる場合#
世間ではソースコードを管理するのにgitを使う場面が多い。
自分はソースだけでなく、日常の勤務締め文書や帳簿もgitlabに入れてる。
ある程度世代残したい場面には便利。
不要になったらmasterにマージしてブランチ削除すればいい。
gitlabはdockerfile書いてビルドせずともいきなり動かせる。
vscodeからこれ使うのにけっこう慣れてきたし、普段使いでもなくてはならないサービスの1つ。
けっこうバージョン上がってくし、履歴をそれほどたくさん残す必要もないから、毎年正月頃にコンテナとイメージを削除して作り直して使ってる。
1
2
3
4
5
6
7
8
9
10
|
SVgitlab2022:
image: gitlab/gitlab-ce:14.6.3-ce.0
ports:
- 10881:80
volumes:
- ./nariDockerDat/sv_gitlab2022/config:/etc/gitlab
- ./nariDockerDat/sv_gitlab2022/logs:/var/log/gitlab
- ./nariDockerDat/sv_gitlab2022/data:/var/opt/gitlab
extra_hosts:
- gcp-gvis-dkLinux.intra.gavann-it.com:192.168.100.218
|
jenkinsを入れる場合#
CI/CDツールと世間で言われる。jenkinsマスタ側。javaで動くのでのっそりしているが、linuxを舎弟にしてリモートでシェルを動かせてしまう。
windowsにもOpenSSHの機能を入れてssh経由で接続できるようにしたら、これもまた舎弟になってバッチ処理起動できてしまい、pipelineを上手に書いて並列処理と直列処理を設計したら、ちょっとしたジョブ管理が実現する。
便利だったが、ローカル自前環境がハードウェア障害になったときcrontabでシンプルに動かすほうが回復早かったので使わなくなった。
Google cloudはローカルPC環境に比べるとさらにのっそり動くのでjavaベースの仕組みなんて入れられない。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
### jenkinsを使ったビルドとテスト
### 参考URL
### https://knowledge.sakura.ad.jp/5293/
###
sv_jenkins-master:
image: jenkins/jenkins:2.190.4
hostname: svjenkins-mst
ports:
- 10081:8080
volumes:
- ./nariDockerDat/sv_jenkins_mst:/var/jenkins_home
environment:
- TZ=Asia/Tokyo
|
jenkins-slaveを入れる場合#
jenkinsマスタ側からlinuxやwindowsのスレーブを追加して舎弟にしてしまえるが、これはdockerコンテナでスレーブを作るときに使う。
「スケーラブルに使いたいわぁ」なんていうときには動的にコンテナ作れて嬉しいのかもしれないが、自分はスケーラブルを必要としないので1回動かして使わずじまい・・・。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
###
### jenkins / (use sshkey)
###
### 参考URL https://qiita.com/i_whammy_/items/84b71c56d70817803472
###
### jenkins-masterからssh接続させて利用
### SSH_PUBKEYの値は、jenkins-master側でssh-keygen -t rsa -C ""してからcat .ssh/id_rsa.pubした値そのままを貼り付け
sv_jenkins-sl1:
image: jenkinsci/ssh-slave
hostname: svjenkins-sl1
volumes:
- ./nariDockerDat/sv_jenkins_sl1:/var/jenkins_home
environment:
- TZ=Asia/Tokyo
- JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDgihGfo2gLA3SF6N1KuvHTDV67x5XmcfxpTPrdPYAa1pFlj1GFnOkbqHSSBeXcG2GsABcoRFFF1+9jCuydE05xgq/4IbThKrI2lna+zLMtKoICrTLDo0UWsdb4Mr67yqiyKhwf3alHneCil4NA26y9HiN1VpW7Wc2wxMSwbXS4Mnydei8mgpSBaJYfKp07iuZXY5HRoyeXhFCi6cegaW7LIMUER9Wn5PhO19u2fGCfmGnWD8wVbD6+bsftmtOTc1WBmg1JT0E92s880iHZJS7TEnuQkqgwNSixLtpaZNvWdKqa57Rn4YG0kvfv28DKKD0L9ZfkCLA8e1S6/KSytOx7
|
nexus3を入れる場合#
業務で必要に迫られて作った。例えば、javaのフレームワークをjarで配布させたいときにnexus3を使う。dockerhubを自家製で作るときに使えるのかもしれないが、必要に迫られなかったので使わず。
1
2
3
4
5
6
7
8
9
|
sv_nexus3:
image: sonatype/nexus3
hostname: svnexus3
ports:
- 10082:8081
volumes:
- ./nariDockerDat/sv_nexus3:/nexus-data
environment:
- TZ=Asia/Tokyo
|
ldapを入れる場合#
これも業務で必要に迫られて作った。ldapなんて自前ではほぼ使わない。active directoryのバックエンドにも使えるんだろうけど、windowsのバックエンド技術者にはなりたくないから深追いしない。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
ldap-server:
image: osixia/openldap:latest
restart: always
container_name: ldap-host
environment:
LDAP_ORGANISATION: "gvis"
LDAP_DOMAIN: "intra-gavann-it.com"
LDAP_ADMIN_PASSWORD: "hogehoge"
ports:
- "11389:389"
- "11636:636"
ldap-admin:
image: osixia/phpldapadmin:latest
restart: always
container_name: ldap-admin
environment:
PHPLDAPADMIN_LDAP_HOSTS: "ldap"
PHPLDAPADMIN_HTTPS: "false"
ports:
- "11801:80"
links:
- "ldap-server:ldap"
|
ldapsを入れる場合#
現在はubuntu22をホストOSに使っている。
以前からホストOSに使ってたcent8redhatクローンは、2020年からコンテナ利用に格下げ。
ついでにldapsの接続確認にも利用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
sv_ldap-server:
image: osixia/openldap:latest
container_name: svldap-server
environment:
LDAP_ORGANISATION: "gvis"
LDAP_DOMAIN: "intra-gavann-it.com"
LDAP_ADMIN_PASSWORD: "hogehoge"
LDAP_TLS_VERIFY_CLIENT: "never"
ports:
- "11389:389"
- "11636:636"
depends_on:
- "sv_mariadb"
### 参考URL https://github.com/osixia/docker-phpLDAPadmin
###
### httpsを使うときは、証明書が自動作成されているので取得してクライアント側に設定すること
### コンテナ内の保管先:/container/service/slapd/assets/certs
###
### 参考URL https://github.com/osixia/docker-openldap#use-your-own-certificate
sv_ldap-admin:
image: osixia/phpldapadmin:latest
container_name: svldap-admin
environment:
PHPLDAPADMIN_LDAP_HOSTS: "ldap-host"
ports:
- "11801:80"
- "11802:443"
depends_on:
- "sv_ldap-server"
links:
- sv_ldap-server:ldap-host
cl_red8:
image: redhat:8gvis
privileged: true
hostname: clred8
build:
context: ./nariDockerDat
dockerfile: cl_red8_Dockerfile
ports:
- "21022:22"
volumes:
- ./nariDockerDat/cl_red8:/gvis
cl_red9:
image: redhat:9gvis
privileged: true
hostname: clred9
build:
context: ./nariDockerDat
dockerfile: cl_red9_Dockerfile
ports:
- "22022:22"
volumes:
- ./nariDockerDat/cl_red9:/gvis
|
docker-composeのコマンドライン#
docker-compose.ymlに書いたコンテナを全部起動させるとき。
バックエンドで動かすときは-dをつける。
docker-compose up
docker-compose.ymlに書いたコンテナを全部停止するとき。
docker-compose stop
ときどき慌てることがあって、stopをdownって書いてしまい、コンテナが消失してまう・・・。
そういう事故を防ぐためにもdocker-composeを直接入力して使うのはあまりやらない。
状態確認#
状態を見るとき。
ctrl+cで表示終わらせる。
docker stats
けっこう横に長いからこんなふうに表示される。
なぜかCPUが120%とか表示されることがあった。
どういう状態なんかな。
1
2
3
4
5
6
7
8
9
10
11
|
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
d62c336ba09b docker-cl_ubu20-1 0.04% 28.88MiB / 15.6GiB 0.18% 27.3kB / 0B 136MB / 200kB 4
58f53a86028b svldap-admin 0.04% 61.78MiB / 15.6GiB 0.39% 27.2kB / 0B 249MB / 1.32MB 139
59b89675f01d svldap-server 0.00% 24.05MiB / 15.6GiB 0.15% 111kB / 115kB 123MB / 968kB 5
ccb831dddadf docker-cl_red8-1 0.05% 132.8MiB / 15.6GiB 0.83% 161kB / 73.8kB 598MB / 132MB 18
037dd3cee854 docker-cl_red9-1 0.00% 131.4MiB / 15.6GiB 0.82% 179kB / 104kB 498MB / 94.1MB 18
6ee57e703303 docker-sv_django-1 0.02% 96.86MiB / 15.6GiB 0.61% 17.5MB / 88.8kB 204MB / 49.2kB 11
6dd167d84d92 docker-sv_https-portal-1 0.02% 15.17MiB / 15.6GiB 0.09% 27.2kB / 0B 76.5MB / 627kB 14
e4ebf1400171 docker-sv_web118-1 0.00% 5.711MiB / 15.6GiB 0.04% 27.3kB / 0B 28.9MB / 12.3kB 5
5890d5d9f01d docker-sv_php74-1 0.01% 7.469MiB / 15.6GiB 0.05% 27.4kB / 0B 101MB / 4.1kB 3
6830b5a8c2e5 docker-sv_mariadb-1 0.07% 1.495GiB / 15.6GiB 9.58% 55.7kB / 17.4MB 1.48GB / 2.17MB 11
|
ログ表示#
gitlabなんか動かすと大量にログが表示される。
新規でコンテナ動かすときとか、たまーにしか見んけど。
docker logs -f (コンテナ名)