はじめまして!インフラSEの宮本(@miyamon_ky)です。今回初めてDockerを触ってみたので記事にしてみました。コンテナ初心者の方にも読んでいただけるように意識して書いてみました。まずは自己紹介させてください!
- 自己紹介
Dockerとは
従来の仮想化技術との比較
- イメージ
- Dockerfile
既存のイメージに機能を積み重ねるためのテキストファイルです。Dockerイメージの設計図の役割を果たします。dockerhubで公開されているイメージではインストールされているコマンドが足りない事があるのでDockerfileで自分好みにカスタマイズさせていきます。
- Docker Compose
複数のコンテナを効率的に操作するためのDockerに対する指示書の役割を果たします。compose.ymlというファイルが実際の指示書になるのですが、ここで利用するDockerfileやコンテナ名、NWを定義していきます。
Dockerをローカル環境にインストール
- 環境
- PC:windows 11
- Docker Desktop:4.33.1
- Terminal:VScodeのGit bash
- Docker for windowsをインストール
https://docs.docker.com/desktop/windows/install/
- バージョン確認
以下でdocker versionというコマンドでdockerがインストールされていることと、どのバージョンをインストールしたのか確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ docker version Client: Version: 27.1.1 API version: 1.46 Go version: go1.21.12 Git commit: 6312585 Built: Tue Jul 23 19:57:57 2024 OS/Arch: windows/amd64 Context: desktop-linux Server: Docker Desktop 4.33.1 (161083) Engine: Version: 27.1.1 API version: 1.46 (minimum version 1.24) Go version: go1.21.12 Git commit: cc13f95 Built: Tue Jul 23 19:57:19 2024 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.7.19 GitCommit: 2bf793ef6dc9a18e00cb12efb64355c2c9d5eb41 |
簡単にDockerでNginxのコンテナを構築
実際に何かを構築するのが一番理解が深まるのでNginxを構築してみました。Dockerはディレクトリ構成が重要です。今回の構築のディレクトリ構成は以下としました。
1 2 3 4 5 |
├─docker-test ├─docker-compose.yml │ └─nginx ├─Dockerfile |
<ディレクトリ構成解説>
- docker-testというディレクトリ配下に
- docker-compose.ymlファイルを作成
- nginxディレクトリを作成
- nginxディレクトリ配下に
- Dockerfileを作成
-
Dockerfileの中身は以下とします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
FROM nginx:1.25.3-alpine3.18 # timezone setting RUN apk --update add tzdata && \ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \ apk del tzdata && \ rm -rf /var/cache/apk/* # install packages RUN apk update && \ apk upgrade && \ apk add --update --no-cache \ bash \ nginx \ sudo \ tzdata \ vim EXPOSE 80< |
<ファイル構成解説>
-
- FROM
- Dockerhubで探したイメージを指定しています。
- RUN
- コンテナ内で実行されるコマンドを書いています。
- EXPOSE
- 公開するコンテナのポートを指定しています。(httpでアクセスできるよう80を指定)
- FROM
1 2 3 4 5 6 7 |
services: nginx: container_name: nginx build: ./nginx/ image: nginx ports: - '80:80' |
<ファイル構成解説>
-
- services
- Docker-Composeでは、アプリケーションを動かすための各要素をServiceと読んでいます。
- 今回nginxというサービス(コンテナ)を1つ構築する為、servicesの中にnginx:を入れ子にしています。
- container_name
- コンテナ名を定義しています。
- build
- 参照させたいDockerfileのあるディレクトリを指定しています。
- 今回はnginx配下のDockerfileを利用したい為./nginx/を指定しています。
- image
- イメージ名を指定しています。
- 実際のイメージの指定はDockerfileで指定しているので、ここでは名前だけを定義しています。
- ports
- ローカルとコンテナのポートマッピングを定義しています。
- 今回はローカルPCの80とコンテナポート80をマッピングさせています。
- services
- イメージをbuild
1 2 |
$ docker-compose build <Log省略> => [nginx] exporting to image |
- buildしたイメージを使用してコンテナを起動
コンテナをデプロイするにはdocker-compose upコマンドを利用します。-dオプションを付け加えることでバックグラウンドでコンテナを起動してくれるので、続けてターミナル上から操作できます。
1 2 3 4 |
$ docker-compose up -d [+] Running 2/2 ✔ Network docker-test_default Created 0.1s ✔ Container nginx Started |
- コンテナが起動されているか確認
1 2 3 |
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ed3f047398ea nginx "/docker-entrypoint.…" 33 minutes ago Up 33 minutes 0.0.0.0:80->80/tcp nginx |
- コンテナにログイン
起動したコンテナにログインするにはdocker exec コマンドを利用します。[docker exec -it <コンテナ名> bash]が書式となり、Dockerfileで私はnginxとコンテナ名を定義したので-itの後はnginxとしています。-itのオプションは-i(interactive)と-t(tty)を組み合わせたものでコンテナ内で対話的なシェルを使えるようになります。
1 2 |
$ docker exec -it nginx bash ed3f047398ea:/# |
- 構築したNginxに実際にブラウザからアクセス
Nginxはwebサーバなのでブラウザからもアクセステストをします。今回はconfファイルをオリジナルで作成していないので、アクセス成功すればデフォルトの画面が表示されます。今回80ポートを解放して、ローカルポート80とコンテナポート80をマッピングさせているのでhttpでアクセスします。hostsで名前解決の設定をしていなければドメインはlocalhostでアクセス出来ます。
http://localhost
まとめ
たしかに事前に調べていた通り、docker-compose upした後の起動が高速に感じました。またローカル環境に依存することなくDockerをインストールしていれば、今回用意したDockerfileとdocker-compose.ymlがあることで、どの環境でも同じ開発環境を構築出来るということが大きなメリットのように思います。今回は基本機能しか検証していませんが、現在並行して応用したKubenetesにもチャレンジしているので、そちらも記事に出来ればと思います。
以上ありがとうございました!
1994年生まれで2020年末に未経験からインフラ系SIerにキャリアチェンジし、SE歴が4年目に突入。ネットワーク機器やセキュリティ系SaaSの商材をメインにプリセールしつつ、設計構築も担当。プラットフォーム、クラウド系の技術に興味を持ち、TechBullコミュニティへ参画。