> docker run python
Unable to find image 'python:latest' locally
latest: Pulling from library/python
d960726af2be: Pulling fs layer
e8d62473a22d: Pull complete
> docker ps
(результатов не увидим, так как нет запущенных контейнеров)
> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e0356b58ac9 python "python3" 15 minutes ago Exited (0) 15 minutes ago unruffled_moser
> docker run -it python
Python 3.9.5 (default, May 10 2021, 15:26:36)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.name
'posix'
>>> os.listdir()
['tmp', 'bin', 'root', 'run', 'opt', 'media', 'etc', 'sys', 'boot', 'proc', 'sbin', 'mnt', 'lib64', 'var', 'usr', 'lib', 'dev', 'srv', 'home', '.dockerenv']
>>> exit()
> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82984f732585 python "python3" 3 minutes ago Exited (0) 14 seconds ago frosty_meitner
5e0356b58ac9 python "python3" 31 minutes ago Exited (0) 31 minutes ago unruffled_moser
Удалим ранее созданный контейнер с именем «unruffled_moser»
> docker rm unruffled_moser
unruffled_moser
Запустим заново контейнер с идентификатором «82984f732585»
> docker start 82984f732585
82984f732585
> docker run --rm python
> docker rm -f $(docker ps -aq)
82984f732585
5e0356b58ac9
> docker ps -a
(В списке не окажется ни одного контейнера)
> docker pull alpine
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python latest a6a0779c5fb2 44 hours ago 886MB
alpine latest 6dbb9cc54074 4 weeks ago 5.61MB
> docker rmi alpine
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python latest a6a0779c5fb2 44 hours ago 886MB
Задаем имя контейнеру
> docker run --name my_py python
Перезапускаем контейнер с именем «my_py»
> docker start my_py
Удостоверяемся, что все сработало
> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
114fd2a873d9 python "python3" 10 seconds ago Exited (0) 7 seconds ago my_py
--- main.js
--- package.json
--- css
|---- style.css
const express = require('express');
const bodyParser = require('body-parser');
const spa = express();
let myGoal = 'Learn Docker!';
spa.use(
bodyParser.urlencoded({
extended: false,
})
);
spa.use(express.static('css'));
spa.get('/', (req, res) => {
res.send(`
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
<title>Моя цель</title>
</head>
<body>
<section>
<h2>Моя главная цель</h2>
<h3>${myGoal}</h3>
</section>
<form action="/save-goal" method="POST">
<div class="form">
<label>Определить новую цель</label>
<input type="text" name="goal">
</div>
<button>Подтвердить</button>
</form>
</body>
</html>
`);
});
spa.post('/save-goal', (req, res) => {
const newGoal = req.body.goal;
myGoal = newGoal;
res.redirect('/');
});
spa.listen(80);
{
"name": "site-js",
"version": "1.1.1",
"description": "Первый проект на Node и Docker",
"main": "main.js",
"author": "Your Name",
"license": "X11",
"dependencies": {
"express": "^4.17.1",
"body-parser": "1.19.0"
}
}
html {
font-family: cursive;
}
body {
margin: 0;
}
section,
form {
padding: 1rem;
border-radius: 14px;
box-shadow: 0 3px 6px rgba(165, 73, 73, 0.26);
margin: 2rem auto;
max-width: 35rem;
}
.form {
margin: 0.4rem 0;
}
input {
font: inherit;
}
input,
label {
display: block;
}
label {
font-weight: bold;
margin-bottom: 0.5rem;
}
button {
background-color: #421070;
border: 1px solid #0d0316;
color: white;
cursor: pointer;
padding: 0.6rem 1.4rem;
}
button:hover,
button:active {
background-color: #8b2399;
border-color: #1c0542;
}
FROM node: 16-alpine
WORKDIR /site
COPY package.json /site
RUN npm install
COPY . /site
EXPOSE 80
CMD ["node", "main.js"]
Инструкция | Описание |
---|---|
FROM | Указывает образ, на основании которого будет формироваться наш собственный (в данном случае - node 16-ой версии минимального размера. Все имена официальных образов указаны на Docker Hub. |
WORKDIR | Папка в образе, в которой будет храниться наше приложение |
COPY | Что (директория или файл на нашей машине) и куда (папка в образе) будет скопировано. Сначала мы скопировали файл зависимостей для установки требуемых пакетов, а потом переместили все содержимое проекта («.» - из текущей директории) в рабочий каталог образа |
RUN | Запускает команду при создании образа (для установки всех дополнительных приложений) |
EXPOSE | Открывает соответствующий порт (иначе мы не сможем получить доступ к содержимому проекта извне) |
CMD | Перечень команд в виде списка, которые будут срабатывать в момент активации контейнера (в примере это «node main.js») |
> docker build . -t goal-site
[+] Building 39.1s (11/11) FINISHED
> docker images
goal-site latest 04876a934435 5 minutes ago 131MB
> docker run -d -p 5115:80 goal-site
Выводим список запущенных контейнеров
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82b299f23831 goal-site "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:5115->80/tcp, :::5115->80/tcp confident_jang
Останавливаем по имени «confident_jang»
> docker stop confident_jang
confident_jang