Skip to content

ホストと異なる専用 IP アドレスで Docker コンテナを起動する

以前に Ubuntu で NIC に復数の固定アドレスを割り当てる というメモを書きました。 このメモも参考に「ホスト OS が使う IP アドレスとコンテナが利用する IP アドレスを分ける」という方針での設定例をメモしておきます。 ホスト OS は「ひとつしか NIC が無い」前提とし、サンプルとして GitLab を Docker コンテナとして起動します。

検証環境

対象 バージョン
Ubuntu 24.04.4LTS

ホスト OS の NIC にはふたつの IP アドレスを割り当て、以下の方針で利用します。

IP アドレス 用途
10.0.0.1/24 ホスト OS で利用する
10.0.0.99/24 Docker コンテナで利用する

sshd で Listen するアドレスを指定する

sshd はデフォルトで全てのアドレス (0.0.0.0) を Listen します。 これでは NIC に追加 IP アドレスを割り当てても sshd が Listen し、他のコンテナと衝突する可能性がある為、sshd が Listen する IP アドレスを限定します。 /etc/ssh/sshd_config を以下のように修正します。 修正が完了したら systemctl restart sshd を実行して反映します。 設定反映が完了したら以下のコマンドなどで「sshd が 0.0.0.0Listen していないこと」を確認します。

  • systemctl status sshd
  • sshd -T | grep -e addressfamily -e listenaddress
  • lsof -i:22
  • ss -nt

修正前

1
2
3
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

修正前

1
2
3
AddressFamily inet
ListenAddress 10.0.0.1
#ListenAddress ::

ホスト OS の NIC に復数 IP アドレスを割り当てる

Ubuntu で NIC に復数の固定アドレスを割り当てる を参考に、ホスト OS に復数 IP アドレスを割り当てます。 /etc/netplan ディレクトリ配下にある netplan の設定ファイルを以下のように設定します。

1
2
3
4
5
6
network:
  ethernets:
    ens2:
      addresses: [10.0.0.1/24,10.0.0.99/24]
      dhcp4: false
  version: 2

ホスト OS とは別アドレスで GitLab コンテナを起動する

概ね、以前に書いた Docker Compose で GitLab を起動する というメモの手順で GitLab を Docker コンテナとして起動します。 作業用のディレクトリを作成します。

1
2
mkdir gitlab
cd gitlab/

以下の内容で docker-compose.yml ファイルを新規作成します。 ports の定義には変換する「Docker コンテナで利用する IP アドレス」も合わせて指定します。 また、通常では TCP/22 や TCP/80 がホスト OS と衝突しがちである為、「2022 ←→ 22」や「8080 ←→ 80」といったポート変換をしますが、今回は「Docker コンテナ専用 IP アドレス」を用意する為、「22 ←→ 22」「80 ←→ 80」のようにポート変換せずに利用します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
version: '3.7'
services:
  app:
    container_name: 'gitlab'
    image: gitlab/gitlab-ce
    restart: unless-stopped
    hostname: 'gitlab.example.com'
    ports:
      - '10.0.0.99:22:22'
      - '10.0.0.99:80:80'
    volumes:
      - ./data:/var/opt/gitlab
      - ./logs:/var/log/gitlab
      - ./config-app:/etc/gitlab
    shm_size: '256m'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://10.0.0.99'
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['smtp_address'] = 'mail.example.com'
        gitlab_rails['smtp_port'] = 587
        gitlab_rails['smtp_user_name'] = 'USER'
        gitlab_rails['smtp_password'] = 'PASSWORD'
        gitlab_rails['smtp_domain'] = 'example.com'
        gitlab_rails['smtp_authentication'] = 'login'
        gitlab_rails['smtp_enable_starttls_auto'] = true
        gitlab_rails['gitlab_email_enabled'] = true
        gitlab_rails['gitlab_email_from'] = 'gitlab@example.com'
        gitlab_rails['gitlab_email_display_name'] = 'GitLab'
        gitlab_rails['gitlab_email_reply_to'] = 'noreply@example.com'
        nginx['listen_port'] = 80
        nginx['listen_https'] = false
        letsencrypt['enable'] = false
volumes:
  data:
  logs:
  config-app:

ブラウザで http://10.0.0.99 (8080 などのポート指定はしない) へアクセスし、GitLab のログイン画面が表示されれば成功です。