{
    "componentChunkName": "component---src-templates-docs-js",
    "path": "/vecka4-implementation/just-task-it-docker",
    "result": {"data":{"site":{"siteMetadata":{"title":"Linnéuniversitetet","language":"sv","courseCode":"1DV613"}},"mdx":{"fields":{"id":"01b4881f-31a9-5b85-b837-37aa83dd3a9a","title":"Introduktion till Docker","slug":"/vecka4-implementation/just-task-it-docker"},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Introduktion till Docker\",\n  \"metaTitle\": \"1dv613 | vecka 4 | Introduktion till Docker\",\n  \"metaDescription\": \"metaDescription\",\n  \"order\": 5\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h2\", null, \"M\\xE5let med \\xF6vningen\"), mdx(\"p\", null, \"Denna \\xF6vning syftar till att \\xF6va p\\xE5 att containerisera en applikation med Docker och anv\\xE4nda denna container i applikationens utveckling.\"), mdx(\"h2\", null, \"Innan du b\\xF6rjar \\xF6vningen\"), mdx(\"p\", null, \"Denna \\xF6vning \\xE4r avsedd att anv\\xE4ndas parallellt med \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"./recordings\"\n  }, \"teoridelen\"), \" i denna modul. B\\xF6rja med att titta p\\xE5 inspelningarna och pausa n\\xE4r du kommer till \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://coursepress.lnu.se/courses/cloud-native-applications/microservices/containers/recordings#:~:text=Lagring%20och%20mounts-,Steg%204%3A%20Containern%C3%A4tverk,-%C3%96vning%20Docker\"\n  }, \"Steg #4\"), \".\"), mdx(\"p\", null, \"Du kan sedan f\\xF6lja med och koda tillsammans med oss. Vi anv\\xE4nder Neo4j och Python i inspelningarna, men du b\\xF6r kunna \\xF6vers\\xE4tta detta till MongoDB och Node.js (eller n\\xE5gon annan milj\\xF6 du v\\xE4ljer) relativt enkelt.\"), mdx(\"p\", null, \"Set till att du har \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.docker.com/\"\n  }, \"Docker Desktop\"), \" installerat p\\xE5 din dator.\"), mdx(\"h2\", null, \"1. Applikationen\"), mdx(\"p\", null, \"Vi kommer att anv\\xE4nda oss av en v\\xE4ldigt enkel applikation f\\xF6r att prova p\\xE5 att anv\\xE4nda Docker.\"), mdx(\"p\", null, \"B\\xF6rja med att skapa ett tomt repository \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"hello-express\"), \" i GitLab under \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"https://gitlab.lnu.se/1dv613/student/<ditt anv\\xE4ndanamn>/projects\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-sh\"\n  }, \"# H\\xE4mta ner det nya repository till din dator\\ngit clone git@gitlab.lnu.se:1dv613/student/<your username>/projects/hello-express.git\\n\\n# Navigera in i den nya mappen\\ncd hello-express\\n\\n# S\\xE4tt git pull strategi f\\xF6r ditt repository\\ngit config pull.rebase false\\n\\n# H\\xE4mta nere \\xE4ndringarna i exempel repository\\ngit pull git@gitlab.lnu.se:1dv613/template/hello-express.git --allow-unrelated-histories\\n\\n# L\\xF6s eventuella konfliktproblem vid sammanslagning och g\\xF6r en commit om det beh\\xF6vs.\\n# git add .\\n# git commit -m \\\"Merged contents from hello-express example\\\"\\n\\n# Pusha dina \\xE4ndringar till ditt nya GitLab repository\\ngit push origin main\\n\")), mdx(\"h3\", null, \"Notes\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"S\\xE4kerst\\xE4ll att du har de n\\xF6dv\\xE4ndiga r\\xE4ttigheterna f\\xF6r att klona b\\xE5da arkiven och k\\xF6ra kommandot \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git pull\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Var f\\xF6rsiktig n\\xE4r du arbetar med orelaterade versionshistoriker; granska \\xE4ndringarna f\\xF6r att s\\xE4kerst\\xE4lla att allt har slagits ihop korrekt.\")), mdx(\"h2\", null, \"2. Docker\"), mdx(\"p\", null, \"F\\xF6lj instruktionerna i \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"./recordings\"\n  }, \"Introduktion till containers (Steps #1-#4)\"), \".\"), mdx(\"h3\", null, \"Dockerfile exempel\"), mdx(\"p\", null, \"I en Docker-fil med flera steg installeras applikationens beroenden i ett bassteg separat fr\\xE5n koden f\\xF6r att optimera caching och bygghastighet. I det sista steget skapas en l\\xE4ttviktig k\\xF6rmilj\\xF6 genom att endast n\\xF6dv\\xE4ndiga filer kopieras, vilket minskar bildens storlek och f\\xF6rb\\xE4ttrar s\\xE4kerheten.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-dockerfile\"\n  }, \"# -----------------------------------------------------------------------------\\n# Base stage\\n# -----------------------------------------------------------------------------\\n  FROM node:20.17.0-bookworm-slim AS base\\n\\n  WORKDIR /usr/src/app\\n  COPY . .\\n  RUN npm install --ignore-scripts\\n\\n  # -----------------------------------------------------------------------------\\n  # Final stage\\n  # -----------------------------------------------------------------------------\\n  FROM node:20.17.0-bookworm-slim\\n\\n  WORKDIR /usr/src/app\\n  COPY --from=base --chown=node:node /usr/src/app/ /usr/src/app/\\n  USER node\\n\\n  ARG EXPRESS_APP_PORT=3000\\n  EXPOSE ${EXPRESS_APP_PORT}\\n  ENV PORT=$EXPRESS_APP_PORT\\n  CMD [\\\"npm\\\", \\\"start\\\"]\\n\")), mdx(\"h3\", null, \".dockerignore\"), mdx(\"p\", null, \"Ist\\xE4llet f\\xF6r att kopiera alla filer till containern, anv\\xE4nd en .dockerignore-fil f\\xF6r att v\\xE4lja vilka filer du vill kopiera. Denna process kallas f\\xF6r \\\"allowlisting\\\".\"), mdx(\"p\", null, \"Example:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-terminal\"\n  }, \"# Exclude all files and directories!\\n*\\n\\n# Explicitly include\\n!public\\n!src\\n!package-lock.json\\n!package.json\\n\")), mdx(\"h3\", null, \"Testa din Docker container\"), mdx(\"p\", null, \"Om allt har gott som det skall s\\xE5 ska du kunna bes\\xF6ka url:en \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"http://localhost:3000\"), \" i din browser och se utskriften ifr\\xE5n applikationen.\"), mdx(\"h2\", null, \"N\\xE4sta steg\"), mdx(\"p\", null, \"Att manuellt s\\xE4tta upp n\\xE4tverk, bygga containrar och k\\xF6ra dem kan vara komplicerat, s\\xE4rskilt n\\xE4r du har flera tj\\xE4nster och beroenden. F\\xF6r att hantera denna komplexitet kommer n\\xE4sta steg att introducera ett verktyg som heter Docker Compose, mer om det under vecka 5.\"));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#målet-med-övningen","title":"Målet med övningen"},{"url":"#innan-du-börjar-övningen","title":"Innan du börjar övningen"},{"url":"#1-applikationen","title":"1. Applikationen","items":[{"url":"#notes","title":"Notes"}]},{"url":"#2-docker","title":"2. Docker","items":[{"url":"#dockerfile-exempel","title":"Dockerfile exempel"},{"url":"#dockerignore","title":".dockerignore"},{"url":"#testa-din-docker-container","title":"Testa din Docker container"}]},{"url":"#nästa-steg","title":"Nästa steg"}]},"parent":{"relativePath":"vecka4-implementation/just-task-it-docker.md"},"frontmatter":{"metaTitle":"1dv613 | vecka 4 | Introduktion till Docker","metaDescription":"metaDescription","fullWidth":null}},"allMdx":{"edges":[{"node":{"fields":{"slug":"/","title":"🎉 Välkommen till Mjukvaruutvecklingsprojekt (1DV613)"}}},{"node":{"fields":{"slug":"/video-loggar","title":"Videologgar"}}},{"node":{"fields":{"slug":"/studieguiden","title":"Studieguiden"}}},{"node":{"fields":{"slug":"/studieguiden/kommunikationsstrategi","title":"Kommunikationsstrategi"}}},{"node":{"fields":{"slug":"/studieguiden/kursledning","title":"Kursledning"}}},{"node":{"fields":{"slug":"/studieguiden/kursplan","title":"Kursplan och betyg"}}},{"node":{"fields":{"slug":"/studieguiden/litteratur","title":"Kurslitteratur"}}},{"node":{"fields":{"slug":"/studieguiden/schema","title":"Schema och deadlines"}}},{"node":{"fields":{"slug":"/studieguiden/studieanvisningar","title":"Studieanvisningar"}}},{"node":{"fields":{"slug":"/studieguiden/utvarderingar","title":"Kursvärderingar"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/dokumentation","title":"Dokumentation"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision","title":"Vecka 1/2 - Planering och vision"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/todo","title":"📅 Att göra-lista"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/vision","title":"Projektvision"}}},{"node":{"fields":{"slug":"/vecka10-etik","title":"Vecka 10 - Etik & överlämning"}}},{"node":{"fields":{"slug":"/vecka10-etik/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/arbeta-i-projekt","title":"Att arbeta i projekt"}}},{"node":{"fields":{"slug":"/vecka3-krav-test","title":"Vecka 3 - Krav och testning"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/testning","title":"Testning"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/vecka3-krav-test","title":"Kravhantering"}}},{"node":{"fields":{"slug":"/vecka4-implementation/arkitektur","title":"Introduktion till mjukvaruarkitektur"}}},{"node":{"fields":{"slug":"/vecka4-implementation/docker-teori","title":"Introduktion till containers"}}},{"node":{"fields":{"slug":"/vecka4-implementation","title":"Vecka 4 - Implementation"}}},{"node":{"fields":{"slug":"/vecka4-implementation/just-task-it-docker","title":"Introduktion till Docker"}}},{"node":{"fields":{"slug":"/vecka4-implementation/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering","title":"Vecka 5 - Versionshantering"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/jobba-med-git","title":"Jobba med Git"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/versionshantering","title":"Versionshantering"}}},{"node":{"fields":{"slug":"/vecka6-drift/docker-compose-teori","title":"Introduktion till Docker compose"}}},{"node":{"fields":{"slug":"/vecka6-drift","title":"Vecka 6 - Driftsättning"}}},{"node":{"fields":{"slug":"/vecka6-drift/just-task-it-docker-compose","title":"JTI - Docker Compose"}}},{"node":{"fields":{"slug":"/vecka6-drift/just-task-it-production","title":"JTI - Production"}}},{"node":{"fields":{"slug":"/vecka6-drift/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd/ci-cd","title":"CI/CD"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd","title":"Vecka 7 - CI/CD"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd/just-task-it-deploy-pipeline","title":"JTI - Deploy through a pipeline"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka8-automatiska-test/automatiska-tester","title":"Automatiserad testning"}}},{"node":{"fields":{"slug":"/vecka8-automatiska-test","title":"Vecka 8 - Automatiserad testning"}}},{"node":{"fields":{"slug":"/vecka8-automatiska-test/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/extern-updragsgivare","title":"Extern uppdragsgivare"}}},{"node":{"fields":{"slug":"/vecka9-leverans","title":"Vecka 9 - Slutleverans"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/extern-updragsgivare/extern-uppdragsgivare-samverkan","title":"Samverkansinformation: studentprojekt med extern uppdragsgivare"}}},{"node":{"fields":{"slug":"/vecka9-leverans/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/extern-updragsgivare/vagledning","title":"Vägledning för arbete med extern uppdragsgivare"}}}]}},"pageContext":{"id":"01b4881f-31a9-5b85-b837-37aa83dd3a9a"}},
    "staticQueryHashes": ["253607798","3706406642","710574383"]}