SQL Server in Kubernetes on Docker for Windows

Last week Docker announced a feature that I’ve been looking forward to for a while: –

And sure enough, when I opened Docker for Windows, there was the update: –

Let’s run through the steps to get this setup. First of all, enable the feature in settings: –

Once installed, you’ll be able to confirm that Kubernetes is up and running: –

Awesome stuff, but how do we interact with it?

Now, if this is the first time working with Kubernetes you won’t have to perform the next couple of steps but just to confirm, run the following: –

kubectl config current-context

If your shell cannot find the kubectl command, add
C:\Program Files\Docker\Docker\Resources\bin\
to your PATH environment variable and restart your shell.

If the command outputs anything other than docker-for-desktop you will need to switch to the desktop cluster. To do this run: –

kubectl config use-context docker-for-desktop

In the above screenshot I switched from my mySQLK8sCluster1 (my AKS cluster) to docker-for-desktop and then ran: –

kubectl get nodes

Now we are ready to go and build a pod running SQL Server in Kubernetes on Docker for Windows 🙂

So in C:\temp create a file called sqlserver.yml and drop in: –

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: sqlserver
  labels:
    app: sqlserver
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: sqlserver
    spec:
      containers:
      - name: sqlserver
        image: microsoft/mssql-server-linux:latest
        ports:
        - containerPort: 1433
        env:
        - name: SA_PASSWORD
          value: "Testing1122"
        - name: ACCEPT_EULA
          value: "Y"
---
apiVersion: v1
kind: Service
metadata:
  name: sqlserver-service
spec:
  ports:
  - name: sqlserver
    port: 1433
    targetPort: 1433
  selector:
    name: sqlserver
  type: LoadBalancer

This is a very simple .yml file to create one pod running SQL Server. To create the pod: –

kubectl create -f C:\temp\sqlserver.yml

kubectl get pods

And boom! There we have a pod running SQL Server.

But how are we going to connect to it? OK, the second part of the yaml file defined a service which exposes an endpoint to allow us to connect. We can see the service by running: –

kubectl get services

The service we created is exposed on localhost (127.0.0.1) so we can use that and the port number specified in the yaml file (1433 in this example).

And boom! We are connected 🙂

We can also remote into the pod and verify that SQL is up and running: –

kubectl exec -it sqlserver /bin/bash

ps aux | grep sql

And there’s SQL running in the pod! Cool!

Thanks for reading!

6 thoughts on “SQL Server in Kubernetes on Docker for Windows

      • Thank you! I have it working after using your repo as an example but I still have a question. (Looking back on this, I think my original question should have been how do I find where on the host WSL2 docker/k8s actually puts stuff). I took your persistent volume yaml and changed the hostPath: path: to /c/DATA/MyStuff. On my windows host I have a directory at C:\DATA\MyStuff where I placed .mdf and .ldf files that I want to attach and use as my database. I used your sqlserver_persistentvolume yaml as is (though I did change the image to mcr.microsoft.com/mssql/server:latest). I could then use azure data studio to connect to my newly running sql instance.

        However, it does not use (host) C:\DATA\MyStuff and none of the files I placed there are available. I then ran k exec -it — bash to shell into the container and ran “touch /var/opt/mssql/data/hello_is_this_on.txt” and saw the file created. But still nothing in (host) C:\DATA\MyStuff.

        So then I ran k describe pv and found this:
        Type: HostPath (bare host directory volume)
        Path: /var/lib/k8s-pvs/mssql-data/pvc-1049f412-529e-4626-a73f-5f8306cc9cfb

        Which I was then able to use to discover that from the host, this shows up at \\wsl$\docker-desktop-data\mnt\wsl\docker-desktop-data\data\k8s-pvs\mssql-data\pvc-1049f412-529e-4626-a73f-5f8306cc9cfb.

        Which I guess is ok now that I know this is happening. But I’d like to understand how I was supposed to know this and why does it ignore my hostPath: path: “/c/DATA/MyStuff” path that I set in my pv yaml? I think this must be new for the WSL2 integration features but I haven’t found any docs that explain how this should work.

        Is there a way to avoid it ignoring my hostPath setting?

Leave a Reply to dbafromthecold Cancel reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s