0

I'm new on docker and I've been trying to create 5 containers for:

  1. nginx
  2. db
  3. 3 instances of python app I successfully created the nginx and db container and they are running (I've checked with docker-ps). For some reason my app's container are not running. When I've loged one of them I got this error message:

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'db' ([Errno 111] Connection refused)")

app.py - UPDATE - I've switched to mysql.connector and it still doesn't work:

from flask import Flask, request, make_response
import mysql.connector
import datetime

app = Flask(__name__)

conn = mysql.connector.connect(
    host='db',  # Use the hostname of the MySQL container as defined in the Docker Compose file
    port=3306,  # Use the port number of the MySQL container
    user='root',
    password='password',
    db='access_log',
)

# Create a table for access logs if it doesn't exist
cursor=conn.cursor()
create_table_query = '''
    CREATE TABLE IF NOT EXISTS access_logs (
        id INT AUTO_INCREMENT PRIMARY KEY,
        client_ip VARCHAR(255),
        internal_ip VARCHAR(255),
        access_time DATETIME
    )
'''
cursor.execute(create_table_query)
conn.commit()

counter=0

@app.route('/')
def home():
    global counter
    counter += 1

    # Get internal IP address
    internal_ip = request.environ['REMOTE_ADDR']

    # Create cookie with internal IP address that expires in 5 minutes
    resp = make_response(internal_ip)
    resp.set_cookie('internal_ip', internal_ip, max_age=300)

    # Record access log in MySQL database
    client_ip = request.remote_addr
    current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    sql = "INSERT INTO access_logs (client_ip, internal_ip, access_time) VALUES (%s, %s, %s)"
    val = (client_ip, internal_ip, current_time)
    cursor = conn.cursor(dictionary=True) # Use dictionary cursor
    cursor.execute(sql, val)
    conn.commit()

    return internal_ip

@app.route('/showcount')
def show_count():
    global counter
    return f'Global Counter: {counter}'

if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0')

docker-compose - UPDATED - I've added depends_on: - db used and it still doesn't work

version: '3'
services:                                        
  nginx:                                          
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro     
    depends_on:                                    
      - app
    networks:
      - my_network

  app:
    build:
      context: ./app
    ports:
      - "5000"
    deploy:
      replicas: 3
    volumes:
      - ./app_logs:/app/logs
    depends_on:                                    
      - db
    networks:
      - my_network                     
  
  db: 
    image: mysql
    ports:
      - '3306:3306'
    environment:
      - MYSQL_ROOT_PASSWORD=password
    volumes:
      - ./db/data:/var/lib/mysql
      - ./db/logs:/var/log/mysql
    networks:
      - my_network
volumes:
  app_logs:
  db_data:
  db_logs:
  
networks:
  my_network:

Dockerfile:

FROM python:3.9                 

WORKDIR /app           

COPY requirements.txt requirements.txt                       

RUN pip install -r requirements.txt  

COPY . .

EXPOSE 5000                        

CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0", "--port=5000"] 

requirements.txt:

Flask
mysql-connector-python


 

 
Inbar Manor
  • 101
  • 1
  • 10
  • Database containers can take a little while to start up, and if the application starts first you can get a "connection refused" error like this. If you `docker-compose up -d` a second time after a minute or so, does it work then? Also see [Docker Compose wait for container X before starting Y](https://stackoverflow.com/questions/31746182/docker-compose-wait-for-container-x-before-starting-y). – David Maze Apr 12 '23 at 11:25

0 Answers0