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形式で出力されます。