[A-00189] Dockerで色々やってみる

Dockerを使っていろんなものを動かしてみたいと思います。

・Docker上でJavaのHelloWorldしてみる

dockerでPlane Javaプログラムを動かしてみます。

ディレクトリ構成は下記の通りです。

ソースコードは下記です。

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello,Java!");
    }
}
FROM openjdk:21-jdk-slim

WORKDIR /app

COPY Main.java .

RUN javac Main.java

CMD ["java", "Main"]

Dockerfileのと同じ階層で下記のコマンドを実行します。

docker build -t java-app .
simple-java-app1$ docker build -t java-app .
[+] Building 3.4s (9/9) FINISHED                                                                                 docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                             0.2s
 => => transferring dockerfile: 138B                                                                                             0.0s
 => [internal] load .dockerignore                                                                                                0.1s
 => => transferring context: 2B                                                                                                  0.0s
 => [internal] load metadata for docker.io/library/openjdk:21-jdk-slim                                                           2.8s
 => [1/4] FROM docker.io/library/openjdk:21-jdk-slim@sha256:7072053847a8a05d7f3a14ebc778a90b38c50ce7e8f199382128a53385160688     0.0s
 => [internal] load build context                                                                                                0.0s
 => => transferring context: 30B                                                                                                 0.0s
 => CACHED [2/4] WORKDIR /app                                                                                                    0.0s
 => CACHED [3/4] COPY Main.java .                                                                                                0.0s
 => CACHED [4/4] RUN javac Main.java                                                                                             0.0s
 => exporting to image                                                                                                           0.0s
 => => exporting layers                                                                                                          0.0s
 => => writing image sha256:876a2c694c44c5fb4096d6dd6a66db65bbd94efd6d4ae8471900b558f4c147a5                                     0.0s
 => => naming to docker.io/library/java-app                                                                                      0.0s

What's Next?
  View a summary of image vulnerabilities and recommendations → docker scout quickview

次に下記のコマンドを実行します。

docker run java-app
simple-java-app1$ docker run java-app
Hello,Java!

・Docker上でGolangのHelloWorldやってみる

次はGolangでやってみたいと思います。

ディレクトリ構造は下記です。

ソースコードは下記です。

package main

import "fmt"

func main() {
	fmt.Println("Hello,world.")
}
FROM golang:latest

COPY ./main.go ./

CMD [ "go", "run", "main.go" ]

Dockerfileと同じ階層で下記のコマンドを実行します。

docker build -t go-app .
simple-go-app1$ docker build -t go-app .
[+] Building 0.3s (7/7) FINISHED                                                                                 docker:desktop-linux
 => [internal] load .dockerignore                                                                                                0.0s
 => => transferring context: 2B                                                                                                  0.0s
 => [internal] load build definition from Dockerfile                                                                             0.0s
 => => transferring dockerfile: 119B                                                                                             0.0s
 => [internal] load metadata for docker.io/library/golang:latest                                                                 0.0s
 => [internal] load build context                                                                                                0.0s
 => => transferring context: 28B                                                                                                 0.0s
 => [1/2] FROM docker.io/library/golang:latest                                                                                   0.0s
 => CACHED [2/2] COPY ./main.go ./                                                                                               0.0s
 => exporting to image                                                                                                           0.0s
 => => exporting layers                                                                                                          0.0s
 => => writing image sha256:6c6309fdc4bcb857f35c55a10b53b1aab27a5e125be31f09cf09e4c034767179                                     0.0s
 => => naming to docker.io/library/go-app                                                                                        0.0s

What's Next?
  View a summary of image vulnerabilities and recommendations → docker scout quickview

下記のコマンドでHelloWorldを実行します。

docker run go-app
simple-go-app1$ docker run go-app
Hello,world.

・Docker上でpythonのHelloWorldしてみる

今度はpythonでやってみます。

ディレクトリ構造はこちら

下記のソースコードを作成します。

FROM python:3-slim

COPY main.py main.py

CMD ["python","main.py"]

def call_hello():
    print('Hello,Python!')

if __name__ == '__main__':
    call_hello()

下記のコマンドを実行してビルドします。

docker build -t python-app .
simple-python-app1$ docker build -t python-app .
[+] Building 15.9s (7/7) FINISHED                                                                                     docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                  0.1s
 => => transferring dockerfile: 103B                                                                                                  0.0s
 => [internal] load .dockerignore                                                                                                     0.1s
 => => transferring context: 2B                                                                                                       0.0s
 => [internal] load metadata for docker.io/library/python:3-slim                                                                      3.6s
 => [internal] load build context                                                                                                     0.0s
 => => transferring context: 124B                                                                                                     0.0s
 => [1/2] FROM docker.io/library/python:3-slim@sha256:5dc6f84b5e97bfb0c90abfb7c55f3cacc2cb6687c8f920b64a833a2219875997               11.0s
 => => resolve docker.io/library/python:3-slim@sha256:5dc6f84b5e97bfb0c90abfb7c55f3cacc2cb6687c8f920b64a833a2219875997                0.0s
 => => sha256:1103112ebfc46e01c0f35f3586e5a39c6a9ffa32c1a362d4d5f20e3783c6fdd7 3.51MB / 3.51MB                                        0.9s
 => => sha256:e71929d491677492d7a4ad57a7fa341553306ea7568c09e4231dcc509dd00ae9 11.99MB / 11.99MB                                      1.6s
 => => sha256:5dc6f84b5e97bfb0c90abfb7c55f3cacc2cb6687c8f920b64a833a2219875997 1.65kB / 1.65kB                                        0.0s
 => => sha256:ac212230555ffb7ec17c214fb4cf036ced11b30b5b460994376b0725c7f6c151 1.37kB / 1.37kB                                        0.0s
 => => sha256:23cd4350f4bde96406bb9025059e69cb9d533a372427877ec86d2a38083eb02d 6.71kB / 6.71kB                                        0.0s
 => => sha256:8a1e25ce7c4f75e372e9884f8f7b1bedcfe4a7a7d452eb4b0a1c7477c9a90345 29.12MB / 29.12MB                                      2.0s
 => => sha256:c529235f83c86ca0fb587777a0c0180058e05e0b37f760212ff224a20d83a9b8 245B / 245B                                            1.2s
 => => sha256:a47354887c310a4b86f2eec46704051aa91513f71ef42a44dcedeea84062c163 2.98MB / 2.98MB                                        1.8s
 => => extracting sha256:8a1e25ce7c4f75e372e9884f8f7b1bedcfe4a7a7d452eb4b0a1c7477c9a90345                                             4.8s
 => => extracting sha256:1103112ebfc46e01c0f35f3586e5a39c6a9ffa32c1a362d4d5f20e3783c6fdd7                                             0.4s
 => => extracting sha256:e71929d491677492d7a4ad57a7fa341553306ea7568c09e4231dcc509dd00ae9                                             1.8s
 => => extracting sha256:c529235f83c86ca0fb587777a0c0180058e05e0b37f760212ff224a20d83a9b8                                             0.0s
 => => extracting sha256:a47354887c310a4b86f2eec46704051aa91513f71ef42a44dcedeea84062c163                                             1.2s
 => [2/2] COPY main.py main.py                                                                                                        1.0s
 => exporting to image                                                                                                                0.0s
 => => exporting layers                                                                                                               0.0s
 => => writing image sha256:9c6e253809c93377de173dd3e4c381fca9868b0f049b18d24ee3623e52e5c6f4                                          0.0s
 => => naming to docker.io/library/python-app                                                                                         0.0s

What's Next?
  View a summary of image vulnerabilities and recommendations → docker scout quickview

次にコンテナを実行します。

docker run python-app
simple-python-app1$ docker run python-app
Hello,Python!

・ブリッジネットワークを作成して、コンテナの双方向通信を行う

自分のブリッジネットワークを作成して2コンテナ間で双方に通信を実施してみます。

docker network create mybridge

次にコンテナを2つ作成します。

docker run -itd --net mybridge --name alpine3 alpine /bin/sh
docker run -itd --net mybridge --name alpine4 alpine /bin/sh

上記を作成したらブリッジネットワークをinspectして割り当てられたIPアドレス等を確認します。

docker network inspect mybridge
user@usernoMBP ~ % docker network inspect mybridge
[
    {
        "Name": "mybridge",
        "Id": "3a3409259a29455899136643c73470c2f1297fe4c1f145acd08b44eb254512d6",
        "Created": "2024-12-30T16:01:47.773322827Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.23.0.0/16",
                    "Gateway": "172.23.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "e58dc6fd688bbded162d79f486a10a3997554b39bcd76a140ae9d201c7624cf4": {
                "Name": "alpine3",
                "EndpointID": "9e65edbe33e333cba519973adf0f50cb684d2b74935df30faaa7d4c3a70cc53d",
                "MacAddress": "02:42:ac:17:00:02",
                "IPv4Address": "172.23.0.2/16",
                "IPv6Address": ""
            },
            "eb5227252ce76509a03dd6cc33d827d1749bf7521885c5d96d4d2cddc6a0ca80": {
                "Name": "alpine4",
                "EndpointID": "8f8a6da2172e275e59428a28c98b18b4a8fb997bc2ef93a52fcca40a8681ee64",
                "MacAddress": "02:42:ac:17:00:03",
                "IPv4Address": "172.23.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

[Containers]ブロックに記載のあるIPアドレスが先ほど作成したコンテナのIPになります。

次にコンテナに入ってpingしてみます。カスタムブリッジネットワークを作成しましたのでIPアドレスでの疎通とコンテナ名での疎通ができるか確認します。

user@usernoMBP ~ % docker exec -it alpine3 /bin/sh
/ # ping -c 5 172.23.0.3
PING 172.23.0.3 (172.23.0.3): 56 data bytes
64 bytes from 172.23.0.3: seq=0 ttl=64 time=0.070 ms
64 bytes from 172.23.0.3: seq=1 ttl=64 time=0.089 ms
64 bytes from 172.23.0.3: seq=2 ttl=64 time=0.091 ms
64 bytes from 172.23.0.3: seq=3 ttl=64 time=0.085 ms
64 bytes from 172.23.0.3: seq=4 ttl=64 time=0.092 ms

--- 172.23.0.3 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.070/0.085/0.092 ms
/ # ping -c 5 alpine4
PING alpine4 (172.23.0.3): 56 data bytes
64 bytes from 172.23.0.3: seq=0 ttl=64 time=0.061 ms
64 bytes from 172.23.0.3: seq=1 ttl=64 time=0.126 ms
64 bytes from 172.23.0.3: seq=2 ttl=64 time=0.127 ms
64 bytes from 172.23.0.3: seq=3 ttl=64 time=0.088 ms
64 bytes from 172.23.0.3: seq=4 ttl=64 time=0.085 ms

--- alpine4 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.061/0.097/0.127 ms
/ # 

次にもう一方のコンテナに入って疎通確認します。

user@usernoMBP ~ % docker exec -it alpine4 /bin/sh
/ # ping -c 5 172.23.0.2
PING 172.23.0.2 (172.23.0.2): 56 data bytes
64 bytes from 172.23.0.2: seq=0 ttl=64 time=0.061 ms
64 bytes from 172.23.0.2: seq=1 ttl=64 time=0.090 ms
64 bytes from 172.23.0.2: seq=2 ttl=64 time=0.092 ms
64 bytes from 172.23.0.2: seq=3 ttl=64 time=0.127 ms
64 bytes from 172.23.0.2: seq=4 ttl=64 time=0.092 ms

--- 172.23.0.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.061/0.092/0.127 ms
/ # ping -c 5 alpine3
PING alpine3 (172.23.0.2): 56 data bytes
64 bytes from 172.23.0.2: seq=0 ttl=64 time=0.053 ms
64 bytes from 172.23.0.2: seq=1 ttl=64 time=0.128 ms
64 bytes from 172.23.0.2: seq=2 ttl=64 time=0.088 ms
64 bytes from 172.23.0.2: seq=3 ttl=64 time=0.060 ms
64 bytes from 172.23.0.2: seq=4 ttl=64 time=0.064 ms

--- alpine3 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.053/0.078/0.128 ms

上記の通り双方向で疎通確認ができました。カスタムブリッジネットワークを使用することでコンテナへのアクセス方法がコンテナ名を指定するという名前解決を自動で行ってくれます。defaultで用意されているbridge0(networkの指定なしでコンテナを作成した場合)ですとIPアドレスでのアクセスしか許容されません。カスタムブリッジネットワークを使用した方が便利であることがわかります。

・Appendix

参考文献はこちら

https://www.javaguides.net/2023/08/dockerize-hello-world-java-program.html

https://knowledge.sakura.ad.jp/23899

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*