content/guides/golang/deploy.md
In this section, you'll learn how to use Docker Desktop to deploy your application to a fully-featured Kubernetes environment on your development machine. This allows you to test and debug your workloads on Kubernetes locally before deploying.
In your project directory, create a file named
docker-go-kubernetes.yaml. Open the file in an IDE or text editor and add
the following contents. Replace DOCKER_USERNAME/REPO_NAME with your Docker
username and the name of the repository that you created in Configure CI/CD for
your Go application.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
service: server
name: server
namespace: default
spec:
replicas: 1
selector:
matchLabels:
service: server
strategy: {}
template:
metadata:
labels:
service: server
spec:
initContainers:
- name: wait-for-db
image: busybox:1.28
command:
[
"sh",
"-c",
'until nc -zv db 5432; do echo "waiting for db"; sleep 2; done;',
]
containers:
- env:
- name: PGDATABASE
value: mydb
- name: PGPASSWORD
value: whatever
- name: PGHOST
value: db
- name: PGPORT
value: "5432"
- name: PGUSER
value: postgres
image: DOCKER_USERNAME/REPO_NAME
name: server
imagePullPolicy: Always
ports:
- containerPort: 8080
hostPort: 8080
protocol: TCP
resources: {}
restartPolicy: Always
status: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
service: db
name: db
namespace: default
spec:
replicas: 1
selector:
matchLabels:
service: db
strategy:
type: Recreate
template:
metadata:
labels:
service: db
spec:
containers:
- env:
- name: POSTGRES_DB
value: mydb
- name: POSTGRES_PASSWORD
value: whatever
- name: POSTGRES_USER
value: postgres
image: postgres:18
name: db
ports:
- containerPort: 5432
protocol: TCP
resources: {}
restartPolicy: Always
status: {}
---
apiVersion: v1
kind: Service
metadata:
labels:
service: server
name: server
namespace: default
spec:
type: NodePort
ports:
- name: "8080"
port: 8080
targetPort: 8080
nodePort: 30001
selector:
service: server
status:
loadBalancer: {}
---
apiVersion: v1
kind: Service
metadata:
labels:
service: db
name: db
namespace: default
spec:
ports:
- name: "5432"
port: 5432
targetPort: 5432
selector:
service: db
status:
loadBalancer: {}
In this Kubernetes YAML file, there are four objects, separated by the ---. In addition to a Service and Deployment for the database, the other two objects are:
template, has just one container in it. The container is
created from the image built by GitHub Actions in Configure CI/CD for your
Go application.To learn more about Kubernetes objects, see the Kubernetes documentation.
In a terminal, navigate to the project directory and deploy your application to Kubernetes.
$ kubectl apply -f docker-go-kubernetes.yaml
You should see output that looks like the following, indicating your Kubernetes objects were created successfully.
deployment.apps/db created
service/db created
deployment.apps/server created
service/server created
Make sure everything worked by listing your deployments.
$ kubectl get deployments
Your deployment should be listed as follows:
NAME READY UP-TO-DATE AVAILABLE AGE
db 1/1 1 1 76s
server 1/1 1 1 76s
This indicates all of the pods are up and running. Do the same check for your services.
$ kubectl get services
You should get output like the following.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
db ClusterIP 10.96.156.90 <none> 5432/TCP 2m8s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 164m
server NodePort 10.102.94.225 <none> 8080:30001/TCP 2m8s
In addition to the default kubernetes service, you can see your server service and db service. The server service is accepting traffic on port 30001/TCP.
Open a terminal and curl your application to verify that it's working.
$ curl --request POST \
--url http://localhost:30001/send \
--header 'content-type: application/json' \
--data '{"value": "Hello, Oliver!"}'
You should get the following message back.
{ "value": "Hello, Oliver!" }
Run the following command to tear down your application.
$ kubectl delete -f docker-go-kubernetes.yaml
In this section, you learned how to use Docker Desktop to deploy your application to a fully-featured Kubernetes environment on your development machine.
Related information: