ググるとquitaで即解説してくれてるわかりやすい内容あるけど、必要な箇所は日本語ドキュメントを読む。
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を覚え始めた頃は、まだ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日で動作確認まで行けるようになった。
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の本番環境の場合
コンテナ起動スクリプトはこんな感じ。
## ------------------------------------------------------------------------- ## 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のテスト環境の場合
コンテナ起動スクリプトはこんな感じ。
#!/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で発見して単発起動したら動いてくれたけど、安定してるかどうかまだテストしてないので切り替えてない。
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に入れてってる。
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社が公開している手順での産物。データベースのライセンス料高価なのに、こんなのでホイホイ動いていいのか???
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つ。
けっこうバージョン上がってくし、履歴をそれほどたくさん残す必要もないから、毎年正月頃にコンテナとイメージを削除して作り直して使ってる。
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ベースの仕組みなんて入れられない。
### 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回動かして使わずじまい・・・。
### ### 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を自家製で作るときに使えるのかもしれないが、必要に迫られなかったので使わず。
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のバックエンド技術者にはなりたくないから深追いしない。
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の接続確認にも利用。
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%とか表示されることがあった。
どういう状態なんかな。
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 (コンテナ名)