1. ホーム
  2. ドッカー

Docker入門実習(II) ---- Dockerfileを使って自分だけのイメージを作ろう

2022-03-03 19:23:17
<パス

前回の記事では、誰かが作ったdockerを利用するためのイメージを使っていました。
その他のミラーは、https://hub.docker.com/查找 で確認できます。

今回の記事では、鏡を自作することにします。
自作はとても簡単で、自分でDockerfileを書いてビルドし、イメージを取得すればいいだけです。

以下の例は、公式サイトを参照してください。

1. 新しいフォルダtestを作成する

>mkdirテスト
>cdテスト

==注意: このフォルダの下には、イメージの作成に関係のない他のファイルは置かない方が良いでしょう。ドッカーはビルドの段階で現在のフォルダ以下の全てのファイルをスキャンするので、作成の効率に影響します。 ==*

2. Dockerfileを新規に作成する

> vim Dockerfile

<マーク 注意:ファイル名はDockerfileでなければなりません。

次のように書きます。

Pythonの公式ランタイムを親画像として使用する

FROM python:2.7-slim

作業ディレクトリを/appに設定する

WORKDIR /app

カレントディレクトリの内容を/appにあるコンテナにコピーします。

COPY . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]


3. app.pyとrequirements.txtの新規作成

app.py writes

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}! </h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)


requirements.txt の書き込み

Flask
Redis


4. この画像をビルドする

>docker build -t friendlyhello .


friendlyhelloはミラーネームで、自分で自由に選んでください。
最後の ". " は、カレントディレクトリを意味します。

ドッカーイメージ
先ほど作成したイメージを見ることができます

5. アプリを実行する

> docker run --name friendlyhello_test -p 4000:80 friendlyhello

ブラウザを開く(ホストのポート4000)

アプリをバックグラウンドで実行させるために、もう一度試してみましょう。
ここでは名前を変更する必要があり、ポート4000が占有されているので、ポートも変更する必要があります

> docker run --name friendlyhello_test2 -p 4001:80 -d friendlyhello

ここでは、コンテナ名をfriendlyhello_test2としています。
-バックグラウンドで実行されるように設定
Windows で docker を実行している場合は、ローカルの ip ではなく、docker-machine ip を使用する必要があることに注意してください。

>docker ps # コンテナを表示すると、実行中のfriendlyhello_test2が表示されます。

考えられる問題点
1. プロキシ設定
ネットワークにプロキシサーバーが設定されている場合は、以下の設定をdockerfileに追加してください。

# Set proxy server, replace host:port with values for your servers
ENV http_proxy host:port
ENV https_proxy host:port


2. DNSの設定
DNSの設定が正しくない場合、pipコマンドが正常に動作しないことがありますので、Dockerデーモンの設定を変更することができます

vim /etc/docker/daemon.json


以下の設定を追加します。

{
  "dns": ["your_dns_address", "8.8.8.8"]
}


1つ目はあなたのDNSサーバー、2つ目はGoogleのDNSサーバーです。1つ目がうまくいかない場合は、2つ目が使用されます。
この設定ファイルを保存した後、dockerサービスを再起動する必要があります。

sudo systemctl restart docker 


この記事では、簡単な例を使ってイメージを作るだけです。次回は、Dockerfileのパラメータについて詳しく説明します。

画像のアップロード

関連コマンド一覧

docker build -t friendlyhello .  # Create image using this directory's Dockerfile
docker run -p 4000:80 friendlyhello # Run "friendlyname" mapping port 4000 to 80
docker run -d -p 4000:80 friendlyhello # Same thing, but in detached mode
docker container ls # List all running containers
docker container ls -a # List all containers, even those not running
docker container stop <hash> # Gracefully stop the specified container
docker container kill <hash> # Force shutdown of the specified container
docker container rm <hash> # Remove specified container from this machine
docker container rm $(docker container ls -a -q) # Remove all containers
docker image ls -a # List all images on this machine
docker image rm <image id> # Remove specified image from this machine
docker image rm $(docker image ls -a -q) # Remove all images from this machine
docker login # Log in this CLI session using your Docker credentials
docker tag <image> username/repository:tag # Tag <image> for upload to registry
docker push username/repository:tag # Upload tagged image to registry
docker run username/repository:tag # Run image from a registry