Concrete CMS
In-context editing CMS with drag-and-drop page building.
Overview
Concrete CMS, formerly known as Concrete5, is a PHP-based content management system that revolutionizes website editing through its innovative in-context editing approach. Unlike traditional CMS platforms that require users to navigate to separate admin panels, Concrete CMS allows content editors to click directly on page elements and modify them in real-time while viewing the actual website. The platform features a sophisticated drag-and-drop page builder with block-based architecture, enabling users to construct complex layouts without technical expertise. Built with developer-friendly APIs and extensive customization options, Concrete CMS has powered thousands of websites since its inception in 2003, from small business sites to large enterprise portals. This Docker stack combines Concrete CMS with MySQL 8.0 to create a robust content management environment. MySQL's InnoDB storage engine provides ACID compliance and transactional integrity for Concrete's complex data relationships, including page versions, block configurations, and user permissions. The database's full-text search capabilities enhance Concrete's built-in search functionality, while MySQL's query cache optimizes performance for the frequent database queries generated by Concrete's dynamic page rendering system. This combination delivers exceptional performance for content-heavy websites that require frequent updates and complex permission structures. Content creators, marketing teams, and small development agencies will find this stack particularly valuable for projects requiring rapid content deployment and non-technical user management. The in-context editing eliminates the learning curve typically associated with CMS adoption, while MySQL's reliability ensures content remains accessible even under high traffic loads. Organizations migrating from static websites or seeking alternatives to WordPress will appreciate Concrete's intuitive interface and built-in features like form builders, file management, and user role systems.
Key Features
- In-context page editing with live preview - edit content directly on the frontend without backend admin panels
- Drag-and-drop block system with over 30 built-in block types including galleries, forms, and social media widgets
- Advanced page versioning and approval workflows with rollback capabilities for content management
- Built-in eCommerce functionality through the integrated marketplace and payment processing blocks
- Multilingual content management with translation interfaces and localized URL structures
- MySQL 8.0 JSON data type support for storing flexible block configurations and custom attributes
- Concrete's Express framework for rapid custom data structure creation with automatic form generation
- MySQL Group Replication compatibility for high-availability content delivery networks
Common Use Cases
- 1Marketing agencies managing multiple client websites with frequent content updates and custom layouts
- 2Educational institutions requiring multilingual sites with complex user hierarchies and course catalogs
- 3Real estate companies showcasing property listings with integrated search and filter capabilities
- 4Non-profit organizations building donation forms and event management systems with volunteer portals
- 5Small businesses transitioning from WordPress seeking more intuitive content editing workflows
- 6Corporate intranets requiring document management with granular permission controls and approval processes
- 7Event management companies creating registration systems with custom data collection and payment processing
Prerequisites
- Minimum 1GB RAM for MySQL 8.0 operations and Concrete's PHP processing requirements
- Port 80 available for web traffic, or modify the port mapping for alternative configurations
- Basic understanding of Concrete CMS block system and page types for effective content management
- Environment variables configured: DB_PASSWORD and ROOT_PASSWORD for database security
- Docker and Docker Compose installed with support for bind mounts and named volumes
- Understanding of PHP application deployment for custom theme development and troubleshooting
For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms
docker-compose.yml
docker-compose.yml
1services: 2 concrete: 3 image: concretecms/cms:latest4 container_name: concrete5 restart: unless-stopped6 environment: 7 CONCRETE5_DB_SERVER: mysql8 CONCRETE5_DB_USERNAME: concrete9 CONCRETE5_DB_PASSWORD: ${DB_PASSWORD}10 CONCRETE5_DB_DATABASE: concrete11 volumes: 12 - concrete_data:/var/www/html/application/files13 ports: 14 - "80:80"15 depends_on: 16 - mysql17 networks: 18 - concrete-network1920 mysql: 21 image: mysql:8.022 container_name: concrete-mysql23 environment: 24 MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}25 MYSQL_DATABASE: concrete26 MYSQL_USER: concrete27 MYSQL_PASSWORD: ${DB_PASSWORD}28 volumes: 29 - mysql_data:/var/lib/mysql30 networks: 31 - concrete-network3233volumes: 34 concrete_data: 35 mysql_data: 3637networks: 38 concrete-network: 39 driver: bridge.env Template
.env
1DB_PASSWORD=changeme2ROOT_PASSWORD=changemeUsage Notes
- 1Docs: https://documentation.concretecms.org/
- 2Access at http://localhost - installation wizard on first visit
- 3In-context editing: click on page elements to edit
- 4Block-based design with drag-and-drop
- 5Marketplace for themes, blocks, and add-ons
- 6Form builder, file manager, users/groups built-in
Individual Services(2 services)
Copy individual services to mix and match with your existing compose files.
concrete
concrete:
image: concretecms/cms:latest
container_name: concrete
restart: unless-stopped
environment:
CONCRETE5_DB_SERVER: mysql
CONCRETE5_DB_USERNAME: concrete
CONCRETE5_DB_PASSWORD: ${DB_PASSWORD}
CONCRETE5_DB_DATABASE: concrete
volumes:
- concrete_data:/var/www/html/application/files
ports:
- "80:80"
depends_on:
- mysql
networks:
- concrete-network
mysql
mysql:
image: mysql:8.0
container_name: concrete-mysql
environment:
MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}
MYSQL_DATABASE: concrete
MYSQL_USER: concrete
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
networks:
- concrete-network
Quick Start
terminal
1# 1. Create the compose file2cat > docker-compose.yml << 'EOF'3services:4 concrete:5 image: concretecms/cms:latest6 container_name: concrete7 restart: unless-stopped8 environment:9 CONCRETE5_DB_SERVER: mysql10 CONCRETE5_DB_USERNAME: concrete11 CONCRETE5_DB_PASSWORD: ${DB_PASSWORD}12 CONCRETE5_DB_DATABASE: concrete13 volumes:14 - concrete_data:/var/www/html/application/files15 ports:16 - "80:80"17 depends_on:18 - mysql19 networks:20 - concrete-network2122 mysql:23 image: mysql:8.024 container_name: concrete-mysql25 environment:26 MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}27 MYSQL_DATABASE: concrete28 MYSQL_USER: concrete29 MYSQL_PASSWORD: ${DB_PASSWORD}30 volumes:31 - mysql_data:/var/lib/mysql32 networks:33 - concrete-network3435volumes:36 concrete_data:37 mysql_data:3839networks:40 concrete-network:41 driver: bridge42EOF4344# 2. Create the .env file45cat > .env << 'EOF'46DB_PASSWORD=changeme47ROOT_PASSWORD=changeme48EOF4950# 3. Start the services51docker compose up -d5253# 4. View logs54docker compose logs -fOne-Liner
Run this command to download and set up the recipe in one step:
terminal
1curl -fsSL https://docker.recipes/api/recipes/concrete-cms/run | bashTroubleshooting
- Installation wizard shows database connection error: Verify CONCRETE5_DB_SERVER matches the MySQL service name and containers are on the same network
- Concrete CMS displays 'Fatal error: Maximum execution time exceeded': Increase PHP max_execution_time or optimize large file uploads through volume configuration
- MySQL container fails to start with 'Access denied for user': Check MYSQL_USER and MYSQL_PASSWORD environment variables match CONCRETE5_DB_USERNAME and CONCRETE5_DB_PASSWORD
- Page blocks disappear after container restart: Ensure concrete_data volume is properly mounted to persist uploaded files and cache data
- Concrete marketplace won't connect: Configure proper DNS resolution in the container or use manual package installation through volume mounts
- MySQL 'Table doesn't exist' errors during installation: Allow sufficient time for MySQL initialization or add healthcheck dependencies to ensure database readiness
Community Notes
Loading...
Loading notes...
Download Recipe Kit
Get all files in a ready-to-deploy package
Includes docker-compose.yml, .env template, README, and license
Ad Space
Shortcuts: C CopyF FavoriteD Download