├── .dockerignore
├── .gitignore
├── LICENSE
├── README.md
├── _archive
├── backend-async-messaging.md
├── backend-rest-api.md
├── frontend-reverse-proxy.md
├── frontend-web.md
├── img
│ ├── bonobo-new-repository.PNG
│ ├── bonobo-new-user.PNG
│ ├── bonobo-push-creds.PNG
│ ├── ferris-buellers-day-off.jpg
│ ├── grafana-add-data-source.png
│ ├── grafana-dashboard.png
│ ├── grafana-import-dashboard.png
│ ├── jenkins-continue-as-admin.PNG
│ ├── jenkins-creds-1.PNG
│ ├── jenkins-creds-2.PNG
│ ├── jenkins-creds-3.PNG
│ ├── jenkins-creds-4.PNG
│ ├── jenkins-creds.PNG
│ ├── jenkins-dockerId.PNG
│ ├── jenkins-job-bindings.PNG
│ ├── jenkins-job-build.PNG
│ ├── jenkins-job-scm.PNG
│ ├── jenkins-plugins.PNG
│ ├── jenkins-powershell-plugin.PNG
│ ├── prometheus-metrics.png
│ ├── signup-homepage.png
│ └── signup-kibana.png
├── intro.md
├── lab-vm.md
├── part-2.md
├── part-2
│ ├── db-credentials.env
│ ├── images
│ │ ├── app-v1.0.png
│ │ └── app-v1.1.png
│ ├── web-1.0
│ │ ├── Dockerfile
│ │ ├── SignUp-1.0.msi
│ │ └── bootstrap.ps1
│ ├── web-1.1
│ │ ├── Dockerfile
│ │ ├── SignUp-1.1.msi
│ │ └── bootstrap.ps1
│ └── web-1.2
│ │ └── Dockerfile
├── part-3.md
├── part-3
│ ├── homepage
│ │ ├── Dockerfile
│ │ └── index.html
│ ├── images
│ │ ├── app-v1.png
│ │ ├── v1-arch.png
│ │ └── v2-arch.png
│ ├── index-handler
│ │ └── Dockerfile
│ ├── save-handler
│ │ └── Dockerfile
│ └── web-1.3
│ │ ├── Dockerfile
│ │ └── bootstrap.ps1
├── part-4.md
├── part-4
│ ├── grafana
│ │ ├── Dockerfile
│ │ └── SignUp-dashboard.json
│ ├── prometheus
│ │ ├── Dockerfile
│ │ └── prometheus.yml
│ └── web-1.4
│ │ ├── Dockerfile
│ │ └── bootstrap.ps1
├── part-5
│ ├── db.sql
│ └── db
│ │ ├── Dockerfile
│ │ └── Initialize-Database.ps1
├── part-6
│ ├── 01-build.ps1
│ ├── 02-run.ps1
│ ├── 03-test.ps1
│ ├── 04-push.ps1
│ ├── app
│ │ ├── db-credentials.env
│ │ ├── docker-compose.build.yml
│ │ ├── docker-compose.dev.yml
│ │ ├── docker-compose.local.yml
│ │ └── docker-compose.yml
│ ├── e2e-tests
│ │ └── Dockerfile
│ ├── infrastructure
│ │ └── docker-compose.yml
│ ├── jenkins
│ │ └── Dockerfile
│ └── write-hosts.ps1
├── part-7
│ ├── create-services.ps1
│ ├── db-credentials.env
│ ├── docker-compose.prod.yml
│ └── docker-compose.yml
├── setup.md
├── thankyou.md
├── x-part-5.md
├── x-part-6.md
└── x-part-7.md
├── app
├── configs
│ └── log4net.config
├── secrets
│ └── connectionStrings.config
├── v1.yml
├── v10.yml
├── v11-core.yml
├── v11-dev.yml
├── v11-prod.yml
├── v2.yml
├── v3.yml
├── v4.yml
├── v5.yml
├── v6.yml
├── v7.yml
├── v8.yml
└── v9.yml
├── ci
├── build.ps1
├── docker-compose-build-v1.yml
├── docker-compose-build-v2.yml
├── docker-compose-build-v3.yml
├── docker-compose-build-v4.yml
├── docker-compose-build-v5.yml
├── docker-compose-build-v6.yml
├── docker-compose-build-v7.yml
├── docker-compose-build.yml
├── docker-compose-local.yml
├── docker-compose.yml
└── ship.ps1
├── docker
├── 101-dockerfiles-and-images
│ ├── hostname-app
│ │ ├── Dockerfile
│ │ └── default.aspx
│ └── tweet-app
│ │ ├── Dockerfile
│ │ ├── index.html
│ │ └── start.ps1
├── 101-image-registries
│ └── hostname-app-v2
│ │ ├── Dockerfile
│ │ └── default.aspx
├── backend-analytics
│ └── index-handler
│ │ └── Dockerfile
├── backend-async-messaging
│ └── save-handler
│ │ └── Dockerfile
├── backend-rest-api
│ └── reference-data-api
│ │ └── Dockerfile
├── frontend-reverse-proxy
│ ├── homepage
│ │ ├── Dockerfile
│ │ ├── img
│ │ │ ├── docker-enterprise.png
│ │ │ ├── dockercon-eu-2018.png
│ │ │ └── dockercon-us-2018.png
│ │ └── index.html
│ └── reverse-proxy
│ │ └── Dockerfile
├── frontend-web
│ ├── v1
│ │ └── Dockerfile
│ └── v2
│ │ └── Dockerfile
├── metrics-application
│ ├── index-handler
│ │ └── Dockerfile
│ └── save-handler
│ │ └── Dockerfile
├── metrics-dashboard
│ ├── grafana
│ │ ├── Dockerfile
│ │ ├── dashboard-provider.yaml
│ │ ├── datasource-prometheus.yaml
│ │ ├── init.ps1
│ │ └── signup-dashboard.json
│ └── prometheus
│ │ ├── Dockerfile
│ │ └── prometheus.yml
├── metrics-runtime
│ └── signup-web
│ │ ├── Dockerfile
│ │ └── startup.ps1
├── prod-config
│ ├── save-handler
│ │ ├── Dockerfile
│ │ └── startup.ps1
│ └── signup-web
│ │ ├── Dockerfile
│ │ └── startup.ps1
├── prod-dependencies
│ ├── signup-db
│ │ ├── Dockerfile
│ │ └── Initialize-Database.ps1
│ └── signup-web
│ │ ├── Dockerfile
│ │ └── startup.ps1
├── prod-health
│ └── signup-web
│ │ ├── Dockerfile
│ │ └── startup.ps1
├── prod-logging
│ └── signup-web
│ │ ├── Dockerfile
│ │ └── startup.ps1
└── sql-server
│ ├── Dockerfile
│ └── start.ps1
├── slides
├── 101.pptx
├── backend.pptx
├── contents
│ ├── 1809.txt
│ ├── buildstufflt18.txt
│ ├── dceu18.txt
│ ├── dcus18.txt
│ ├── dcus19.txt
│ ├── devsum19.txt
│ ├── dvla19.txt
│ ├── gbe19.txt
│ ├── master.txt
│ ├── pslive19.txt
│ ├── sdd19.txt
│ ├── slcnet.txt
│ └── techoramanl18.txt
├── docker
│ └── windows
│ │ ├── Dockerfile
│ │ └── build.ps1
├── fonts
│ ├── geomanist
│ │ └── hinted-Geomanist-Book.woff2
│ ├── glyphicons-halflings-regular.eot
│ ├── glyphicons-halflings-regular.svg
│ ├── glyphicons-halflings-regular.ttf
│ └── glyphicons-halflings-regular.woff
├── frontend.pptx
├── img
│ ├── 101
│ │ ├── Slide1.PNG
│ │ ├── Slide2.PNG
│ │ └── Slide3.PNG
│ ├── backend
│ │ ├── Slide1.PNG
│ │ ├── Slide2.PNG
│ │ └── Slide3.PNG
│ ├── docker.png
│ ├── frontend
│ │ ├── Slide1.PNG
│ │ └── Slide2.PNG
│ ├── metrics
│ │ └── Slide1.PNG
│ └── prod
│ │ ├── Slide1.PNG
│ │ ├── Slide2.PNG
│ │ ├── Slide3.PNG
│ │ ├── Slide4.PNG
│ │ ├── Slide5.PNG
│ │ ├── Slide6.PNG
│ │ ├── Slide7.PNG
│ │ ├── Slide8.PNG
│ │ └── Slide9.PNG
├── lib
│ └── clipboard.min.js
├── metrics.pptx
├── netlify
│ └── build.sh
├── prod.pptx
├── reveal
│ ├── css
│ │ ├── print
│ │ │ ├── paper.css
│ │ │ └── pdf.css
│ │ ├── reveal.css
│ │ ├── reveal.scss
│ │ └── theme
│ │ │ ├── README.md
│ │ │ ├── beige.css
│ │ │ ├── black.css
│ │ │ ├── blood.css
│ │ │ ├── league.css
│ │ │ ├── moon.css
│ │ │ ├── night.css
│ │ │ ├── serif.css
│ │ │ ├── simple.css
│ │ │ ├── sky.css
│ │ │ ├── solarized.css
│ │ │ ├── source
│ │ │ ├── beige.scss
│ │ │ ├── black.scss
│ │ │ ├── blood.scss
│ │ │ ├── league.scss
│ │ │ ├── moon.scss
│ │ │ ├── night.scss
│ │ │ ├── serif.scss
│ │ │ ├── simple.scss
│ │ │ ├── sky.scss
│ │ │ ├── solarized.scss
│ │ │ └── white.scss
│ │ │ ├── template
│ │ │ ├── mixins.scss
│ │ │ ├── settings.scss
│ │ │ └── theme.scss
│ │ │ └── white.css
│ ├── js
│ │ └── reveal.js
│ ├── lib
│ │ ├── css
│ │ │ └── zenburn.css
│ │ ├── font
│ │ │ ├── league-gothic
│ │ │ │ ├── LICENSE
│ │ │ │ ├── league-gothic.css
│ │ │ │ ├── league-gothic.eot
│ │ │ │ ├── league-gothic.ttf
│ │ │ │ └── league-gothic.woff
│ │ │ └── source-sans-pro
│ │ │ │ ├── LICENSE
│ │ │ │ ├── source-sans-pro-italic.eot
│ │ │ │ ├── source-sans-pro-italic.ttf
│ │ │ │ ├── source-sans-pro-italic.woff
│ │ │ │ ├── source-sans-pro-regular.eot
│ │ │ │ ├── source-sans-pro-regular.ttf
│ │ │ │ ├── source-sans-pro-regular.woff
│ │ │ │ ├── source-sans-pro-semibold.eot
│ │ │ │ ├── source-sans-pro-semibold.ttf
│ │ │ │ ├── source-sans-pro-semibold.woff
│ │ │ │ ├── source-sans-pro-semibolditalic.eot
│ │ │ │ ├── source-sans-pro-semibolditalic.ttf
│ │ │ │ ├── source-sans-pro-semibolditalic.woff
│ │ │ │ └── source-sans-pro.css
│ │ └── js
│ │ │ ├── classList.js
│ │ │ ├── head.min.js
│ │ │ └── html5shiv.js
│ └── plugin
│ │ ├── highlight
│ │ └── highlight.js
│ │ ├── markdown
│ │ ├── example.html
│ │ ├── example.md
│ │ ├── markdown.js
│ │ └── marked.js
│ │ ├── math
│ │ └── math.js
│ │ ├── multiplex
│ │ ├── client.js
│ │ ├── index.js
│ │ ├── master.js
│ │ └── package.json
│ │ ├── notes-server
│ │ ├── client.js
│ │ ├── index.js
│ │ └── notes.html
│ │ ├── notes
│ │ ├── notes.html
│ │ └── notes.js
│ │ ├── print-pdf
│ │ └── print-pdf.js
│ │ ├── search
│ │ └── search.js
│ │ └── zoom-js
│ │ └── zoom.js
├── run-local.ps1
├── sections
│ ├── 101-container-basics.md
│ ├── 101-dockerfiles-and-images.md
│ ├── 101-image-registries.md
│ ├── backend-analytics.md
│ ├── backend-async-messaging.md
│ ├── backend-rest-api.md
│ ├── frontend-reverse-proxy.md
│ ├── frontend-web.md
│ ├── intro.md
│ ├── metrics-application.md
│ ├── metrics-dashboard.md
│ ├── metrics-runtime.md
│ ├── nfr-restart.md
│ ├── nfr-scale.md
│ ├── nfr-storage.md
│ ├── prod-config.md
│ ├── prod-dependencies.md
│ ├── prod-health.md
│ ├── prod-intro.md
│ ├── prod-logging.md
│ ├── swarm-services.md
│ ├── swarm-setup.md
│ ├── swarm-stack.md
│ └── thankyou.md
├── template.html
└── workshop.css
├── src
├── SignUp.Api.ReferenceData
│ ├── Controllers
│ │ ├── CountriesController.cs
│ │ └── RolesController.cs
│ ├── Program.cs
│ ├── Repositories
│ │ ├── CountryRepository.cs
│ │ ├── RoleRepository.cs
│ │ └── Spec
│ │ │ ├── IRepository.cs
│ │ │ └── RepositoryBase.cs
│ ├── SignUp.Api.ReferenceData.csproj
│ ├── Startup.cs
│ ├── appsettings.Development.json
│ └── appsettings.json
├── SignUp.Core
│ ├── Config.cs
│ └── SignUp.Core.csproj
├── SignUp.EndToEndTests
│ ├── App.config
│ ├── AssertHelper.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── ProspectSignUp.feature
│ ├── ProspectSignUp.feature.cs
│ ├── ProspectSignUpSteps.cs
│ ├── SignUp.EndToEndTests.csproj
│ └── packages.config
├── SignUp.Entities
│ ├── Country.cs
│ ├── Prospect.cs
│ ├── Role.cs
│ └── SignUp.Entities.csproj
├── SignUp.MessageHandlers.IndexProspect
│ ├── Documents
│ │ └── Prospect.cs
│ ├── Indexer
│ │ └── Index.cs
│ ├── Program.cs
│ ├── SignUp.MessageHandlers.IndexProspect.csproj
│ ├── Workers
│ │ └── QueueWorker.cs
│ └── appsettings.json
├── SignUp.MessageHandlers.SaveProspect
│ ├── App.config
│ ├── Program.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── SignUp.MessageHandlers.SaveProspect.csproj
│ ├── appsettings.json
│ ├── connectionStrings.config
│ └── packages.config
├── SignUp.Messaging
│ ├── MessageHelper.cs
│ ├── MessageQueue.cs
│ ├── Messages
│ │ ├── Events
│ │ │ └── ProspectSignedUpEvent.cs
│ │ └── Message.cs
│ └── SignUp.Messaging.csproj
├── SignUp.Model
│ ├── App.config
│ ├── Initializers
│ │ └── StaticDataInitializer.cs
│ ├── ProductLaunchConfiguration.cs
│ ├── ProductLaunchContext.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── SignUp.Model.csproj
│ └── packages.config
├── SignUp.Web.Setup
│ ├── Product.wxs
│ ├── ProductLaunch.Web.Setup.wixproj
│ └── package-msi.ps1
├── SignUp.Web
│ ├── About.aspx
│ ├── About.aspx.cs
│ ├── About.aspx.designer.cs
│ ├── App_Data
│ │ ├── .diagnostics
│ │ │ └── SignUp.Web-configuration.txt
│ │ ├── nsb_log_2018-10-18_0.txt
│ │ └── nsb_log_2018-10-19_0.txt
│ ├── App_Start
│ │ ├── BundleConfig.cs
│ │ └── RouteConfig.cs
│ ├── Bundle.config
│ ├── Contact.aspx
│ ├── Contact.aspx.cs
│ ├── Contact.aspx.designer.cs
│ ├── Content
│ │ ├── Site.css
│ │ ├── bootstrap-grid.css
│ │ ├── bootstrap-grid.css.map
│ │ ├── bootstrap-grid.min.css
│ │ ├── bootstrap-grid.min.css.map
│ │ ├── bootstrap-reboot.css
│ │ ├── bootstrap-reboot.css.map
│ │ ├── bootstrap-reboot.min.css
│ │ ├── bootstrap-reboot.min.css.map
│ │ ├── bootstrap.css
│ │ ├── bootstrap.css.map
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ ├── Default.aspx
│ ├── Default.aspx.cs
│ ├── Default.aspx.designer.cs
│ ├── Global.asax
│ ├── Global.asax.cs
│ ├── Logging
│ │ ├── Log.cs
│ │ └── LogLevel.cs
│ ├── Project_Readme.html
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── ProspectSave
│ │ ├── AsynchronousProspectSaveHandler.cs
│ │ ├── IProspectSaveHandler.cs
│ │ └── SynchronousProspectSaveHandler.cs
│ ├── ReferenceData
│ │ ├── ApiReferenceDataLoader.cs
│ │ ├── DatabaseReferenceDataLoader.cs
│ │ └── IReferenceDataLoader.cs
│ ├── Scripts
│ │ ├── README.md
│ │ ├── WebForms
│ │ │ ├── DetailsView.js
│ │ │ ├── Focus.js
│ │ │ ├── GridView.js
│ │ │ ├── MSAjax
│ │ │ │ ├── MicrosoftAjax.js
│ │ │ │ ├── MicrosoftAjaxApplicationServices.js
│ │ │ │ ├── MicrosoftAjaxComponentModel.js
│ │ │ │ ├── MicrosoftAjaxCore.js
│ │ │ │ ├── MicrosoftAjaxGlobalization.js
│ │ │ │ ├── MicrosoftAjaxHistory.js
│ │ │ │ ├── MicrosoftAjaxNetwork.js
│ │ │ │ ├── MicrosoftAjaxSerialization.js
│ │ │ │ ├── MicrosoftAjaxTimer.js
│ │ │ │ ├── MicrosoftAjaxWebForms.js
│ │ │ │ └── MicrosoftAjaxWebServices.js
│ │ │ ├── Menu.js
│ │ │ ├── MenuStandards.js
│ │ │ ├── SmartNav.js
│ │ │ ├── TreeView.js
│ │ │ ├── WebForms.js
│ │ │ ├── WebParts.js
│ │ │ └── WebUIValidation.js
│ │ ├── _references.js
│ │ ├── bootstrap.bundle.js
│ │ ├── bootstrap.bundle.js.map
│ │ ├── bootstrap.bundle.min.js
│ │ ├── bootstrap.bundle.min.js.map
│ │ ├── bootstrap.js
│ │ ├── bootstrap.js.map
│ │ ├── bootstrap.min.js
│ │ ├── bootstrap.min.js.map
│ │ ├── esm
│ │ │ ├── popper-utils.js
│ │ │ ├── popper-utils.js.map
│ │ │ ├── popper-utils.min.js
│ │ │ ├── popper-utils.min.js.map
│ │ │ ├── popper.js
│ │ │ ├── popper.js.map
│ │ │ ├── popper.min.js
│ │ │ └── popper.min.js.map
│ │ ├── index.d.ts
│ │ ├── jquery-1.10.2.intellisense.js
│ │ ├── jquery-3.3.1.intellisense.js
│ │ ├── jquery-3.3.1.js
│ │ ├── jquery-3.3.1.min.js
│ │ ├── jquery-3.3.1.min.map
│ │ ├── jquery-3.3.1.slim.js
│ │ ├── jquery-3.3.1.slim.min.js
│ │ ├── jquery-3.3.1.slim.min.map
│ │ ├── modernizr-2.6.2.js
│ │ ├── modernizr-2.8.3.js
│ │ ├── popper-utils.js
│ │ ├── popper-utils.js.map
│ │ ├── popper-utils.min.js
│ │ ├── popper-utils.min.js.map
│ │ ├── popper.js
│ │ ├── popper.js.map
│ │ ├── popper.min.js
│ │ ├── popper.min.js.map
│ │ ├── respond.js
│ │ ├── respond.matchmedia.addListener.js
│ │ ├── respond.matchmedia.addListener.min.js
│ │ ├── respond.min.js
│ │ └── umd
│ │ │ ├── popper-utils.js
│ │ │ ├── popper-utils.js.map
│ │ │ ├── popper-utils.min.js
│ │ │ ├── popper-utils.min.js.map
│ │ │ ├── popper.js
│ │ │ ├── popper.js.map
│ │ │ ├── popper.min.js
│ │ │ └── popper.min.js.map
│ ├── SignUp.Web.csproj
│ ├── SignUp.aspx
│ ├── SignUp.aspx.cs
│ ├── SignUp.aspx.designer.cs
│ ├── Site.Master
│ ├── Site.Master.cs
│ ├── Site.Master.designer.cs
│ ├── Site.Mobile.Master
│ ├── Site.Mobile.Master.cs
│ ├── Site.Mobile.Master.designer.cs
│ ├── ThankYou.aspx
│ ├── ThankYou.aspx.cs
│ ├── ThankYou.aspx.designer.cs
│ ├── ViewSwitcher.ascx
│ ├── ViewSwitcher.ascx.cs
│ ├── ViewSwitcher.ascx.designer.cs
│ ├── Web.Debug.config
│ ├── Web.Release.config
│ ├── Web.config
│ ├── appsettings.json
│ ├── connectionStrings.config
│ ├── favicon.ico
│ ├── fonts
│ │ └── geomanist
│ │ │ └── hinted-Geomanist-Book.woff2
│ ├── img
│ │ ├── docker-enterprise.png
│ │ ├── dockercon-2017.png
│ │ ├── dockercon-eu-2017.png
│ │ ├── dockercon-eu-2018.png
│ │ ├── dockercon-us-2017.png
│ │ └── dockercon-us-2018.png
│ ├── log4net.config
│ └── packages.config
├── SignUp.sln
├── Utilities.DependencyCheck
│ ├── App.config
│ ├── Program.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── Utilities.DependencyCheck.csproj
│ ├── connectionStrings.config
│ └── packages.config
├── Utilities.HealthCheck
│ ├── App.config
│ ├── Program.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ └── Utilities.HealthCheck.csproj
├── Utilities.sln
└── build-web.bat
└── workshop
├── chat
└── docker-compose.yml
├── lab-vm
├── docker
│ └── daemon.json
├── setup.ps1
├── update.ps1
├── verify.ps1
└── verify
│ └── Dockerfile
├── raffle
├── Dockerfile
├── README.md
└── raffle.ps1
└── vote
└── docker-compose.yml
/.dockerignore:
--------------------------------------------------------------------------------
1 | **
2 | !src/
3 | !docker/
4 | src/.vs
5 | src/packages
6 | **/obj
7 | **/bin
--------------------------------------------------------------------------------
/_archive/img/bonobo-new-repository.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/bonobo-new-repository.PNG
--------------------------------------------------------------------------------
/_archive/img/bonobo-new-user.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/bonobo-new-user.PNG
--------------------------------------------------------------------------------
/_archive/img/bonobo-push-creds.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/bonobo-push-creds.PNG
--------------------------------------------------------------------------------
/_archive/img/ferris-buellers-day-off.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/ferris-buellers-day-off.jpg
--------------------------------------------------------------------------------
/_archive/img/grafana-add-data-source.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/grafana-add-data-source.png
--------------------------------------------------------------------------------
/_archive/img/grafana-dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/grafana-dashboard.png
--------------------------------------------------------------------------------
/_archive/img/grafana-import-dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/grafana-import-dashboard.png
--------------------------------------------------------------------------------
/_archive/img/jenkins-continue-as-admin.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/jenkins-continue-as-admin.PNG
--------------------------------------------------------------------------------
/_archive/img/jenkins-creds-1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/jenkins-creds-1.PNG
--------------------------------------------------------------------------------
/_archive/img/jenkins-creds-2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/jenkins-creds-2.PNG
--------------------------------------------------------------------------------
/_archive/img/jenkins-creds-3.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/jenkins-creds-3.PNG
--------------------------------------------------------------------------------
/_archive/img/jenkins-creds-4.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/jenkins-creds-4.PNG
--------------------------------------------------------------------------------
/_archive/img/jenkins-creds.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/jenkins-creds.PNG
--------------------------------------------------------------------------------
/_archive/img/jenkins-dockerId.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/jenkins-dockerId.PNG
--------------------------------------------------------------------------------
/_archive/img/jenkins-job-bindings.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/jenkins-job-bindings.PNG
--------------------------------------------------------------------------------
/_archive/img/jenkins-job-build.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/jenkins-job-build.PNG
--------------------------------------------------------------------------------
/_archive/img/jenkins-job-scm.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/jenkins-job-scm.PNG
--------------------------------------------------------------------------------
/_archive/img/jenkins-plugins.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/jenkins-plugins.PNG
--------------------------------------------------------------------------------
/_archive/img/jenkins-powershell-plugin.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/jenkins-powershell-plugin.PNG
--------------------------------------------------------------------------------
/_archive/img/prometheus-metrics.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/prometheus-metrics.png
--------------------------------------------------------------------------------
/_archive/img/signup-homepage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/signup-homepage.png
--------------------------------------------------------------------------------
/_archive/img/signup-kibana.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/img/signup-kibana.png
--------------------------------------------------------------------------------
/_archive/lab-vm.md:
--------------------------------------------------------------------------------
1 | # Lab VM
2 |
3 | At a hosted workshop you will be given your own VM to use, running in the cloud.
4 |
5 | If you're doing this at home, the easiest way to setup your own environment is to create a VM on Azure.
6 |
7 | ## Create and configure the VM
8 |
9 | - create a DevTest lab (so the VM automatically shuts down and doesn't incur extra charges)
10 | - create a VM from the **Windows Server 2016 - with Containers** image (any size will do, but D3V2 is a good choice)
11 | - connect to the VM and run Windows Update (I use `sconfig`, and I also set updates to _Manual_ so there's no interruption later)
12 | - run the [setup.ps1](lab-vm/setup.ps1) script which I use to prep the lab VM:
13 |
14 | ```
15 | iwr -useb https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/master/lab-vm/setup.ps1 | iex
16 | ```
17 |
18 | That script does a few things:
19 |
20 | - updates Docker to the latest version
21 | - installs a few tools, like VS Code, Git and Firefox
22 | - pulls all the Docker images used in the lab
23 |
24 | ## Clone the workshop repo
25 |
26 | After the script completes, you have Git installed so you can clone the repo:
27 |
28 | ```
29 | mkdir C:\scm
30 | cd C:\scm
31 | git clone https://github.com/sixeyed/docker-windows-workshop.git
32 | ```
33 |
34 | The workshop also expects an environment variable for the repo path:
35 |
36 | ```
37 | $env:workshop='C:\scm\docker-windows-workshop'
38 | ```
--------------------------------------------------------------------------------
/_archive/part-2/db-credentials.env:
--------------------------------------------------------------------------------
1 | sa_password=DockerCon!!!
2 | DB_CONNECTION_STRING=Server=mta-db;Database=ProductLaunch;User Id=sa;Password=DockerCon!!!
3 |
--------------------------------------------------------------------------------
/_archive/part-2/images/app-v1.0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/part-2/images/app-v1.0.png
--------------------------------------------------------------------------------
/_archive/part-2/images/app-v1.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/part-2/images/app-v1.1.png
--------------------------------------------------------------------------------
/_archive/part-2/web-1.0/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM microsoft/aspnet:4.7.1-windowsservercore-10.0.14393.1884
3 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
4 |
5 | ENTRYPOINT ["powershell", "./bootstrap.ps1"]
6 | COPY bootstrap.ps1 /
7 |
8 | COPY SignUp-1.0.msi /
9 | RUN Start-Process msiexec.exe -ArgumentList '/i', 'C:\SignUp-1.0.msi', '/quiet', '/norestart' -NoNewWindow -Wait
--------------------------------------------------------------------------------
/_archive/part-2/web-1.0/SignUp-1.0.msi:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/part-2/web-1.0/SignUp-1.0.msi
--------------------------------------------------------------------------------
/_archive/part-2/web-1.0/bootstrap.ps1:
--------------------------------------------------------------------------------
1 | Write-Output 'Bootstrap starting'
2 |
3 | # copy process-level environment variables (from `docker run`) machine-wide
4 | foreach($key in [System.Environment]::GetEnvironmentVariables('Process').Keys) {
5 | if ([System.Environment]::GetEnvironmentVariable($key, 'Machine') -eq $null) {
6 | $value = [System.Environment]::GetEnvironmentVariable($key, 'Process')
7 | [System.Environment]::SetEnvironmentVariable($key, $value, 'Machine')
8 | Write-Output "Set environment variable: $key"
9 | }
10 | }
11 |
12 | Write-Output 'Running ServiceMonitor'
13 | & C:\ServiceMonitor.exe w3svc
--------------------------------------------------------------------------------
/_archive/part-2/web-1.1/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM microsoft/aspnet:4.7.1-windowsservercore-10.0.14393.1884
3 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
4 |
5 | ENTRYPOINT ["powershell", "./bootstrap.ps1"]
6 | COPY bootstrap.ps1 /
7 |
8 | COPY SignUp-1.1.msi /
9 | RUN Start-Process msiexec.exe -ArgumentList '/i', 'C:\SignUp-1.1.msi', '/quiet', '/norestart' -NoNewWindow -Wait
--------------------------------------------------------------------------------
/_archive/part-2/web-1.1/SignUp-1.1.msi:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/part-2/web-1.1/SignUp-1.1.msi
--------------------------------------------------------------------------------
/_archive/part-2/web-1.1/bootstrap.ps1:
--------------------------------------------------------------------------------
1 | Write-Output 'Bootstrap starting'
2 |
3 | # copy process-level environment variables (from `docker run`) machine-wide
4 | foreach($key in [System.Environment]::GetEnvironmentVariables('Process').Keys) {
5 | if ([System.Environment]::GetEnvironmentVariable($key, 'Machine') -eq $null) {
6 | $value = [System.Environment]::GetEnvironmentVariable($key, 'Process')
7 | [System.Environment]::SetEnvironmentVariable($key, $value, 'Machine')
8 | Write-Output "Set environment variable: $key"
9 | }
10 | }
11 |
12 | Write-Output 'Running ServiceMonitor'
13 | & C:\ServiceMonitor.exe w3svc
--------------------------------------------------------------------------------
/_archive/part-2/web-1.2/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM dockersamples/mta-dev-web-builder:4.7.1 AS builder
3 |
4 | WORKDIR C:\src\SignUp.Web
5 | COPY signup\src\SignUp.Web\packages.config .
6 | RUN nuget restore packages.config -PackagesDirectory ..\packages
7 |
8 | COPY signup\src C:\src
9 | RUN msbuild SignUp.Web.csproj /p:OutputPath=c:\out /p:DeployOnBuild=true
10 |
11 | # app image
12 | FROM microsoft/aspnet:4.7.1-windowsservercore-ltsc2016
13 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
14 |
15 | RUN Remove-Website -Name 'Default Web Site';`
16 | New-Item -Path 'C:\web-app' -Type Directory; `
17 | New-Website -Name 'web-app' -Port 80 -PhysicalPath 'C:\web-app'
18 |
19 | HEALTHCHECK --interval=5s `
20 | CMD powershell -command `
21 | try { `
22 | $response = iwr http://localhost/SignUp -UseBasicParsing; `
23 | if ($response.StatusCode -eq 200) { return 0} `
24 | else {return 1}; `
25 | } catch { return 1 }
26 |
27 | ENTRYPOINT ["powershell", "C:\\bootstrap.ps1"]
28 |
29 | COPY .\signup\docker\bootstrap.ps1 C:\
30 | COPY --from=builder C:\out\_PublishedWebsites\SignUp.Web C:\web-app
--------------------------------------------------------------------------------
/_archive/part-3/homepage/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM microsoft/iis:nanoserver-sac2016
2 | COPY index.html c:/inetpub/wwwroot/index.html
--------------------------------------------------------------------------------
/_archive/part-3/homepage/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Meet Play with Docker...
4 |
18 |
19 |
20 |
21 |
26 |
27 |
28 |
29 |
32 |
33 |
--------------------------------------------------------------------------------
/_archive/part-3/images/app-v1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/part-3/images/app-v1.png
--------------------------------------------------------------------------------
/_archive/part-3/images/v1-arch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/part-3/images/v1-arch.png
--------------------------------------------------------------------------------
/_archive/part-3/images/v2-arch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/_archive/part-3/images/v2-arch.png
--------------------------------------------------------------------------------
/_archive/part-3/index-handler/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM microsoft/dotnet-framework-build:4.7.1-windowsservercore-ltsc2016 AS builder
3 |
4 | WORKDIR C:\src\SignUp.MessageHandlers.IndexProspect
5 | COPY signup\src\SignUp.MessageHandlers.IndexProspect\packages.config .
6 | RUN nuget restore packages.config -PackagesDirectory ..\packages
7 |
8 | COPY signup\src C:\src
9 | RUN msbuild SignUp.MessageHandlers.IndexProspect.csproj /p:OutputPath=c:\out\index-prospect\IndexProspectHandler
10 |
11 | # app image
12 | FROM microsoft/windowsservercore:ltsc2016
13 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
14 |
15 | WORKDIR /index-prospect-handler
16 | CMD .\SignUp.MessageHandlers.IndexProspect.exe
17 |
18 | ENV MESSAGE_QUEUE_URL="nats://message-queue:4222" `
19 | ELASTICSEARCH_URL="http://elasticsearch:9200"
20 |
21 | COPY --from=builder C:\out\index-prospect\IndexProspectHandler .
--------------------------------------------------------------------------------
/_archive/part-3/save-handler/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM microsoft/dotnet-framework-build:4.7.1-windowsservercore-ltsc2016 AS builder
3 |
4 | WORKDIR C:\src\SignUp.MessageHandlers.SaveProspect
5 | COPY signup\src\SignUp.MessageHandlers.SaveProspect\packages.config .
6 | RUN nuget restore packages.config -PackagesDirectory ..\packages
7 |
8 | COPY signup\src C:\src
9 | RUN msbuild SignUp.MessageHandlers.SaveProspect.csproj /p:OutputPath=c:\out\save-prospect\SaveProspectHandler
10 |
11 | # app image
12 | FROM microsoft/windowsservercore:ltsc2016
13 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
14 |
15 | WORKDIR /save-prospect-handler
16 | CMD .\SignUp.MessageHandlers.SaveProspect.exe
17 |
18 | ENV MESSAGE_QUEUE_URL="nats://message-queue:4222" `
19 | DB_MAX_RETRY_COUNT="5" `
20 | DB_MAX_DELAY_SECONDS="10"
21 |
22 | COPY --from=builder C:\out\save-prospect\SaveProspectHandler .
--------------------------------------------------------------------------------
/_archive/part-3/web-1.3/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM dockersamples/mta-dev-web-builder:4.7.1 AS builder
3 |
4 | WORKDIR C:\src\SignUp.Web
5 | COPY signup\src\SignUp.Web\packages.config .
6 | RUN nuget restore packages.config -PackagesDirectory ..\packages
7 |
8 | COPY signup\src C:\src
9 | RUN msbuild SignUp.Web.csproj /p:OutputPath=c:\out /p:DeployOnBuild=true
10 |
11 | # app image
12 | FROM microsoft/aspnet:4.7.1-windowsservercore-ltsc2016
13 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
14 |
15 | RUN Remove-Website -Name 'Default Web Site';`
16 | New-Item -Path 'C:\web-app' -Type Directory; `
17 | New-Website -Name 'web-app' -Port 80 -PhysicalPath 'C:\web-app'
18 |
19 | HEALTHCHECK --interval=5s `
20 | CMD powershell -command `
21 | try { `
22 | $response = iwr http://localhost/SignUp -UseBasicParsing; `
23 | if ($response.StatusCode -eq 200) { return 0} `
24 | else {return 1}; `
25 | } catch { return 1 }
26 |
27 | ENV MESSAGE_QUEUE_URL="nats://message-queue:4222" `
28 | DB_MAX_RETRY_COUNT="5" `
29 | DB_MAX_DELAY_SECONDS="10"
30 |
31 | ENTRYPOINT ["powershell", "C:\\bootstrap.ps1"]
32 |
33 | COPY .\signup\docker\bootstrap.ps1 C:\
34 | COPY --from=builder C:\out\_PublishedWebsites\SignUp.Web C:\web-app
--------------------------------------------------------------------------------
/_archive/part-3/web-1.3/bootstrap.ps1:
--------------------------------------------------------------------------------
1 | Write-Output 'Bootstrap starting'
2 |
3 | # copy process-level environment variables (from `docker run`) machine-wide
4 | foreach($key in [System.Environment]::GetEnvironmentVariables('Process').Keys) {
5 | if ([System.Environment]::GetEnvironmentVariable($key, 'Machine') -eq $null) {
6 | $value = [System.Environment]::GetEnvironmentVariable($key, 'Process')
7 | [System.Environment]::SetEnvironmentVariable($key, $value, 'Machine')
8 | Write-Output "Set environment variable: $key"
9 | }
10 | }
11 |
12 | Write-Output 'Running ServiceMonitor'
13 | & C:\ServiceMonitor.exe w3svc
--------------------------------------------------------------------------------
/_archive/part-4/grafana/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM microsoft/windowsservercore:ltsc2016
3 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
4 |
5 | RUN Set-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord
6 |
7 | EXPOSE 3000
8 | ENV GRAFANA_VERSION="4.4.3"
9 |
10 | RUN Invoke-WebRequest "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-$($env:GRAFANA_VERSION).windows-x64.zip" -OutFile grafana.zip -UseBasicParsing; `
11 | Expand-Archive grafana.zip -DestinationPath C:\; `
12 | Move-Item "grafana-$($env:GRAFANA_VERSION)" grafana; `
13 | Remove-Item grafana.zip
14 |
15 | WORKDIR C:\grafana\bin
16 | CMD ["grafana-server.exe"]
--------------------------------------------------------------------------------
/_archive/part-4/prometheus/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM dockersamples/aspnet-monitoring-prometheus
2 |
3 | COPY prometheus.yml /etc/prometheus/prometheus.yml
--------------------------------------------------------------------------------
/_archive/part-4/prometheus/prometheus.yml:
--------------------------------------------------------------------------------
1 | global:
2 | scrape_interval: 5s
3 | external_labels:
4 | monitor: 'local-monitor'
5 |
6 | scrape_configs:
7 | - job_name: 'web'
8 | static_configs:
9 | - targets: ['signup-web:50505']
10 | - job_name: 'index-handler'
11 | static_configs:
12 | - targets: ['signup-index-handler:50505']
13 | - job_name: 'save-handler'
14 | static_configs:
15 | - targets: ['signup-save-handler:50505']
--------------------------------------------------------------------------------
/_archive/part-4/web-1.4/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM dockersamples/mta-dev-web-builder:4.7.1 AS builder
3 |
4 | WORKDIR C:\src\SignUp.Web
5 | COPY signup\src\SignUp.Web\packages.config .
6 | RUN nuget restore packages.config -PackagesDirectory ..\packages
7 |
8 | COPY signup\src C:\src
9 | RUN msbuild SignUp.Web.csproj /p:OutputPath=c:\out /p:DeployOnBuild=true
10 |
11 | # perf counter exporter
12 | FROM dockersamples/aspnet-monitoring-exporter AS exporter
13 |
14 | # app image
15 | FROM microsoft/aspnet:4.7.1-windowsservercore-ltsc2016
16 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
17 |
18 | RUN Remove-Website -Name 'Default Web Site';`
19 | New-Item -Path 'C:\web-app' -Type Directory; `
20 | New-Website -Name 'web-app' -Port 80 -PhysicalPath 'C:\web-app'
21 |
22 | HEALTHCHECK --interval=5s `
23 | CMD powershell -command `
24 | try { `
25 | $response = iwr http://localhost/SignUp -UseBasicParsing; `
26 | if ($response.StatusCode -eq 200) { return 0} `
27 | else {return 1}; `
28 | } catch { return 1 }
29 |
30 | ENV MESSAGE_QUEUE_URL="nats://message-queue:4222" `
31 | DB_MAX_RETRY_COUNT="5" `
32 | DB_MAX_DELAY_SECONDS="10" `
33 | COLLECTOR_CONFIG_PATH="w3svc-collectors.json"
34 |
35 | WORKDIR C:\aspnet-exporter
36 | ENTRYPOINT ["powershell", "C:\\bootstrap.ps1"]
37 |
38 | COPY .\part-4\web-1.4\bootstrap.ps1 C:\
39 | COPY --from=exporter C:\aspnet-exporter .
40 | COPY --from=builder C:\out\_PublishedWebsites\SignUp.Web C:\web-app
--------------------------------------------------------------------------------
/_archive/part-4/web-1.4/bootstrap.ps1:
--------------------------------------------------------------------------------
1 | Write-Output 'Bootstrap starting'
2 |
3 | # copy process-level environment variables (from `docker run`) machine-wide
4 | foreach($key in [System.Environment]::GetEnvironmentVariables('Process').Keys) {
5 | if ([System.Environment]::GetEnvironmentVariable($key, 'Machine') -eq $null) {
6 | $value = [System.Environment]::GetEnvironmentVariable($key, 'Process')
7 | [System.Environment]::SetEnvironmentVariable($key, $value, 'Machine')
8 | Write-Output "Set environment variable: $key"
9 | }
10 | }
11 |
12 | Write-Output 'Starting IIS'
13 | Start-Service W3SVC
14 |
15 | Write-Output 'Sending warm-up request'
16 | Invoke-WebRequest http://localhost -UseBasicParsing | Out-Null
17 |
18 | Write-Output 'Starting metrics exporter'
19 | Start-Process -NoNewWindow C:\aspnet-exporter\aspnet-exporter.exe
20 |
21 | Write-Output 'Running ServiceMonitor'
22 | & C:\ServiceMonitor.exe w3svc
--------------------------------------------------------------------------------
/_archive/part-5/db.sql:
--------------------------------------------------------------------------------
1 |
2 | SELECT *
3 | FROM sys.databases
--------------------------------------------------------------------------------
/_archive/part-5/db/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM microsoft/mssql-server-windows-express:2016-sp1
3 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
4 |
5 | ENV ACCEPT_EULA=Y `
6 | DATA_PATH="C:\data"
7 |
8 | VOLUME ${DATA_PATH}
9 |
10 | WORKDIR C:\init
11 | COPY Initialize-Database.ps1 .
12 |
13 | CMD ./Initialize-Database.ps1 -sa_password $env:sa_password -data_path $env:data_path -Verbose
--------------------------------------------------------------------------------
/_archive/part-6/01-build.ps1:
--------------------------------------------------------------------------------
1 | Write-Output '*** App Build: '
2 |
3 | cd part-6
4 |
5 | $gatewayAddress = (Get-NetRoute -DestinationPrefix '0.0.0.0/0').NextHop
6 |
7 | $config = '--host', "tcp://$($gatewayAddress):2376", '--tlsverify', `
8 | '--tlscacert', $env:DOCKER_CA,'--tlscert', $env:DOCKER_CERT, '--tlskey', $env:DOCKER_KEY
9 |
10 | & docker-compose $config `
11 | -f .\app\docker-compose.yml -f .\app\docker-compose.build.yml -f .\app\docker-compose.local.yml build
--------------------------------------------------------------------------------
/_archive/part-6/02-run.ps1:
--------------------------------------------------------------------------------
1 | Write-Output '*** Start App: '
2 |
3 | cd part-6
4 |
5 | $gatewayAddress = (Get-NetRoute -DestinationPrefix '0.0.0.0/0').NextHop
6 |
7 | $config = '--host', "tcp://$($gatewayAddress):2376", '--tlsverify', `
8 | '--tlscacert', $env:DOCKER_CA,'--tlscert', $env:DOCKER_CERT, '--tlskey', $env:DOCKER_KEY
9 |
10 | & docker-compose $config `
11 | -f .\app\docker-compose.yml -f .\app\docker-compose.local.yml up -d
12 |
13 | Write-Output '*** Containers: '
14 |
15 | & docker $config container ls
16 |
17 | Write-Output '*** Sleeping'
18 |
19 | Start-Sleep -Seconds 30
20 |
21 | $ip = & docker $config inspect --format '{{ .NetworkSettings.Networks.nat.IPAddress }}' app_signup-web_1
22 |
23 | Write-Output '*** Checking website'
24 |
25 | iwr -UseBasicParsing "http://$ip"
--------------------------------------------------------------------------------
/_archive/part-6/03-test.ps1:
--------------------------------------------------------------------------------
1 | Write-Output '*** E2E tests'
2 |
3 | $gatewayAddress = (Get-NetRoute -DestinationPrefix '0.0.0.0/0').NextHop
4 |
5 | $config = '--host', "tcp://$($gatewayAddress):2376", '--tlsverify', `
6 | '--tlscacert', $env:DOCKER_CA,'--tlscert', $env:DOCKER_CERT, '--tlskey', $env:DOCKER_KEY
7 |
8 | & docker $config image build -t $env:dockerId/signup-e2e-tests -f .\part-6\e2e-tests\Dockerfile .
9 |
10 | & docker $config container run --env-file .\part-6\app\db-credentials.env $env:dockerId/signup-e2e-tests
11 |
12 | & docker-compose $config -f .\part-6\app\docker-compose.yml -f .\part-6\app\docker-compose.local.yml down
--------------------------------------------------------------------------------
/_archive/part-6/04-push.ps1:
--------------------------------------------------------------------------------
1 | Write-Output '*** Tagging and pushing images'
2 |
3 | $gatewayAddress = (Get-NetRoute -DestinationPrefix '0.0.0.0/0').NextHop
4 |
5 | $config = '--host', "tcp://$($gatewayAddress):2376", '--tlsverify', `
6 | '--tlscacert', $env:DOCKER_CA,'--tlscert', $env:DOCKER_CERT, '--tlskey', $env:DOCKER_KEY
7 |
8 | $repositories = 'signup-db', 'signup-web', 'signup-save-handler', 'signup-index-handler', 'signup-prometheus', 'signup-grafana'
9 |
10 | foreach ($repository in $repositories) {
11 |
12 | $sourceTag = "$($env:dockerId)/$($repository)"
13 | $targetTag = "registry.local:5000/$($env:dockerId)/$($repository):$($env:BUILD_TAG)"
14 |
15 | & docker $config image tag $sourceTag $targetTag
16 |
17 | & docker $config image push $targetTag
18 | }
--------------------------------------------------------------------------------
/_archive/part-6/app/db-credentials.env:
--------------------------------------------------------------------------------
1 | sa_password=DockerCon!!!
2 | DB_CONNECTION_STRING=Server=signup-db;Database=SignUp;User Id=sa;Password=DockerCon!!!
3 |
--------------------------------------------------------------------------------
/_archive/part-6/app/docker-compose.build.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-db:
6 | build:
7 | context: ../../part-5/db
8 | dockerfile: ./Dockerfile
9 |
10 | signup-web:
11 | build:
12 | context: ../../
13 | dockerfile: ./part-4/web-1.4/Dockerfile
14 |
15 | signup-save-handler:
16 | build:
17 | context: ../../
18 | dockerfile: ./part-3/save-handler/Dockerfile
19 |
20 | signup-index-handler:
21 | build:
22 | context: ../../
23 | dockerfile: ./part-3/index-handler/Dockerfile
24 |
25 | prometheus:
26 | build:
27 | context: ../../part-4/prometheus
28 | dockerfile: ./Dockerfile
29 |
30 | grafana:
31 | build:
32 | context: ../../part-4/grafana
33 | dockerfile: ./Dockerfile
--------------------------------------------------------------------------------
/_archive/part-6/app/docker-compose.dev.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-db:
6 | volumes:
7 | - C:\mssql:C:\data
8 | ports:
9 | - "1433:1433"
--------------------------------------------------------------------------------
/_archive/part-6/app/docker-compose.local.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-db:
6 | ports:
7 | - "1433"
8 |
9 | signup-web:
10 | ports:
11 | - "80"
12 |
13 | kibana:
14 | ports:
15 | - "5601"
16 |
17 | grafana:
18 | ports:
19 | - "3000"
20 |
21 | networks:
22 | app-net:
23 | external:
24 | name: nat
--------------------------------------------------------------------------------
/_archive/part-6/app/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-db:
6 | image: ${dockerId}/signup-db
7 | env_file:
8 | - db-credentials.env
9 | networks:
10 | - app-net
11 |
12 | signup-web:
13 | image: ${dockerId}/signup-web:1.4
14 | env_file:
15 | - db-credentials.env
16 | depends_on:
17 | - signup-db
18 | - message-queue
19 | networks:
20 | - app-net
21 |
22 | message-queue:
23 | image: nats:nanoserver
24 | networks:
25 | - app-net
26 |
27 | signup-save-handler:
28 | image: ${dockerId}/signup-save-handler:2
29 | env_file:
30 | - db-credentials.env
31 | depends_on:
32 | - signup-db
33 | - message-queue
34 | networks:
35 | - app-net
36 |
37 | elasticsearch:
38 | image: sixeyed/elasticsearch:nanoserver
39 | environment:
40 | - ES_JAVA_OPTS=-Xms512m -Xmx512m
41 | networks:
42 | - app-net
43 |
44 | kibana:
45 | image: sixeyed/kibana:nanoserver
46 | depends_on:
47 | - elasticsearch
48 | networks:
49 | - app-net
50 |
51 | signup-index-handler:
52 | image: ${dockerid}/signup-index-handler:2
53 | depends_on:
54 | - elasticsearch
55 | - message-queue
56 | networks:
57 | - app-net
58 |
59 | prometheus:
60 | image: ${dockerid}/signup-prometheus
61 | networks:
62 | - app-net
63 |
64 | grafana:
65 | image: ${dockerid}/signup-grafana
66 | depends_on:
67 | - prometheus
68 | networks:
69 | - app-net
--------------------------------------------------------------------------------
/_archive/part-6/e2e-tests/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM microsoft/dotnet-framework-build:4.7.1-windowsservercore-ltsc2016 AS builder
3 |
4 | WORKDIR C:\src\SignUp.EndToEndTests
5 | COPY signup\src\SignUp.EndToEndTests\packages.config .
6 | RUN nuget restore packages.config -PackagesDirectory ..\packages
7 |
8 | COPY signup\src C:\src
9 | RUN msbuild SignUp.EndToEndTests.csproj /p:OutputPath=C:\out\tests\EndToEndTests
10 |
11 | # test runner
12 | FROM sixeyed/nunit:3.6.1
13 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; "]
14 |
15 | RUN Set-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord
16 |
17 | WORKDIR /e2e-tests
18 | CMD nunit3-console SignUp.EndToEndTests.dll
19 |
20 | COPY --from=builder C:\out\tests\EndToEndTests .
--------------------------------------------------------------------------------
/_archive/part-6/infrastructure/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3'
2 |
3 | services:
4 |
5 | registry:
6 | image: sixeyed/registry:2.6.0-nanoserver
7 | restart: unless-stopped
8 | ports:
9 | - 5000
10 | volumes:
11 | - c:\registry:c:\data
12 | networks:
13 | - home
14 |
15 | bonobo:
16 | image: sixeyed/bonobo:6.1.0-windowsservercore
17 | restart: unless-stopped
18 | ports:
19 | - 80
20 | volumes:
21 | - c:\bonobo:c:\data
22 | networks:
23 | - home
24 |
25 | jenkins:
26 | image: ${dockerId}/jenkins:configured
27 | restart: unless-stopped
28 | ports:
29 | - 8080
30 | volumes:
31 | - c:\jenkins:c:\data
32 | networks:
33 | - home
34 |
35 | networks:
36 | home:
37 | external:
38 | name: nat
--------------------------------------------------------------------------------
/_archive/part-6/jenkins/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM sixeyed/git:2.15.1 AS git
3 | FROM sixeyed/docker-ee:17.06.2-ee-6 AS docker
4 |
5 | FROM sixeyed/jenkins:2.89.2
6 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
7 |
8 | RUN New-Item -Type Directory 'C:\git'; `
9 | $env:PATH = 'C:\git\cmd;C:\git\mingw64\bin;C:\git\usr\bin;' + $env:PATH; `
10 | [Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine)
11 |
12 | COPY --from=git C:\git C:\git
13 |
14 | RUN New-Item -Type Directory 'C:\docker'; `
15 | $env:PATH = 'C:\docker;' + $env:PATH; `
16 | [Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine)
17 |
18 | COPY --from=docker C:\docker\docker.exe C:\docker
19 | COPY --from=docker C:\docker\docker-compose.exe C:\docker
--------------------------------------------------------------------------------
/_archive/part-6/write-hosts.ps1:
--------------------------------------------------------------------------------
1 |
2 | $ipFormat ='{{ .NetworkSettings.Networks.nat.IPAddress }}'
3 | $hosts = 'C:\Windows\System32\drivers\etc\hosts'
4 |
5 | $ip = docker container inspect --format $ipFormat infrastructure_jenkins_1
6 | Add-Content -Path $hosts "$ip jenkins.local"
7 |
8 | $ip = docker container inspect --format $ipFormat infrastructure_bonobo_1
9 | Add-Content -Path $hosts "$ip bonobo.local"
10 |
11 | $ip = docker container inspect --format $ipFormat infrastructure_registry_1
12 | Add-Content -Path $hosts "$ip registry.local"
13 |
14 | Get-Content -Path $hosts
--------------------------------------------------------------------------------
/_archive/part-7/create-services.ps1:
--------------------------------------------------------------------------------
1 |
2 | docker network create --driver overlay signup-net
3 |
4 | docker service create `
5 | --network signup-net --endpoint-mode dnsrr `
6 | --env-file db-credentials.env `
7 | --name signup-db `
8 | sixeyed/signup-db:rtm
9 |
10 | docker service create `
11 | --network signup-net --endpoint-mode dnsrr `
12 | --name message-queue `
13 | nats:nanoserver
14 |
15 | docker service create `
16 | --network signup-net --endpoint-mode dnsrr `
17 | --env ES_JAVA_OPTS="-Xms512m -Xmx512m" `
18 | --name elasticsearch `
19 | sixeyed/elasticsearch:nanoserver
20 |
21 | docker service create `
22 | --network signup-net --endpoint-mode dnsrr `
23 | --publish mode=host,target=80,published=80 `
24 | --env-file db-credentials.env `
25 | --name signup-web `
26 | sixeyed/signup-web:rtm
27 |
28 | docker service create `
29 | --network signup-net --endpoint-mode dnsrr `
30 | --env-file db-credentials.env `
31 | --name signup-save-handler `
32 | sixeyed/signup-save-handler:rtm
33 |
34 | docker service create `
35 | --network signup-net --endpoint-mode dnsrr `
36 | --name signup-index-handler `
37 | sixeyed/signup-index-handler:rtm
38 |
39 | docker service create `
40 | --network signup-net --endpoint-mode dnsrr `
41 | --publish mode=host,target=5601,published=5601 `
42 | --name kibana `
43 | sixeyed/kibana:nanoserver
--------------------------------------------------------------------------------
/_archive/part-7/db-credentials.env:
--------------------------------------------------------------------------------
1 | sa_password=DockerCon!!!
2 | DB_CONNECTION_STRING=Server=signup-db;Database=SignUp;User Id=sa;Password=DockerCon!!!
3 |
--------------------------------------------------------------------------------
/_archive/part-7/docker-compose.prod.yml:
--------------------------------------------------------------------------------
1 | version: '3.3'
2 |
3 | services:
4 |
5 | signup-db:
6 | deploy:
7 | endpoint_mode: dnsrr
8 |
9 | signup-web:
10 | ports:
11 | - mode: host
12 | target: 80
13 | published: 80
14 | deploy:
15 | endpoint_mode: dnsrr
16 |
17 | message-queue:
18 | deploy:
19 | endpoint_mode: dnsrr
20 |
21 | signup-save-handler:
22 | deploy:
23 | endpoint_mode: dnsrr
24 | replicas: 3
25 |
26 | elasticsearch:
27 | deploy:
28 | endpoint_mode: dnsrr
29 |
30 | kibana:
31 | ports:
32 | - mode: host
33 | target: 5601
34 | published: 5601
35 | deploy:
36 | endpoint_mode: dnsrr
37 |
38 | signup-index-handler:
39 | deploy:
40 | endpoint_mode: dnsrr
41 | replicas: 3
42 |
43 | prometheus:
44 | deploy:
45 | endpoint_mode: dnsrr
46 |
47 | grafana:
48 | ports:
49 | - mode: host
50 | target: 3000
51 | published: 3000
52 | deploy:
53 | endpoint_mode: dnsrr
54 |
55 | networks:
56 | app-net:
--------------------------------------------------------------------------------
/_archive/part-7/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3.3'
2 |
3 | services:
4 |
5 | signup-db:
6 | image: sixeyed/signup-db:rtm
7 | env_file:
8 | - db-credentials.env
9 | networks:
10 | - app-net
11 |
12 | signup-web:
13 | image: sixeyed/signup-web:rtm
14 | env_file:
15 | - db-credentials.env
16 | networks:
17 | - app-net
18 |
19 | message-queue:
20 | image: nats:nanoserver
21 | networks:
22 | - app-net
23 |
24 | signup-save-handler:
25 | image: sixeyed/signup-save-handler:rtm
26 | env_file:
27 | - db-credentials.env
28 | networks:
29 | - app-net
30 |
31 | elasticsearch:
32 | image: sixeyed/elasticsearch:nanoserver
33 | environment:
34 | - ES_JAVA_OPTS=-Xms512m -Xmx512m
35 | networks:
36 | - app-net
37 |
38 | kibana:
39 | image: sixeyed/kibana:nanoserver
40 | networks:
41 | - app-net
42 |
43 | signup-index-handler:
44 | image: sixeyed/signup-index-handler:rtm
45 | networks:
46 | - app-net
47 |
48 | prometheus:
49 | image: sixeyed/signup-prometheus:rtm
50 | networks:
51 | - app-net
52 |
53 | grafana:
54 | image: sixeyed/signup-grafana:rtm
55 | networks:
56 | - app-net
--------------------------------------------------------------------------------
/_archive/thankyou.md:
--------------------------------------------------------------------------------
1 | # We're Done!
2 |
3 | Thanks for coming to the workshop. We hope it was useful and we'll be glad to have your feedback.
4 |
5 | The content for this workshop will stay online and you don't need a Windows Server VM to follow along - you can do everything with [Docker for Windows](https://www.docker.com/docker-windows) on Windows 10.
6 |
7 | But before you go...
8 |
9 | ---
10 |
11 | ## Next steps in your Docker journey
12 |
13 | - Use [Play with Docker](https://labs.play-with-docker.com/)
14 |
15 | - Try one of the [Play with Docker labs](http://training.play-with-docker.com/)
16 |
17 | - Follow [@EltonStoneman](https://twitter.com/EltonStoneman) and [@stefscherer](https://twitter.com/stefscherer) on Twitter
18 |
19 | - Read [Docker on Windows](https://www.amazon.co.uk/Docker-Windows-Elton-Stoneman/dp/1785281658), the book
20 |
21 | - Watch [Modernizing .NET Apps with Docker on Pluralsight](https://pluralsight.pxf.io/c/1197078/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmodernizing-dotnet-framework-apps-docker), the video course (don't have Pluralsight? Ping @EltonStoneman on Twitter to get a free trial).
22 |
--------------------------------------------------------------------------------
/app/configs/log4net.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/app/secrets/connectionStrings.config:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/app/v1.yml:
--------------------------------------------------------------------------------
1 | # v1 is the original monolith with SQL Server
2 | version: '3.7'
3 |
4 | services:
5 |
6 | signup-db:
7 | image: dwwx/sql-server:2017
8 | environment:
9 | - sa_password=DockerCon!!!
10 | networks:
11 | - app-net
12 |
13 | signup-web:
14 | image: dwwx/signup-web:v2
15 | ports:
16 | - "8020:80"
17 | depends_on:
18 | - signup-db
19 | networks:
20 | - app-net
21 |
22 | networks:
23 | app-net:
24 | external:
25 | name: nat
--------------------------------------------------------------------------------
/app/v11-dev.yml:
--------------------------------------------------------------------------------
1 | # v11 - overrides for running in dev with Compose
2 | version: '3.7'
3 |
4 | services:
5 |
6 | signup-db:
7 | volumes:
8 | - C:\mssql:C:\data
9 |
10 | signup-web:
11 | environment:
12 | - DEPENDENCY_CHECK_ENABLED=0
13 | volumes:
14 | - C:\web-logs:C:\logs
15 | depends_on:
16 | - signup-db
17 | - reference-data-api
18 | - message-queue
19 |
20 | proxy:
21 | command: --docker --docker.endpoint=npipe:////./pipe/docker_engine --docker.watch --api
22 | ports:
23 | - "8020:80"
24 | - "8080:8080"
25 | depends_on:
26 | - signup-web
27 | - homepage
28 |
29 | signup-save-handler:
30 | depends_on:
31 | - signup-db
32 | - message-queue
33 |
34 | signup-index-handler:
35 | depends_on:
36 | - elasticsearch
37 | - message-queue
38 |
39 | kibana:
40 | ports:
41 | - "5601:5601"
42 | depends_on:
43 | - elasticsearch
44 |
45 | grafana:
46 | ports:
47 | - "3000:3000"
48 | depends_on:
49 | - prometheus
50 |
51 | networks:
52 | app-net:
53 | external:
54 | name: nat
--------------------------------------------------------------------------------
/app/v11-prod.yml:
--------------------------------------------------------------------------------
1 | # v11 - overrides for running in prod with Swarm
2 | version: '3.7'
3 |
4 | services:
5 |
6 | signup-web:
7 | environment:
8 | - DEPENDENCY_CHECK_ENABLED=1
9 | - LOG4NET_CONFIG_PATH=C:\netfx-log4net
10 | - CONNECTIONSTRINGS_CONFIG_PATH=C:\ProgramData\Docker\secrets\netfx-connectionstrings
11 | configs:
12 | - netfx-log4net
13 | secrets:
14 | - source: netfx-connectionstrings
15 | healthcheck:
16 | retries: 3
17 | interval: 10s
18 | start_period: 40s
19 | deploy:
20 | replicas: 2
21 |
22 | proxy:
23 | command: --docker --docker.swarmMode --docker.watch --docker.endpoint=npipe:////./pipe/docker_engine --api
24 | ports:
25 | - "8020:80"
26 | - "8080:8080"
27 | deploy:
28 | mode: global
29 | placement:
30 | constraints:
31 | - node.role == manager
32 |
33 | signup-save-handler:
34 | environment:
35 | - CONNECTIONSTRINGS_CONFIG_PATH=C:\ProgramData\Docker\secrets\netfx-connectionstrings
36 | secrets:
37 | - source: netfx-connectionstrings
38 | deploy:
39 | replicas: 2
40 |
41 | signup-index-handler:
42 | deploy:
43 | replicas: 3
44 |
45 | kibana:
46 | ports:
47 | - "5601:5601"
48 |
49 | grafana:
50 | ports:
51 | - "3000:3000"
52 |
53 | networks:
54 | app-net:
55 |
56 | configs:
57 | netfx-log4net:
58 | external: true
59 |
60 | secrets:
61 | netfx-connectionstrings:
62 | external: true
--------------------------------------------------------------------------------
/app/v2.yml:
--------------------------------------------------------------------------------
1 | # v2 adds the reverse proxy and new homepage
2 | version: '3.7'
3 |
4 | services:
5 |
6 | signup-db:
7 | image: dwwx/sql-server:2017
8 | environment:
9 | - sa_password=DockerCon!!!
10 | networks:
11 | - app-net
12 |
13 | signup-web:
14 | image: dwwx/signup-web:v2
15 | environment:
16 | - ConnectionStrings:SignUpDb=Server=signup-db;Database=SignUp;User Id=sa;Password=DockerCon!!!
17 | labels:
18 | - "traefik.frontend.rule=PathPrefix:/app"
19 | - "traefik.frontend.priority=10"
20 | depends_on:
21 | - signup-db
22 | networks:
23 | - app-net
24 |
25 | homepage:
26 | image: dwwx/homepage
27 | labels:
28 | - "traefik.frontend.rule=PathPrefix:/"
29 | - "traefik.frontend.priority=1"
30 | networks:
31 | - app-net
32 |
33 | proxy:
34 | image: dwwx/reverse-proxy
35 | command: --docker --docker.endpoint=npipe:////./pipe/docker_engine --docker.watch --api
36 | ports:
37 | - "8020:80"
38 | - "8080:8080"
39 | volumes:
40 | - type: npipe
41 | source: \\.\pipe\docker_engine
42 | target: \\.\pipe\docker_engine
43 | networks:
44 | - app-net
45 |
46 | networks:
47 | app-net:
48 | external:
49 | name: nat
--------------------------------------------------------------------------------
/app/v3.yml:
--------------------------------------------------------------------------------
1 | # v3 adds the reference data API
2 | version: '3.7'
3 |
4 | services:
5 |
6 | signup-db:
7 | image: dwwx/sql-server:2017
8 | environment:
9 | - sa_password=DockerCon!!!
10 | networks:
11 | - app-net
12 |
13 | signup-web:
14 | image: dwwx/signup-web:v2
15 | environment:
16 | - Dependencies:IReferenceDataLoader=SignUp.Web.ReferenceData.ApiReferenceDataLoader
17 | - ReferenceDataApi:Url=http://reference-data-api/api
18 | labels:
19 | - "traefik.frontend.rule=PathPrefix:/app"
20 | - "traefik.frontend.priority=30"
21 | depends_on:
22 | - signup-db
23 | - reference-data-api
24 | networks:
25 | - app-net
26 |
27 | homepage:
28 | image: dwwx/homepage
29 | labels:
30 | - "traefik.frontend.rule=PathPrefix:/"
31 | - "traefik.frontend.priority=10"
32 | networks:
33 | - app-net
34 |
35 | proxy:
36 | image: dwwx/reverse-proxy
37 | command: --docker --docker.endpoint=npipe:////./pipe/docker_engine --docker.watch --api
38 | ports:
39 | - "8020:80"
40 | - "8080:8080"
41 | volumes:
42 | - type: npipe
43 | source: \\.\pipe\docker_engine
44 | target: \\.\pipe\docker_engine
45 | networks:
46 | - app-net
47 |
48 | reference-data-api:
49 | image: dwwx/reference-data-api
50 | environment:
51 | - ConnectionStrings:SignUpDb=Server=signup-db;Database=SignUp;User Id=sa;Password=DockerCon!!!
52 | labels:
53 | - "traefik.frontend.rule=PathPrefix:/api"
54 | - "traefik.frontend.priority=20"
55 | depends_on:
56 | - signup-db
57 | networks:
58 | - app-net
59 |
60 | networks:
61 | app-net:
62 | external:
63 | name: nat
--------------------------------------------------------------------------------
/ci/build.ps1:
--------------------------------------------------------------------------------
1 | param(
2 | [int] $from = 1,
3 | [int] $to = 7
4 | )
5 |
6 | for ($i=$from; $i -le $to; $i++) {
7 | Write-Host "*** Building version: $i"
8 |
9 | docker-compose `
10 | -f ./ci/docker-compose.yml `
11 | -f ./ci/docker-compose-local.yml `
12 | -f ./ci/docker-compose-build.yml `
13 | -f "./ci/docker-compose-build-v$i.yml" `
14 | build --pull
15 | }
--------------------------------------------------------------------------------
/ci/docker-compose-build-v1.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-web:
6 | image: dwwx/signup-web
7 | build:
8 | context: ..
9 | dockerfile: ./docker/frontend-web/v1/Dockerfile
--------------------------------------------------------------------------------
/ci/docker-compose-build-v2.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-web:
6 | image: dwwx/signup-web:v2
7 | build:
8 | context: ..
9 | dockerfile: ./docker/frontend-web/v2/Dockerfile
--------------------------------------------------------------------------------
/ci/docker-compose-build-v3.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-web:
6 | image: dwwx/signup-web:v3
7 | build:
8 | context: ..
9 | dockerfile: ./docker/metrics-runtime/signup-web/Dockerfile
10 |
11 | signup-save-handler:
12 | image: dwwx/save-handler:v2
13 | build:
14 | context: ..
15 | dockerfile: ./docker/metrics-application/save-handler/Dockerfile
16 |
17 | signup-index-handler:
18 | image: dwwx/index-handler:v2
19 | build:
20 | context: ..
21 | dockerfile: ./docker/metrics-application/index-handler/Dockerfile
--------------------------------------------------------------------------------
/ci/docker-compose-build-v4.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-web:
6 | image: dwwx/signup-web:v4
7 | build:
8 | context: ..
9 | dockerfile: ./docker/prod-logging/signup-web/Dockerfile
--------------------------------------------------------------------------------
/ci/docker-compose-build-v5.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-web:
6 | image: dwwx/signup-web:v5
7 | build:
8 | context: ..
9 | dockerfile: ./docker/prod-config/signup-web/Dockerfile
10 |
11 | signup-save-handler:
12 | image: dwwx/save-handler:v3
13 | build:
14 | context: ..
15 | dockerfile: ./docker/prod-config/save-handler/Dockerfile
--------------------------------------------------------------------------------
/ci/docker-compose-build-v6.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-db:
6 | image: dwwx/signup-db
7 | build:
8 | context: ..
9 | dockerfile: ./docker/prod-dependencies/signup-db/Dockerfile
10 |
11 | signup-web:
12 | image: dwwx/signup-web:v6
13 | build:
14 | context: ..
15 | dockerfile: ./docker/prod-dependencies/signup-web/Dockerfile
--------------------------------------------------------------------------------
/ci/docker-compose-build-v7.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-web:
6 | image: dwwx/signup-web:v7
7 | build:
8 | context: ..
9 | dockerfile: ./docker/prod-health/signup-web/Dockerfile
--------------------------------------------------------------------------------
/ci/docker-compose-build.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-db:
6 | build:
7 | context: ../docker/sql-server
8 |
9 | signup-web:
10 | build:
11 | context: ..
12 | dockerfile: ./docker/frontend-web/Dockerfile
13 |
14 | homepage:
15 | build:
16 | context: ..
17 | dockerfile: ./docker/frontend-reverse-proxy/homepage/Dockerfile
18 |
19 | proxy:
20 | build:
21 | context: ..
22 | dockerfile: ./docker/frontend-reverse-proxy/reverse-proxy/Dockerfile
23 |
24 | reference-data-api:
25 | build:
26 | context: ..
27 | dockerfile: ./docker/backend-rest-api/reference-data-api/Dockerfile
28 |
29 | signup-save-handler:
30 | build:
31 | context: ..
32 | dockerfile: ./docker/backend-async-messaging/save-handler/Dockerfile
33 |
34 | signup-index-handler:
35 | build:
36 | context: ..
37 | dockerfile: ./docker/backend-analytics/index-handler/Dockerfile
38 |
39 | prometheus:
40 | build:
41 | context: ..
42 | dockerfile: ./docker/metrics-dashboard/prometheus/Dockerfile
43 |
44 | grafana:
45 | build:
46 | context: ..
47 | dockerfile: ./docker/metrics-dashboard/grafana/Dockerfile
--------------------------------------------------------------------------------
/ci/docker-compose-local.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-db:
6 | ports:
7 | - "1433"
8 |
9 | proxy:
10 | ports:
11 | - "80"
12 |
13 | networks:
14 | app-net:
15 | external:
16 | name: nat
--------------------------------------------------------------------------------
/ci/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 |
3 | services:
4 |
5 | signup-db:
6 | image: dwwx/sql-server:2017
7 | networks:
8 | - app-net
9 |
10 | signup-web:
11 | image: dwwx/signup-web
12 | networks:
13 | - app-net
14 |
15 | homepage:
16 | image: dwwx/homepage
17 | networks:
18 | - app-net
19 |
20 | proxy:
21 | image: dwwx/reverse-proxy
22 | networks:
23 | - app-net
24 |
25 | reference-data-api:
26 | image: dwwx/reference-data-api
27 | networks:
28 | - app-net
29 |
30 | message-queue:
31 | image: nats:2.0.4-nanoserver-1809
32 | networks:
33 | - app-net
34 |
35 | signup-save-handler:
36 | image: dwwx/save-handler
37 | networks:
38 | - app-net
39 |
40 | signup-index-handler:
41 | image: dwwx/index-handler
42 | networks:
43 | - app-net
44 |
45 | prometheus:
46 | image: dwwx/prometheus
47 | networks:
48 | - app-net
49 |
50 | grafana:
51 | image: dwwx/grafana
52 | networks:
53 | - app-net
54 |
55 | elasticsearch:
56 | image: sixeyed/elasticsearch:5.6.11-nanoserver-sac2016
57 | networks:
58 | - app-net
59 |
60 | kibana:
61 | image: sixeyed/kibana:5.6.11-windowsservercore-ltsc2016
62 | networks:
63 | - app-net
--------------------------------------------------------------------------------
/ci/ship.ps1:
--------------------------------------------------------------------------------
1 | param(
2 | [int] $from = 1,
3 | [int] $to = 7
4 | )
5 |
6 | for ($i=$from; $i -le $to; $i++) {
7 | Write-Host "*** Pushing version: $i"
8 |
9 | docker-compose `
10 | -f ./ci/docker-compose.yml `
11 | -f ./ci/docker-compose-local.yml `
12 | -f ./ci/docker-compose-build.yml `
13 | -f "./ci/docker-compose-build-v$i.yml" `
14 | push --ignore-push-failures
15 | }
--------------------------------------------------------------------------------
/docker/101-dockerfiles-and-images/hostname-app/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM mcr.microsoft.com/dotnet/framework/aspnet
2 | COPY default.aspx C:/inetpub/wwwroot
3 |
--------------------------------------------------------------------------------
/docker/101-dockerfiles-and-images/hostname-app/default.aspx:
--------------------------------------------------------------------------------
1 | <%@ Import Namespace="System" %>
2 | <%@ Page Language="c#"%>
3 |
4 |
10 |
11 |
12 |
13 |
39 |
40 |
41 |
42 |
43 |
Hello from <% =GetMachineName() %>!
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/docker/101-dockerfiles-and-images/tweet-app/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
3 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
4 |
5 | RUN Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.applicationHost/log' -name 'centralLogFileMode' -value 'CentralW3C'; `
6 | Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.applicationHost/log/centralW3CLogFile' -name 'truncateSize' -value 4294967295; `
7 | Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.applicationHost/log/centralW3CLogFile' -name 'period' -value 'MaxSize'; `
8 | Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.applicationHost/log/centralW3CLogFile' -name 'directory' -value 'c:\iislog'
9 |
10 | WORKDIR C:\
11 | COPY start.ps1 .
12 | ENTRYPOINT ["powershell", "C:\\start.ps1"]
13 |
14 | HEALTHCHECK --interval=2s `
15 | CMD powershell -command `
16 | try { `
17 | $response = Invoke-WebRequest http://localhost -UseBasicParsing; `
18 | if ($response.StatusCode -eq 200) { return 0} `
19 | else {return 1}; `
20 | } catch { return 1 }
21 |
22 | COPY index.html C:\inetpub\wwwroot
--------------------------------------------------------------------------------
/docker/101-dockerfiles-and-images/tweet-app/start.ps1:
--------------------------------------------------------------------------------
1 |
2 | Write-Output 'Starting w3svc'
3 | Start-Service W3SVC
4 |
5 | Write-Output 'Making HTTP GET call'
6 | Invoke-WebRequest http://localhost -UseBasicParsing | Out-Null
7 |
8 | Write-Output 'Flushing log file'
9 | netsh http flush logbuffer | Out-Null
10 |
11 | Write-Output 'Tailing log file'
12 | Get-Content -path 'c:\iislog\W3SVC\u_extend1.log' -Tail 1 -Wait
--------------------------------------------------------------------------------
/docker/101-image-registries/hostname-app-v2/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM mcr.microsoft.com/dotnet/framework/aspnet
2 | COPY default.aspx C:/inetpub/wwwroot
3 |
--------------------------------------------------------------------------------
/docker/101-image-registries/hostname-app-v2/default.aspx:
--------------------------------------------------------------------------------
1 | <%@ Import Namespace="System" %>
2 | <%@ Page Language="c#"%>
3 |
4 |
10 |
11 |
12 |
13 |
39 |
40 |
41 |
42 |
43 |
Hello from <% =GetMachineName() %>!
44 | (this is v2)
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/docker/backend-analytics/index-handler/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM microsoft/dotnet:2.1-sdk-nanoserver-1809 as builder
3 |
4 | WORKDIR C:\src\SignUp.MessageHandlers.IndexProspect
5 | COPY src\SignUp.MessageHandlers.IndexProspect\SignUp.MessageHandlers.IndexProspect.csproj .
6 | RUN dotnet restore
7 |
8 | COPY src C:\src
9 | RUN dotnet publish -c Release -o C:\out SignUp.MessageHandlers.IndexProspect.csproj
10 |
11 | # app image
12 | FROM microsoft/dotnet:2.1-runtime-nanoserver-1809
13 |
14 | WORKDIR /index-prospect-handler
15 | ENTRYPOINT ["dotnet", "SignUp.MessageHandlers.IndexProspect.dll"]
16 |
17 | COPY --from=builder C:\out\ .
--------------------------------------------------------------------------------
/docker/backend-async-messaging/save-handler/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM mcr.microsoft.com/dotnet/framework/sdk:4.7.2-20190312-windowsservercore-ltsc2019 AS builder
3 |
4 | WORKDIR C:\src
5 | COPY src\SignUp.sln .
6 | COPY src\SignUp.Core\SignUp.Core.csproj .\SignUp.Core\
7 | COPY src\SignUp.Entities\SignUp.Entities.csproj .\SignUp.Entities\
8 | COPY src\SignUp.Messaging\SignUp.Messaging.csproj .\SignUp.Messaging\
9 | COPY src\SignUp.Model\SignUp.Model.csproj .\SignUp.Model\
10 | COPY src\SignUp.Model\packages.config .\SignUp.Model\
11 | COPY src\SignUp.MessageHandlers.SaveProspect\SignUp.MessageHandlers.SaveProspect.csproj .\SignUp.MessageHandlers.SaveProspect\
12 | COPY src\SignUp.MessageHandlers.SaveProspect\packages.config .\SignUp.MessageHandlers.SaveProspect\
13 | RUN nuget restore .\SignUp.sln
14 |
15 | COPY src C:\src
16 | RUN msbuild SignUp.MessageHandlers.SaveProspect\SignUp.MessageHandlers.SaveProspect.csproj /p:OutputPath=c:\out\save-prospect\SaveProspectHandler
17 |
18 | # app image
19 | FROM mcr.microsoft.com/windows/servercore:ltsc2019
20 |
21 | WORKDIR /save-prospect-handler
22 | CMD .\SignUp.MessageHandlers.SaveProspect.exe
23 |
24 | COPY --from=builder C:\out\save-prospect\SaveProspectHandler .
--------------------------------------------------------------------------------
/docker/backend-rest-api/reference-data-api/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM microsoft/dotnet:2.1-sdk-nanoserver-1809 as builder
3 |
4 | WORKDIR C:\src\SignUp.Api.ReferenceData
5 | COPY src\SignUp.Api.ReferenceData\SignUp.Api.ReferenceData.csproj .
6 | RUN dotnet restore
7 |
8 | COPY src C:\src
9 | RUN dotnet publish -c Release -o C:\out SignUp.Api.ReferenceData.csproj
10 |
11 | # app image
12 | FROM microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-1809
13 |
14 | EXPOSE 80
15 | WORKDIR /reference-data-api
16 | ENTRYPOINT ["dotnet", "SignUp.Api.ReferenceData.dll"]
17 |
18 | COPY --from=builder C:\out\ .
--------------------------------------------------------------------------------
/docker/frontend-reverse-proxy/homepage/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
3 |
4 | COPY .\docker\frontend-reverse-proxy\homepage\img\ C:\inetpub\wwwroot\img\
5 | COPY .\docker\frontend-reverse-proxy\homepage\index.html C:\inetpub\wwwroot
--------------------------------------------------------------------------------
/docker/frontend-reverse-proxy/homepage/img/docker-enterprise.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/docker/frontend-reverse-proxy/homepage/img/docker-enterprise.png
--------------------------------------------------------------------------------
/docker/frontend-reverse-proxy/homepage/img/dockercon-eu-2018.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/docker/frontend-reverse-proxy/homepage/img/dockercon-eu-2018.png
--------------------------------------------------------------------------------
/docker/frontend-reverse-proxy/homepage/img/dockercon-us-2018.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/docker/frontend-reverse-proxy/homepage/img/dockercon-us-2018.png
--------------------------------------------------------------------------------
/docker/frontend-reverse-proxy/reverse-proxy/Dockerfile:
--------------------------------------------------------------------------------
1 | # uses Server Core at netapi32.dll not in Nano Server 1809
2 | # usage
3 | # docker container run -d -p 80 -p 8080 -v \\.\pipe\docker_engine:\\.\pipe\docker_engine sixeyed/traefik:v1.7.8-windowsservercore-ltsc2019 --api --docker --docker.endpoint=npipe:////./pipe/docker_engine --logLevel=DEBUG
4 | FROM mcr.microsoft.com/windows/servercore:ltsc2019
5 |
6 | COPY --from=traefik:v1.7.8-nanoserver-sac2016 /traefik.exe /traefik.exe
7 |
8 | EXPOSE 80 443
9 | ENTRYPOINT ["/traefik"]
--------------------------------------------------------------------------------
/docker/frontend-web/v1/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM mcr.microsoft.com/dotnet/framework/sdk:4.7.2-20190312-windowsservercore-ltsc2019 AS builder
3 |
4 | WORKDIR C:\src
5 | COPY src .
6 | RUN .\build-web.bat
7 |
8 | # app image
9 | FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-ltsc2019
10 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]
11 |
12 | WORKDIR C:\web-app
13 | RUN New-WebApplication -Name 'app' -Site 'Default Web Site' -PhysicalPath C:\web-app
14 |
15 | COPY --from=builder C:\out\_PublishedWebsites\SignUp.Web .
--------------------------------------------------------------------------------
/docker/frontend-web/v2/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM mcr.microsoft.com/dotnet/framework/sdk:4.7.2-20190312-windowsservercore-ltsc2019 AS builder
3 |
4 | WORKDIR C:\src
5 | COPY src\SignUp.sln .
6 | COPY src\SignUp.Core\SignUp.Core.csproj .\SignUp.Core\
7 | COPY src\SignUp.Entities\SignUp.Entities.csproj .\SignUp.Entities\
8 | COPY src\SignUp.Messaging\SignUp.Messaging.csproj .\SignUp.Messaging\
9 | COPY src\SignUp.Model\SignUp.Model.csproj .\SignUp.Model\
10 | COPY src\SignUp.Web\SignUp.Web.csproj .\SignUp.Web\
11 | COPY src\SignUp.Model\packages.config .\SignUp.Model\
12 | COPY src\SignUp.Web\packages.config .\SignUp.Web\
13 | RUN nuget restore SignUp.sln
14 |
15 | COPY src C:\src
16 | RUN msbuild SignUp.Web\SignUp.Web.csproj /p:OutputPath=c:\out /p:Configuration=Release
17 |
18 | # app image
19 | FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-ltsc2019
20 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]
21 |
22 | ENV APP_ROOT=C:\web-app
23 |
24 | WORKDIR ${APP_ROOT}
25 | RUN New-WebApplication -Name 'app' -Site 'Default Web Site' -PhysicalPath $env:APP_ROOT
26 |
27 | COPY --from=builder C:\out\_PublishedWebsites\SignUp.Web ${APP_ROOT}
--------------------------------------------------------------------------------
/docker/metrics-application/index-handler/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM microsoft/dotnet:2.1-sdk-nanoserver-1809 as builder
3 |
4 | WORKDIR C:\src\SignUp.MessageHandlers.IndexProspect
5 | COPY src\SignUp.MessageHandlers.IndexProspect\SignUp.MessageHandlers.IndexProspect.csproj .
6 | RUN dotnet restore
7 |
8 | COPY src C:\src
9 | RUN dotnet publish -c Release -o C:\out SignUp.MessageHandlers.IndexProspect.csproj
10 |
11 | # app image
12 | FROM microsoft/dotnet:2.1-runtime-nanoserver-1809
13 |
14 | WORKDIR /index-prospect-handler
15 | ENTRYPOINT ["dotnet", "SignUp.MessageHandlers.IndexProspect.dll"]
16 |
17 | USER ContainerAdministrator
18 |
19 | ENV Metrics:Enabled=true `
20 | Metrics:Port=50505
21 |
22 | COPY --from=builder C:\out\ .
--------------------------------------------------------------------------------
/docker/metrics-application/save-handler/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM mcr.microsoft.com/dotnet/framework/sdk:4.7.2-20190312-windowsservercore-ltsc2019 AS builder
3 |
4 | WORKDIR C:\src
5 | COPY src\SignUp.sln .
6 | COPY src\SignUp.Core\SignUp.Core.csproj .\SignUp.Core\
7 | COPY src\SignUp.Entities\SignUp.Entities.csproj .\SignUp.Entities\
8 | COPY src\SignUp.Messaging\SignUp.Messaging.csproj .\SignUp.Messaging\
9 | COPY src\SignUp.Model\SignUp.Model.csproj .\SignUp.Model\
10 | COPY src\SignUp.Model\packages.config .\SignUp.Model\
11 | COPY src\SignUp.MessageHandlers.SaveProspect\SignUp.MessageHandlers.SaveProspect.csproj .\SignUp.MessageHandlers.SaveProspect\
12 | COPY src\SignUp.MessageHandlers.SaveProspect\packages.config .\SignUp.MessageHandlers.SaveProspect\
13 | RUN nuget restore .\SignUp.sln
14 |
15 | COPY src C:\src
16 | RUN msbuild SignUp.MessageHandlers.SaveProspect\SignUp.MessageHandlers.SaveProspect.csproj /p:OutputPath=c:\out\save-prospect\SaveProspectHandler
17 |
18 | # app image
19 | FROM mcr.microsoft.com/windows/servercore:ltsc2019
20 |
21 | WORKDIR /save-prospect-handler
22 | CMD .\SignUp.MessageHandlers.SaveProspect.exe
23 |
24 | ENV Metrics:Enabled=true `
25 | Metrics:Port=50505
26 |
27 | COPY --from=builder C:\out\save-prospect\SaveProspectHandler .
--------------------------------------------------------------------------------
/docker/metrics-dashboard/grafana/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM dockersamples/aspnet-monitoring-grafana:5.2.1-windowsservercore-ltsc2019
3 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]
4 |
5 | COPY .\docker\metrics-dashboard\grafana\datasource-prometheus.yaml \grafana\conf\provisioning\datasources\
6 | COPY .\docker\metrics-dashboard\grafana\dashboard-provider.yaml \grafana\conf\provisioning\dashboards\
7 | COPY .\docker\metrics-dashboard\grafana\signup-dashboard.json \var\lib\grafana\dashboards\
8 |
9 | COPY .\docker\metrics-dashboard\grafana\init.ps1 .
10 | RUN .\init.ps1
--------------------------------------------------------------------------------
/docker/metrics-dashboard/grafana/dashboard-provider.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: 1
2 |
3 | providers:
4 | - name: 'default'
5 | orgId: 1
6 | folder: ''
7 | type: file
8 | disableDeletion: true
9 | updateIntervalSeconds: 0
10 | options:
11 | path: /var/lib/grafana/dashboards
--------------------------------------------------------------------------------
/docker/metrics-dashboard/grafana/datasource-prometheus.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: 1
2 |
3 | datasources:
4 | - name: Prometheus
5 | type: prometheus
6 | access: proxy
7 | url: http://prometheus:9090
8 | basicAuth: false
9 | version: 1
10 | editable: true
--------------------------------------------------------------------------------
/docker/metrics-dashboard/grafana/init.ps1:
--------------------------------------------------------------------------------
1 | # start Grafana and give it time to spin up
2 | Start-Process grafana-server -NoNewWindow
3 | Start-Sleep 45
4 |
5 | # create new user
6 | $auth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes('admin:admin'))
7 | Invoke-RestMethod `
8 | -Method Post `
9 | -ContentType 'application/json' `
10 | -Headers @{Authorization="Basic $auth"} `
11 | -Body '{ "name":"viewer", "email":"viewer@org.com", "login":"viewer", "password":"readonly" }' `
12 | -Uri http://localhost:3000/api/admin/users
13 |
14 | # set user's home dashboard
15 | $auth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes('viewer:readonly'))
16 | Invoke-RestMethod `
17 | -Method Put `
18 | -ContentType 'application/json' `
19 | -Headers @{Authorization="Basic $auth"} `
20 | -Body '{ "homeDashboardId":1 }' `
21 | -Uri http://localhost:3000/api/user/preferences
22 |
--------------------------------------------------------------------------------
/docker/metrics-dashboard/prometheus/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM dockersamples/aspnet-monitoring-prometheus:2.3.1-windowsservercore-ltsc2019
2 | COPY ./docker/metrics-dashboard/prometheus/prometheus.yml /etc/prometheus/prometheus.yml
--------------------------------------------------------------------------------
/docker/metrics-dashboard/prometheus/prometheus.yml:
--------------------------------------------------------------------------------
1 | global:
2 | scrape_interval: 10s
3 | external_labels:
4 | monitor: 'local-monitor'
5 |
6 | scrape_configs:
7 | - job_name: 'web'
8 | metrics_path: /metrics/
9 | static_configs:
10 | - targets: ['signup-web:50505']
11 |
12 | - job_name: 'index-handler'
13 | metrics_path: /metrics/
14 | static_configs:
15 | - targets: ['signup-index-handler:50505']
16 |
17 | - job_name: 'save-handler'
18 | metrics_path: /metrics/
19 | static_configs:
20 | - targets: ['signup-save-handler:50505']
--------------------------------------------------------------------------------
/docker/metrics-runtime/signup-web/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM mcr.microsoft.com/dotnet/framework/sdk:4.7.2-20190312-windowsservercore-ltsc2019 AS builder
3 |
4 | WORKDIR C:\src
5 | COPY src\SignUp.sln .
6 | COPY src\SignUp.Core\SignUp.Core.csproj .\SignUp.Core\
7 | COPY src\SignUp.Entities\SignUp.Entities.csproj .\SignUp.Entities\
8 | COPY src\SignUp.Messaging\SignUp.Messaging.csproj .\SignUp.Messaging\
9 | COPY src\SignUp.Model\SignUp.Model.csproj .\SignUp.Model\
10 | COPY src\SignUp.Web\SignUp.Web.csproj .\SignUp.Web\
11 | COPY src\SignUp.Model\packages.config .\SignUp.Model\
12 | COPY src\SignUp.Web\packages.config .\SignUp.Web\
13 | RUN nuget restore SignUp.sln
14 |
15 | COPY src C:\src
16 | RUN msbuild SignUp.Web\SignUp.Web.csproj /p:OutputPath=c:\out /p:Configuration=Release
17 |
18 | # app image
19 | FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-ltsc2019
20 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]
21 |
22 | ENV APP_ROOT=C:\web-app
23 |
24 | EXPOSE 80 50505
25 | WORKDIR ${APP_ROOT}
26 | RUN New-WebApplication -Name 'app' -Site 'Default Web Site' -PhysicalPath $env:APP_ROOT
27 |
28 | WORKDIR C:\aspnet-exporter
29 | COPY --from=dockersamples/aspnet-monitoring-exporter:4.7.2-windowsservercore-ltsc2019 C:\aspnet-exporter .
30 | ENV COLLECTOR_CONFIG_PATH="w3svc-collectors.json"
31 |
32 | COPY .\docker\metrics-runtime\signup-web\startup.ps1 /
33 | ENTRYPOINT ["powershell", "/startup.ps1"]
34 |
35 | COPY --from=builder C:\out\_PublishedWebsites\SignUp.Web ${APP_ROOT}
--------------------------------------------------------------------------------
/docker/metrics-runtime/signup-web/startup.ps1:
--------------------------------------------------------------------------------
1 | Write-Output 'STARTUP: Starting IIS'
2 | Start-Service w3svc
3 |
4 | Write-Output 'STARTUP: Running metrics exporter'
5 | Invoke-WebRequest http://localhost/app -UseBasicParsing | Out-Null
6 | Start-Process -NoNewWindow C:\aspnet-exporter\aspnet-exporter.exe
7 |
8 | Write-Output 'STARTUP: Running ServiceMonitor'
9 | & C:\ServiceMonitor.exe w3svc
--------------------------------------------------------------------------------
/docker/prod-config/save-handler/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM mcr.microsoft.com/dotnet/framework/sdk:4.7.2-20190312-windowsservercore-ltsc2019 AS builder
3 |
4 | WORKDIR C:\src
5 | COPY src\SignUp.sln .
6 | COPY src\SignUp.Core\SignUp.Core.csproj .\SignUp.Core\
7 | COPY src\SignUp.Entities\SignUp.Entities.csproj .\SignUp.Entities\
8 | COPY src\SignUp.Messaging\SignUp.Messaging.csproj .\SignUp.Messaging\
9 | COPY src\SignUp.Model\SignUp.Model.csproj .\SignUp.Model\
10 | COPY src\SignUp.Model\packages.config .\SignUp.Model\
11 | COPY src\SignUp.MessageHandlers.SaveProspect\SignUp.MessageHandlers.SaveProspect.csproj .\SignUp.MessageHandlers.SaveProspect\
12 | COPY src\SignUp.MessageHandlers.SaveProspect\packages.config .\SignUp.MessageHandlers.SaveProspect\
13 | RUN nuget restore .\SignUp.sln
14 |
15 | COPY src C:\src
16 | RUN msbuild SignUp.MessageHandlers.SaveProspect\SignUp.MessageHandlers.SaveProspect.csproj /p:OutputPath=c:\out\save-prospect\SaveProspectHandler
17 |
18 | # app image
19 | FROM mcr.microsoft.com/windows/servercore:ltsc2019
20 |
21 | ENV Metrics:Enabled=true `
22 | Metrics:Port=50505 `
23 | APP_ROOT=C:\save-prospect-handler`
24 | CONNECTIONSTRINGS_CONFIG_PATH=""
25 |
26 | WORKDIR ${APP_ROOT}
27 | COPY .\docker\prod-config\save-handler\startup.ps1 .
28 | ENTRYPOINT ["powershell", "./startup.ps1"]
29 |
30 | COPY --from=builder C:\out\save-prospect\SaveProspectHandler .
--------------------------------------------------------------------------------
/docker/prod-config/save-handler/startup.ps1:
--------------------------------------------------------------------------------
1 | function RedirectConfigFile {
2 | param([string] $sourcePath, [string] $targetPath)
3 |
4 | if ($sourcePath -And (Test-Path $sourcePath)) {
5 |
6 | Remove-Item -Force -Path $targetPath
7 |
8 | New-Item -Path $targetPath `
9 | -ItemType SymbolicLink `
10 | -Value $sourcePath
11 |
12 | Write-Output "STARTUP: Redirected $targetPath config to read from $sourcePath"
13 | }
14 | }
15 |
16 | Write-Output 'STARTUP: Loading config files'
17 | RedirectConfigFile $env:CONNECTIONSTRINGS_CONFIG_PATH "$env:APP_ROOT\connectionStrings.config"
18 |
19 | Write-Output 'STARTUP: Running app'
20 | .\SignUp.MessageHandlers.SaveProspect.exe
--------------------------------------------------------------------------------
/docker/prod-config/signup-web/startup.ps1:
--------------------------------------------------------------------------------
1 | function RedirectConfigFile {
2 | param([string] $sourcePath, [string] $targetPath)
3 |
4 | if ($sourcePath -And (Test-Path $sourcePath)) {
5 |
6 | Remove-Item -Force -Path $targetPath
7 |
8 | New-Item -Path $targetPath `
9 | -ItemType SymbolicLink `
10 | -Value $sourcePath
11 |
12 | Write-Output "STARTUP: Redirected $targetPath config to read from $sourcePath"
13 | }
14 | }
15 |
16 | Write-Output 'STARTUP: Loading config files'
17 | RedirectConfigFile $env:LOG4NET_CONFIG_PATH "$env:APP_ROOT\log4net.config"
18 | RedirectConfigFile $env:CONNECTIONSTRINGS_CONFIG_PATH "$env:APP_ROOT\connectionStrings.config"
19 |
20 | Write-Output 'STARTUP: Starting IIS'
21 | Start-Service w3svc
22 |
23 | Write-Output 'STARTUP: Running metrics exporter'
24 | Invoke-WebRequest http://localhost/app -UseBasicParsing | Out-Null
25 | Start-Process -NoNewWindow C:\aspnet-exporter\aspnet-exporter.exe
26 |
27 | Write-Output 'STARTUP: Tailing log'
28 | Get-Content -Path "$env:APP_LOGS\SignUp.log" -Tail 1 -Wait
--------------------------------------------------------------------------------
/docker/prod-dependencies/signup-db/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM dwwx/sql-server:2017
3 |
4 | ENV DATA_PATH="C:\data" `
5 | sa_password="DockerCon!!!"
6 |
7 | VOLUME ${DATA_PATH}
8 |
9 | WORKDIR C:\init
10 | COPY .\docker\prod-dependencies\signup-db\Initialize-Database.ps1 .
11 | ENTRYPOINT ["powershell", "./Initialize-Database.ps1"]
--------------------------------------------------------------------------------
/docker/prod-dependencies/signup-web/startup.ps1:
--------------------------------------------------------------------------------
1 | function RedirectConfigFile {
2 | param([string] $sourcePath, [string] $targetPath)
3 |
4 | if ($sourcePath -And (Test-Path $sourcePath)) {
5 |
6 | Remove-Item -Force -Path $targetPath
7 |
8 | New-Item -Path $targetPath `
9 | -ItemType SymbolicLink `
10 | -Value $sourcePath
11 |
12 | Write-Output "STARTUP: Redirected $targetPath config to read from $sourcePath"
13 | }
14 | }
15 |
16 | Write-Output 'STARTUP: Loading config files'
17 | RedirectConfigFile $env:LOG4NET_CONFIG_PATH "$env:APP_ROOT\log4net.config"
18 | RedirectConfigFile $env:CONNECTIONSTRINGS_CONFIG_PATH "$env:APP_ROOT\connectionStrings.config"
19 |
20 | if ($env:DEPENDENCY_CHECK_ENABLED) {
21 | Write-Output 'STARTUP: Running dependency check'
22 | & $env:APP_ROOT\Utilities.DependencyCheck.exe
23 | if ($LastExitCode -ne 0) {
24 | return 1
25 | }
26 | }
27 | else {
28 | Write-Output 'STARTUP: Skipping dependency check'
29 | }
30 |
31 | Write-Output 'STARTUP: Starting IIS'
32 | Start-Service w3svc
33 |
34 | Write-Output 'STARTUP: Running metrics exporter'
35 | Invoke-WebRequest http://localhost/app -UseBasicParsing | Out-Null
36 | Start-Process -NoNewWindow C:\aspnet-exporter\aspnet-exporter.exe
37 |
38 | Write-Output 'STARTUP: Tailing log'
39 | Get-Content -Path "$env:APP_LOGS\SignUp.log" -Tail 1 -Wait
--------------------------------------------------------------------------------
/docker/prod-health/signup-web/startup.ps1:
--------------------------------------------------------------------------------
1 | function RedirectConfigFile {
2 | param([string] $sourcePath, [string] $targetPath)
3 |
4 | if ($sourcePath -And (Test-Path $sourcePath)) {
5 |
6 | Remove-Item -Force -Path $targetPath
7 |
8 | New-Item -Path $targetPath `
9 | -ItemType SymbolicLink `
10 | -Value $sourcePath
11 |
12 | Write-Output "STARTUP: Redirected $targetPath config to read from $sourcePath"
13 | }
14 | }
15 |
16 | Write-Output 'STARTUP: Loading config files'
17 | RedirectConfigFile $env:LOG4NET_CONFIG_PATH "$env:APP_ROOT\log4net.config"
18 | RedirectConfigFile $env:CONNECTIONSTRINGS_CONFIG_PATH "$env:APP_ROOT\connectionStrings.config"
19 |
20 | if ($env:DEPENDENCY_CHECK_ENABLED) {
21 | Write-Output 'STARTUP: Running dependency check'
22 | & $env:APP_ROOT\Utilities.DependencyCheck.exe
23 | if ($LastExitCode -ne 0) {
24 | return 1
25 | }
26 | }
27 | else {
28 | Write-Output 'STARTUP: Skipping dependency check'
29 | }
30 |
31 | Write-Output 'STARTUP: Starting IIS'
32 | Start-Service w3svc
33 |
34 | Write-Output 'STARTUP: Running metrics exporter'
35 | Invoke-WebRequest http://localhost/app -UseBasicParsing | Out-Null
36 | Start-Process -NoNewWindow C:\aspnet-exporter\aspnet-exporter.exe
37 |
38 | Write-Output 'STARTUP: Tailing log'
39 | Get-Content -Path "$env:APP_LOGS\SignUp.log" -Tail 1 -Wait
--------------------------------------------------------------------------------
/docker/prod-logging/signup-web/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM mcr.microsoft.com/dotnet/framework/sdk:4.7.2-20190312-windowsservercore-ltsc2019 AS builder
3 |
4 | WORKDIR C:\src
5 | COPY src\SignUp.sln .
6 | COPY src\SignUp.Core\SignUp.Core.csproj .\SignUp.Core\
7 | COPY src\SignUp.Entities\SignUp.Entities.csproj .\SignUp.Entities\
8 | COPY src\SignUp.Messaging\SignUp.Messaging.csproj .\SignUp.Messaging\
9 | COPY src\SignUp.Model\SignUp.Model.csproj .\SignUp.Model\
10 | COPY src\SignUp.Web\SignUp.Web.csproj .\SignUp.Web\
11 | COPY src\SignUp.Model\packages.config .\SignUp.Model\
12 | COPY src\SignUp.Web\packages.config .\SignUp.Web\
13 | RUN nuget restore SignUp.sln
14 |
15 | COPY src C:\src
16 | RUN msbuild SignUp.Web\SignUp.Web.csproj /p:OutputPath=c:\out /p:Configuration=Release
17 |
18 | # app image
19 | FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-ltsc2019
20 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]
21 |
22 | ENV APP_ROOT=C:\web-app `
23 | APP_LOGS=C:\logs `
24 | COLLECTOR_CONFIG_PATH="w3svc-collectors.json"
25 |
26 | EXPOSE 80 50505
27 | WORKDIR ${APP_ROOT}
28 | RUN New-WebApplication -Name 'app' -Site 'Default Web Site' -PhysicalPath $env:APP_ROOT
29 |
30 | WORKDIR C:\aspnet-exporter
31 | COPY --from=dockersamples/aspnet-monitoring-exporter:4.7.2-windowsservercore-ltsc2019 C:\aspnet-exporter .
32 |
33 | VOLUME ${APP_LOGS}
34 | COPY .\docker\prod-logging\signup-web\startup.ps1 /
35 | ENTRYPOINT ["powershell", "/startup.ps1"]
36 |
37 | COPY --from=builder C:\out\_PublishedWebsites\SignUp.Web ${APP_ROOT}
--------------------------------------------------------------------------------
/docker/prod-logging/signup-web/startup.ps1:
--------------------------------------------------------------------------------
1 | Write-Output 'STARTUP: Starting IIS'
2 | Start-Service w3svc
3 |
4 | Write-Output 'STARTUP: Running metrics exporter'
5 | Invoke-WebRequest http://localhost/app -UseBasicParsing | Out-Null
6 | Start-Process -NoNewWindow C:\aspnet-exporter\aspnet-exporter.exe
7 |
8 | Write-Output 'STARTUP: Tailing log'
9 | Get-Content -Path "$env:APP_LOGS\SignUp.log" -Tail 1 -Wait
--------------------------------------------------------------------------------
/docker/sql-server/Dockerfile:
--------------------------------------------------------------------------------
1 | #escape=`
2 | FROM mcr.microsoft.com/windows/servercore:ltsc2019
3 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
4 |
5 | ARG DOWNLOAD_URL="https://go.microsoft.com/fwlink/?linkid=829176"
6 |
7 | ENV sa_password="_" `
8 | sa_password_path="C:\ProgramData\Docker\secrets\sa-password"
9 |
10 | RUN Invoke-WebRequest -Uri $env:DOWNLOAD_URL -OutFile sqlexpress.exe; `
11 | Start-Process -Wait -FilePath .\sqlexpress.exe -ArgumentList /qs, /x:setup ; `
12 | .\setup\setup.exe /q /ACTION=Install /INSTANCENAME=SQLEXPRESS /FEATURES=SQLEngine /UPDATEENABLED=0 /SQLSVCACCOUNT='NT AUTHORITY\System' /SQLSYSADMINACCOUNTS='BUILTIN\ADMINISTRATORS' /TCPENABLED=1 /NPENABLED=0 /IACCEPTSQLSERVERLICENSETERMS ; `
13 | Remove-Item -Recurse -Force sqlexpress.exe, setup
14 |
15 | RUN Stop-Service MSSQL`$SQLEXPRESS ; `
16 | Set-ItemProperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql14.SQLEXPRESS\mssqlserver\supersocketnetlib\tcp\ipall' -name tcpdynamicports -value '' ; `
17 | Set-ItemProperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql14.SQLEXPRESS\mssqlserver\supersocketnetlib\tcp\ipall' -name tcpport -value 1433 ; `
18 | Set-ItemProperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql14.SQLEXPRESS\mssqlserver\' -name LoginMode -value 2 ;
19 |
20 | COPY start.ps1 /
21 | CMD powershell /start.ps1 -sa_password $env:sa_password -sa_password_path $env:sa_password_path -Verbose
--------------------------------------------------------------------------------
/docker/sql-server/start.ps1:
--------------------------------------------------------------------------------
1 | param(
2 | [Parameter(Mandatory=$true)]
3 | [string] $sa_password,
4 |
5 | [Parameter(Mandatory=$true)]
6 | [string] $sa_password_path
7 | )
8 |
9 | Write-Verbose "Starting SQL Server"
10 | start-service MSSQL`$SQLEXPRESS
11 |
12 | # set the SA password
13 | if ($sa_password_path -and (Test-Path $sa_password_path)) {
14 | $password = Get-Content -Raw $sa_password_path
15 | if ($password) {
16 | $sa_password = $password
17 | Write-Verbose "Using SA password from secret file: $sa_password_path"
18 | }
19 | else {
20 | Write-Verbose "WARN: Using default SA password, no password in secret file: $sa_password_path"
21 | }
22 | }
23 | else {
24 | Write-Verbose "WARN: Using default SA password, secret file not found at: $sa_password_path"
25 | }
26 |
27 | if ($sa_password) {
28 | Write-Verbose 'Changing SA login credentials'
29 | $sqlcmd = "ALTER LOGIN sa with password='$sa_password'; ALTER LOGIN sa ENABLE;"
30 | Invoke-SqlCmd -Query $sqlcmd -ServerInstance ".\SQLEXPRESS"
31 | }
32 | else {
33 | Write-Verbose 'FATAL: SA password not supplied in sa_password or sa_password_path'
34 | return 1
35 | }
36 |
37 | Write-Verbose "Started SQL Server."
38 | $lastCheck = (Get-Date).AddSeconds(-2)
39 | while ($true)
40 | {
41 | Get-EventLog -LogName Application -Source "MSSQL*" -After $lastCheck | Select-Object TimeGenerated, EntryType, Message
42 | $lastCheck = Get-Date
43 | Start-Sleep -Seconds 2
44 | }
--------------------------------------------------------------------------------
/slides/101.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/101.pptx
--------------------------------------------------------------------------------
/slides/backend.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/backend.pptx
--------------------------------------------------------------------------------
/slides/contents/1809.txt:
--------------------------------------------------------------------------------
1 | intro.md
2 | 101-container-basics.md
3 | 101-dockerfiles-and-images.md
4 | 101-image-registries.md
5 | frontend-web.md
6 | frontend-reverse-proxy.md
7 | backend-rest-api.md
8 | backend-async-messaging.md
9 | backend-analytics.md
10 | metrics-runtime.md
11 | metrics-application.md
12 | metrics-dashboard.md
13 | nfr-storage.md
14 | nfr-restart.md
15 | nfr-scale.md
16 | swarm-setup.md
17 | swarm-services.md
18 | swarm-stack.md
19 | thankyou.md
--------------------------------------------------------------------------------
/slides/contents/buildstufflt18.txt:
--------------------------------------------------------------------------------
1 | intro.md
2 | 101-container-basics.md
3 | 101-dockerfiles-and-images.md
4 | 101-image-registries.md
5 | frontend-web.md
6 | frontend-reverse-proxy.md
7 | backend-rest-api.md
8 | backend-async-messaging.md
9 | backend-analytics.md
10 | metrics-runtime.md
11 | metrics-application.md
12 | metrics-dashboard.md
13 | prod-intro.md
14 | prod-logging.md
15 | prod-config.md
16 | prod-dependencies.md
17 | prod-health.md
18 | swarm-setup.md
19 | swarm-services.md
20 | swarm-stack.md
21 | thankyou.md
--------------------------------------------------------------------------------
/slides/contents/dceu18.txt:
--------------------------------------------------------------------------------
1 | intro.md
2 | frontend-web.md
3 | frontend-reverse-proxy.md
4 | backend-rest-api.md
5 | backend-async-messaging.md
6 | backend-analytics.md
7 | metrics-runtime.md
8 | metrics-application.md
9 | metrics-dashboard.md
10 | thankyou.md
--------------------------------------------------------------------------------
/slides/contents/dcus18.txt:
--------------------------------------------------------------------------------
1 | intro.md
2 | frontend-web.md
3 | frontend-reverse-proxy.md
4 | backend-rest-api.md
5 | backend-async-messaging.md
6 | thankyou.md
--------------------------------------------------------------------------------
/slides/contents/dcus19.txt:
--------------------------------------------------------------------------------
1 | intro.md
2 | frontend-web.md
3 | frontend-reverse-proxy.md
4 | backend-rest-api.md
5 | backend-async-messaging.md
6 | backend-analytics.md
7 | metrics-runtime.md
8 | metrics-application.md
9 | metrics-dashboard.md
10 | thankyou.md
--------------------------------------------------------------------------------
/slides/contents/devsum19.txt:
--------------------------------------------------------------------------------
1 | intro.md
2 | 101-container-basics.md
3 | 101-dockerfiles-and-images.md
4 | 101-image-registries.md
5 | frontend-web.md
6 | frontend-reverse-proxy.md
7 | backend-rest-api.md
8 | backend-async-messaging.md
9 | backend-analytics.md
10 | metrics-runtime.md
11 | metrics-application.md
12 | metrics-dashboard.md
13 | prod-intro.md
14 | prod-logging.md
15 | prod-config.md
16 | prod-dependencies.md
17 | prod-health.md
18 | swarm-setup.md
19 | swarm-services.md
20 | swarm-stack.md
21 | thankyou.md
--------------------------------------------------------------------------------
/slides/contents/dvla19.txt:
--------------------------------------------------------------------------------
1 | intro.md
2 | 101-container-basics.md
3 | 101-dockerfiles-and-images.md
4 | 101-image-registries.md
5 | frontend-web.md
6 | prod-intro.md
7 | prod-logging.md
8 | prod-config.md
9 | prod-dependencies.md
10 | prod-health.md
--------------------------------------------------------------------------------
/slides/contents/gbe19.txt:
--------------------------------------------------------------------------------
1 | 101-container-basics.md
2 | 101-dockerfiles-and-images.md
3 | 101-image-registries.md
4 | frontend-web.md
5 | frontend-reverse-proxy.md
6 | backend-rest-api.md
7 | backend-async-messaging.md
8 | backend-analytics.md
9 | metrics-runtime.md
10 | metrics-application.md
11 | metrics-dashboard.md
12 | prod-intro.md
13 | prod-logging.md
14 | prod-config.md
15 | prod-dependencies.md
16 | prod-health.md
17 | swarm-setup.md
18 | swarm-services.md
19 | swarm-stack.md
20 | thankyou.md
--------------------------------------------------------------------------------
/slides/contents/master.txt:
--------------------------------------------------------------------------------
1 | intro.md
2 | 101-container-basics.md
3 | 101-dockerfiles-and-images.md
4 | 101-image-registries.md
5 | frontend-web.md
6 | frontend-reverse-proxy.md
7 | backend-rest-api.md
8 | backend-async-messaging.md
9 | backend-analytics.md
10 | metrics-runtime.md
11 | metrics-application.md
12 | metrics-dashboard.md
13 | prod-intro.md
14 | prod-logging.md
15 | prod-config.md
16 | prod-dependencies.md
17 | prod-health.md
18 | swarm-setup.md
19 | swarm-services.md
20 | swarm-stack.md
21 | thankyou.md
--------------------------------------------------------------------------------
/slides/contents/pslive19.txt:
--------------------------------------------------------------------------------
1 | intro.md
2 | 101-container-basics.md
3 | frontend-web.md
4 | frontend-reverse-proxy.md
5 | backend-async-messaging.md
6 | thankyou.md
--------------------------------------------------------------------------------
/slides/contents/sdd19.txt:
--------------------------------------------------------------------------------
1 | intro.md
2 | 101-container-basics.md
3 | 101-dockerfiles-and-images.md
4 | 101-image-registries.md
5 | frontend-web.md
6 | frontend-reverse-proxy.md
7 | backend-rest-api.md
8 | backend-async-messaging.md
9 | backend-analytics.md
10 | metrics-runtime.md
11 | metrics-application.md
12 | metrics-dashboard.md
13 | prod-intro.md
14 | prod-logging.md
15 | prod-config.md
16 | prod-dependencies.md
17 | prod-health.md
18 | swarm-setup.md
19 | swarm-services.md
20 | swarm-stack.md
21 | thankyou.md
--------------------------------------------------------------------------------
/slides/contents/slcnet.txt:
--------------------------------------------------------------------------------
1 | intro.md
2 | frontend-web.md
3 | frontend-reverse-proxy.md
4 | backend-rest-api.md
5 | backend-async-messaging.md
6 | thankyou.md
--------------------------------------------------------------------------------
/slides/contents/techoramanl18.txt:
--------------------------------------------------------------------------------
1 | intro.md
2 | 101-container-basics.md
3 | 101-dockerfiles-and-images.md
4 | 101-image-registries.md
5 | frontend-web.md
6 | frontend-reverse-proxy.md
7 | backend-rest-api.md
8 | backend-async-messaging.md
9 | backend-analytics.md
10 | metrics-runtime.md
11 | metrics-application.md
12 | metrics-dashboard.md
13 | nfr-storage.md
14 | nfr-restart.md
15 | nfr-scale.md
16 | swarm-setup.md
17 | swarm-services.md
18 | swarm-stack.md
19 | thankyou.md
--------------------------------------------------------------------------------
/slides/docker/windows/Dockerfile:
--------------------------------------------------------------------------------
1 | # escape=`
2 | FROM microsoft/windowsservercore:ltsc2016 AS build
3 | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
4 |
5 | ARG BRANCH="master"
6 |
7 | WORKDIR /slides
8 | COPY . .
9 | RUN Write-Host "Running build script for branch: $env:BRANCH"; `
10 | ./docker/windows/build.ps1
11 |
12 | FROM sixeyed/nginx
13 | COPY --from=build /slides /nginx/html
--------------------------------------------------------------------------------
/slides/docker/windows/build.ps1:
--------------------------------------------------------------------------------
1 | [CmdletBinding()]
2 | param(
3 | [string]$branch
4 | )
5 |
6 | if ("$branch" -eq "") {
7 | $branch = $env:BRANCH
8 | }
9 |
10 | Write-Output "Building branch: $branch"
11 | $rawUrl = "https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/$branch/"
12 | $repoUrl = "https://github.com/sixeyed/docker-windows-workshop/blob/$branch/"
13 |
14 | $markdownList = Get-Content ".\contents\$branch.txt"
15 | $html = ""
16 | foreach ($markdownFile in $markdownList){
17 | if ($markdownFile.StartsWith('#') -ne $true) {
18 | Write-Output "Adding content from: $markdownFile"
19 | $markdown = Get-Content ".\sections\$markdownFile"
20 | $markdown.Replace('](/', "]($rawUrl").Replace('](./', "]($repoUrl") | Out-File ".\sections\$markdownFile" -Encoding UTF8
21 | $section = "`n"
22 | $html += $section
23 | }
24 | }
25 |
26 | $(Get-Content template.html).Replace('${content}', $html) | Out-File .\index.html -Encoding UTF8
--------------------------------------------------------------------------------
/slides/fonts/geomanist/hinted-Geomanist-Book.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/fonts/geomanist/hinted-Geomanist-Book.woff2
--------------------------------------------------------------------------------
/slides/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/slides/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/slides/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/slides/frontend.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/frontend.pptx
--------------------------------------------------------------------------------
/slides/img/101/Slide1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/101/Slide1.PNG
--------------------------------------------------------------------------------
/slides/img/101/Slide2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/101/Slide2.PNG
--------------------------------------------------------------------------------
/slides/img/101/Slide3.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/101/Slide3.PNG
--------------------------------------------------------------------------------
/slides/img/backend/Slide1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/backend/Slide1.PNG
--------------------------------------------------------------------------------
/slides/img/backend/Slide2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/backend/Slide2.PNG
--------------------------------------------------------------------------------
/slides/img/backend/Slide3.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/backend/Slide3.PNG
--------------------------------------------------------------------------------
/slides/img/docker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/docker.png
--------------------------------------------------------------------------------
/slides/img/frontend/Slide1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/frontend/Slide1.PNG
--------------------------------------------------------------------------------
/slides/img/frontend/Slide2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/frontend/Slide2.PNG
--------------------------------------------------------------------------------
/slides/img/metrics/Slide1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/metrics/Slide1.PNG
--------------------------------------------------------------------------------
/slides/img/prod/Slide1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/prod/Slide1.PNG
--------------------------------------------------------------------------------
/slides/img/prod/Slide2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/prod/Slide2.PNG
--------------------------------------------------------------------------------
/slides/img/prod/Slide3.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/prod/Slide3.PNG
--------------------------------------------------------------------------------
/slides/img/prod/Slide4.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/prod/Slide4.PNG
--------------------------------------------------------------------------------
/slides/img/prod/Slide5.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/prod/Slide5.PNG
--------------------------------------------------------------------------------
/slides/img/prod/Slide6.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/prod/Slide6.PNG
--------------------------------------------------------------------------------
/slides/img/prod/Slide7.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/prod/Slide7.PNG
--------------------------------------------------------------------------------
/slides/img/prod/Slide8.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/prod/Slide8.PNG
--------------------------------------------------------------------------------
/slides/img/prod/Slide9.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/img/prod/Slide9.PNG
--------------------------------------------------------------------------------
/slides/metrics.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/metrics.pptx
--------------------------------------------------------------------------------
/slides/netlify/build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | echo "Building branch: $BRANCH"
3 |
4 | repoUrl="https://github.com/sixeyed/docker-windows-workshop/blob/$BRANCH/"
5 |
6 | markdownList=$(<"./contents/$BRANCH.txt")
7 | html=""
8 | for markdownFile in $markdownList
9 | do
10 | echo "Adding content from: $markdownFile"
11 | sed -i '' -e "s#](./#]($repoUrl#g" "./sections/$markdownFile"
12 | section=""
13 | html=$html$section
14 | done
15 |
16 | placeholder='${content}'
17 | sed -e "s#$placeholder#$html#g" template.html > index.html
--------------------------------------------------------------------------------
/slides/prod.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/prod.pptx
--------------------------------------------------------------------------------
/slides/reveal/css/theme/README.md:
--------------------------------------------------------------------------------
1 | ## Dependencies
2 |
3 | Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceeding: https://github.com/hakimel/reveal.js#full-setup
4 |
5 | ## Creating a Theme
6 |
7 | To create your own theme, start by duplicating a ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source). It will be automatically compiled by Grunt from Sass to CSS (see the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js)) when you run `grunt css-themes`.
8 |
9 | Each theme file does four things in the following order:
10 |
11 | 1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)**
12 | Shared utility functions.
13 |
14 | 2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)**
15 | Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3.
16 |
17 | 3. **Override**
18 | This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding any selectors and styles you please.
19 |
20 | 4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)**
21 | The template theme file which will generate final CSS output based on the currently defined variables.
22 |
--------------------------------------------------------------------------------
/slides/reveal/css/theme/source/beige.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Beige theme for reveal.js.
3 | *
4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 |
15 | // Include theme-specific fonts
16 | @import url(../../lib/font/league-gothic/league-gothic.css);
17 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
18 |
19 |
20 | // Override theme settings (see ../template/settings.scss)
21 | $mainColor: #333;
22 | $headingColor: #333;
23 | $headingTextShadow: none;
24 | $backgroundColor: #f7f3de;
25 | $linkColor: #8b743d;
26 | $linkColorHover: lighten( $linkColor, 20% );
27 | $selectionBackgroundColor: rgba(79, 64, 28, 0.99);
28 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
29 |
30 | // Background generator
31 | @mixin bodyBackground() {
32 | @include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) );
33 | }
34 |
35 |
36 |
37 | // Theme template ------------------------------
38 | @import "../template/theme";
39 | // ---------------------------------------------
--------------------------------------------------------------------------------
/slides/reveal/css/theme/source/black.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Black theme for reveal.js. This is the opposite of the 'white' theme.
3 | *
4 | * By Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 | // Include theme-specific fonts
15 | @import url(../../lib/font/source-sans-pro/source-sans-pro.css);
16 |
17 |
18 | // Override theme settings (see ../template/settings.scss)
19 | $backgroundColor: #222;
20 |
21 | $mainColor: #fff;
22 | $headingColor: #fff;
23 |
24 | $mainFontSize: 42px;
25 | $mainFont: 'Source Sans Pro', Helvetica, sans-serif;
26 | $headingFont: 'Source Sans Pro', Helvetica, sans-serif;
27 | $headingTextShadow: none;
28 | $headingLetterSpacing: normal;
29 | $headingTextTransform: uppercase;
30 | $headingFontWeight: 600;
31 | $linkColor: #42affa;
32 | $linkColorHover: lighten( $linkColor, 15% );
33 | $selectionBackgroundColor: lighten( $linkColor, 25% );
34 |
35 | $heading1Size: 2.5em;
36 | $heading2Size: 1.6em;
37 | $heading3Size: 1.3em;
38 | $heading4Size: 1.0em;
39 |
40 | section.has-light-background {
41 | &, h1, h2, h3, h4, h5, h6 {
42 | color: #222;
43 | }
44 | }
45 |
46 |
47 | // Theme template ------------------------------
48 | @import "../template/theme";
49 | // ---------------------------------------------
--------------------------------------------------------------------------------
/slides/reveal/css/theme/source/league.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * League theme for reveal.js.
3 | *
4 | * This was the default theme pre-3.0.0.
5 | *
6 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
7 | */
8 |
9 |
10 | // Default mixins and settings -----------------
11 | @import "../template/mixins";
12 | @import "../template/settings";
13 | // ---------------------------------------------
14 |
15 |
16 |
17 | // Include theme-specific fonts
18 | @import url(../../lib/font/league-gothic/league-gothic.css);
19 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
20 |
21 | // Override theme settings (see ../template/settings.scss)
22 | $headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2);
23 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
24 |
25 | // Background generator
26 | @mixin bodyBackground() {
27 | @include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) );
28 | }
29 |
30 |
31 |
32 | // Theme template ------------------------------
33 | @import "../template/theme";
34 | // ---------------------------------------------
--------------------------------------------------------------------------------
/slides/reveal/css/theme/source/moon.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Solarized Dark theme for reveal.js.
3 | * Author: Achim Staebler
4 | */
5 |
6 |
7 | // Default mixins and settings -----------------
8 | @import "../template/mixins";
9 | @import "../template/settings";
10 | // ---------------------------------------------
11 |
12 |
13 |
14 | // Include theme-specific fonts
15 | @import url(../../lib/font/league-gothic/league-gothic.css);
16 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
17 |
18 | /**
19 | * Solarized colors by Ethan Schoonover
20 | */
21 | html * {
22 | color-profile: sRGB;
23 | rendering-intent: auto;
24 | }
25 |
26 | // Solarized colors
27 | $base03: #002b36;
28 | $base02: #073642;
29 | $base01: #586e75;
30 | $base00: #657b83;
31 | $base0: #839496;
32 | $base1: #93a1a1;
33 | $base2: #eee8d5;
34 | $base3: #fdf6e3;
35 | $yellow: #b58900;
36 | $orange: #cb4b16;
37 | $red: #dc322f;
38 | $magenta: #d33682;
39 | $violet: #6c71c4;
40 | $blue: #268bd2;
41 | $cyan: #2aa198;
42 | $green: #859900;
43 |
44 | // Override theme settings (see ../template/settings.scss)
45 | $mainColor: $base1;
46 | $headingColor: $base2;
47 | $headingTextShadow: none;
48 | $backgroundColor: $base03;
49 | $linkColor: $blue;
50 | $linkColorHover: lighten( $linkColor, 20% );
51 | $selectionBackgroundColor: $magenta;
52 |
53 |
54 |
55 | // Theme template ------------------------------
56 | @import "../template/theme";
57 | // ---------------------------------------------
58 |
--------------------------------------------------------------------------------
/slides/reveal/css/theme/source/night.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Black theme for reveal.js.
3 | *
4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 | // Include theme-specific fonts
15 | @import url(https://fonts.googleapis.com/css?family=Montserrat:700);
16 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
17 |
18 |
19 | // Override theme settings (see ../template/settings.scss)
20 | $backgroundColor: #111;
21 |
22 | $mainFont: 'Open Sans', sans-serif;
23 | $linkColor: #e7ad52;
24 | $linkColorHover: lighten( $linkColor, 20% );
25 | $headingFont: 'Montserrat', Impact, sans-serif;
26 | $headingTextShadow: none;
27 | $headingLetterSpacing: -0.03em;
28 | $headingTextTransform: none;
29 | $selectionBackgroundColor: #e7ad52;
30 |
31 |
32 | // Theme template ------------------------------
33 | @import "../template/theme";
34 | // ---------------------------------------------
--------------------------------------------------------------------------------
/slides/reveal/css/theme/source/serif.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * A simple theme for reveal.js presentations, similar
3 | * to the default theme. The accent color is brown.
4 | *
5 | * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
6 | */
7 |
8 |
9 | // Default mixins and settings -----------------
10 | @import "../template/mixins";
11 | @import "../template/settings";
12 | // ---------------------------------------------
13 |
14 |
15 |
16 | // Override theme settings (see ../template/settings.scss)
17 | $mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
18 | $mainColor: #000;
19 | $headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
20 | $headingColor: #383D3D;
21 | $headingTextShadow: none;
22 | $headingTextTransform: none;
23 | $backgroundColor: #F0F1EB;
24 | $linkColor: #51483D;
25 | $linkColorHover: lighten( $linkColor, 20% );
26 | $selectionBackgroundColor: #26351C;
27 |
28 | .reveal a {
29 | line-height: 1.3em;
30 | }
31 |
32 |
33 | // Theme template ------------------------------
34 | @import "../template/theme";
35 | // ---------------------------------------------
36 |
--------------------------------------------------------------------------------
/slides/reveal/css/theme/source/simple.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * A simple theme for reveal.js presentations, similar
3 | * to the default theme. The accent color is darkblue.
4 | *
5 | * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
6 | * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
7 | */
8 |
9 |
10 | // Default mixins and settings -----------------
11 | @import "../template/mixins";
12 | @import "../template/settings";
13 | // ---------------------------------------------
14 |
15 |
16 |
17 | // Include theme-specific fonts
18 | @import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
19 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
20 |
21 |
22 | // Override theme settings (see ../template/settings.scss)
23 | $mainFont: 'Lato', sans-serif;
24 | $mainColor: #000;
25 | $headingFont: 'News Cycle', Impact, sans-serif;
26 | $headingColor: #000;
27 | $headingTextShadow: none;
28 | $headingTextTransform: none;
29 | $backgroundColor: #fff;
30 | $linkColor: #00008B;
31 | $linkColorHover: lighten( $linkColor, 20% );
32 | $selectionBackgroundColor: rgba(0, 0, 0, 0.99);
33 |
34 | section.has-dark-background {
35 | &, h1, h2, h3, h4, h5, h6 {
36 | color: #fff;
37 | }
38 | }
39 |
40 |
41 | // Theme template ------------------------------
42 | @import "../template/theme";
43 | // ---------------------------------------------
--------------------------------------------------------------------------------
/slides/reveal/css/theme/source/sky.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Sky theme for reveal.js.
3 | *
4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 |
15 | // Include theme-specific fonts
16 | @import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
17 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
18 |
19 |
20 | // Override theme settings (see ../template/settings.scss)
21 | $mainFont: 'Open Sans', sans-serif;
22 | $mainColor: #333;
23 | $headingFont: 'Quicksand', sans-serif;
24 | $headingColor: #333;
25 | $headingLetterSpacing: -0.08em;
26 | $headingTextShadow: none;
27 | $backgroundColor: #f7fbfc;
28 | $linkColor: #3b759e;
29 | $linkColorHover: lighten( $linkColor, 20% );
30 | $selectionBackgroundColor: #134674;
31 |
32 | // Fix links so they are not cut off
33 | .reveal a {
34 | line-height: 1.3em;
35 | }
36 |
37 | // Background generator
38 | @mixin bodyBackground() {
39 | @include radial-gradient( #add9e4, #f7fbfc );
40 | }
41 |
42 |
43 |
44 | // Theme template ------------------------------
45 | @import "../template/theme";
46 | // ---------------------------------------------
47 |
--------------------------------------------------------------------------------
/slides/reveal/css/theme/source/solarized.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Solarized Light theme for reveal.js.
3 | * Author: Achim Staebler
4 | */
5 |
6 |
7 | // Default mixins and settings -----------------
8 | @import "../template/mixins";
9 | @import "../template/settings";
10 | // ---------------------------------------------
11 |
12 |
13 |
14 | // Include theme-specific fonts
15 | @import url(../../lib/font/league-gothic/league-gothic.css);
16 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
17 |
18 |
19 | /**
20 | * Solarized colors by Ethan Schoonover
21 | */
22 | html * {
23 | color-profile: sRGB;
24 | rendering-intent: auto;
25 | }
26 |
27 | // Solarized colors
28 | $base03: #002b36;
29 | $base02: #073642;
30 | $base01: #586e75;
31 | $base00: #657b83;
32 | $base0: #839496;
33 | $base1: #93a1a1;
34 | $base2: #eee8d5;
35 | $base3: #fdf6e3;
36 | $yellow: #b58900;
37 | $orange: #cb4b16;
38 | $red: #dc322f;
39 | $magenta: #d33682;
40 | $violet: #6c71c4;
41 | $blue: #268bd2;
42 | $cyan: #2aa198;
43 | $green: #859900;
44 |
45 | // Override theme settings (see ../template/settings.scss)
46 | $mainColor: $base00;
47 | $headingColor: $base01;
48 | $headingTextShadow: none;
49 | $backgroundColor: $base3;
50 | $linkColor: $blue;
51 | $linkColorHover: lighten( $linkColor, 20% );
52 | $selectionBackgroundColor: $magenta;
53 |
54 | // Background generator
55 | // @mixin bodyBackground() {
56 | // @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) );
57 | // }
58 |
59 |
60 |
61 | // Theme template ------------------------------
62 | @import "../template/theme";
63 | // ---------------------------------------------
64 |
--------------------------------------------------------------------------------
/slides/reveal/css/theme/source/white.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * White theme for reveal.js. This is the opposite of the 'black' theme.
3 | *
4 | * By Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 | // Include theme-specific fonts
15 | @import url(../../lib/font/source-sans-pro/source-sans-pro.css);
16 |
17 |
18 | // Override theme settings (see ../template/settings.scss)
19 | $backgroundColor: #fff;
20 |
21 | $mainColor: #222;
22 | $headingColor: #222;
23 |
24 | $mainFontSize: 42px;
25 | $mainFont: 'Source Sans Pro', Helvetica, sans-serif;
26 | $headingFont: 'Source Sans Pro', Helvetica, sans-serif;
27 | $headingTextShadow: none;
28 | $headingLetterSpacing: normal;
29 | $headingTextTransform: uppercase;
30 | $headingFontWeight: 600;
31 | $linkColor: #2a76dd;
32 | $linkColorHover: lighten( $linkColor, 15% );
33 | $selectionBackgroundColor: lighten( $linkColor, 25% );
34 |
35 | $heading1Size: 2.5em;
36 | $heading2Size: 1.6em;
37 | $heading3Size: 1.3em;
38 | $heading4Size: 1.0em;
39 |
40 | section.has-dark-background {
41 | &, h1, h2, h3, h4, h5, h6 {
42 | color: #fff;
43 | }
44 | }
45 |
46 |
47 | // Theme template ------------------------------
48 | @import "../template/theme";
49 | // ---------------------------------------------
--------------------------------------------------------------------------------
/slides/reveal/css/theme/template/mixins.scss:
--------------------------------------------------------------------------------
1 | @mixin vertical-gradient( $top, $bottom ) {
2 | background: $top;
3 | background: -moz-linear-gradient( top, $top 0%, $bottom 100% );
4 | background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) );
5 | background: -webkit-linear-gradient( top, $top 0%, $bottom 100% );
6 | background: -o-linear-gradient( top, $top 0%, $bottom 100% );
7 | background: -ms-linear-gradient( top, $top 0%, $bottom 100% );
8 | background: linear-gradient( top, $top 0%, $bottom 100% );
9 | }
10 |
11 | @mixin horizontal-gradient( $top, $bottom ) {
12 | background: $top;
13 | background: -moz-linear-gradient( left, $top 0%, $bottom 100% );
14 | background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) );
15 | background: -webkit-linear-gradient( left, $top 0%, $bottom 100% );
16 | background: -o-linear-gradient( left, $top 0%, $bottom 100% );
17 | background: -ms-linear-gradient( left, $top 0%, $bottom 100% );
18 | background: linear-gradient( left, $top 0%, $bottom 100% );
19 | }
20 |
21 | @mixin radial-gradient( $outer, $inner, $type: circle ) {
22 | background: $outer;
23 | background: -moz-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
24 | background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) );
25 | background: -webkit-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
26 | background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
27 | background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
28 | background: radial-gradient( center, $type cover, $inner 0%, $outer 100% );
29 | }
--------------------------------------------------------------------------------
/slides/reveal/css/theme/template/settings.scss:
--------------------------------------------------------------------------------
1 | // Base settings for all themes that can optionally be
2 | // overridden by the super-theme
3 |
4 | // Background of the presentation
5 | $backgroundColor: #2b2b2b;
6 |
7 | // Primary/body text
8 | $mainFont: 'Lato', sans-serif;
9 | $mainFontSize: 40px;
10 | $mainColor: #eee;
11 |
12 | // Vertical spacing between blocks of text
13 | $blockMargin: 20px;
14 |
15 | // Headings
16 | $headingMargin: 0 0 $blockMargin 0;
17 | $headingFont: 'League Gothic', Impact, sans-serif;
18 | $headingColor: #eee;
19 | $headingLineHeight: 1.2;
20 | $headingLetterSpacing: normal;
21 | $headingTextTransform: uppercase;
22 | $headingTextShadow: none;
23 | $headingFontWeight: normal;
24 | $heading1TextShadow: $headingTextShadow;
25 |
26 | $heading1Size: 3.77em;
27 | $heading2Size: 2.11em;
28 | $heading3Size: 1.55em;
29 | $heading4Size: 1.00em;
30 |
31 | // Links and actions
32 | $linkColor: #13DAEC;
33 | $linkColorHover: lighten( $linkColor, 20% );
34 |
35 | // Text selection
36 | $selectionBackgroundColor: #FF5E99;
37 | $selectionColor: #fff;
38 |
39 | // Generates the presentation background, can be overridden
40 | // to return a background image or gradient
41 | @mixin bodyBackground() {
42 | background: $backgroundColor;
43 | }
--------------------------------------------------------------------------------
/slides/reveal/lib/css/zenburn.css:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov
4 | based on dark.css by Ivan Sagalaev
5 |
6 | */
7 |
8 | .hljs {
9 | display: block;
10 | overflow-x: auto;
11 | padding: 0.5em;
12 | background: #3f3f3f;
13 | color: #dcdcdc;
14 | }
15 |
16 | .hljs-keyword,
17 | .hljs-selector-tag,
18 | .hljs-tag {
19 | color: #e3ceab;
20 | }
21 |
22 | .hljs-template-tag {
23 | color: #dcdcdc;
24 | }
25 |
26 | .hljs-number {
27 | color: #8cd0d3;
28 | }
29 |
30 | .hljs-variable,
31 | .hljs-template-variable,
32 | .hljs-attribute {
33 | color: #efdcbc;
34 | }
35 |
36 | .hljs-literal {
37 | color: #efefaf;
38 | }
39 |
40 | .hljs-subst {
41 | color: #8f8f8f;
42 | }
43 |
44 | .hljs-title,
45 | .hljs-name,
46 | .hljs-selector-id,
47 | .hljs-selector-class,
48 | .hljs-section,
49 | .hljs-type {
50 | color: #efef8f;
51 | }
52 |
53 | .hljs-symbol,
54 | .hljs-bullet,
55 | .hljs-link {
56 | color: #dca3a3;
57 | }
58 |
59 | .hljs-deletion,
60 | .hljs-string,
61 | .hljs-built_in,
62 | .hljs-builtin-name {
63 | color: #cc9393;
64 | }
65 |
66 | .hljs-addition,
67 | .hljs-comment,
68 | .hljs-quote,
69 | .hljs-meta {
70 | color: #7f9f7f;
71 | }
72 |
73 |
74 | .hljs-emphasis {
75 | font-style: italic;
76 | }
77 |
78 | .hljs-strong {
79 | font-weight: bold;
80 | }
81 |
--------------------------------------------------------------------------------
/slides/reveal/lib/font/league-gothic/LICENSE:
--------------------------------------------------------------------------------
1 | SIL Open Font License (OFL)
2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
3 |
--------------------------------------------------------------------------------
/slides/reveal/lib/font/league-gothic/league-gothic.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'League Gothic';
3 | src: url('league-gothic.eot');
4 | src: url('league-gothic.eot?#iefix') format('embedded-opentype'),
5 | url('league-gothic.woff') format('woff'),
6 | url('league-gothic.ttf') format('truetype');
7 |
8 | font-weight: normal;
9 | font-style: normal;
10 | }
--------------------------------------------------------------------------------
/slides/reveal/lib/font/league-gothic/league-gothic.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/league-gothic/league-gothic.eot
--------------------------------------------------------------------------------
/slides/reveal/lib/font/league-gothic/league-gothic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/league-gothic/league-gothic.ttf
--------------------------------------------------------------------------------
/slides/reveal/lib/font/league-gothic/league-gothic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/league-gothic/league-gothic.woff
--------------------------------------------------------------------------------
/slides/reveal/lib/font/source-sans-pro/source-sans-pro-italic.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/source-sans-pro/source-sans-pro-italic.eot
--------------------------------------------------------------------------------
/slides/reveal/lib/font/source-sans-pro/source-sans-pro-italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/source-sans-pro/source-sans-pro-italic.ttf
--------------------------------------------------------------------------------
/slides/reveal/lib/font/source-sans-pro/source-sans-pro-italic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/source-sans-pro/source-sans-pro-italic.woff
--------------------------------------------------------------------------------
/slides/reveal/lib/font/source-sans-pro/source-sans-pro-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/source-sans-pro/source-sans-pro-regular.eot
--------------------------------------------------------------------------------
/slides/reveal/lib/font/source-sans-pro/source-sans-pro-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/source-sans-pro/source-sans-pro-regular.ttf
--------------------------------------------------------------------------------
/slides/reveal/lib/font/source-sans-pro/source-sans-pro-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/source-sans-pro/source-sans-pro-regular.woff
--------------------------------------------------------------------------------
/slides/reveal/lib/font/source-sans-pro/source-sans-pro-semibold.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/source-sans-pro/source-sans-pro-semibold.eot
--------------------------------------------------------------------------------
/slides/reveal/lib/font/source-sans-pro/source-sans-pro-semibold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/source-sans-pro/source-sans-pro-semibold.ttf
--------------------------------------------------------------------------------
/slides/reveal/lib/font/source-sans-pro/source-sans-pro-semibold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/source-sans-pro/source-sans-pro-semibold.woff
--------------------------------------------------------------------------------
/slides/reveal/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot
--------------------------------------------------------------------------------
/slides/reveal/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf
--------------------------------------------------------------------------------
/slides/reveal/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/slides/reveal/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff
--------------------------------------------------------------------------------
/slides/reveal/lib/font/source-sans-pro/source-sans-pro.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'Source Sans Pro';
3 | src: url('source-sans-pro-regular.eot');
4 | src: url('source-sans-pro-regular.eot?#iefix') format('embedded-opentype'),
5 | url('source-sans-pro-regular.woff') format('woff'),
6 | url('source-sans-pro-regular.ttf') format('truetype');
7 | font-weight: normal;
8 | font-style: normal;
9 | }
10 |
11 | @font-face {
12 | font-family: 'Source Sans Pro';
13 | src: url('source-sans-pro-italic.eot');
14 | src: url('source-sans-pro-italic.eot?#iefix') format('embedded-opentype'),
15 | url('source-sans-pro-italic.woff') format('woff'),
16 | url('source-sans-pro-italic.ttf') format('truetype');
17 | font-weight: normal;
18 | font-style: italic;
19 | }
20 |
21 | @font-face {
22 | font-family: 'Source Sans Pro';
23 | src: url('source-sans-pro-semibold.eot');
24 | src: url('source-sans-pro-semibold.eot?#iefix') format('embedded-opentype'),
25 | url('source-sans-pro-semibold.woff') format('woff'),
26 | url('source-sans-pro-semibold.ttf') format('truetype');
27 | font-weight: 600;
28 | font-style: normal;
29 | }
30 |
31 | @font-face {
32 | font-family: 'Source Sans Pro';
33 | src: url('source-sans-pro-semibolditalic.eot');
34 | src: url('source-sans-pro-semibolditalic.eot?#iefix') format('embedded-opentype'),
35 | url('source-sans-pro-semibolditalic.woff') format('woff'),
36 | url('source-sans-pro-semibolditalic.ttf') format('truetype');
37 | font-weight: 600;
38 | font-style: italic;
39 | }
--------------------------------------------------------------------------------
/slides/reveal/lib/js/classList.js:
--------------------------------------------------------------------------------
1 | /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
2 | if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(j){var a="classList",f="prototype",m=(j.HTMLElement||j.Element)[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p **Do not use PowerShell ISE for the workshop!** It has a strange relationship with some `docker` commands.
56 |
57 | ---
58 |
59 | ## We're ready!
60 |
61 | Here we go :)
62 |
63 |
--------------------------------------------------------------------------------
/slides/sections/prod-intro.md:
--------------------------------------------------------------------------------
1 | # Production Readiness
2 |
3 | ---
4 |
5 |
6 |
7 | ---
8 |
9 |
10 |
11 | ---
12 |
13 |
14 |
15 | ---
16 |
17 |
18 |
--------------------------------------------------------------------------------
/slides/sections/thankyou.md:
--------------------------------------------------------------------------------
1 | # We're Done!
2 |
3 | Thanks for coming to the workshop. We hope it was useful and we'll be glad to have your feedback.
4 |
5 | The content for this workshop will stay online and you don't need a Windows Server VM to follow along - you can do everything with [Docker Desktop](https://www.docker.com/docker-windows) on Windows 10.
6 |
7 | But before you go...
8 |
9 | ---
10 |
11 | ## Continuing your journey
12 |
13 | - Follow [@EltonStoneman](https://twitter.com/EltonStoneman) and [@stefscherer](https://twitter.com/stefscherer) on Twitter
14 |
15 | - Bookmark [Elton's blog](https://blog.sixeyed.com)
16 |
17 | - Read [Docker on Windows](https://www.amazon.co.uk/Docker-Windows-101-production-2nd/dp/1789617375), the book
18 |
19 | And watch these [Pluralsight](https://pluralsight.com) training courses:
20 |
21 | - [Modernizing .NET Apps with Docker](https://pluralsight.pxf.io/c/1197078/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmodernizing-dotnet-framework-apps-docker)
22 |
23 | - [Managing Load Balancing and Scale in Docker Swarm](https://pluralsight.pxf.io/c/1197078/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmanaging-load-balancing-scale-docker-swarm-clusters)
24 |
25 | - [Monitoring Containerized Application Health with Docker](https://pluralsight.pxf.io/c/1197078/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmonitoring-containerized-app-health-docker)
26 |
27 | > Don't have Pluralsight? Ping @EltonStoneman.
28 |
--------------------------------------------------------------------------------
/slides/workshop.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'Geomanist Book';
3 | src: url(fonts/geomanist/hinted-Geomanist-Book.eot);
4 | src: url(fonts/geomanist/hinted-Geomanist-Book.eot?#iefix) format('embedded-opentype'),url(../fonts/geomanist/hinted-Geomanist-Book.woff2) format('woff2'),url(../fonts/geomanist/hinted-Geomanist-Book.woff) format('woff'),url(../fonts/geomanist/hinted-Geomanist-Book.ttf) format('truetype'),url(../fonts/geomanist/hinted-Geomanist-Book.svg#Geomanist-Book) format('svg');
5 | font-weight: 400;
6 | font-style: normal
7 | }
8 |
9 | body {
10 | background-color: #F0F0F1;
11 | }
12 |
13 | .reveal {
14 | font-size: 38px;
15 | font-family: "Arial", sans-serif;
16 | }
17 |
18 | .reveal h1, .reveal h2, .reveal h3 {
19 | font-family: 'Geomanist Book';
20 | color: #0075BC;
21 | }
22 |
23 | .reveal h1 {
24 | font-size: 3em;
25 | }
26 |
27 | .reveal h2 {
28 | text-transform: none;
29 | font-size: 1.8em;
30 | }
31 |
32 | .reveal p, .reveal li {
33 | font-size: 95%;
34 | color: #0096C7;
35 | }
36 |
37 | .reveal a {
38 | text-decoration-line: underline;
39 | text-decoration-style: dotted;
40 | }
41 |
42 | .reveal pre {
43 | width: 97%;
44 | font-size: 0.6em;
45 | }
46 |
47 | .reveal blockquote {
48 | width: 90%;
49 | font-size: 0.85em;
50 | }
51 |
52 | .reveal .slides {
53 | text-align: left;
54 | background-image: url("img/docker.png");
55 | background-position: 99% 99%;
56 | background-size: 5%;
57 | background-repeat: no-repeat;
58 | }
59 |
60 | .reveal .slide-number {
61 | top: 8px;
62 | bottom: unset;
63 | font-size: 16px;
64 | background-color: #0075BC;
65 | }
--------------------------------------------------------------------------------
/src/SignUp.Api.ReferenceData/Controllers/CountriesController.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Mvc;
2 | using Microsoft.Extensions.Logging;
3 | using SignUp.Api.ReferenceData.Repositories;
4 | using SignUp.Entities;
5 | using System.Collections.Generic;
6 |
7 | namespace SignUp.Api.ReferenceData.Controllers
8 | {
9 | [Produces("application/json")]
10 | [Route("api/countries")]
11 | public class CountriesController : Controller
12 | {
13 | private readonly IRepository _repository;
14 | private readonly ILogger _logger;
15 |
16 | public CountriesController(IRepository repository, ILogger logger)
17 | {
18 | _repository = repository;
19 | _logger = logger;
20 | }
21 |
22 | [HttpGet]
23 | public IEnumerable Get()
24 | {
25 | _logger.LogInformation("Received request: get");
26 | return _repository.GetAll();
27 | }
28 | }
29 | }
--------------------------------------------------------------------------------
/src/SignUp.Api.ReferenceData/Controllers/RolesController.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Mvc;
2 | using Microsoft.Extensions.Logging;
3 | using SignUp.Api.ReferenceData.Repositories;
4 | using SignUp.Entities;
5 | using System.Collections.Generic;
6 |
7 | namespace SignUp.Api.ReferenceData.Controllers
8 | {
9 | [Produces("application/json")]
10 | [Route("api/Roles")]
11 | public class RolesController : Controller
12 | {
13 | private readonly IRepository _repository;
14 | private readonly ILogger _logger;
15 |
16 | public RolesController(IRepository repository, ILogger logger)
17 | {
18 | _repository = repository;
19 | _logger = logger;
20 | }
21 |
22 | [HttpGet]
23 | public IEnumerable Get()
24 | {
25 | _logger.LogInformation("Received request: get");
26 | return _repository.GetAll();
27 | }
28 | }
29 | }
--------------------------------------------------------------------------------
/src/SignUp.Api.ReferenceData/Program.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore;
2 | using Microsoft.AspNetCore.Hosting;
3 |
4 | namespace SignUp.Api.ReferenceData
5 | {
6 | public class Program
7 | {
8 | public static void Main(string[] args)
9 | {
10 | BuildWebHost(args).Run();
11 | }
12 |
13 | public static IWebHost BuildWebHost(string[] args) =>
14 | WebHost.CreateDefaultBuilder(args)
15 | .UseStartup()
16 | .Build();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/SignUp.Api.ReferenceData/Repositories/CountryRepository.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.Configuration;
2 | using Microsoft.Extensions.Logging;
3 | using SignUp.Entities;
4 |
5 | namespace SignUp.Api.ReferenceData.Repositories
6 | {
7 | public class CountryRepository : RepositoryBase
8 | {
9 | public CountryRepository(IConfiguration configuration, ILogger logger) : base(configuration, logger)
10 | {
11 | }
12 |
13 | protected override string GetAllSqlQuery => "SELECT* FROM Countries";
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/SignUp.Api.ReferenceData/Repositories/RoleRepository.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.Configuration;
2 | using Microsoft.Extensions.Logging;
3 | using SignUp.Entities;
4 |
5 | namespace SignUp.Api.ReferenceData.Repositories
6 | {
7 | public class RoleRepository : RepositoryBase
8 | {
9 | public RoleRepository(IConfiguration configuration, ILogger logger) : base(configuration, logger)
10 | {
11 | }
12 |
13 | protected override string GetAllSqlQuery => "SELECT* FROM Roles";
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/SignUp.Api.ReferenceData/Repositories/Spec/IRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace SignUp.Api.ReferenceData.Repositories
4 | {
5 | public interface IRepository
6 | {
7 | IEnumerable GetAll();
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/SignUp.Api.ReferenceData/Repositories/Spec/RepositoryBase.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Data;
3 | using System.Data.SqlClient;
4 | using Dapper;
5 | using Microsoft.Extensions.Configuration;
6 | using Microsoft.Extensions.Logging;
7 |
8 | namespace SignUp.Api.ReferenceData.Repositories
9 | {
10 | public abstract class RepositoryBase : IRepository
11 | {
12 | protected readonly IConfiguration _configuration;
13 | protected readonly ILogger _logger;
14 |
15 | protected abstract string GetAllSqlQuery { get; }
16 |
17 | public RepositoryBase(IConfiguration configuration, ILogger logger)
18 | {
19 | _configuration = configuration;
20 | _logger = logger;
21 | }
22 |
23 | public IDbConnection Connection
24 | {
25 | get
26 | {
27 | var connectionString = _configuration.GetConnectionString("SignUpDb");
28 | return new SqlConnection(connectionString);
29 | }
30 | }
31 |
32 | public IEnumerable GetAll()
33 | {
34 | _logger.LogDebug("GetAll - executing SQL query: '{0}'", GetAllSqlQuery);
35 | using (IDbConnection dbConnection = Connection)
36 | {
37 | dbConnection.Open();
38 | return dbConnection.Query(GetAllSqlQuery);
39 | }
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/SignUp.Api.ReferenceData/SignUp.Api.ReferenceData.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netcoreapp2.1
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/src/SignUp.Api.ReferenceData/Startup.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Builder;
2 | using Microsoft.AspNetCore.Hosting;
3 | using Microsoft.Extensions.Configuration;
4 | using Microsoft.Extensions.DependencyInjection;
5 | using SignUp.Api.ReferenceData.Repositories;
6 | using SignUp.Entities;
7 |
8 | namespace SignUp.Api.ReferenceData
9 | {
10 | public class Startup
11 | {
12 | public Startup(IConfiguration configuration)
13 | {
14 | Configuration = configuration;
15 | }
16 |
17 | public IConfiguration Configuration { get; }
18 |
19 | public void ConfigureServices(IServiceCollection services)
20 | {
21 | services.AddMvc();
22 | services.AddTransient, CountryRepository>();
23 | services.AddTransient, RoleRepository>();
24 | }
25 |
26 | public void Configure(IApplicationBuilder app, IHostingEnvironment env)
27 | {
28 | if (env.IsDevelopment())
29 | {
30 | app.UseDeveloperExceptionPage();
31 | }
32 | app.UseMvc();
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/SignUp.Api.ReferenceData/appsettings.Development.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "IncludeScopes": false,
4 | "LogLevel": {
5 | "Default": "Debug",
6 | "System": "Information",
7 | "Microsoft": "Information"
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/SignUp.Api.ReferenceData/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "IncludeScopes": false,
4 | "Console": {
5 | "LogLevel": {
6 | "Default": "Debug",
7 | "System": "Warning",
8 | "Microsoft": "Warning"
9 | }
10 | }
11 | },
12 | "Database": {
13 | "MaxRetryCount": "3",
14 | "MaxDelaySeconds": "10"
15 | },
16 | "ConnectionStrings": {
17 | "SignUpDb": "Server=signup-db;Database=SignUp;User Id=sa;Password=DockerCon!!!"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/SignUp.Core/Config.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.Configuration;
2 |
3 | namespace SignUp.Core
4 | {
5 | public class Config
6 | {
7 | public static IConfiguration Current { get; private set; }
8 |
9 | static Config()
10 | {
11 | Current = new ConfigurationBuilder()
12 | .AddJsonFile("appsettings.json")
13 | .AddEnvironmentVariables()
14 | .Build();
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/SignUp.Core/SignUp.Core.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/src/SignUp.EndToEndTests/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/SignUp.EndToEndTests/AssertHelper.cs:
--------------------------------------------------------------------------------
1 | using NUnit.Framework;
2 | using System;
3 | using System.Threading;
4 |
5 | namespace SignUp.EndToEndTests
6 | {
7 | public static class AssertHelper
8 | {
9 | public static void RetryAssert(int retryInterval, int retryCount, string failureMessage, Func assertion)
10 | {
11 | var assert = assertion();
12 | var count = 1;
13 | while (assert == false && count < retryCount)
14 | {
15 | Thread.Sleep(retryInterval);
16 | assert = assertion();
17 | count++;
18 | }
19 | Assert.IsTrue(assert, failureMessage);
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/SignUp.EndToEndTests/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("SignUp.EndToEndTests")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("SignUp.EndToEndTests")]
13 | [assembly: AssemblyCopyright("Copyright © 2017")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("d47cf813-de0e-4cc4-b9ed-8ee4b6f14869")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/src/SignUp.EndToEndTests/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/src/SignUp.Entities/Country.cs:
--------------------------------------------------------------------------------
1 | namespace SignUp.Entities
2 | {
3 | public class Country
4 | {
5 | public string CountryCode { get; set; }
6 |
7 | public string CountryName { get; set; }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/SignUp.Entities/Prospect.cs:
--------------------------------------------------------------------------------
1 | namespace SignUp.Entities
2 | {
3 | public class Prospect
4 | {
5 | public int ProspectId { get; set; }
6 |
7 | public string FirstName { get; set; }
8 |
9 | public string LastName { get; set; }
10 |
11 | public string CompanyName { get; set; }
12 |
13 | public string EmailAddress { get; set; }
14 |
15 | public Role Role { get; set; }
16 |
17 | public Country Country { get; set; }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/SignUp.Entities/Role.cs:
--------------------------------------------------------------------------------
1 | namespace SignUp.Entities
2 | {
3 | public class Role
4 | {
5 | public string RoleCode { get; set; }
6 |
7 | public string RoleName { get; set; }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/SignUp.Entities/SignUp.Entities.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/SignUp.MessageHandlers.IndexProspect/Documents/Prospect.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace SignUp.MessageHandlers.IndexProspect.Documents
4 | {
5 | public class Prospect
6 | {
7 | public string FullName { get; set; }
8 |
9 | public string CompanyName { get; set; }
10 |
11 | public string EmailAddress { get; set; }
12 |
13 | public string RoleName { get; set; }
14 |
15 | public string CountryName { get; set; }
16 |
17 | public DateTime SignUpDate { get; set; }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/SignUp.MessageHandlers.IndexProspect/Indexer/Index.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.Configuration;
2 | using Nest;
3 | using SignUp.MessageHandlers.IndexProspect.Documents;
4 | using System;
5 |
6 | namespace SignUp.MessageHandlers.IndexProspect.Indexer
7 | {
8 | public class Index
9 | {
10 | private readonly IConfiguration _config;
11 |
12 | public Index(IConfiguration config)
13 | {
14 | _config = config;
15 | EnsureIndex();
16 | }
17 |
18 | private void EnsureIndex()
19 | {
20 | Console.WriteLine($"Initializing Elasticsearch. url: {_config["Elasticsearch:Url"]}");
21 | GetClient().CreateIndex("prospects");
22 | }
23 |
24 | public void CreateDocument(Prospect prospect)
25 | {
26 | GetClient().Index(prospect, idx => idx.Index("prospects"));
27 | }
28 |
29 | private ElasticClient GetClient()
30 | {
31 | var uri = new Uri(_config["Elasticsearch:Url"]);
32 | return new ElasticClient(uri);
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/SignUp.MessageHandlers.IndexProspect/Program.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.Configuration;
2 | using Microsoft.Extensions.DependencyInjection;
3 | using SignUp.Core;
4 | using SignUp.MessageHandlers.IndexProspect.Indexer;
5 | using SignUp.MessageHandlers.IndexProspect.Workers;
6 |
7 | namespace SignUp.MessageHandlers.IndexProspect
8 | {
9 | class Program
10 | {
11 | static void Main(string[] args)
12 | {
13 | var serviceProvider = new ServiceCollection()
14 | .AddSingleton(Config.Current)
15 | .AddSingleton()
16 | .AddSingleton()
17 | .BuildServiceProvider();
18 |
19 | var worker = serviceProvider.GetService();
20 | worker.Start();
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/SignUp.MessageHandlers.IndexProspect/SignUp.MessageHandlers.IndexProspect.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | netcoreapp2.1
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | PreserveNewest
15 | PreserveNewest
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/src/SignUp.MessageHandlers.IndexProspect/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Elasticsearch": {
3 | "Url": "http://elasticsearch:9200"
4 | },
5 | "MessageQueue": {
6 | "Url": "nats://message-queue:4222"
7 | },
8 | "Metrics": {
9 | "Enabled" : false,
10 | "Port" : 50505
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/SignUp.MessageHandlers.SaveProspect/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("SignUp.MessageHandlers.SaveProspect")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("SignUp.MessageHandlers.SaveProspect")]
13 | [assembly: AssemblyCopyright("Copyright © 2017")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("65089c80-27f1-4744-979b-4c5a33b0cff6")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/src/SignUp.MessageHandlers.SaveProspect/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "MessageQueue": {
3 | "Url": "nats://message-queue:4222"
4 | },
5 | "Database": {
6 | "MaxRetryCount": "3",
7 | "MaxDelaySeconds": "10"
8 | },
9 | "Metrics": {
10 | "Enabled" : false,
11 | "Port" : 50505
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/SignUp.MessageHandlers.SaveProspect/connectionStrings.config:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/src/SignUp.Messaging/MessageHelper.cs:
--------------------------------------------------------------------------------
1 | using Newtonsoft.Json;
2 | using SignUp.Messaging.Messages;
3 | using System.Text;
4 |
5 | namespace SignUp.Messaging
6 | {
7 | public class MessageHelper
8 | {
9 | public static byte[] ToData(TMessage message)
10 | where TMessage : Message
11 | {
12 | var json = JsonConvert.SerializeObject(message);
13 | return Encoding.Unicode.GetBytes(json);
14 | }
15 |
16 | public static TMessage FromData(byte[] data)
17 | where TMessage : Message
18 | {
19 | var json = Encoding.Unicode.GetString(data);
20 | return (TMessage)JsonConvert.DeserializeObject(json);
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/SignUp.Messaging/MessageQueue.cs:
--------------------------------------------------------------------------------
1 | using NATS.Client;
2 | using SignUp.Core;
3 | using SignUp.Messaging.Messages;
4 |
5 | namespace SignUp.Messaging
6 | {
7 | public static class MessageQueue
8 | {
9 |
10 | public static void Publish(TMessage message)
11 | where TMessage : Message
12 | {
13 | using (var connection = CreateConnection())
14 | {
15 | var data = MessageHelper.ToData(message);
16 | connection.Publish(message.Subject, data);
17 | }
18 | }
19 |
20 | public static IConnection CreateConnection()
21 | {
22 | return new ConnectionFactory().CreateConnection(Config.Current["MessageQueue:Url"]);
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/SignUp.Messaging/Messages/Events/ProspectSignedUpEvent.cs:
--------------------------------------------------------------------------------
1 | using SignUp.Entities;
2 | using System;
3 |
4 | namespace SignUp.Messaging.Messages.Events
5 | {
6 | public class ProspectSignedUpEvent : Message
7 | {
8 | public override string Subject { get { return MessageSubject; } }
9 |
10 | public DateTime SignedUpAt { get; set; }
11 |
12 | public Prospect Prospect { get; set; }
13 |
14 | public static string MessageSubject = "events.prospect.signedup";
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/SignUp.Messaging/Messages/Message.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace SignUp.Messaging.Messages
4 | {
5 | public abstract class Message
6 | {
7 | public string CorrelationId { get; set; }
8 |
9 | public abstract string Subject { get; }
10 |
11 | public Message()
12 | {
13 | CorrelationId = Guid.NewGuid().ToString();
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/SignUp.Messaging/SignUp.Messaging.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/SignUp.Model/ProductLaunchConfiguration.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Data.Entity;
3 | using System.Data.Entity.SqlServer;
4 | using Microsoft.Extensions.Configuration;
5 | using SignUp.Core;
6 |
7 | namespace SignUp.Model
8 | {
9 | public class SignUpConfiguration : DbConfiguration
10 | {
11 | public SignUpConfiguration()
12 | {
13 | var maxRetryCount = Config.Current.GetValue("Database:MaxRetryCount");
14 | var maxDelaySeconds = Config.Current.GetValue("Database:MaxDelaySeconds");
15 |
16 | Console.WriteLine($"- Setting DbConfiguration - maxRetryCount: {maxRetryCount}, maxDelaySeconds: {maxDelaySeconds}");
17 |
18 | SetExecutionStrategy("System.Data.SqlClient", () =>
19 | new SqlAzureExecutionStrategy(maxRetryCount, TimeSpan.FromSeconds(maxDelaySeconds)));
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/SignUp.Model/ProductLaunchContext.cs:
--------------------------------------------------------------------------------
1 | using System.Data.Entity;
2 | using SignUp.Entities;
3 |
4 | namespace SignUp.Model
5 | {
6 | public class SignUpContext : DbContext
7 | {
8 | public SignUpContext() : base("SignUpDb") { }
9 |
10 | public DbSet Countries { get; set; }
11 |
12 | public DbSet Roles { get; set; }
13 |
14 | public DbSet Prospects { get; set; }
15 |
16 | protected override void OnModelCreating(DbModelBuilder builder)
17 | {
18 | builder.Entity().HasKey(c => c.CountryCode);
19 | builder.Entity().HasKey(r => r.RoleCode);
20 | builder.Entity().HasOptional(p => p.Country);
21 | builder.Entity().HasOptional(p => p.Role);
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/SignUp.Model/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("SignUp.Model")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("SignUp.Model")]
13 | [assembly: AssemblyCopyright("Copyright © 2017")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("3afc4a48-5db6-48ff-a459-20ec21a2eb28")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/src/SignUp.Model/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/SignUp.Web.Setup/package-msi.ps1:
--------------------------------------------------------------------------------
1 | $wixPath = 'C:\Program Files (x86)\WiX Toolset v3.11\bin'
2 |
3 | & "$wixPath\candle.exe" -out .\Output\SignUp.wixobj .\Product.wxs -ext WixIIsExtension -ext WixUiExtension -ext WixUtilExtension
4 | & "$wixPath\light.exe" -out .\Output\SignUp.msi .\Output\SignUp.wixobj -ext WixIISExtension -ext WixUiExtension -ext WixUtilExtension -cultures:en-us
5 |
--------------------------------------------------------------------------------
/src/SignUp.Web/About.aspx:
--------------------------------------------------------------------------------
1 | <%@ Page Title="About" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="SignUp.Web.About" %>
2 |
3 |
4 | <%: Title %>.
5 | Your application description page.
6 | Use this area to provide additional information.
7 |
8 |
--------------------------------------------------------------------------------
/src/SignUp.Web/About.aspx.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Web;
5 | using System.Web.UI;
6 | using System.Web.UI.WebControls;
7 |
8 | namespace SignUp.Web
9 | {
10 | public partial class About : Page
11 | {
12 | protected void Page_Load(object sender, EventArgs e)
13 | {
14 |
15 | }
16 | }
17 | }
--------------------------------------------------------------------------------
/src/SignUp.Web/About.aspx.designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | //
5 | // Changes to this file may cause incorrect behavior and will be lost if
6 | // the code is regenerated.
7 | //
8 | //------------------------------------------------------------------------------
9 |
10 | namespace SignUp.Web
11 | {
12 |
13 |
14 | public partial class About
15 | {
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/SignUp.Web/App_Start/RouteConfig.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Web;
4 | using System.Web.Routing;
5 | using Microsoft.AspNet.FriendlyUrls;
6 |
7 | namespace SignUp.Web
8 | {
9 | public static class RouteConfig
10 | {
11 | public static void RegisterRoutes(RouteCollection routes)
12 | {
13 | var settings = new FriendlyUrlSettings();
14 | settings.AutoRedirectMode = RedirectMode.Permanent;
15 | routes.EnableFriendlyUrls(settings);
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Bundle.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Contact.aspx:
--------------------------------------------------------------------------------
1 | <%@ Page Title="Contact" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Contact.aspx.cs" Inherits="SignUp.Web.Contact" %>
2 |
3 |
4 | <%: Title %>.
5 | Your contact page.
6 |
7 | One Microsoft Way
8 | Redmond, WA 98052-6399
9 | P:
10 | 425.555.0100
11 |
12 |
13 |
14 | Support: Support@example.com
15 | Marketing: Marketing@example.com
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Contact.aspx.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Web;
5 | using System.Web.UI;
6 | using System.Web.UI.WebControls;
7 |
8 | namespace SignUp.Web
9 | {
10 | public partial class Contact : Page
11 | {
12 | protected void Page_Load(object sender, EventArgs e)
13 | {
14 |
15 | }
16 | }
17 | }
--------------------------------------------------------------------------------
/src/SignUp.Web/Contact.aspx.designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | //
5 | // Changes to this file may cause incorrect behavior and will be lost if
6 | // the code is regenerated.
7 | //
8 | //------------------------------------------------------------------------------
9 |
10 | namespace SignUp.Web
11 | {
12 |
13 |
14 | public partial class Contact
15 | {
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Content/Site.css:
--------------------------------------------------------------------------------
1 | /* v2 */
2 | @font-face {
3 | font-family: 'Geomanist Book';
4 | src: url(../fonts/geomanist/hinted-Geomanist-Book.eot);
5 | src: url(../fonts/geomanist/hinted-Geomanist-Book.eot?#iefix) format('embedded-opentype'),url(../fonts/geomanist/hinted-Geomanist-Book.woff2) format('woff2'),url(../fonts/geomanist/hinted-Geomanist-Book.woff) format('woff'),url(../fonts/geomanist/hinted-Geomanist-Book.ttf) format('truetype'),url(../fonts/geomanist/hinted-Geomanist-Book.svg#Geomanist-Book) format('svg');
6 | font-weight: 400;
7 | font-style: normal
8 | }
9 |
10 | /* Move down content because we have a fixed navbar that is 50px tall */
11 | body {
12 | padding-top: 50px;
13 | padding-bottom: 20px;
14 | /* v1.1 */
15 | background-color: #37A1D5;
16 | color: #FFF;
17 | font-size: 18px;
18 | }
19 |
20 | /* Wrapping element */
21 | /* Set some basic padding to keep content from hitting the edges */
22 | .body-content {
23 | padding-left: 15px;
24 | padding-right: 15px;
25 | }
26 |
27 | /* Set widths on the form inputs since otherwise they're 100% wide */
28 | input,
29 | select,
30 | textarea {
31 | max-width: 280px;
32 | }
33 |
34 |
35 | /* Responsive: Portrait tablets and up */
36 | @media screen and (min-width: 768px) {
37 | .jumbotron {
38 | margin-top: 20px;
39 | }
40 |
41 | .body-content {
42 | padding: 0;
43 | }
44 | }
45 |
46 | /* v1.1 */
47 |
48 | .jumbotron {
49 | font-family: 'Geomanist Book';
50 | background-color: #0087C9;
51 | }
52 |
53 | h1, h2 {
54 | font-family: 'Geomanist Book';
55 | }
56 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Default.aspx.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Web.UI;
3 |
4 | namespace SignUp.Web
5 | {
6 | public partial class _Default : Page
7 | {
8 | protected void Page_Load(object sender, EventArgs e)
9 | {
10 | }
11 | }
12 | }
--------------------------------------------------------------------------------
/src/SignUp.Web/Default.aspx.designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | //
5 | // Changes to this file may cause incorrect behavior and will be lost if
6 | // the code is regenerated.
7 | //
8 | //------------------------------------------------------------------------------
9 |
10 | namespace SignUp.Web
11 | {
12 |
13 |
14 | public partial class _Default
15 | {
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Global.asax:
--------------------------------------------------------------------------------
1 | <%@ Application Codebehind="Global.asax.cs" Inherits="SignUp.Web.Global" Language="C#" %>
2 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Logging/LogLevel.cs:
--------------------------------------------------------------------------------
1 | namespace SignUp.Web.Logging
2 | {
3 | public enum LogLevel
4 | {
5 | Info,
6 | Warn,
7 | Debug,
8 | Error,
9 | Fatal
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("SignUp.Web")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("SignUp.Web")]
13 | [assembly: AssemblyCopyright("Copyright © 2017")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("17a57cf4-a6c1-47c1-aa38-650db6d87f8f")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Revision and Build Numbers
33 | // by using the '*' as shown below:
34 | [assembly: AssemblyVersion("1.0.0.0")]
35 | [assembly: AssemblyFileVersion("1.0.0.0")]
36 |
--------------------------------------------------------------------------------
/src/SignUp.Web/ProspectSave/AsynchronousProspectSaveHandler.cs:
--------------------------------------------------------------------------------
1 | using SignUp.Entities;
2 | using SignUp.Messaging;
3 | using SignUp.Messaging.Messages.Events;
4 | using System;
5 |
6 | namespace SignUp.Web.ProspectSave
7 | {
8 | public class AsynchronousProspectSaveHandler : IProspectSaveHandler
9 | {
10 | public void SaveProspect(Prospect prospect)
11 | {
12 | var eventMessage = new ProspectSignedUpEvent
13 | {
14 | Prospect = prospect,
15 | SignedUpAt = DateTime.UtcNow
16 | };
17 |
18 | MessageQueue.Publish(eventMessage);
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/src/SignUp.Web/ProspectSave/IProspectSaveHandler.cs:
--------------------------------------------------------------------------------
1 | using SignUp.Entities;
2 |
3 | namespace SignUp.Web.ProspectSave
4 | {
5 | interface IProspectSaveHandler
6 | {
7 | void SaveProspect(Prospect prospect);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/SignUp.Web/ProspectSave/SynchronousProspectSaveHandler.cs:
--------------------------------------------------------------------------------
1 | using SignUp.Entities;
2 | using SignUp.Model;
3 | using System.Linq;
4 |
5 | namespace SignUp.Web.ProspectSave
6 | {
7 | public class SynchronousProspectSaveHandler : IProspectSaveHandler
8 | {
9 | public void SaveProspect(Prospect prospect)
10 | {
11 | using (var context = new SignUpContext())
12 | {
13 | //reload child objects:
14 | prospect.Country = context.Countries.Single(x => x.CountryCode == prospect.Country.CountryCode);
15 | prospect.Role = context.Roles.Single(x => x.RoleCode == prospect.Role.RoleCode);
16 |
17 | context.Prospects.Add(prospect);
18 | context.SaveChanges();
19 | }
20 | }
21 | }
22 | }
--------------------------------------------------------------------------------
/src/SignUp.Web/ReferenceData/ApiReferenceDataLoader.cs:
--------------------------------------------------------------------------------
1 | using RestSharp;
2 | using SignUp.Core;
3 | using SignUp.Entities;
4 | using System.Collections.Generic;
5 | using System.Configuration;
6 |
7 | namespace SignUp.Web.ReferenceData
8 | {
9 | public class ApiReferenceDataLoader : IReferenceDataLoader
10 | {
11 | public IEnumerable GetCountries()
12 | {
13 | var client = new RestClient(Config.Current["ReferenceDataApi:Url"]);
14 | var request = new RestRequest("countries");
15 | var response = client.Execute>(request);
16 | return response.Data;
17 | }
18 |
19 | public IEnumerable GetRoles()
20 | {
21 | var client = new RestClient(Config.Current["ReferenceDataApi:Url"]);
22 | var request = new RestRequest("roles");
23 | var response = client.Execute>(request);
24 | return response.Data;
25 | }
26 | }
27 | }
--------------------------------------------------------------------------------
/src/SignUp.Web/ReferenceData/IReferenceDataLoader.cs:
--------------------------------------------------------------------------------
1 | using SignUp.Entities;
2 | using System.Collections.Generic;
3 |
4 | namespace SignUp.Web.ReferenceData
5 | {
6 | interface IReferenceDataLoader
7 | {
8 | IEnumerable GetCountries();
9 |
10 | IEnumerable GetRoles();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Scripts/WebForms/DetailsView.js:
--------------------------------------------------------------------------------
1 | //CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/DetailsView.js
2 | function DetailsView() {
3 | this.pageIndex = null;
4 | this.dataKeys = null;
5 | this.createPropertyString = DetailsView_createPropertyString;
6 | this.setStateField = DetailsView_setStateValue;
7 | this.getHiddenFieldContents = DetailsView_getHiddenFieldContents;
8 | this.stateField = null;
9 | this.panelElement = null;
10 | this.callback = null;
11 | }
12 | function DetailsView_createPropertyString() {
13 | return createPropertyStringFromValues_DetailsView(this.pageIndex, this.dataKeys);
14 | }
15 | function DetailsView_setStateValue() {
16 | this.stateField.value = this.createPropertyString();
17 | }
18 | function DetailsView_OnCallback (result, context) {
19 | var value = new String(result);
20 | var valsArray = value.split("|");
21 | var innerHtml = valsArray[2];
22 | for (var i = 3; i < valsArray.length; i++) {
23 | innerHtml += "|" + valsArray[i];
24 | }
25 | context.panelElement.innerHTML = innerHtml;
26 | context.stateField.value = createPropertyStringFromValues_DetailsView(valsArray[0], valsArray[1]);
27 | }
28 | function DetailsView_getHiddenFieldContents(arg) {
29 | return arg + "|" + this.stateField.value;
30 | }
31 | function createPropertyStringFromValues_DetailsView(pageIndex, dataKeys) {
32 | var value = new Array(pageIndex, dataKeys);
33 | return value.join("|");
34 | }
35 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Scripts/WebForms/GridView.js:
--------------------------------------------------------------------------------
1 | //CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/GridView.js
2 | function GridView() {
3 | this.pageIndex = null;
4 | this.sortExpression = null;
5 | this.sortDirection = null;
6 | this.dataKeys = null;
7 | this.createPropertyString = GridView_createPropertyString;
8 | this.setStateField = GridView_setStateValue;
9 | this.getHiddenFieldContents = GridView_getHiddenFieldContents;
10 | this.stateField = null;
11 | this.panelElement = null;
12 | this.callback = null;
13 | }
14 | function GridView_createPropertyString() {
15 | return createPropertyStringFromValues_GridView(this.pageIndex, this.sortDirection, this.sortExpression, this.dataKeys);
16 | }
17 | function GridView_setStateValue() {
18 | this.stateField.value = this.createPropertyString();
19 | }
20 | function GridView_OnCallback (result, context) {
21 | var value = new String(result);
22 | var valsArray = value.split("|");
23 | var innerHtml = valsArray[4];
24 | for (var i = 5; i < valsArray.length; i++) {
25 | innerHtml += "|" + valsArray[i];
26 | }
27 | context.panelElement.innerHTML = innerHtml;
28 | context.stateField.value = createPropertyStringFromValues_GridView(valsArray[0], valsArray[1], valsArray[2], valsArray[3]);
29 | }
30 | function GridView_getHiddenFieldContents(arg) {
31 | return arg + "|" + this.stateField.value;
32 | }
33 | function createPropertyStringFromValues_GridView(pageIndex, sortDirection, sortExpression, dataKeys) {
34 | var value = new Array(pageIndex, sortDirection, sortExpression, dataKeys);
35 | return value.join("|");
36 | }
37 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Scripts/_references.js:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 | ///
4 | ///
5 | ///
6 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Site.Master.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Web;
5 | using System.Web.UI;
6 | using System.Web.UI.WebControls;
7 |
8 | namespace SignUp.Web
9 | {
10 | public partial class SiteMaster : MasterPage
11 | {
12 | protected void Page_Load(object sender, EventArgs e)
13 | {
14 |
15 | }
16 | }
17 | }
--------------------------------------------------------------------------------
/src/SignUp.Web/Site.Master.designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | //
5 | // Changes to this file may cause incorrect behavior and will be lost if
6 | // the code is regenerated.
7 | //
8 | //------------------------------------------------------------------------------
9 |
10 | namespace SignUp.Web {
11 |
12 |
13 | public partial class SiteMaster {
14 |
15 | ///
16 | /// MainContent control.
17 | ///
18 | ///
19 | /// Auto-generated field.
20 | /// To modify move field declaration from designer file to code-behind file.
21 | ///
22 | protected global::System.Web.UI.WebControls.ContentPlaceHolder MainContent;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Site.Mobile.Master:
--------------------------------------------------------------------------------
1 | <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.Mobile.master.cs" Inherits="SignUp.Web.Site_Mobile" %>
2 | <%@ Register Src="~/ViewSwitcher.ascx" TagPrefix="friendlyUrls" TagName="ViewSwitcher" %>
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Site.Mobile.Master.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Web;
5 | using System.Web.UI;
6 | using System.Web.UI.WebControls;
7 |
8 | namespace SignUp.Web
9 | {
10 | public partial class Site_Mobile : System.Web.UI.MasterPage
11 | {
12 | protected void Page_Load(object sender, EventArgs e)
13 | {
14 |
15 | }
16 | }
17 | }
--------------------------------------------------------------------------------
/src/SignUp.Web/ThankYou.aspx:
--------------------------------------------------------------------------------
1 | <%@ Page Title="Ta" Language="C#" MasterPageFile="~/Site.Master" CodeBehind="ThankYou.aspx.cs" Inherits="SignUp.Web.ThankYou" %>
2 |
3 |
4 |
5 |
6 |
Thank you!
7 |
8 |
9 |
10 |
11 |
Good work on signing up. We'll be in touch.
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/SignUp.Web/ThankYou.aspx.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Web;
5 | using System.Web.UI;
6 | using System.Web.UI.WebControls;
7 |
8 | namespace SignUp.Web
9 | {
10 | public partial class ThankYou : System.Web.UI.Page
11 | {
12 | protected void Page_Load(object sender, EventArgs e)
13 | {
14 |
15 | }
16 | }
17 | }
--------------------------------------------------------------------------------
/src/SignUp.Web/ThankYou.aspx.designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | //
5 | // Changes to this file may cause incorrect behavior and will be lost if
6 | // the code is regenerated.
7 | //
8 | //------------------------------------------------------------------------------
9 |
10 | namespace SignUp.Web {
11 |
12 |
13 | public partial class ThankYou {
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/SignUp.Web/ViewSwitcher.ascx:
--------------------------------------------------------------------------------
1 | <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ViewSwitcher.ascx.cs" Inherits="SignUp.Web.ViewSwitcher" %>
2 |
--------------------------------------------------------------------------------
/src/SignUp.Web/ViewSwitcher.ascx.designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | //
5 | // Changes to this file may cause incorrect behavior and will be lost if
6 | // the code is regenerated.
7 | //
8 | //------------------------------------------------------------------------------
9 |
10 | namespace SignUp.Web {
11 |
12 |
13 | public partial class ViewSwitcher {
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Web.Debug.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
17 |
18 |
29 |
30 |
--------------------------------------------------------------------------------
/src/SignUp.Web/Web.Release.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
17 |
18 |
19 |
30 |
31 |
--------------------------------------------------------------------------------
/src/SignUp.Web/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Dependencies": {
3 | "IReferenceDataLoader": "SignUp.Web.ReferenceData.DatabaseReferenceDataLoader",
4 | "IProspectSaveHandler": "SignUp.Web.ProspectSave.SynchronousProspectSaveHandler"
5 | },
6 | "ReferenceDataApi": {
7 | "Url": "http://localhost:58808/api"
8 | },
9 | "MessageQueue": {
10 | "Url": "nats://message-queue:4222"
11 | },
12 | "Database": {
13 | "MaxRetryCount": "3",
14 | "MaxDelaySeconds": "10"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/SignUp.Web/connectionStrings.config:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/src/SignUp.Web/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/src/SignUp.Web/favicon.ico
--------------------------------------------------------------------------------
/src/SignUp.Web/fonts/geomanist/hinted-Geomanist-Book.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/src/SignUp.Web/fonts/geomanist/hinted-Geomanist-Book.woff2
--------------------------------------------------------------------------------
/src/SignUp.Web/img/docker-enterprise.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/src/SignUp.Web/img/docker-enterprise.png
--------------------------------------------------------------------------------
/src/SignUp.Web/img/dockercon-2017.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/src/SignUp.Web/img/dockercon-2017.png
--------------------------------------------------------------------------------
/src/SignUp.Web/img/dockercon-eu-2017.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/src/SignUp.Web/img/dockercon-eu-2017.png
--------------------------------------------------------------------------------
/src/SignUp.Web/img/dockercon-eu-2018.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/src/SignUp.Web/img/dockercon-eu-2018.png
--------------------------------------------------------------------------------
/src/SignUp.Web/img/dockercon-us-2017.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/src/SignUp.Web/img/dockercon-us-2017.png
--------------------------------------------------------------------------------
/src/SignUp.Web/img/dockercon-us-2018.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sixeyed/docker-windows-workshop/6fe18dc21f35d1a3655cc807047e6373e4f31511/src/SignUp.Web/img/dockercon-us-2018.png
--------------------------------------------------------------------------------
/src/SignUp.Web/log4net.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/Utilities.DependencyCheck/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/Utilities.DependencyCheck/Program.cs:
--------------------------------------------------------------------------------
1 | using Polly;
2 | using System;
3 | using System.Configuration;
4 | using System.Data.SqlClient;
5 |
6 | namespace Utilities.DependencyCheck
7 | {
8 | class Program
9 | {
10 | static int Main(string[] args)
11 | {
12 | Console.WriteLine("DEPENDENCY: starting");
13 |
14 | var sqlPolicy = Policy.Handle()
15 | .Retry(3, (exception, retryCount) =>
16 | {
17 | Console.WriteLine("DEPENDENCY: Got SQL exception {0}, retryCount {1}", exception.GetType(), retryCount);
18 | });
19 |
20 | var result = sqlPolicy.ExecuteAndCapture(() => ConnectToSqlServer());
21 | if (result.Outcome == OutcomeType.Successful)
22 | {
23 | Console.WriteLine("DEPENDENCY: OK");
24 | return 0;
25 | }
26 | else
27 | {
28 | Console.WriteLine("DEPENDENCY: FAILED");
29 | return 1;
30 | }
31 | }
32 |
33 | private static void ConnectToSqlServer()
34 | {
35 | var connectionString = ConfigurationManager.ConnectionStrings["SignUpDb"].ConnectionString;
36 | var server = connectionString.Split(';')[0].Split('=')[1];
37 | Console.WriteLine("DEPENDENCY: Connecting to SQL Server: {0}", server);
38 | using (var conn = new SqlConnection(connectionString))
39 | {
40 | conn.Open();
41 | }
42 | }
43 | }
44 | }
--------------------------------------------------------------------------------
/src/Utilities.DependencyCheck/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("DependencyChecker")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("DependencyChecker")]
13 | [assembly: AssemblyCopyright("Copyright © 2018")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("d5fa23ad-b9eb-40e9-b4a6-fc4053386875")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/src/Utilities.DependencyCheck/connectionStrings.config:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/src/Utilities.DependencyCheck/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/Utilities.HealthCheck/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/src/Utilities.HealthCheck/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.Net;
4 | using System.Net.Http;
5 | using System.Threading.Tasks;
6 |
7 | namespace Utilities.HealthCheck
8 | {
9 | class Program
10 | {
11 | static int Main(string[] args)
12 | {
13 | var exitCode = 1;
14 | try
15 | {
16 | using (var client = new HttpClient())
17 | {
18 | var stopwatch = Stopwatch.StartNew();
19 | var task = client.GetAsync("http://localhost/app");
20 | Task.WaitAll(task);
21 | stopwatch.Stop();
22 | Console.WriteLine($"HEALTHCHECK: status {task.Result.StatusCode}, took {stopwatch.ElapsedMilliseconds}ms");
23 | if (task.Result.StatusCode == HttpStatusCode.OK && stopwatch.ElapsedMilliseconds < 200)
24 | {
25 | exitCode = 0;
26 | }
27 | }
28 | }
29 | catch (Exception ex)
30 | {
31 | Console.WriteLine($"HEALTHCHECK: error. Exception {ex.Message}");
32 | }
33 | return exitCode;
34 | }
35 | }
36 | }
--------------------------------------------------------------------------------
/src/Utilities.HealthCheck/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("HealthChecker")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("HealthChecker")]
13 | [assembly: AssemblyCopyright("Copyright © 2018")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("9c14c542-7101-46e9-8e7b-047f0139a939")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/src/build-web.bat:
--------------------------------------------------------------------------------
1 | REM remove the .NET Core 2.1 projects which aren;t used in this build
2 | REM otherwise the nuget restore fails because .NET 4.7.2 can't work with Core 2.1
3 |
4 | del .\SignUp.Api.ReferenceData\SignUp.Api.ReferenceData.csproj
5 | del .\SignUp.MessageHandlers.IndexProspect\SignUp.MessageHandlers.IndexProspect.csproj
6 |
7 | nuget restore SignUp.sln
8 | msbuild SignUp.Web\SignUp.Web.csproj /p:OutputPath=c:\out /p:Configuration=Release
--------------------------------------------------------------------------------
/workshop/chat/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: "3.1"
2 |
3 | services:
4 | db:
5 | image: mongo:4.0.1-xenial
6 | command: mongod --smallfiles
7 | networks:
8 | - chat-net
9 |
10 | rocketchat:
11 | image: rocketchat/rocket.chat:0.65.2
12 | ports:
13 | - "3000:3000"
14 | depends_on:
15 | - db
16 | environment:
17 | - MONGO_URL=mongodb://db:27017/rocketchat
18 | - ROOT_URL=http://chat.dwwx.space:3000
19 | networks:
20 | - chat-net
21 |
22 | networks:
23 | chat-net:
24 |
--------------------------------------------------------------------------------
/workshop/lab-vm/docker/daemon.json:
--------------------------------------------------------------------------------
1 | {
2 | "insecure-registries" : ["registry.local:5000"]
3 | }
--------------------------------------------------------------------------------
/workshop/lab-vm/update.ps1:
--------------------------------------------------------------------------------
1 | # create shortcuts
2 | Get-ChildItem $env:Public\Desktop\*.lnk | ForEach-Object { Remove-Item $_ }
3 |
4 | $branch = Get-Content C:\branch.txt
5 |
6 | $WshShell = New-Object -comObject WScript.Shell
7 | $Shortcut = $WshShell.CreateShortcut("$Home\Desktop\Firefox.lnk")
8 | $Shortcut.TargetPath = "C:\Program Files\Mozilla Firefox\firefox.exe"
9 | $shortcut.Arguments = "https://$branch.dwwx.space"
10 | $Shortcut.Save()
11 |
12 | $Shortcut = $WshShell.CreateShortcut("$Home\Desktop\PowerShell.lnk")
13 | $Shortcut.TargetPath = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
14 | $shortcut.WorkingDirectory = "C:\scm\docker-windows-workshop"
15 | $Shortcut.Save()
16 |
17 | $Shortcut = $WshShell.CreateShortcut("$Home\Desktop\Code.lnk")
18 | $Shortcut.TargetPath = "C:\Program Files\Microsoft VS Code\Code.exe"
19 | $shortcut.Arguments = "C:\scm\docker-windows-workshop"
20 | $Shortcut.Save()
21 |
22 | # update lab repo
23 | cd $env:workshop
24 | git checkout $branch
25 | git pull
26 |
27 | # turn off firewall and Defender *this is meant for short-lived lab VMs*
28 | Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
29 | Set-MpPreference -DisableRealtimeMonitoring $true
--------------------------------------------------------------------------------
/workshop/lab-vm/verify.ps1:
--------------------------------------------------------------------------------
1 | docker image build `
2 | --tag $env:dockerID/docker-workshop-verify `
3 | $pwd\verify
4 |
5 | docker container run --rm $env:dockerID/docker-workshop-verify
6 |
7 | docker image push $env:dockerID/docker-workshop-verify
8 |
--------------------------------------------------------------------------------
/workshop/lab-vm/verify/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM microsoft/windowsservercore
2 |
3 | CMD ["powershell", "Write-Output", "Help! I am trapped in a Docker container!"]
--------------------------------------------------------------------------------
/workshop/raffle/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM mcr.microsoft.com/windows/servercore:ltsc2019
2 | WORKDIR /
3 | COPY raffle.ps1 .
4 | ENTRYPOINT ["powershell", "/raffle.ps1"]
--------------------------------------------------------------------------------
/workshop/raffle/README.md:
--------------------------------------------------------------------------------
1 | # sixeyed/raffle
2 |
3 | Randomly selects one entry from a list, e.g. to choose swag winners.
4 |
5 | ## Usage
6 |
7 | Pass a comma-separated list of entries:
8 |
9 | ```
10 | docker container run --isolation=process sixeyed/raffle "'John,Paul,George,Ringo'"
11 | ```
12 |
13 | > You need to escape the list with double- **and** single-quotes.
14 |
15 | ## Output
16 |
17 | Something like:
18 |
19 | ```
20 | The winner is...
21 | ----------------
22 | ------------
23 | -----
24 | Paul!
25 | ```
26 |
27 | > There are delays in the output to build tension.
--------------------------------------------------------------------------------
/workshop/raffle/raffle.ps1:
--------------------------------------------------------------------------------
1 | param(
2 | [Parameter(Mandatory=$true)]
3 | [string]$entryList,
4 |
5 | [Parameter()]
6 | [string]$separator
7 | )
8 |
9 | if ("$separator" -eq ""){
10 | $separator = ','
11 | }
12 | $entries = $entryList.Split($separator)
13 | $random = New-object -Type System.Random -ArgumentList (Get-Date).millisecond
14 | $winner = $entries[$random.Next($entries.count)]
15 |
16 | Write-Output 'The winner is...'
17 | Start-Sleep -Seconds 1
18 | Write-Output '----------------'
19 | Start-Sleep -Seconds 2
20 | Write-Output '------------'
21 | Start-Sleep -Seconds 1
22 | Write-Output '-----'
23 | Start-Sleep -Seconds 1
24 | Write-Output "$winner!`n"
--------------------------------------------------------------------------------
/workshop/vote/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: "3.2"
2 |
3 | services:
4 | vote:
5 | image: dockersamples/examplevotingapp_vote:dotnet-alpine
6 | environment:
7 | - "Voting:OptionA=101"
8 | - "Voting:OptionB=Metrics"
9 | ports:
10 | - "5000:80"
11 | depends_on:
12 | - message-queue
13 |
14 | result:
15 | image: dockersamples/examplevotingapp_result:dotnet-alpine
16 | ports:
17 | - "5001:80"
18 | environment:
19 | - "Voting:OptionA=101"
20 | - "Voting:OptionB=Metrics"
21 | - "ConnectionStrings:ResultData=Server=db;Port=4000;Database=votes;User=root;SslMode=None"
22 | depends_on:
23 | - db
24 |
25 | worker:
26 | image: dockersamples/examplevotingapp_worker:dotnet-alpine
27 | environment:
28 | - "ConnectionStrings:VoteData=Server=db;Port=4000;Database=votes;User=root;SslMode=None"
29 | depends_on:
30 | - message-queue
31 | - db
32 |
33 | message-queue:
34 | image: nats:1.3.0-linux
35 |
36 | db:
37 | image: pingcap/tidb:v2.1.0
--------------------------------------------------------------------------------