Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KC3 2024 Dockerで始める自宅サーバー入門

rokuosan
September 07, 2024

KC3 2024 Dockerで始める自宅サーバー入門

KC3 2024 学生勉強会で使用したスライド

rokuosan

September 07, 2024
Tweet

More Decks by rokuosan

Other Decks in Technology

Transcript

  1. 自己紹介 松本紘輝 Matsumoto Kouki 京都産業大学 情報理工学部 「あまてく」から来ました Kotlin, Go, Perl

    をよく書きます https://github.com/rokuosan https://twitter.com/rokuosan_dev 現実のすがた
  2. 自己紹介 松本紘輝 Matsumoto Kouki 京都産業大学 情報理工学部 「あまてく」から来ました Kotlin, Go, Perl

    をよく書きます https://github.com/rokuosan https://twitter.com/rokuosan_dev インターネットのすがた
  3. なぜ Docker を使うのか 仮想化でもVMよりコンテナの方が省リソース 物理マシン ホストOS 仮想化ソフトウェア ゲストOS ミドルウェア アプリ

    ゲストOS ミドルウェア アプリ 物理マシン ホストOS Docker ミドルウェア アプリ ミドルウェア アプリ 仮想マシン コンテナ(Dockerの例) VM 1 VM 2 コンテナ 1 コンテナ 2
  4. Linux サーバーにDocker を入れる ↓ compose.yamlを書く ↓ “docker compose up -d”を実行

    Docker での自宅サーバー運営 3ステップだけ!とっても簡単!!
  5. Dockerの基本 docker version $ docker version CloudClient: integration: v1.0.35+desktop.13 Version:

    26.0.0 API version: 1.45 Go version: go1.21.8 Git commit: 2ae903e Built: Wed Mar 20 15:14:46 2024 OS/Arch: darwin/arm64 Context: desktop-linux Server: Docker Desktop 4.29.0 (145265) Engine: Version: 26.0.0 API version: 1.45 (minimum version 1.24) Go version: go1.21.8 Git commit: 8b79278 Built: Wed Mar 20 15:18:02 2024 OS/Arch: linux/arm64 Experimental: false containerd: Version: 1.6.28 GitCommit: ae07eda36dd25f8a1b98dfbf587313b99c0190bb runc: Version: 1.1.12 GitCommit: v1.1.12-0-g51d5e94 docker-init: Version: 0.19.0 GitCommit: de40ad0 Docker のクライアントとサーバーのバージョンと 各種情報を確認できるコマンド
  6. Dockerの基本 docker run $ docker run "docker run" requires at

    least 1 argument. See 'docker run --help'. Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Create and run a new container from an image このコマンドの後に続くイメージとオプションで コンテナを起動します。手元にないイメージは レジストリから取得されます。 docker run は docker container run のエイリアス 正しい方は長いので docker run とよく書きます $ docker container run "docker container run" requires at least 1 argument. See 'docker container run --help'. Usage: docker container run [OPTIONS] IMAGE [COMMAND] [ARG...] Create and run a new container from an image docker container run
  7. リポジトリの構造 リポジトリの構造 tree -L 2 . ├── 01-hello-world │ └──

    README.md ├── 02-nginx │ └── README.md ├── 03-nginx-custom │ ├── README.md │ ├── answer.md │ ├── config │ ├── data │ └── secret ├── 04-compose │ ├── README.md │ └── compose.yaml ├── 05-dockerfile │ ├── README.md │ ├── backend │ ├── compose.yaml │ └── database ├── 06-minecraft │ ├── README.md │ ├── compose.yaml │ └── data ├── LICENSE └── README.md 13 directories, 12 files 数字から始まるのがハンズオンのステップです。 非表示の「.devcontainer」のファイルもあります。 devcontainer を使える人は再現性のためにも 利用してくれると助かります!
  8. ステップ 01・Hello World してみよう # Hello World イメージからコンテナを起動する $ docker

    run --rm hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (arm64v8) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
  9. ステップ 01・Hello World してみよう # Ubuntu を起動してみる $ docker run

    --rm –it ubuntu:latest /bin/bash # コンテナの中でos-releaseを確認してみよう root@76993e1de13f:/# cat /etc/os-release PRETTY_NAME="Ubuntu 24.04 LTS" NAME="Ubuntu" VERSION_ID="24.04" VERSION="24.04 LTS (Noble Numbat)" VERSION_CODENAME=noble ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=noble LOGO=ubuntu-logo
  10. ステップ 01・「--rm」オプション # Ubuntu をそのまま起動する $ docker run ubuntu:latest /bin/bash

    # 応答が返ってこない # 停止中を含めたすべてのコンテナを表示 → さっきのコンテナだ! $ docker ps –a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e4876f3b4d22 ubuntu:latest "/bin/bash" 2 seconds ago Exited (0) 2 seconds ago wizardly_rhodes # そのコンテナを削除する $ docker rm e4876f3b4d22 # --rm オプションをつけてみる $ docker run –-rm ubuntu:latest /bin/bash # 応答が返ってこない # 停止中を含めたすべてのコンテナを表示 → 何も表示されない → 自動的に削除されている $ docker ps –a
  11. ステップ 02・Web サーバーをホストしてみよう # nginx イメージのコンテナを起動する $ docker run --rm

    -p 8080:80 nginx:latest /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh /docker-entrypoint.sh: Configuration complete; ready for start up 2024/09/05 13:54:53 [notice] 1#1: using the "epoll" event method 2024/09/05 13:54:53 [notice] 1#1: nginx/1.27.1 2024/09/05 13:54:53 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14) 2024/09/05 13:54:53 [notice] 1#1: OS: Linux 6.6.22-linuxkit 2024/09/05 13:54:53 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 2024/09/05 13:54:53 [notice] 1#1: start worker processes 2024/09/05 13:54:53 [notice] 1#1: start worker process 29 2024/09/05 13:54:53 [notice] 1#1: start worker process 30 2024/09/05 13:54:53 [notice] 1#1: start worker process 31 2024/09/05 13:54:53 [notice] 1#1: start worker process 32 2024/09/05 13:54:53 [notice] 1#1: start worker process 33 2024/09/05 13:54:53 [notice] 1#1: start worker process 34
  12. ステップ 03・Web サーバーをホストしてみよう・2 # nginx イメージのコンテナをバックグラウンドで起動する $ docker run --rm

    -d nginx:latest dd3c125ce8273d4d3357755b0e31aa7b8caffc92e77278a6b7efc803c347aeb # 起動中のコンテナを表示する $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dd3c125ce827 nginx:latest "/docker-entrypoint.…" 17 seconds ago Up 16 seconds 80/tcp happy_fermat # ブラウザから接続してみよう!! → あれっ、できないな # 接続できるようにしてみよう!! 「-d」オプションでバックグランド起動可能!
  13. ステップ 03・Web サーバーをホストしてみよう・2 # 起動中のコンテナを表示する $ docker ps CONTAINER ID

    IMAGE COMMAND CREATED STATUS PORTS NAMES dd3c125ce827 nginx:latest "/docker-entrypoint.…" 17 seconds ago Up 16 seconds 80/tcp happy_fermat # コンテナを停止する $ docker stop dd3c125ce827 dd3c125ce827 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 止めるには「docker stop」コマンドを使う
  14. ステップ 04・Docker Compose を使ってみよう 「docker compose up –d」 で起動する 「-d」はバックグラウンド起動のオプション

    compose 直後の「-f」でcomposeファイルの指定! # docker compose でコンテナを起動する $ docker compose –f ./04-compose/compose.yaml up -d [+] Running 2/2 Network 04-compose_default Created 0.0s Container 04-compose-web-1 Started 0.1s
  15. ステップ 04・Docker Compose を使ってみよう 「docker compose –f ./04-compose/compose.yaml logs」 ログを確認してみよう

    # コンテナのログを確認してみる $ docker compose –f ./04-compose/compose.yaml logs web-1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration web-1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ web-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh web-1 | 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf is not a file or does not exist web-1 | /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh web-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh web-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh web-1 | /docker-entrypoint.sh: Configuration complete; ready for start up web-1 | 2024/09/05 15:29:40 [notice] 1#1: using the "epoll" event method web-1 | 2024/09/05 15:29:40 [notice] 1#1: nginx/1.27.1 web-1 | 2024/09/05 15:29:40 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14) web-1 | 2024/09/05 15:29:40 [notice] 1#1: OS: Linux 6.6.22-linuxkit web-1 | 2024/09/05 15:29:40 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
  16. ステップ 04・Docker Compose ファイルの解説 • web: サービスの名前 • web.image: サービスで使うイメージ名

    • web.ports: 公開するポート • web.volumes: 使用するボリューム 他にも設定できる項目はありますが、 Compose使い方解説ではないので省略
  17. ステップ 05・Dockerfile を使ってみよう とりあえず起動してみよう! # docker compose でコンテナを起動する $ docker

    compose -f ./05-dockerfile/compose.yaml up –d [+] Running 3/3 Network 05-dockerfile_default Created 0.0s Container mysql Started 0.1s Container backend Started 0.2s 2つのコンテナが起動した!
  18. ステップ 06・ゲームサーバーを立ててみよう 起動を確認する # コンテナを起動してみる $ docker compose –f ./06-minecraft/compose.yaml

    up –d [+] Running 2/2 Network 06-minecraft_default Created 0.0s Container minecraft Started 0.2s # 起動状態を確認する(下の表示はやや省略しています) $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9be44fd7f416 itzg/minecraft-serv "/start" 10 seconds ago Up 9 seconds (health: starting) 0.0.0.0:25565 minecraft # 起動中はHealthcheckによってstartingと表示される # 少し待ってから起動確認する $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9be44fd7f416 itzg/minecraft-serv “/start” 10 seconds ago Up 24 seconds (healthy) 0.0.0.0:25565 minecraft # 起動完了後は healthy になる
  19. 起動する # コンテナを起動してみる $ docker compose –f ./07-metrics/compose.yaml up –d

    [+] Running 4/4 Network 07-metrics_default Created 0.0s Container monitoring-node-exporter Started 0.3s Container prometheus Started 0.4s Container grafana Started 0.5s # 起動状態を確認する(下の表示はやや省略しています) $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cd66bfd85a4b grafana/grafana:latest "/run.sh" About a minute ago Up About a minute 0.0.0.0:3000->3000/tcp, :::3000- >3000/tcp grafana 7bb3d0c0ddda prom/prometheus "/bin/prometheus --c…" About a minute ago Up About a minute 0.0.0.0:9090- >9090/tcp, :::9090->9090/tcp prometheus b2ae10f05244 prom/node-exporter:latest "/bin/node_exporter …" About a minute ago Up About a minute 9100/tcp monitoring-node-exporter ステップ 07・サービスを監視してみよう