はじめに
Docker の OSX への導入からコンテナ起動までを見ていきます。
Docker のインストール
DockerHub からインストーラをダウンロードすることもできますが、Homebrew での導入が楽です。DockerHub アカウントの取得も不要です。
Homebrew をアップデートしておきましょう。
$ brew update $ brew -v Homebrew 2.1.14 Homebrew/homebrew-core (git revision 2f327; last commit 2019-10-15) Homebrew/homebrew-cask (git revision 9c73f; last commit 2019-10-15)
docker を検索します。
$ brew search docker ==> Formulae docker docker-credential-helper docker-clean docker-credential-helper-ecr ... ==> Casks docker docker-edge docker-toolbox ...
GUI 関連を含むCasks 側の docker
を使いましょう。
内容を確認してみます。
$ brew cask info docker docker: 2.1.0.3,38240 (auto_updates) https://www.docker.com/community-edition Not installed From: https://github.com/Homebrew/homebrew-cask/blob/master/Casks/docker.rb ==> Names Docker Community Edition Docker CE ==> Artifacts Docker.app (App)
Community Edition です。
インストールしましょう。
$ brew cask install docker Updating Homebrew... ==> Auto-updated Homebrew! Updated 1 tap (homebrew/core). No changes to formulae. ==> Satisfying dependencies ==> Downloading https://download.docker.com/mac/stable/38240/Docker.dmg ######################################################################## 100.0% ==> Verifying SHA-256 checksum for Cask 'docker'. ==> Installing Cask docker ==> Moving App 'Docker.app' to '/Applications/Docker.app'. 🍺 docker was successfully installed!
インストールが完了しました。
Docker の起動
アプリケーションディレクトリに Docker.app としてインストールされます。
起動しましょう。
$ open /Applications/Docker.app
起動には少し時間がかかります。
緑になれば起動完了です。
Docker Hub のアカウントがあればここからログインすることができます。
Docker Hub に Push したりしなければログインする必要はありません。
バージョンは以下のようになります。
これで導入は完了です。
コンテナの起動
Nginx をコンテナで動かして見ましょう。
以下のようにするだけです。
$ docker run --name ws-nginx -d -p 8080:80 nginx
ブラウザで http://localhost:8080
にアクセスすれば Nginx の起動が確認できます。
先程の docker run
コマンドは以下を合わせて行います。
- (イメージが存在しない場合)Docker Hub から nginx のイメージを取得(
docker pull
) - 取得したイメージからコンテナを作成(
docker create
) - コンテナを起動(
docker start
)
それぞれ個別のコマンドに置き換えた場合は以下のようになります。
Docker Hub から nginx のイメージを取得
$ docker pull nginx
Docker Hub から nginx という名前のイメージを取得します。
取得したイメージから ws-nginx という名前でコンテナを作成
$ docker create --name ws-nginx -p 8080:80 nginx
ローカルのイメージ nginx から ws-nginx という名前でコンテナを作成します。
-p 8080:80
でホストマシンの8080ポートをコンテナの80ポートにバインドしています。
create で作成したコンテナは stop 状態になっています。
作成したコンテナを起動
$ docker start ws-nginx
作成した stop状態のコンテナを起動します。
ベースとなるイメージからコンテナを作成し、コンテナをDockerホスト上のプロセスで動かすことで仮想環境が実現されます。
ここではイメージを Docker Hub から取得して直接利用しましたが、Dockerfile でイメージの構築手順を定義することで独自のイメージを作成することができます。
コンテナの操作
コンテナの操作方法を簡単に見ていきます。
動いているコンテナの一覧
起動しているコンテナを一覧するには ps
を使用します。
$ docker ps
先程起動したコンテナは以下のように見えます。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37049268dde1 nginx nginx -g 'daemon of…" About an hour ago Up 5 seconds 0.0.0.0:8080->80/tcp ws-nginx
コンテナの停止
コンテナは stop
で停止します。
$ docker stop ws-nginx
停止しているコンテナを含めて一覧
ps
は起動しているコンテナしか見えません。
停止しているコンテナも含めて一覧するには -a
オプションを指定します。
$ docker ps -a
ps -a
で先程停止したコンテナを見ると以下のようになります。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37049268dde1 nginx "nginx -g 'daemon of…" About an hour ago Exited (0) 37 seconds ago ws-nginx
ステータスが Exited
になっています。
停止しているコンテナは start
で再度起動できます。
コンテナの削除
コンテナはコンテナ名(またはコンテナID)を指定して rm
で削除できます。
$ docker rm ws-nginx
イメージの一覧
ローカルに存在するイメージは以下で一覧できます。
$ docker images
以下のような一覧が得られます。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest f949e7d76d63 3 weeks ago 126MB
イメージの削除
イメージはイメージ名(またはイメージID)を指定して rmi
で削除できます。
$ docker rmi nginx
コンテナが存在する場合は -f
で強制削除できます(コンテナは残ります)。
Dockerfile からイメージ作成
先ほどは Docker Hub からイメージを取得しましたが、イメージは自分で作成することもできます。
イメージは Dockerfile に 元にするベースイメージを指定し、コードにて環境構築手順を記載して作成します。
ここでは Nginx のイメージを作成してみます。
Nginx の設定ファイルの準備
最初に Nginx の設定ファイルを作成しましょう。
$ mkdir nginx $ cd nginx $ touch default.conf
default.conf
を以下のように編集します。
server { listen 8080; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
Dockerfile の作成
Dockerfile を作成していきます。
$ touch Dockerfile
Dockerfile
を以下のように編集します。
FROM nginx:alpine COPY ./default.conf /etc/nginx/conf.d/ EXPOSE 8080 CMD ["nginx", "-g", "daemon off;"]
FROM
にてこのイメージのベースとなるイメージを指定COPY
にてローカルに準備したdefault.conf
をイメージにコピーEXPOSE
にてコンテナが公開するポートを指定CMD
にてコンテナ起動時に実行するコマンドを指定
Dockerfile のビルド
作成した Dockerfile をビルドします(カレントディレクトリで実行します)。
$ docker build . -t alpine_nginx
-t
にてリポジトリ名を指定しています。
ビルドが終了したら、作成されたイメージを確認してみましょう。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE alpine_nginx latest ae116f14a6d3 20 seconds ago 21.2MB
イメージが作成されています。
イメージの実行
先ほどと同様に docker run
してみましょう。
$ docker run --name alpine_nginx -d -p 80:8080 alpine_nginx
Nginx が動いていますね。
作成されたコンテナを削除しておきます。
$ docker stop alpine_nginx $ docker rm alpine_nginx
Docker Compose
アプリケーションサーバやデータベースサーバなど各種のコンテナを起動する場合、都度 docker run
するのは大変です。
その場合、docker-compose
を利用することで、イメージのビルドやコンテナの起動を1コマンドで実行できるようになります。
docker-compose
は YAML 形式でコマンドやオプションを指定します。早速作ってみましょう。
docker-compose.yml の作成
docker-compose.yml
を作成します。
$ touch docker-compose.yml
docker-compose.yml
を以下のように編集します。
version: '3' services: nginx: image: alpine_nginx ports: - "80:8080" volumes: - ./public:/usr/share/nginx/html
image
で先ほど作成したイメージ(alpine_nginx)を指定build: .
とすることで Dockerfile をビルドすることも可能volumes
でホスト側のpublic
ディレクトリをコンテナの/usr/share/nginx/html
にマウント
マウント元となる public
ディレクトリの中に HTML を作成しておきます。
$ mkdir public $ cat <<EOF > public/index.html <!DOCTYPE html> <html> <body> <h1>Hello docker-compose</h1> </body> </html> EOF
docker-compose up
docker-compose.yml
を動かすには以下のようにします。
$ docker-compose up
http://localhost
にアクセスします。
コンテナが起動し、ホスト側に用意したHTMLが表示されました。
Ctrl + C
で停止し、コンテナとイメージを削除しておきましょう(docker-compose で -d
指定した場合は docker-compose stop
とします)。
docker-compose ps
でプロセスを確認することができます(docker ps
でも見れます)。
$ docker-compose ps Name Command State Ports ------------------------------------------------------- nginx_nginx_1 nginx -g daemon off; Exit 137
コンテナとイメージを削除します。
$ docker rm nginx_nginx_1 $ docker rmi alpine_nginx
まとめ
Docker のインストールからコンテナ操作、Dockerfile からのイメージビルド、Docker Compose による Docker コマンドの自動化までを見ました。
次回は、Webアプリケーションサーバとデータベースサーバの環境構築の実例を見ていきたいと思います。
- 作者:吉岡 恒夫
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/05/30
- メディア: Kindle版
Docker実践入門――Linuxコンテナ技術の基礎から応用まで (Software Design plus)
- 作者:中井 悦司
- 出版社/メーカー: 技術評論社
- 発売日: 2015/09/26
- メディア: 大型本
Kubernetes完全ガイド (impress top gear)
- 作者:青山 真也
- 出版社/メーカー: インプレス
- 発売日: 2018/09/21
- メディア: 単行本(ソフトカバー)