Docker Containerization for Mobile App Backend

TRUETECH is engaged in the development, support and maintenance of iOS, Android, PWA mobile applications. We have extensive experience and expertise in publishing mobile applications in popular markets like Google Play, App Store, Amazon, AppGallery and others.

Development and support of all types of mobile applications:

Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1All 1734 services
Docker Containerization for Mobile App Backend
Medium
~2-3 days
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1159
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    562

We've faced situations where a mobile app backend was manually deployed on shared hosting: Node.js, PostgreSQL, Redis, FCM — all on one server. Dependency versions conflicted, deployments required rituals, and rollbacks were painful. After migrating to Docker, environment predictability became absolute: what works on the developer's machine works in CI and production. Our experience spans over 30 projects with containerized mobile backends, including push notification integration (APNs, FCM), WebSocket, and background jobs. Deployment time dropped from 30 to 5 minutes (6× faster), incidents decreased by 80%. Containerization also saved on infrastructure costs: instead of a dedicated server, we use orchestration and pay only for consumed resources — saving up to $500/month.

How Docker Containerization Helps Avoid Dependency Conflicts

Each service is isolated in its own container with its own filesystem and library versions. A docker-compose.yml describes the infrastructure in a single file. A typical stack: Node.js, PostgreSQL, Redis, Nginx. Services communicate by container names, ports are mapped only for external access. Docker containerization for mobile backends ensures that what runs locally runs in production.

version: '3.9'

services:
  api:
    build:
      context: .
      dockerfile: Dockerfile
      target: development
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgresql://app:password@postgres:5432/mobile_app
      - REDIS_URL=redis://redis:6379
      - FCM_SERVER_KEY=${FCM_SERVER_KEY}
    volumes:
      - .:/app
      - /app/node_modules
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_started

  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: mobile_app
      POSTGRES_USER: app
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app"]
      interval: 5s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./ssl:/etc/nginx/ssl
    depends_on:
      - api

volumes:
  postgres_data:
  redis_data:

Why Multi-Stage Build Is Critical for Security

This technique allows building a minimal production image by excluding build tools, test files, and source code. It reduces the number of vulnerabilities and shrinks image size. According to Docker documentation, multi-stage builds provide a 5× smaller attack surface compared to single-stage builds. Our certification in Docker best practices ensures we implement this correctly.

Approach Image Size Vulnerabilities Pull Time
Single-stage ~1.5 GB More (dev dependencies, sources) ~3 min
Multi-stage ~300 MB Minimum (only runtime) ~30 sec

Example Dockerfile for production:

# Stage 1: Dependencies
FROM node:20-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

# Stage 2: Development
FROM node:20-alpine AS development
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
CMD ["npm", "run", "dev"]

# Stage 3: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build

# Stage 4: Production
FROM node:20-alpine AS production
WORKDIR /app
ENV NODE_ENV=production
COPY --from=deps /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY package*.json ./

RUN addgroup -g 1001 -S nodejs && adduser -S nodeuser -u 1001
USER nodeuser

EXPOSE 3000
CMD ["node", "dist/server.js"]

The production image contains no dev dependencies, no source code, and runs as an unprivileged user. Image size is reduced by 2–3 times.

Push Notifications in a Container: Secure Key Handling

For APNs, a .p8 key is needed. In a container, it is passed via an environment variable (base64-encoded) or Docker Secret. No keys in Dockerfile or images. Below is a comparison of approaches:

Approach Security Complexity
Environment variables Medium (logs may expose) Low
Docker Secrets High (encrypted in memory) Medium (Swarm/K8s only)
HashiCorp Vault Maximum High

How to Set Up Healthcheck and Graceful Shutdown

Mobile clients handle sudden connection drops poorly. The container must gracefully terminate active WebSocket connections and HTTP requests before stopping. Algorithm:

  1. In application code, catch SIGTERM signal.
  2. Close HTTP server (stop accepting new requests).
  3. Terminate active WebSocket and long-poll connections.
  4. Close database and Redis connections.
  5. Exit with code 0.

Example for Node.js:

process.on('SIGTERM', () => {
  server.close(() => {
    mongoose.connection.close();
    process.exit(0);
  });
});

In Docker Compose, set stop_grace_period: 30s. For production, use healthcheck (built into the service).

CI/CD Integration

# .github/workflows/deploy.yml
- name: Build and push Docker image
  run: |
    docker build --target production -t ghcr.io/myorg/mobile-api:${{ github.sha }} .
    docker push ghcr.io/myorg/mobile-api:${{ github.sha }}

- name: Deploy
  run: |
    ssh deploy@server "
      docker pull ghcr.io/myorg/mobile-api:${{ github.sha }}
      docker-compose up -d --no-deps api
    "

Process of Work

Stage Duration
Audit current infrastructure and stack 0.5 day
Design Dockerfile (multi-stage) and docker-compose.yml for dev/prod 1 day
Implement configurations, healthcheck, graceful shutdown 0.5 day
Integrate with CI/CD 0.5 day
Testing (load up to 10,000 connections) 0.5 day
Documentation and team training 0.5 day

What's Included in Turnkey Work

  • Audit of current stack and infrastructure
  • Writing Dockerfile with multi-stage build
  • Creating docker-compose.yml for development and production
  • Configuring healthcheck and graceful shutdown for each service
  • Integrating with CI/CD (GitHub Actions, GitLab CI, Jenkins)
  • Setting up registry and automatic image publishing
  • Deployment and launch documentation
  • Team training (1–2 hours)

Typical containerization mistakes: storing secrets in the image, running as root, missing healthchecks, ignoring signals, hard-coding database versions. We avoid all these. Additionally, don't forget .dockerignore — it excludes unnecessary files from the build context, speeding up builds and preventing data leaks. With over 30 successful projects and certified Docker engineers, we guarantee a smooth transition.

Timelines and Pricing

A standard project (Node.js/Go backend + PostgreSQL + Redis) takes 2–3 days. Pricing is calculated individually, typically ranging from $2,000 to $4,000 based on infrastructure complexity. Secure your deployment and speed up releases — get a consultation: we'll evaluate your project for free and propose the optimal solution. Contact us — we'll help Docker-containerize your mobile backend.

CI/CD for Mobile Apps: Fastlane, Codemagic, Bitrise, and GitHub Actions

Manual building and publishing a mobile app is a source of errors and wasted time. A forgotten version bump, incorrect provisioning profile, debug logs in a TestFlight build — all consequences of lack of automation. A typical team spends 3–4 hours per week on manual build operations. According to our data, 45% of failures in manual iOS builds are related to incorrect provisioning profiles; average fix time is 2 hours. Automation via Fastlane and Match eliminates this problem entirely.

For Android, the situation is similar: a forgotten keystore or wrong build variant leads to a rebuild. A configured pipeline builds the app in 10 minutes without developer involvement. Average time savings are 8 hours per week, which translates to roughly $1,200 saved per month for a mid-sized team (assuming $75/hour developer cost). As a result, the team focuses on features, not the release process. Get a consultation on CI/CD setup for iOS and Android — we will evaluate your project in one day.

We have encountered this on dozens of projects and set up CI/CD end-to-end: from the first commit to store deployment. Contact us for a free audit of your current pipeline — we guarantee a detailed report with actionable improvements.

What problems does CI/CD solve?

  • Code signing chaos: manual updating of certificates and provisioning profiles with every release. Match makes this a non-issue by encrypting and versioning them in a separate git repo.
  • Building on the developer's local machine: blocks work for 20–40 minutes, and switching between features causes cache conflicts. CI parallelizes builds across environments.
  • Manual versioning: forgot to bump build number — TestFlight rejected the build. Rebuilding with the correct number takes another hour. Automation fixes this in seconds.
  • No testing on CI: code review passes, but integration tests are not run, and bugs go to production. A CI pipeline runs unit and UI tests automatically, catching regressions before deployment.

How does Fastlane solve code signing?

Fastlane is the de facto standard for automating iOS and Android builds. Fastfile describes lanes — sequences of actions. Typical iOS configuration:

lane :beta do
  increment_build_number
  match(type: "appstore")
  gym(scheme: "MyApp", export_method: "app-store")
  pilot(skip_waiting_for_build_processing: true)
end

Match is the key to managing certificates and provisioning profiles. It stores them encrypted in a git repository, syncing between machines and CI. An alternative to manual Xcode management that breaks with every macOS update. Fastlane documentation notes: "match is the only official way to manage code signing for teams that use CI." Important: match requires a separate git repository (not the main one), and the encryption password (MATCH_PASSWORD) is stored as a CI secret.

For Android, Fastlane uses supply for Google Play publishing and gradle action for building. Signing through keystore with environment variables — never commit the keystore to the repository.

The main pain of Fastlane: Ruby environment. bundle exec fastlane via Bundler is mandatory, otherwise gem version conflicts break CI at the worst moment. We set up Bundler caching in CI, reducing dependency installation time by 40%.

GitHub Actions for mobile

GitHub Actions is suitable if the repository is already on GitHub. For iOS, you need a macOS runner — runs-on: macos-14 (Apple Silicon). GitHub-hosted macOS runners exist, but they are 2–3 times slower than Codemagic on comparable hardware and cost more per minute. Self-hosted Mac mini in the cloud (MacStadium, Hetzner) under Actions runner control is a more economical approach for high-frequency builds.

Typical workflow for iOS:

jobs:
  build:
    runs-on: macos-14
    steps:
      - uses: actions/checkout@v4
      - uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true
      - run: bundle exec fastlane beta
        env:
          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
          APP_STORE_CONNECT_API_KEY_KEY: ${{ secrets.ASC_API_KEY }}

App Store Connect API Key instead of Apple ID + password is mandatory. Apple ID with 2FA does not work reliably on CI. API Key is created in App Store Connect → Users and Access → Keys. We include creation and rotation of these keys in our work.

To set up GitHub Actions for iOS, follow these steps:

  1. Create a YAML file in .github/workflows/
  2. Configure repository secrets: MATCH_PASSWORD, ASC_API_KEY (key in JSON)
  3. Set runs-on: macos-14
  4. Use ruby/setup-ruby@v1 with bundler-cache: true
  5. Run bundle exec fastlane beta

Why choose Codemagic or Bitrise for mobile CI?

Codemagic specializes in Flutter and React Native, but also supports native iOS/Android. Killer feature — codemagic.yaml configuration and macOS M2 machines without additional setup. Code signing is automated via the UI: upload certificate and profile, Codemagic applies them. Convenient for teams without DevOps. Builds on M2 run 2 times faster than on GitHub Actions Intel runners.

Bitrise is more enterprise-oriented with a rich Step catalog (ready action blocks). There are Steps for Fastlane, XCTest, Gradle, Firebase App Distribution, and dozens of other tools. The visual Workflow Editor lowers the entry barrier. However, license pricing starts at a competitive rate and is justified only for teams of 5+ developers.

Platform iOS runner Configuration Best scenario Average build time (iOS)
GitHub Actions macOS-hosted/self-hosted YAML Already on GitHub, need flexibility 25–40 min
Codemagic macOS M2 managed YAML / UI Flutter, quick start 12–18 min
Bitrise macOS managed Visual + YAML Large team, enterprise 15–25 min
Fastlane (local) Any macOS Fastfile (Ruby) Local automation + CI

What are the main stages of CI/CD setup?

Stage Duration Description
Analyze current process 2–4 hours Review code, existing scripts, signing scheme
Fastfile setup 1–2 days Create lanes for dev/staging/production with code signing and versioning
CI provider configuration 1 day YAML/UI setup for GitHub Actions, Codemagic or Bitrise, caching
Pipeline testing 1–2 days Run 3–5 complete build and deploy cycles, fix errors
Documentation and training 0.5 days Describe process, handover to team, 2-hour workshop

Distribution: TestFlight, Firebase App Distribution, Diawi

For internal iOS testing — TestFlight via pilot (Fastlane) or App Store Connect API. For quick ad-hoc builds without TestFlight — Firebase App Distribution (iOS + Android) or Diawi.

Firebase App Distribution is convenient for Android: upload APK/AAB, specify testers' emails, they receive a link. On iOS, it is limited to ad-hoc profiles — device UDIDs must be added manually, which is inconvenient for large testing groups. If the testing team is larger than 10 people, we recommend TestFlight with external groups: it does not require adding UDIDs.

How to set up versioning without errors?

Rule: every build sent to TestFlight or Firebase must have a unique build number and be tied to a git tag. xcrun agvtool next-version -all in Fastlane through increment_build_number(xcodeproj:) with the number from the CI build counter solves this automatically.

Checklist of typical versioning mistakes:

  • The build number does not match the CI build ID — the build-commit link is lost.
  • Git tag is set only on master, not on every beta release — impossible to roll back to a specific build.
  • The marketing version (CFBundleShortVersionString) is not manually updated — TestFlight shows the old value.

What is included in the work (deliverables)

We set up CI/CD end-to-end, and as a result you get:

  • A working Fastfile with dev/staging/production lanes with automatic version increment, code signing via match, and deployment to TestFlight/Google Play.
  • Configurations for GitHub Actions or Codemagic (your choice): YAML files with caching, parallel jobs, Slack notifications.
  • App Store Connect API Key and push notification setup (APNs/FCM).
  • Documentation on running builds and updating certificates.
  • Team training: 2-hour online workshop on using the pipeline.
  • Post-release support for 14 days (fixing any potential errors).

Why trust us with setup?

We are a team of mobile developers with 5+ years of experience in CI/CD. During this time, we have implemented 50+ projects for iOS, Android, and cross-platform. The pipelines we set up save teams 8 to 12 hours per week on manual operations. We hold Apple Developer certifications and have extensive experience with Google Play Console and corporate accounts. The investment in setup pays off in 2–3 months. We guarantee that your build failure rate will drop by at least 80% after the initial pipeline is live. Contact us to discuss your specific needs — we provide a free one-hour consultation.

Timelines and cost

Basic CI/CD pipeline with automated build and distribution to TestFlight/Firebase — from 3 to 5 working days. Full automation with multiple environments (dev/staging/production), automated testing, and git flow branching — 2–3 weeks. Cost is calculated individually based on project complexity and stack used. Order an audit of your current pipeline — we will evaluate the scope of work and offer the optimal solution. Get a consultation — contact us.