DEV Community

Kevin George
Kevin George

Posted on • Originally published at datastories.aletasystems.com on

1

Containers | QuickStart Docker Compose for SQL Server

‘Visual Studio Code + Compose File + Docker Plugin = Amazing’

In my previous post, introduction to docker we looked at how to get, start, stop and remove containers by running the various docker commands. Today, we will look at how to use docker-compose, followed by how easy it is to use with Visual Studio Code + vscode-docker extension.

Introduction to docker-compose

Dockers documentation on docker-compose.

Compose is a tool for defining and running multi-container Docker applications.

Note: docker-compose will only work with Linux containers. (At the moment).

Let us now break down the docker run command into a compose file.

docker run -d -p 14333:1433 --name myDocker --hostname myDocker -e sa_password='$3cureP@ssw0rd' -e ACCEPT_EULA=Y microsoft/mssql-server-linux

Recapping, we have a Microsoft/mssql-server-linux container named myDocker, running SQL Server on port 14333 with the SA password as $3cureP@ssw0rd.

version: '3'
services:
db:
image: microsoft/mssql-server-linux
environment:
SA_PASSWORD: $$3cureP@ssw0rd
ACCEPT_EULA: Y
ports:
- '14333:1433'

Let me explain what each line means, in a simplistic way.

Code Notes
version: '3' Version of Docker-Compose
services: A list Services in the container
____ db: A container named db
________ image: microsoft/mssql-server-linux The image that this services will use
________ environment: A list of environment variables
____________ SA_PASSWORD: $3cureP@ssw0rd The environment variable SA_PASSWORD with its value as $3cureP@ssw0rd
____________ ACCEPT_EULA: Y The environment variable ACCEPT_EULA with its value as Y
________ ports: A list of ports exposed by this container
____________ - '14333:1433' The mapping of container-port:1433 to 14333

_Spaces are important in YML files which is why I have used _ to represent them here.

Now that we have an understanding of the basics, how do we run a compose file?

Running a docker-compose file

To run a docker-compose file

  1. To run docker-compose -f "path\to\docker-compose.yml" up -d --build
  2. To tear-down docker-compose -f "path\to\docker-compose.yml" down
  3. to restart, well it is down and up :)

And now a screencast of how to run a docker-compose file in VS Code

docker-compose-upmp4 version(Ps: I used screentogif to make these)

Environment Variables in docker-compose file

If you recall, in the above screencast there was an error Invalid interpolation format for "environment" option in service "db": "$3cureP@ssw0rd". With a compose file you can use variables in the format of ${variable_name}.

Scenario: You don’t want to hard-code the password into your Docker-Compose file but would like it to be taken from a .env file (ideally it is not part of source-control).

In your docker-compose file you replace the hard-code password with a variable ${SQL_SERVER_PASSWORD}

version: '3'
services:
db:
image: microsoft/mssql-server-linux
environment:
SA_PASSWORD: ${SQL_SERVER_PASSWORD}
ACCEPT_EULA: Y
ports:
- '14333:1433'

Then you create a file name .env in the same folder as the docker-compose file.

SQL_SERVER_PASSWORD=$3cureP@ssw0rd

Now when you run docker-compose up it will automatically substitute the value of $3cureP@ssw0rd into ${SQL_SERVER_PASSWORD} and as a bonus docker will automatically escape the $ and change to $$

A snippet to run this code-example.

git clone https://github.com/kgeorge314/code-examples.git
cd ./code-examples/sql-server-docker-compose
# docker-up
docker-compose -f "docker-compose.yml" up -d --build
# docker-down
docker-compose -f "docker-compose.yml" down
# The Docker-Compose file after variable replacements
docker-compose config

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

The Most Contextual AI Development Assistant

Pieces.app image

Our centralized storage agent works on-device, unifying various developer tools to proactively capture and enrich useful materials, streamline collaboration, and solve complex problems through a contextual understanding of your unique workflow.

👥 Ideal for solo developers, teams, and cross-company projects

Learn more