在docker中配置dns

问题描述 投票:0回答:1

我已经和我的 docker 斗争了 2 天,以获得一个稳定的 Laravel 实例,但是如何在我的 AWS ec2 实例中运行它,而且我已经在那台机器上运行了一些 apache 服务,现在我需要把这个docker放在同一台机器上,我做了一些测试,我将与你分享结果,看看你是否可以帮助我:

Dockerfile

# Base image as Ubuntu 22.04
FROM ubuntu:22.04

# Avoid prompts from apt.
ENV DEBIAN_FRONTEND=noninteractive

# Install curl and iputils-ping to check internet connectivity
RUN apt-get update && apt-get install -y curl iputils-ping
RUN curl -s https://api.ipify.org || exit 1

# Install required packages
RUN apt-get install -y software-properties-common && \
    add-apt-repository ppa:ondrej/php && \
    apt-get update && apt-get install -y apache2 \
    php8.1 php8.1-fpm php8.1-common php8.1-mysql php8.1-xml php8.1-xmlrpc php8.1-curl php8.1-gd php8.1-imagick php8.1-cli php8.1-dev php8.1-imap php8.1-mbstring php8.1-opcache php8.1-soap php8.1-zip php8.1-intl \
    mariadb-server mariadb-client composer

# Set your timezone
RUN ln -fs /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime && dpkg-reconfigure --frontend noninteractive tzdata

# Enable Apache mods
RUN a2enmod rewrite ssl

# Copy application source
COPY . /var/www/html

# Set the working directory
WORKDIR /var/www/html

# Remove composer.lock if present and install/update Composer dependencies
RUN if [ -f composer.lock ]; then rm composer.lock; fi && \
    composer install --no-interaction && \
    composer update --no-interaction

# Expose ports for web traffic
EXPOSE 80 443

# Start Apache in the foreground
CMD ["apache2ctl", "-D", "FOREGROUND"]

docker-composer.yml

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8080:80"
      - "8443:443"
    volumes:
      - /var/www/backend/api:/var/www/html
      - /etc/apache2/sites-available/api.com.br.conf:/etc/apache2/sites-available/000-default.conf
      - /etc/apache2/sites-available/api.com.br-le-ssl.conf:/etc/apache2/sites-available/000-default-le-ssl.conf
    command: >
      bash -c "composer update && apache2ctl -D FOREGROUND"
    environment:
      - APACHE_DOCUMENT_ROOT=/var/www/html/public
    dns:
      - 8.8.8.8
      - 8.8.4.4

构建命令生成我的图像,我给出了 up -d 命令,没有任何问题,但是当我访问这台机器并对其进行 ping 操作时,它无法识别互联网。

然后测试发出命令:

sudo docker run --dns 8.8.8.8 --dns 8.8.4.4 -it api_web:latest /bin/bash

然后它就能正确 ping 通互联网。

容器构建并运行没有错误,但无法连接到互联网。使用 docker run --dns 成功配置 DNS 并允许互联网访问。由于与现有 Apache 服务器的端口冲突,尝试在 daemon.json 中设置 DNS 并使用主机网络模式失败。

如何在 docker-compose.yml 中配置 DNS,以确保我的 Docker 容器可以访问互联网,而不干扰主机的 Apache 设置?

更新

那么问题是如何通过 docker-composer 配置 DNS?这不会给出错误,但是当我输入并 ping 它时,它不起作用或出现在等中,但通过命令它可以工作。一起考虑这三件事,因为我必须在不同的端口上运行它,因为主机上已经有一些东西正在运行,它是 ec2 的实例。

docker docker-compose
1个回答
0
投票

由于尽管 Docker compose 文件中的 DNS 设置显示正确,容器仍无法访问互联网,因此检查

/etc/resolv.conf
(按照 注释larsks 的要求)可以帮助确定容器是否正在使用预期的 DNS服务器(在您的情况下为 8.8.8.8 和 8.8.4.4),或者是否发生可能解释连接问题的错误配置或覆盖。

+------------------+    +------------------+    +------------------+
| Dockerfile Setup | -> | docker-compose   | -> | Docker Container |
| (Ubuntu Base)    |    | (Service Config) |    | (Runs Apache)    |
+------------------+    +------------------+    +------------------+
       |                        |                        |
       |--- Installs Apache --- |                        |
       |--- PHP, Composer ---   |                        |
       |--- Exposes Ports  ---  |                        |
                                |--- Maps Ports 80,443 --|
                                |--- Sets DNS  ------->--|
                                |--- Binds Volumes   --- |

然后,您可以比较通过

docker run --dns
... 命令应用的 DNS 配置(成功)和那些打算由 Docker 撰写文件设置的配置。

如果

/etc/resolv.conf
未显示 docker-compose.yml 中指定的 DNS 服务器,则可能表明 Docker 的网络或 DNS 设置被主机上的其他配置覆盖(如 dnsmasq,如 this 所示)问题)或在 Docker 自己的网络设置中。

如果它确实显示正确的 DNS 服务器,您还可以尝试创建自定义网络,为容器提供隔离的网络环境。这意味着同一网络上的容器可以直接相互通信,但与不同 Docker 网络上的容器是隔离的。
然后,Docker 将为同一自定义网络上的容器提供自动 DNS 解析。这意味着您可以通过服务名称而不是 IP 地址来引用其他容器,从而简化了配置脚本和服务间通信

docker network create my-custom-network

# Define it in your docker-compose.yml
services:
  web:
    networks:
      - my-custom-network
networks:
  my-custom-network:
    external: true

# Then restart your docker-compose services
docker-compose down
docker-compose up -d

# To diagnose network issues, you can enter the container and inspect the DNS configurations and connectivity:
docker-compose exec web bash
cat /etc/resolv.conf  # Check if DNS settings are applied
ping google.com       # Test internet connectivity
© www.soinside.com 2019 - 2024. All rights reserved.