diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..0a3cad6d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,36 @@
+ifeq ($(OS),Windows_NT)
+ SHELL := pwsh.exe
+else
+ SHELL := pwsh
+endif
+
+.SHELLFLAGS := -NoProfile -Command
+
+REGISTRY_NAME := ghcr.io/
+REPOSITORY_NAME := pcottle/
+IMAGE_NAME := learngitbranching
+TAG := :latest
+
+.PHONY: all clean test
+all: build
+
+getcommitid:
+ $(eval COMMITID = $(shell git log -1 --pretty=format:'%H'))
+
+getbranchname:
+ $(eval BRANCH_NAME = $(shell (git branch --show-current ) -replace '/','.'))
+
+build:
+ docker run --rm -v $${PWD}:/mnt --workdir /mnt node:14.20.0-alpine3.16 yarn install
+ docker run --rm -v $${PWD}:/mnt --workdir /mnt node:14.20.0-alpine3.16 yarn gulp fastBuild
+build_docker: getcommitid getbranchname
+ docker build -t $(REGISTRY_NAME)$(REPOSITORY_NAME)$(IMAGE_NAME)$(TAG) -t $(REGISTRY_NAME)$(REPOSITORY_NAME)$(IMAGE_NAME):$(BRANCH_NAME) -t $(REGISTRY_NAME)$(REPOSITORY_NAME)$(IMAGE_NAME):$(BRANCH_NAME)_$(COMMITID) .
+ docker build --target export --output type=local,dest=learnGitBranching_$(BRANCH_NAME)_$(COMMITID) .
+
+run:
+ docker run -p 8080:80 $(REGISTRY_NAME)$(REPOSITORY_NAME)$(IMAGE_NAME)$(TAG)
+
+clean:
+ echo 'not implemented'
+test:
+ echo 'not implemented'
\ No newline at end of file
diff --git a/README.md b/README.md
index dd70ccd5..9b369809 100644
--- a/README.md
+++ b/README.md
@@ -102,6 +102,14 @@ Alternatively, you can also build and run the app in a pre-configured online wor
[](https://gitpod.io/#https://github.com/pcottle/learnGitBranching/blob/main/src/js/git/index.js)
+### Docker
+
+You can run the most recently built stable image with `docker run -p 8080:80 ghcr.io/pcottle/learngitbranching:main`. Access your environment with at [http://localhost:8080/]()
+
+You can build the app and image with the command: `docker build -t ghcr.io/pcottle/learngitbranching:latest`. See the [Makefile](Makefile) for information on how to build locally with docker.
+
+
+
[//]: contributor-faces