Статьи по Теме
- Учебное пособие по Docker для фронтенд-инженеров — основы
- Учебное пособие по Docker для фронтенд-инженеров — средний уровень
- Учебник по Docker, написанный для фронтенд-инженеров — реальный бой
В последнее время компания продвигает контейнеризацию и k8s, и проект нужно менять на развертывание Docker. В ответственном проекте есть несколько нод-проектов, и я могу изучить Docker только с нуля.
Установить
Docker поддерживает окна, Mac, Linux, справочник по учебникамРуководство по установке докера.
Рекомендуется использовать Docker в системах Mac и Linux.
В обычной разработке я использую редактор vscode и, кстати, могу установить плагин для докера. Поиск в магазине плагиновdocker
, После завершения установки мы можем легко управлять образами и контейнерами Docker.
быстрый в использовании
Сначала давайте испытаем Docker.
При обычной работе, если среда разработки на нашем компьютере — Windows, и однажды мы захотим что-то сделать в среде Linux, что нам делать? (При условии отсутствия облачного сервера) В настоящее время большинство людей предпочтут установить систему Ubuntu с виртуальной машиной. Однако перед установкой виртуальной машины необходимо сначала загрузить несколько G-образов, затем настроить некоторые параметры в VMware и, наконец, подождать не менее десяти минут, пока система установится. В ожидании установки системы ubuntu, по оценкам, несколько часов были потрачены впустую.
Однако с Docker вам понадобится всего несколько минут!
# 拉取ubuntu镜像
docker pull ubuntu
# 创建一个ubuntu容器并且使用终端进行交互
docker run -it --name my-ubuntu --rm ubuntu /bin/bash
После успешного создания вы войдете в систему ubuntu, и теперь сможете выполнять в ней произвольные операции.
Примечание. Хотя текущим контейнером является система ubuntu, вы можете представить ее только как упрощенную версию ubuntu, поэтому существует множество общих команд, которые необходимо установить самостоятельно.
curl -v bilibili.com
бежать напрямуюcurl
Команда подскажет, что команда не существует
# 安装curl
apt-get update
apt-get install -y curl
После завершения установки вы можете использоватьcurl
Заказ
выйти из контейнера
exit
основная концепция
- Изображение: аналогично изображению на виртуальной машине. Существует два типа изображений: базовые изображения и личные изображения. Основные изображения предоставляются крупными производителями, такими как
ubuntu
зеркало,node
Зеркало. Персональное зеркало загружено персональными разработчиками. - Контейнер (контейнер): похож на легкую песочницу. Контейнер основан на зеркале для создания,
ubuntu
Зеркала никак не могут взаимодействовать с нами, мы хотим, чтобы среда работалаubuntu
, поэтому на основеubuntu
Образ создает контейнер. - Репозиторий: как и репозиторий кода, здесь находится репозиторий образов, который Docker использует для централизованного хранения файлов изображений.
Мы можем сравнить так:
# 下载源代码
git clone deepred5/app
# 启动app
npm run start
# 拉取镜像
docker pull deepred5/app
# 创建容器
docker run deepred5/app
Docker основан на архитектуре C / S: мы выполняем команду в Docker Client, последний созданный контейнер и сервер Image будут работать в
# 可以查看server和client信息
docker info
Изображение
Общие команды
# 查找镜像
docker search ubuntu
# 拉取特定tag版本的镜像(默认是latest)
docker pull ubuntu:18.0.4
# 查看下载的所有本地镜像
docker images
# 删除镜像
docker rmi ubuntu:18.0.4
построить образ
Обычно мы создаем личные изображения на основе базовых изображений. Образ собирается по одной инструкции (Dockerfile)
Давайте построимnode-pm2
Зеркало, это зеркало поставляется с узлом и pm2:
Создаватьnode-pm2
Каталог и создайте новыйDockerfile
документ
mkdir node-pm2
cd node-pm2
touch Dockerfile
редактироватьDockerfile
# 基于node11基础镜像
FROM node:11
# 一些元数据,比如作者信息
LABEL maintainer="deepred5 <deepred5@gamil.com>"
# 安装pm2
RUN npm install pm2 -g --registry=https://registry.npm.taobao.org
# 暴露容器的端口
EXPOSE 80 443
основываясь на этомDockerfile
Создадим собственное зеркалоdeepred5/node-pm2
docker build -t deepred5/node-pm2:1.0 .
Обратите внимание, что в конце есть.
Проверьте наше собственное зеркало
# 可以看到deepred5/node-pm2镜像了
docker images
на основеdeepred5/node-pm2
Изображение запускает контейнер
docker run -it deepred5/node-pm2:1.0 /bin/bash
Оказавшись внутри контейнера, мы запускаемpm2 -v
, вы можете видеть, что pm2 был успешно установлен
загрузить изображение
Если мы хотим создать изображение локально и можно использовать другими, нам нужно загрузить изображение в репозиторий. Авторизоватьсяdockerhub, зарегистрировать аккаунт.
# 登入账户,输入用户名和密码
docker login
# 上传镜像
docker push deepred5/node-pm2:1.0
Уведомление:deepred5/node-pm2
изменить на你的用户名/node-pm2
, вам нужно восстановить你的用户名/node-pm2
изображение перед загрузкой в dockerhub
Контейнер
Мы в основном имеем дело с контейнерами все время.
# 基于ubuntu镜像创建my-ubuntu容器。如果本地没有ubuntu镜像,会先去docker pull下载
docker run -it ubuntu:latest --name my-ubuntu /bin/bash
Объяснение параметра:
-i
: позволяет взаимодействовать со стандартным вводом (STDIN) внутри контейнера.
-t
: укажите псевдотерминал или терминал внутри нового контейнера.
--name
: Имя контейнера, по умолчанию это случайное имя.
/bin/bash
: команда для выполнения сразу после запуска контейнера
# 停止容器
docker stop my-ubuntu
# 启动容器
docker start my-ubuntu
# 删除容器
docker rm my-ubuntu
# 删除所有容器
docker rm `docker ps -aq`
# 查看正在运行的容器
docker ps
# 查看所有创建过的容器(运行或者关闭)
docker ps -a
docker start my-ubuntu
Запущенный контейнер, хотя контейнер запущен, мы не можем войти в контейнер.
Как снова попасть в контейнер?
docker exec -it my-ubuntu /bin/bash
Два слоя контейнеров
- работать в интерактивном режиме (-it)
- демонизированный (без интерактивных сеансов, длительный, подходит для запуска приложений и служб) (-d)
Сравнить можно так:
node index.js
: запустить в интерактивном режиме
pm2 start index.js
: работа демона
В основном работает демонизированный контейнер
# 启动了容器,然后容器立即关闭
docker run ubuntu /bin/bash
# 启动了容器,并开启了交互式的终端,只有输入exit才退出终端,退出终端后,容器仍然在后台运行
docker run -it ubuntu /bin/bash
# 启动了容器,并且在后台一直运行,每隔1s输出hello world
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
Просмотр журналов контейнера
docker run -d --name my_container ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
# 查看后台运行的日志
docker logs my_container
# 实时监控(类似tail -f)
docker logs -f my_container
# 获取最后10行
docker logs --tail 10 my_container
# 实时查看最近的日志
docker logs --tail 0 -f my_container
# 加上时间戳
docker logs -t my_container