I started a project recently that required that I connect a Microsoft SQL Server database with a Laravel 5.5 application, so I thought I’d document how I install the
pdo_sqlsrv module and install the Microsoft drivers for PHP in Docker.
Once you install the driver, you can easily configure Laravel to use a Microsoft SQL Server connection:
I use Docker with most of my PHP projects—I am releasing a book on using Docker with PHP next week—so I thought I’d show you the recipe for getting a SQL server connection with the PDO driver.
Dockerfile needed to install the perquisites and
pdo_sqlsrv PECL module:
FROM php:7.1-apache ENV ACCEPT_EULA=Y # Microsoft SQL Server Prerequisites RUN apt-get update \ && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \ && curl https://packages.microsoft.com/config/debian/9/prod.list \ > /etc/apt/sources.list.d/mssql-release.list \ && apt-get install -y --no-install-recommends \ locales \ apt-transport-https \ && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \ && locale-gen \ && apt-get update \ && apt-get -y --no-install-recommends install \ unixodbc-dev \ msodbcsql17 RUN docker-php-ext-install mbstring pdo pdo_mysql \ && pecl install sqlsrv pdo_sqlsrv xdebug \ && docker-php-ext-enable sqlsrv pdo_sqlsrv xdebug COPY index.php /var/www/html/
I was having difficulties installing the necessary packages with Debian Stretch and PHP 7.2, so I am using the official PHP 7.1 Docker image as the base image that I extend from at the time of writing.
I am demonstrating the apache version so it’s easy to serve up an
index.php file to verify the installation. In most of my projects I am using Caddy or Nginx as the web server, but Apache is an excellent choice too!
The first RUN instruction installs the packages necessary for installing the
unixodbc-dev packages successfully:
# Microsoft SQL Server Prerequisites RUN apt-get update \ && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \ && curl https://packages.microsoft.com/config/debian/9/prod.list \ > /etc/apt/sources.list.d/mssql-release.list \ && apt-get install -y --no-install-recommends \ locales \ apt-transport-https \ && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \ && locale-gen \ && apt-get update \ && apt-get -y --no-install-recommends install \ unixodbc-dev \ msodbcsql17
These packages are needed to install the PECL module for SQL Server’s PDO driver. You can find installation instructions for various platforms in the Microsoft/msphpsql GitHub project readme.
It’s also important to note that we set the
ACCEPT_EULA environment variable to
Y which is needed when running
apt-get install msodbcsql. It signifies that you’ve accepted the End-user license agreement when installing the package.
The next RUN instruction installs PHP extensions using the official PHP image’s
docker-php-ext-install script. In this case, I am installing a Laravel prerequisite
mbstring along with
RUN apt-get update \ && apt-get -y --no-install-recommends install \ libxml2-dev \ && docker-php-ext-install mbstring pdo pdo_mysql soap \ && pecl install sqlsrv pdo_sqlsrv xdebug \ && docker-php-ext-enable sqlsrv pdo_sqlsrv xdebug
Finally, the most important part of this RUN instruction, we are using
pecl to install the
pdo_sqlsrv modules, and then using
docker-php-ext-enable to enable them. I am also installing Xdebug because I typically install this in most images for development.
Building and Running The Container
The final instruction in the
Dockerfile is the COPY instruction that is copying a simple
index.php file that we will create now from the command line:
$ echo "<?php phpinfo();" > index.php
When we build the image, the Dockerfile will copy the index.php file in the location that Apache will look for it, and we can verify that the SQL Server drivers were installed and working with PHP.
You can build the image with the
docker build command to try it out real quick:
$ docker build --pull -t sqlserver-demo .
The image will take a few minutes depending on your connection speed. Once the build finishes, you can run it from the command line:
$ docker run --rm -p 8080:80 sqlserver-demo
docker run command runs the container, and with the help of the
-p 8080:80 flag, we have mapped
8080 to the container which is listening on port
--rm flag will remove the container once it exits.
After the container is running you should see some Apache logs in the console, and you can visit http://localhost:8080 in the browser to verify that the SQL Server module is enabled:
You should now be able to connect to a SQL Server database in your PHP 7.1 application! I’ve kept the example simple to just focus on the steps necessary to install the SQL Server PDO drivers, but I hope you can see how Docker can help ease the hassle of connecting to a Microsoft SQL database from your PHP applications.
Want to learn more about using Docker with PHP? I wrote a book, Docker for PHP Developers that is now available for sale. You can pick from one of two packages:
- The Book Only – (use offer code “laravel-news”)
- The Starter Bundle (use offer code “laravel-news”)
- The Complete Video Bundle (use offer code “laravelnews”)
The links included are affiliate links which means if you decide to buy Laravel News gets a little kickback to help run this site.
Filed in: News
Join the weekly newsletter and never miss out on new tips, tutorials, and more.
- Lead Front End Developer
- Full-Stack Laravel Developer
- Intermediate PHP Developer (Full Stack | CakePHP | Laravel | Vue | jQuery)
- Senior PHP Developer (Full Stack | CakePHP | Laravel | Vue | jQuery)
- Laravel Developer
Amsterdam (partially remote possible)
- Web Developer (Laravel)
Tweed Heads, New South Wales, AUSTRALIA
Tursa Employment & Training
- Laravel Experts needed-Remote position
Golden Sky ROI
Bootstrap 4 Stable Released, and What to Expect Next
Bootstrap 4 stable was released today! We’ve covered the progress of Bootstrap 4, from the first beta to the fi…
Oh Dear! Website and SSL Monitoring Application Is Now Live
Oh Dear! is a new SaaS application for website monitoring with multi-location uptime monitoring, mixed content detect…