docker-composeについて

ググると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日で動作確認まで行けるようになった。

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

ときどき慌てることがあって、stopdownって書いてしまい、コンテナが消失してまう・・・。

そういう事故を防ぐためにも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 (コンテナ名)
タイトルとURLをコピーしました