我已经和我的 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 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