docker-composeについて

docker-compose日本語ドキュメント

  • docker-composeのインストール

インストール方法はいろいろ。
yumやdnf, aptなどパッケージ管理ツールで入れたりcurlやwgetで特定のバージョンを取得して入れる(いろいろやったのでyumやdnf使ってないかも)。
大事なのは、利用OSのバージョンがどのdocker-composeを使えるのか調べてから導入すること。
見放されているバージョンもあるので注意。

けれどcentos8が公開された直後、dockerもdocker-composeもサポート範囲外だったが、無理して入れたら入って使えた。

  • docker-compose.ymlのサンプル

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とお別れする日が来るかもしれない。

  • xrdp/web+php/dbを起動して使うとき

普段はコレを使う。Google Cloudでインスタンス上げてこの内容を使う。xrdp経由でphpのページを使っていて事前にdocker imageをビルドしておく必要がある。ローカルPCのlinux上に同じdocker-compose.ymlを展開しておいて、mariadbのデータフォルダを丸々tar&zipしてGoogle Cloudから持ってきたら、同じDB内容をローカルでも使える。本番環境とテスト環境みたいな感じ。phpやmariadbのバージョン上げたかったら、ローカルPCで練習してDockerfileとdocker-compose.ymlを作っておき、うまく動いたらそのファイルをGoogle Cloudに持って行って動かす。ミドルウェアのバージョンアップってたいへんだったけど、docker使うようになったら1日で動作確認まで行けるようになった。

version: '3'

services:

  cl_cent7:
    image: centos:7gvis
    privileged: true
    hostname: clcent7
    build: 
      context: ./nariDockerDat
      dockerfile: cl_cent7_Dockerfile
    ports:
      - "20022:22"
      - "23389:3389"
    volumes:
      - ./nariDockerDat/cl_cent7:/gvis
    shm_size: 512m


  sv_web118:
    image: nginx:1.18.0-alpine
    hostname: svweb118
    ports:
      - 20080:80

    depends_on:
      - sv_php74
      - sv_mariadb

    volumes:
      - ./nariDockerDat/sv_webconf-log/default.conf:/etc/nginx/conf.d/default.conf
      - ./nariDockerDat/sv_webconf-log/log/nginx-access.log:/var/log/nginx/access.log
      - ./nariDockerDat/sv_webconf-log/log/nginx-error.log:/var/log/nginx/error.log
      - ./nariDockerDat/sv_web/gvis-php7/apl/html:/var/www/html
    environment:
      - TZ=Asia/Tokyo

  sv_php74:
    build: 
      context: ./nariDockerDat
      dockerfile: sv_php-imag_Dockerfile74
    volumes:
      - ./nariDockerDat/sv_webconf-log/php.ini:/usr/local/etc/php/php.ini
      - ./nariDockerDat/sv_webconf-log/log/php_errors.log:/var/log/php_errors.log
      - ./nariDockerDat/sv_web/gvis-php7/apl/html:/var/www/html
      - ./nariDockerDat/sv_web/gvis-php7/ipa-pgothic:/usr/share/fonts/ipa-pgothic
    environment:
      - TZ=Asia/Tokyo

  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
  • 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
  • データベースにoracleを入れる場合の追記

業務でしかoracleは使わない。というか昔に比べるとoracle嫌いになった。jenkinsで自動テストするときにDB必要になったので、oracle12/18/19をdockerコンテナとして動かす場面があったので書いた。別途ビルド必要。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
  • ソースや文書管理のためのgitlabを入れる場合

世間ではソースコードを管理するのにgitを使う場面が多い。自分はソースだけでなく、日常の勤務締め文書や帳簿もgitlabに入れている。ある程度世代残したい場面には便利。不要になったらmasterにマージすればいい。gitlabはdockerfile書いてビルドせずともいきなり動かせる。

  sv_gitlab:
    image: gitlab/gitlab-ce:latest
    ### image: gitlab/gitlab-ce:12.1.4-ce.0
    hostname: svgitlab
    ports:
      - "10080:80"
      - "10443:443"
    volumes:
      - ./nariDockerDat/sv_gitlab/config:/etc/gitlab
      - ./nariDockerDat/sv_gitlab/logs:/var/log/gitlab
      - ./nariDockerDat/sv_gitlab/data:/var/opt/gitlab
    environment:
      - TZ=Asia/Tokyo
  • 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
  • docker-composeのコマンドライン

docker-compose.ymlに書いたコンテナを全部起動させるとき

docker-compose up

docker-compose.ymlに書いたコンテナを全部停止するとき

docker-compose stop

コメント