[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
コメントを残す