🐳

【Docker】プロキシ環境からチュートリアルを実施する①

2024/06/12に公開

Dockerの公式ページにあるチュートリアルをプロキシ環境から実施したので、その手順を記します。
今回はPart2: アプリケーションのコンテナ化について説明します。

https://docs.docker.jp/get-started/toc.html

環境

  • Linux

準備

管理者権限

$ sudo -s

aptのプロキシ設定

apt.confを開きます。

$ vi /etc/apt/apt.conf

プロキシ設定を追記して保存します。

Acquire::http::Proxy "http://proxy.co.jp:xxxx";
Acquire::https::Proxy "http://proxy.co.jp:xxxx";

アプリケーションのコンテナ化

アプリの入手

チュートリアル用のアプリケーションのソースコードをGitHubからクローンします。
ただし、そのままgit cloneするとエラーになるので注意。Gitのhttp.proxyを設定してからクローンしましょう。
参考:GitHubでcloneすると「Could not resolve host: github.com」のエラーが発生した場合の対処方法 | Snow System

$ git config --global http.proxy "http://proxy.co.jp:xxxx"
$ git clone https://github.com/docker/getting-started.git

クローンしたリポジトリを確認すると、以下のようなディレクトリ構成になっていました。
参考:tree コマンドが無い環境で tree コマンドを実現 #Linux - Qiita

$ pwd;find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/|  /g'
/home/getting-started
|--.dockerignore
|--.git
|--.github
|--.gitignore
|--Dockerfile
|--LICENSE
|--README.md
|--app
|  |--Dockerfile
|  |--package.json
|  |--spec
|  |--src
|  |--yarn.lock
|--build.sh
|--docker-compose.yml
|--docs
|--mkdocs.yml
|--requirements.txt

アプリのコンテナ イメージを構築

コンテナイメージを構築するには、Dockerfileを用意する必要があります。
Dockerfileとは文字情報を主体とするファイルで、ファイルの拡張子がありません。
ファイル内に記述する命令のスクリプトを使うことで、コンテナイメージを構築することができます。

packege.jsonなどがあるappディレクトリ内でDockerfileという名前のファイルを作成し、内容を追記します。

$ cd app
$ touch Dockerfile
$ vi Dockerfile
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

Dockerfileが作成できたら、これを元にコンテナイメージを構築します。

docker build -t getting-started .
  • docker build
    • Dockerfileを使って新しいコンテナイメージを構築します。
  • -t getting-started
    • イメージにgetting-startedというタグを付与します。タグを付与することで、イメージ名を人間が読みやすい名前にすることができ、管理がしやすくなります。
  • .
    • Dockerに対して、現在のディレクトリないにあるDockerfileを探すように命令しています。

しかし、ここでエラーが発生しました。

$ docker build -t getting-started .
・・・
--------------------
   1 | >>> # syntax=docker/dockerfile:1
   2 |     FROM node:18-alpine
   3 |     WORKDIR /app
--------------------
ERROR: failed to solve: failed to authorize: failed to fetch anonymous token: Get "https://auth.docker.io/token?scope=repository%3Adocker%2Fdockerfile%3Apull&service=registry.docker.io": dial tcp: lookup auth.docker.io on 127.0.0.53:53: no such host

「build時にもプロキシ設定をしないといけないのか?」「DNSの設定の問題なのか?」など色々考えましたが、以下の記述を削除したところ問題解決しました。

# syntax=docker/dockerfile:1

#が使われている記述はコメントだと思っていたのですが、#命令=値という形式のコメントはパーサ・ディレクティブという構文命令になっています。
この記述はDockerfileの構文の情報を外部サイトから取得して構文チェックをするなのですが、外部サイトにアクセスする際にプロキシ設定がされておらずエラーになっていました。
もしかしたら構文チェックを行うBuildKitに対してプロキシ設定をすれば問題なく動作するのかもしれませんが、今回はこの部分を削除することで対応しました。

さて、再度buildを実行・・・と、またエラーが。
今度はyarn install --productionがうまくいかないようです。

$ docker build -t getting-started .
・・・
------                                                                                                                                                       
Dockerfile:4                                                                                                                                                 
--------------------                                                                                                                                         
   2 |     WORKDIR /app                                                                                                                                      
   3 |     COPY . .                                                                                                                                          
   4 | >>> RUN yarn install --production                                                                                                                     
   5 |     CMD ["node", "src/index.js"]                                                                                                                      
   6 |     EXPOSE 8080                                                                                                                                       
--------------------                                                                                                                                         
ERROR: failed to solve: process "/bin/sh -c yarn install --production" did not complete successfully: exit code: 1

こちらは、Dockerfileにyarnのプロキシ設定の記述を追加することで解決しました。

FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn config set proxy "http://proxy.co.jp:xxxx"
RUN yarn config set http_proxy "http://proxy.co.jp:xxxx"
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

アプリコンテナの起動

イメージを作成したので、コンテナ内でアプリケーションを実行できます。

$ docker run -dp 127.0.0.1:3000:3000 getting-started
  • -d--detach
    • コンテナをバックグラウンドで実行します。
  • -p--publish
    • HOST:CONTAINERという書式で記述することで、ホストとコンテナ間でポートの関連付け(ポートマッピング)を作成します。HOSTはホスト上のアドレス、CONTAINERはコンテナ上で対象となるポートを指定します。このコマンドでは、コンテナのポート3000を、ホスト上の127.0.0.1:3000(localhost:3000)へ公開します。ポート割り当ての指定がなければ、ホスト上からアプリケーションに接続することはできません。

実行できたら、自分のwebブラウザでhttp://localhost:3000/を開きます。
アプリケーションの画面を見ることができるでしょう。

image.png


次回、Part3は以下の記事にて記載しています。
https://zenn.dev/mmm_wak/articles/7521cada8c7358

参考文献

Discussion