dockerを使う
dockerはコンピュータの仮想環境を提供します。ときに複数のアプリケーションソフトが互いに異なる環境を要求するようなことがあります。そういったときに、dockerを使うと別々の環境を与えることができます。
dockerのインストール
CentOS 7ではyumでインストールすることができます。
# yum install docker # systemctl enable docker # systemctl start docker # systemctl docker
dockerイメージのダウンロード
dockerのイメージファイルをダウンロードします。イメージファイルはdockerが提供する仮想環境に必要なファイルがまとまったものです。様々なものが提供されているので、目的に合ったものをダウンロードします。
# docker search wordpress # wordpressを含むイメージを検索 INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/wordpress The WordPress rich content management syst... 4379 [OK] docker.io docker.io/appcontainers/wordpress Centos/Debian Based Customizable WordPress... 34 [OK] docker.io docker.io/aveltens/wordpress-backup Easily backup and restore your WordPress b... 24 [OK] (途中省略) # docker pull docker.io/wordpress # 検索結果に表示されたイメージをダウンロードする Using default tag: latest Trying to pull repository docker.io/library/wordpress ... latest: Pulling from docker.io/library/wordpress bd897bb914af: Pull complete # wordpressのイメージが重ねられているイメージをダウンロードしている 9c29eb0e4b79: Pull complete (途中省略) Digest: sha256:e9481c2b58abf7aeb893c65c2112f3aa06576572ff19b5e2d10a4e0b9527ed06 Status: Downloaded newer image for docker.io/wordpress:latest
dockerのイメージはそれぞれ単独で作られているのではなく、複数のイメージの上に重ねられています。例えばWordPressを使うのであればPHPが必要で、それはウェブサーバー(apache)とともに動き、OS(Linux)を必要とします。透明なシートを想像し、それにLinux、apache、PHP、WordPressと書かれていたとして、これらを重ねて動かしている感じです。
docker pullをすると指定したイメージを使用するために必要な別のイメージをダウンロードします。
dockerのコンテナの作成・起動
dockerのつくる仮想環境内で動かしたいソフトによって起動方法が異なります。
WordPressの場合
WordPressの実体はPHPのスクリプトで、それを動かしているのはウェブサーバーのapacheです。ウェブサーバーは特定のポートでリクエストが来るのを構えているので、常時動いている必要があります。なのでイメージを動かすときには-d|–detachオプションを付けます。
# docker run -d docker.io/wordpress # 実際にはホストのポートとくっつけたり、データベースサーバーと接続する必要があるのでこれではWordPressは動かない # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4ca58c4dd41e docker.io/wordpress "docker-entrypoint..." About a minute ago Up 27 seconds 80/tcp quizzical_lewin # docker stop quizzical_lewin # コンテナを停止する # docker ps -a # 停止中のコンテナは-aをつけないと見えない CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4ca58c4dd41e docker.io/wordpress "docker-entrypoint..." 13 seconds ago Exited (0) 7 seconds ago quizzical_lewin # docker start quizzical_lewin # 作成済みのコンテナを起動する。
コンテナが不要になったら、docker stopして、docker rm で削除します。
コンテナの中を見たくなったら、docker psでSTATUSがUpであることを確認して、docker exec -it /bin/bash とします。こうするとコンテナの中を見ることができます。コンテナから出る(bashを終了する)にはexitと入力します。WordPressの設定ファイルなどを見ることができますが、viも入っていないのでファイルの編集は難しいでしょう。
R (bioconductor)の場合
bioconductorを動かしたいけれどもいろいろと依存関係を解消してインストールするのが難しいときにはdockerを利用するといいです。docker search bioconductorで調べてみると、docker.io/bioconductor/bioconductor_dockerが見つかるのでこれをpullして使ってみます。
bioconductorのイメージはキーボードからの入力とディスプレイへの出力が前提です。しかし、コンテナ内で動くRからは標準入出力が見えず、Rを操作できません(やむを得ずCtrl + CでR(コンテナ?)を終了することになります)。Rとキーボードとディスプレイをつなげるために -i|–interactive オプションを付けます。
# docker pull docker.io/bioconductor/bioconductor_docker # docker run -i docker.io/bioconductor/bioconductor_docker R # 最後のRはRを起動している。 R version 4.0.3 (2020-10-10) -- "Bunny-Wunnies Freak Out" (途中省略) > q() # Rのプロンプト。qはRを終了する関数。 # docker ps -a # コンテナがExitedになっている。 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6291c30c210a docker.io/bioconductor/bioconductor_docker "R" 6 minutes ago Exited (0) 18 seconds ago stoic_euclid
最後にq()を実行することで、Rが終了し、コンテナもExitedになります。このコンテナを使うにはdocker startに-a -i オプションを付けます。
# docker start -a -i stoic_euclid R version 4.0.3 (2020-10-10) -- "Bunny-Wunnies Freak Out" (途中省略) > q() # Rのプロンプト。qはRを終了する関数。
bioconductorのパッケージをインストールしようとしたとき、libssl-devが足りないと言われました。コンテナ内にLinuxのパッケージを入れる必要があるときは、execを使ってコマンドを実行します。
# docker exec stoic_euclid apt-get update # コンテナstoic_euclidがExitedなら、この前にdocker start stoic_euclid でUpにしておく。 # docker exec stoic_euclid apt-get -y install libssl-dev # パッケージをインストール。-yを付けないとインストールの可否を聞かれて止まる。docker execに対して-iオプションを付けてもよい。 # docker stop stoic_euclid # またはdocker attach stoic_euclid で接続後、q()で終了。
イメージの動きを調べる
# docker inspect docker.io/wordpress
イメージの設定がJSON形式で出力されます。