今回の記事ではPLCNEXTを使用しDockerイメージを作成し、podmanから起動させます。Docker Fileのコンセプトにも少し触れますので、よろしくおねがいします。
Reference Link
Docker file?
Dockerfile はコンテナイメージを作成するために使われているFileです。そしてコンテナを構築するときそのFileが実行されます。
Dockerfile にはコンテナーの構成内容をまとめて記述するため、構成管理にも役立ちます。
いままでDockerベージから公開されているイメージをそのまま使うのが多いですが、実は
必要なパッケージやアプリ、各種設定を含んだDockerイメージを自分で作成して使用するケースが出てきます。
その場合、Dockerfileが必要になります。そのDockerFileを作成し、必要なDockerイメージを作成することができます。Dockerfileには、ベースとするDockerイメージに対して実行する内容を記述します。
そしてDockerfileは、Dockerコンテナをビルドするためのテキストファイルで、コンテナ内で実行するアプリケーションやサービスの構成を定義します。
Dockerfileには、以下のような構成があります。
- Base Imageの指定: Dockerコンテナは、基本となるイメージから構築されます。Dockerfileでは、FROM命令を使用してそのBase Imageを指定します。
- アプリケーションやサービスの構成: Dockerコンテナ内で実行するアプリケーションやサービスの構成を指定します。例えば、RUN命令を使用してパッケージのインストールしたりCOPY命令を使用してファイルのコピーしたりEXPOSE命令を使用してポートの公開などの操作になります。
- コンテナ起動時の設定: Dockerコンテナが起動する際の設定を指定します。例えば、CMD命令を使用してデフォルトのコマンドや引数を指定することができます。
Dockerfileを使用することで、開発者はアプリケーションやサービスの構成を明確に定義し、再現可能な環境を構築することができます。また、Docker HubなどのDockerレジストリにDockerfileをアップロードすることで、他のユーザーが同じ環境を構築することができるようになります。
Implementation
login as root
sshでrootをLoginします。
admin@axcf2152:~$ su |
File Structure
こちらはFileの構造です。
Dockerfile
こちらは今回使用するDocker Fileです。
FROM python:3.9 WORKDIR /app COPY helloworld.py . RUN apt update # install python and pip RUN apt install -y python3 python3-pip RUN pip install –upgrade pip COPY requirements.txt . |
FROM
ベースとするDockerイメージを指定しています。ローカルにない場合は、Dockerイメージ作成のコマンド実行時に自動で取得してきます。今回指定するBase-Imageはpython:3.9です。
実際にImageのVersionがDockerのWebから確認できます。
TagsのTabを開いて、各VersionのTagsも確認いただけます。
COPY
COPYコマンドは、ローカルファイルシステム上のファイルやディレクトリを、Docker Containerのファイルシステムにコピーするために使用されます。構文は以下になります。
COPY <src> <dest> |
<src>
ローカルファイルシステム上のファイルまたはディレクトリになります。
<dest>
Dockerコンテナ内のコピー先になります。
WORKDIR
WORKDIRは、Dockerfile内で使用されるディレクトリを設定するための命令です。この命令は、cdコマンドと同じく、Dockerfile内での作業ディレクトリを指定することができ
ます。たとえば、以下のように使用します。
例えば、Dockerコンテナ内での作業ディレクトリを/appに設定します。それ以降のRUN、CMD、およびENTRYPOINTなどのコマンドで指定されたコマンドは、この作業ディレクトリ内で実行されます。
WORKDIR /app |
RUN
RUNコマンドは、Dockerfile内でコマンドを実行するための命令です。この命令は、Dockerコンテナ内で実行するLinuxコマンドを指定することができます。たとえば、以下のようにDockerコンテナ内でapt-getコマンドを使用して、Python3をインストールすることができます。複数のコマンドを実行する場合は、&&で区切って指定すればOKです。
RUN apt-get update && apt-get install -y python3 |
そのWORKDIRとRUNコマンドを組み合わせることで、Dockerfile内で特定のディレクトリで作業し、必要なコマンドを実行することが可能です!
build
Docker Fileが作成終わったらbuildコマンドでImageをビルドします。
そのDocker buildは、DockerイメージをビルドするためにDockerfileを使用するコマンドです。
root@axcf2152:/pythonDocker# podman build –network=host -t mypythondocker:1.0 . |
–network=host
–network=hostは、Docker buildコマンドのオプションの1つで、ホストネットワークモードを使用することを指定するものです。つまり、–network=hostオプションを使用することで、Docker buildコマンドがホスト上のネットワークインターフェースを直接使用し、ホスト上のネットワーク設定をDockerイメージ内に反映することができます。このオプションを使用することで、Dockerコンテナ内でホスト上のリソースにアクセスすることができるようになります。
ですが、セキュリティ上の問題が生じる可能性があるので、慎重に使用する必要があります。また、このオプションはLinux環境でのみ使用できます。
Check
Build終わったらpodman imagesでImagesが作成されたかを確認しましょう。
root@axcf2152:/pythonDocker# podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/mypythondocker 1.0 91c0ac482909 21 minutes ago 789 MB docker.io/library/python 3.9 9a628174e171 5 days ago 725 MB |
run
次はrun コマンドでDockerイメージからDockerコンテナを作成し、実行します。
root@axcf2152:/pythonDocker# podman run –name mypyserver -it -d mypythondocker:1.0 |
Name (–name)
–nameオプションは、Dockerコンテナに名前を付けるためのオプションです。Dockerコンテナを作成するときにこのオプションを使用することで、Dockerコンテナに固有の名前を付けることができます。
-it
-itは、Dockerコンテナ内でユーザーが対話的に操作できるようにするためのオプションです。例えば、docker run -it ubuntu /bin/bashというコマンドを実行すると、Ubuntuコンテナ内でbashシェルを開始し、ユーザーはコンテナ内でコマンドを入力したり、ファイルを編集したりすることができます。
-i
-iは「対話的」を意味し、コンテナ内の標準入力(stdin)を開いて、ユーザーがコンテナ内での操作を継続的に行えるようにします。
-t
tは「tty」を意味し、コンテナ内の仮想端末(tty)を開き、コンテナ内で操作を行うためのインターフェースを提供します。
-d
-dは、Dockerコンテナをバックグラウンドで実行するためのDocker runコマンドのオプションで、detached(分離)を意味し、コンテナをバックグラウンドで実行し、コマンドラインの制御をユーザーに返します。
Result
exec
最後はexecコマンドです.、Dockerコンテナ内に入りましょう。
root@axcf2152:/pythonDocker# podman exec -it mypyserver bash |
Container内のPythonバージョンを確認します。3.9.16です。
root@9588a0907eb4:/app# python Python 3.9.16 (main, Apr 12 2023, 19:35:10) [GCC 10.2.1 20210110] on linux Type “help”, “copyright”, “credits” or “license” for more information. >>> |
exit コマンドでContainerから離れます。
root@9588a0907eb4:/app# exit |
次はPLCNEXT本体のPythonバージョンを確認します。
自分には2023.0が入っていますので、Pythonが3.10.8になります。
admin@axcf2152:~$ python3 Python 3.10.8 (main, Oct 11 2022, 11:35:05) [GCC 11.3.0] on linux Type “help”, “copyright”, “credits” or “license” for more information. >>> |