Dockerのネットワークについて

2 min read読了の目安(約2300字

DockerやDocker-Composeを使用してアクセスできるかどうか確認する。

はじめに

筆者試験環境として、windows10のwsl2環境下でdockerを動かすように環境構築しました。
個人的に、Dockerコンテナを動かした際にどうなるのか気になったので、確認の意味で動作を確認しました。

試験用のソース

フォルダ構成

.
├── Dockerfile
├── docker-compose.yml
└── golang
    └── main.go

ファイルの中身

  • Dockerfile
Dockerfile
FROM golang
WORKDIR /app
COPY ./golang ./
RUN go build -o app
CMD ./app
  • docker-compose.yml
docker-compose.yml
version: '3'
services:
  server1:
    build: ./
    container_name: server1
    environment: 
      NUM: "1"
    ports:
      - 8082:8080
    networks: 
      - front
  server2:
    build: ./
    container_name: server2
    environment: 
      NUM: "2"
    networks: 
      - front
      - back
  server3:
    build: ./
    container_name: server3
    environment: 
      NUM: "3"
    networks: 
      - back
networks:
  front:
  back:
  • golang/main.go
golang/main.go
package main

import (
	"fmt"
	"net/http"
	"os"
)

type Server struct {
	Port string
	Ip   string
	Num  string
}

func (t *Server) Start() {
	mux := http.NewServeMux()
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		output := "Hello World " + t.Num + "\n"
		fmt.Fprintf(w, output)
	})

	s := http.Server{
		Addr:    t.Ip + ":" + t.Port,
		Handler: mux,
	}

	fmt.Println(t.Ip + ":" + t.Port + " server start")
	s.ListenAndServe()
}
func main() {
	server := Server{Port: "8080", Num: "0"}
	if str := os.Getenv("NUM"); str != "" {
		server.Num = str
	}
	server.Start()

}

実際の動作起動コマンドについて

以下のコマンドでコンテナビルドしました。

docker build -t curlserver .

以下のコマンドを使用して、コンテナ動作させました。

docker run --rm --name server4 -e "NUM=4" -p 8081:8080 -d curlserver

先に動かしたserver4と連携させる意味で、以下のコマンドで立ち上げました。

docker run -d --rm --name server5 -e "NUM=5" --link server4 curlserver

docker-composeでのファイルは以下のコマンドで立ち上げる。

docker-compose up -d

ネットワーク状態

実際にコンテナにアクセスし ip aコマンドでipの状態を確認すると以下の絵の状態になる。

ipアドレスとコンテナの関係図
図 ipアドレスとコンテナの関係図

以下にDNS解決できる関係とポートマッピングについていかに示す。

図 コンテナのDNS関係とポートマッピングの関係図

余談

Docker内のコンテナ間でネットワーク連携がされているのか調べる方法 /etc/hosts/etc/resolv.confに登録されている情報を確認すれば、ある程度調べることができる。