These days, many developers are using docker-compose to build system on our local machines. If each container does not depend on each other, the system is simple. However, we usually have dependent and dependency containers within our docker-compose networks. I'm sharing the most basic cases of dependent-dependency pattern and how to boot containers in a order that we expect.
Basics: Docker healthcheck
Docker has healthcheck functionality. The rules can be written in our Dockerfile or docker-compose. In docker-compose, it is written like following. The server container relies on db container. db should have healthcheck section and the condition. server should have db in the depends_on and the condition underneath to make sure that it boots after the db container gets health status.
services:
server:
image: your_server_image
depends_on:
db:
condition: service_healthy
db:
image: your_db_image
healthcheck:
test: ... # Command to check health.
interval: 5s # Interval between health checks.
timeout: 5s # Timeout for each health checking.
retries: 20 # Hou many times retries.
start_period: 10s # Estimated time to boot.
Case 1: Server depends on MySQL
Maintain server and MySQL containers in the same docker-compose runtimes is a very common pattern. The server must be booted after the MySQL container gets ready if you want to do something like table migrations when the server container booted. Pinging with mysqladmin to MySQL server in the db container, we can check if MySQL is ready. The MySQL server runs on localhost in the contianer, the host -h parameter must be localhost. The password is the one you set in the environment section with the MYSQL_ROOT_PASSWORD parameter.
db:
image: mysql:8.0.26
ports:
- 3316:3306
environment:
MYSQL_DATABASE: yourdb
MYSQL_ROOT_PASSWORD: pass
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-uroot", "-ppass"]
interval: 5s
timeout: 5s
retries: 20
Case 2: Server depends on another server
If we have more than 1 server, the servers may depends on others. e.g. In an image detection service system, one main server for user access and another server for image detection by machine learning. For the case, self-pinging should be the simplest solution. For the server runs on localhost and 8080 port in the container, curl command to ping should be like the below.
image_detection:
image: your_image
ports:
- 8082:8080
healthcheck:
test: "curl -f localhost:8080"
interval: 5s
timeout: 5s
retries: 20
Top comments (0)