Спасибо и ссылка
Содержание этой статьи все еще относительно неглубокое.Содержимое распределенного и кластеризованного в Docker не охватывается, поэтому в этой статье рекомендуется взглянуть на студентов, изучающих интерфейс, но не рекомендуется на это. Все команды в этой статье предназначены дляUbuntu16.04, будьте осторожны при копировании и вставке. (В этой статье есть несколько повторителей 🎺, если вас интересует докер, вы можете напрямую увидеть следующие ссылки)
Эта статья в основном относится к следующим материалам
- docker docs официальная документация докера
- Приступая к работе с Docker. Учебные заметки.
- Докер — от начала до практики
- DockerInfo
- Docker Learning Roadmap (с практическим руководством на основе Alibaba Cloud Container Service)
Сводка команд
Сводка команд, быстрый запрос аспекта
# 创建镜像
docker build -t [镜像名] .
# Docker镜像列表
docker image ls
# 删除镜像
docker rmi [id]
# 删除所有的镜像
docker image rm $(docker image ls -a -q)
# Docker容器列表
docker container ls
docker container ls --all
# 全部的停止的容器
docker container ls -aq
# 删除容器
docker rm [id]
# 删除所有的容器
docker container rm $(docker container ls -a -q)
# 停止容器
docker container stop [id]
# 启动停止的容器
docker container start [id]
# 强制关闭指定容器
docker container kill [id]
# 重启容器
docker container restart [id]
# 进入容器内部
docker exec -it [容器id] bash
# 运行容器,外部的4000端口映射到容器的80端口
docker run -p 4000:80 hello
# 指定容器的名称 --name
docker run --name [name] -p 4000:80 [image]
# 守护态运行容器(后台运行,不需要在打开一个终端)
docker run -d -p 4000:80 hello
# 随机映射本机的端口到容器的端口
docker run -d -P [image]
# 映射所有的地址
docker run -d -p [宿主机端口]:[容器端口] [image]
# 映射指定地址以及端口
docker run -d -p [ip]:[宿主机端口]:[容器端口] [image]
# 映射指定地址的任意端口
docker run -d -p [ip]::[容器端口] [image]
# 查看容器映射的端口
docker port [容器名|容器id] [容器的端口]
# 标记镜像
docker tag [镜像名] [用户名]/[存储库]:[标签]
# 上传镜像到DockerHub
docker push [用户名]/[存储库]:[标签]
# 从DockeerHub上获取镜像
docker pull [存储库]:[标签]
# 从存储库运行镜像
docker run -p [用户名]/[存储库]:[标签]
# 创建数据卷
docker volume create [数据卷名称]
# 查看所有的数据卷
docker volume ls
# 查看数据卷的信息
docker volume inspect [数据卷名称]
# 删除数据卷
docker volume rm [数据卷名称]
# 清理无主的数据卷
docker volume prune
# 查看网络列表
docker network ls
Основные концепции Docker
Виртуализация Docker реализована на системном уровне, а виртуальная машина реализована на аппаратном уровне.
зеркало
Docker Images — это исполняемый пакет. Содержит все для запуска приложения, код, среду выполнения, переменные среды, библиотеки, файлы конфигурации.
Зеркальная композиция
Построение образа строится слой за слоем, и предыдущий слой является основой следующего слоя. После того, как каждый слой построен, он не изменится. Последующие модификации будут происходить только с текущим слоем изображения. Например, удаление файлов в предыдущем слое на самом деле не является удалением. Вместо этого он помечается как удаленный на следующем слое изображения, и удаленные файлы всегда будут существовать в образе.
Многоуровневый характер позволяет легко расширять и повторно использовать изображения. Например, различные базовые образы доступны на Docker Hub.
commit
Выше мы сказали, что зеркалирование является многоуровневым. Здесь мы используем команду фиксации, чтобы глубоко понять состав зеркала.
Мы используемdocker run --name webserver -d -p 4880:80 nginxСоздайте контейнер nginx. использоватьexecВойдите в контейнер веб-сервера и внесите некоторые изменения. Команда docker commit может сохранить наши изменения на уровне хранилища контейнера как новый образ. Новое изображение состоит из исходного изображения и нашего измененного слоя хранения.
контейнер
Контейнеры Docker — это экземпляры, в которых запускаются образы. Список запущенных контейнеров можно посмотреть с помощью docker ps. Контейнеры также представляют собой многоуровневое хранилище с образами в качестве базового уровня и уровнем хранения, работающим с контейнерами, поверх базового уровня.
Установка докера
Удалите старые версии Docker
sudo apt-get remove docker docker-engine docker.io containerd runc
Установить
# 更新apt
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
# 添加官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 将存储库添加到APT源
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 更新apt
sudo apt-get update
# 安装
sudo apt-get install docker-ce docker-ce-cli containerd.io
Проверить установку
# 查看docker版本
docker version
# 允许hello-world镜像,验证是否正确安装
docker run hello-world
контейнер
В прошлом, если вы хотели написать приложение Python, вам нужно было установить среду выполнения Python на свой компьютер, и вам нужно было настроить среду не только на вашем компьютере для разработки, но и на рабочем компьютере. Если вы используете Docker, вы можете получить среду выполнения Python из образа без необходимости многократно устанавливать среду на разных машинах. Его можно упаковать вместе с приложением и образом среды выполнения Python. Убедитесь, что он работает нормально на разных машинах. Эти переносимые образы определяются файлом Dockerfile.
Dockerfile
Dockerfile определяет среду внутри контейнера. Контейнеры изолированы от остальной системы, поэтому вам необходимо сопоставить порты контейнера с внешним миром. Сборка приложения, определяемая этим Dockerfile, ведет себя одинаково везде, где она выполняется.
Пример
# 创建空文件夹,并在文件夹中创建Dockerfile文件
mkdir learn-docker
cd learn-docker
touch Dockerfile
touch app.js
Dockerfile
# 在Dockerfile写入以下的内容
vim Dockerfile
# 将node作为父镜像
FROM node
# 将容器的工作目录设置为/app(当前目录,如果/app不存在,WORKDIR会创建/app文件夹)
WORKDIR /app
# 将当前文件夹中的所有内容,复制到容器的/app中
COPY . /app
# 安装node包
RUN npm install
# 容器对外暴露80端口
EXPOSE 80
# 环境变量
ENV NAME World
# 容器启动时运行app.js
CMD ["node", "app.js"]
app.js
const express = require('express')
const app = express()
app.get('/', function (req, res) {
res.send('hello world')
})
app.listen(80, '0.0.0.0')
Нам не нужно устанавливать в системе Python, Flask или Redis. Их также не нужно устанавливать при сборке и запуске образов. Хотя это не похоже на то, что мы создаем среду разработки с помощью Pyhone, мы это делаем.
Создайте приложение
Используйте команду сборки docker для сборки образа. (Опция --tag называет изображение)
# 构建hellodocker的镜像
docker build --tag=hellodocker .
# 构建完成后,我们查看镜像列表
docker image ls
запустить приложение
# 将服务器的4000端口映射到容器的80端口
docker run -p 3999:80 hellodocker
# 查看正在运行的容器
docker container ls
# curl测试,返回helloworld
curl 0.0.0.0:3999
Подробное объяснение инструкций Dockerfile
🌟ОТ
Инструкция FROM используется для указания базового образа изображения.FROM scratch, вы можете указать пустой базовый образ.
🌟БЕГИ
Каждая инструкция в Dockerfile создает слой образа,Команда RUN не должна быть написана как сценарий оболочки..
FROM scratch
# 这回额外的创建7层镜像,这是错误的行为
RUN apt-get update
RUN apt-get install -y gcc libc6-dev make wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN mkdir -p /usr/src/redis
RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install
# 正确的写法应当是,使用&&将命令串连,简化为一层镜像
RUN buildDeps='gcc libc6-dev make wget' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
# 清除无用的缓存,避免Docker的臃肿
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
COPY
Команда COPY копирует файлы из текущего каталога в образ.
Исходный путь относится к каталогу текущего контекста. Целевой путь может быть абсолютным путем внутри контейнера или контейнером.WORKDIRОтносительный путь к указанному рабочему каталогу.
COPY [源路径] [目标路径]
CMD
Команда CMD задает запуск основного технологического сосуда.
# 使用node
CMD ["node", "app.js"]
# 使用pm2
# http://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/#docker-integration
RUN npm install pm2 -g
CMD ["pm2-runtime", "app.js"]
VOLUME
Команда VOLUME может указать каталог каканонимный том, любые операции записи в этот каталог не будут регистрироваться на уровне хранения контейнера.
Для баз данных файл базы данных должен быть сохранен в томе данных
VOLUME /data
ENV
Инструкция ENV используется для установки переменной среды, которую можно использовать в инструкциях или коде Dockerfile.
# Dockerfile
# 环境变量
ENV NAME World
// app.js
const express = require('express')
const app = express()
app.get('/', function (req, res) {
// 使用环境变量
res.send(`hello world${process.env.NAME}`)
})
app.listen(80, '0.0.0.0')
EXPOSE
Команда EXPOSE используется для объявления порта, но порт, объявленный EXPOSE, следует отличать от docker run
WORKDIR
WORKDIR используется для указаниятекущий каталог (рабочий каталог), Dockerfile — это не шелл-скрипт, об этом нужно помнить.
# 这是错误的示范
RUN cd /app
RUN echo "hello" > world.txt
Файл /app/world.txt здесь создаваться не будет. Потому что среда выполнения двух строк RUN в Dockerfile отличается. Таким образом, cd /app первого слоя не повлияет на текущий каталог второго слоя, правильный путь должен быть.
WORKDIR /app
RUN echo "hello" > world.txt
поделись своим зеркалом
Что такое DockerHub?
DockerHub похож на Github, общедоступный репозиторий образов контейнеров, официально поддерживаемый Docker. Сначала регистрируемся и авторизуемсяDocker Hub
Создать репозиторий
знак зеркало
# 登录
docker login
# 标记镜像
# docker tag [镜像名] [用户名]/[存储库]:[标签]
docker tag hellodocker zhangyue9467/learn-docker:test
выпускное зеркало
docker push zhangyue9467/learn-docker:test
В репозиториях Docker Hub будут наши опубликованные образы.
Извлекайте и запускайте образы из DockerHub
После использования Docker нам не нужно ничего устанавливать на другую машину, его можно запустить. Нужно только вытащить удаленное зеркало Docker
docker run -p 3998:80 zhangyue9467/learn-docker:test
объем данных
Что такое объем данных?
Том данных — это специальный каталог, который может использоваться одним или несколькими контейнерами, а данные в томе данных могут совместно использоваться и повторно использоваться между контейнерами. Изменения объема данных вступают в силу немедленно.
Создать том данных
# 创建一个名为vol的数据卷
docker volume create vol
# 查看数据卷中的信息
docker volume inspect vol
Точка монтирования — это место, где том данных монтируется на хосте. Создаем файл в папке, соответствующей полю Mountpoint
Запустите контейнер с подключенным томом данных
С --mount том данных монтируется при запуске контейнера, и при запуске контейнера можно монтировать несколько томов данных.
# 启动了name为web的容器
# 使用vol数据卷,加载到容器的/webapp中
docker run -d -P \
--name web \
--mount source=vol,target=/webapp \
hello
Войдите в веб-контейнер для просмотра, содержимое тома данных vol монтируется в каталог /webapp контейнера.
Смонтируйте каталог хоста как том данных
Путь хоста должен быть абсолютным.Если используется --mount, Docker сообщит об ошибке, если каталог хоста не существует. Разрешения Docker по умолчанию для каталога хоста — это права на чтение и запись.
# 启动了name为web2的容器
# 使用本机/var/www/vol目录作为数据卷,加载到容器的/webapp中
docker run -d -P \
--name web2 \
--mount type=bind,source=/var/www/vol,target=/webapp \
hello
Монтировать локальные файлы как тома данных
# /root/.bash_history 作为卷
docker run -d -P \
--name web3 \
--mount type=bind,source=/root/.bash_history,target=/root/.bash_history \
hello
Историю внешней командной строки можно получить внутри контейнера
Интернет
контейнер внешнего доступа
# 映射任意端口到容器的端口
docker run -d -P [image]
# 映射所有的地址
# docker run -d -p 5000:5000 web
docker run -d -p [宿主机端口]:[容器端口] [image]
# 映射指定地址以及端口
# docker run -d -p 127.0.0.1:5000:5000 web
docker run -d -p [ip]:[宿主机端口]:[容器端口] [image]
# 映射指定地址的任意端口
# docker run -d -p 127.0.0.1::5000 web
docker run -d -p [ip]::[容器端口] [image]
Просмотр конфигурации порта сопоставления контейнеров
# 查看容器映射的端口
docker port [容器名|容器id] [容器的端口]
Контейнер имеет свою сеть и ip, которые можно получить в «NetworkSettings» с помощью команды docker inspect.
# 查看容器内部的ip信息
docker inspect [容器id]
контейнерная связь
Реализуйте взаимодействие контейнеров с помощью пользовательской сети Docker. Если несколько контейнеров могут использовать Docker Compose для связи между контейнерами, Docker Compose по умолчанию использует все контейнеры в одной сети.
# 创建网络
docker network create -d bridge mynet
# 将容器链接到网络mynet中
docker run -d -p 5000:8888 --name busybox1 --network mynet hello
docker run -d -p 5001:8889 --name busybox2 --network mynet hello2
# 进入容器busybox1内部,可以使用curl或者ping,测试
# busybox2的ip地址
curl 172.19.0.3:8889
#
ping busybox2
Docker Compose
Что такое составить?
Контейнер можно легко определить с помощью Dockerfile. Но в повседневной работе проекту может понадобиться несколько контейнеров (фронтенд, бэкенд, база данных). Compose позволяет пользователям определить файл шаблона docker-compose.yml, чтобы определить набор связанных контейнеров как набор проектов.
Два понятия в Compose:
- Служба, контейнер для приложения, может быть несколькими экземплярами одного и того же образа.
- Проект, полная бизнес-единица, состоящая из набора связанных контейнеров приложений, определяется в файле docker-compose.yml.
Создать установку
sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Проверьте установку docker composc
# 查看版本
docker-compose --version
Создать команду
больше команд, пожалуйстаСсылаться на.
💡Прежде чем знакомить с командой Compose, считаю необходимым уточнить понятия сервисов и контейнеров. Я перепутал их понятия, объясните, пожалуйста, подробноСсылаться на
В docker-compose то, что определено в docker-compose.ymal,Служить, следующее определяетwebоказание услуг. Веб-служба запускает контейнер с именем «[имя файла проекта]_web».
# docker-compose.ymal
version: '3'
services:
web:
build: .
ports:
- "5000:3000"
build
Запустите команду сборки в корневом каталоге проекта, чтобы собрать образ.
# 构建容器
docker-compose build
ps
Запустите команду ps в корневом каталоге проекта, чтобы получить списокпроектвсе контейнеры
docker-compose ps
up
Команда up завершает серию операций, таких как сборка контейнера, создание службы, запуск службы и т. д. Вы можете запустить проект напрямую с помощью команды up
# 在前台启动容器
docker-compose up
# 在后台启动并运行项目(不需要强制退出控制台了)
docker-compose up -d
port
ПроверитьСлужитьПорт сопоставлен на хосте
version: '3'
services:
web:
build: .
ports:
- "5000:3000"
# 示例
# 0.0.0.0:5000
docker-compose port web[服务] 3000[容器端口]
Создать файл шаблона
больше инструкций, пожалуйстаСсылаться на
version: '3'
services:
# web服务
web:
# 容器的名称
container_name: hello_compose
# Dockerfile文件的位置(绝对路径,相对docker-compose模版文件的路径都可以)
build: .
# 暴露端口,但不映射到宿主机
expose:
- "3000"
# 暴露端口 [宿主端口]:[容器端口]
ports:
- "5000:3000"
# 数据卷挂载的路径
# https://forums.docker.com/t/making-volumes-with-docker-compose/45657
volumes:
- [宿主机路径]:[容器路径]
# db服务
db:
# 容器使用的镜像
image: "redis:alpine"
настоящий бой
Docker развертывает клиентские приложения
Создайте новую задачу jenkins и перетащите проект на github в пустую папку онлайн-облачного сервера.
Затем определите пользовательский образ Dockerfile. Используйте команду FROM, чтобы использовать nginx в качестве родительского образа, и используйте команду COPY, чтобы скопировать все содержимое каталога контекста в каталог /var/www/hello_docker/ контейнера. /var/www/hello_docker/ — каталог статических файлов, который мы настроили в конфигурации nginx. Затем используйте команду COPY, чтобы скопировать файл конфигурации nginx в каталог /etc/nginx/conf.d/. Содержимое файла конфигурации nginx в папке conf.d будет объединено с основным файлом конфигурации nginx. Затем используйте команду RUN, чтобы перезапустить службу nginx.
После настройки нашего образа с помощью Dockerfile нам нужно собрать наш образ с помощью команды сборки. В связи с необходимостью автоматизации работы и обслуживания, непосредственный запуск нашего образа может привести к ошибкам (может быть образ с таким же именем). Мы используемсценарий оболочкиОпределите, нужно ли вам удалить предыдущее изображение или запустить контейнер напрямую. Наконец, используйте команду запуска для создания нашего контейнера.
# Dockerfile
FROM nginx
COPY ./* /var/www/hello_docker/
COPY ./nginx/hello_docker.conf /etc/nginx/conf.d/
RUN service nginx restart
# nginx.conf
server {
listen 8888;
server_name localhost;
root /var/www/hello_docker;
index index.html;
expires 7d;
}
После того, как контейнер построен, мы не можем получить прямой доступ к интерфейсу, отображаемому контейнером локально, нам нужно настроить прокси nginx на ☁️ облачном сервере для доступа к контейнеру.
(Мы перенаправим запрос на интерфейс, отображаемый контейнером)Docker развертывает службу Node
Интерфейсное развертывание такое же, как и в предыдущем проекте (пропустите его здесь). Используйте Dockerfile для определения образа серверной службы, используйте команду FROM, чтобы использовать узел в качестве родительского образа, используйте команду RUN для глобальной установки pm2, используйте команду CMD и используйте pm2 для запуска серверной службы.
FROM node
WORKDIR /server
COPY . /server
EXPOSE 8888
RUN npm install pm2 -g
CMD ["pm2-runtime", "app.js"]
Докер развертывает Mongo
Мы развертываем базу данных mongo напрямую с помощью docker-compose.
Следует отметить, что в месте хранения данных монго не рекомендуется хранить данные непосредственно в контейнере. Вместо этого используйте тома для подключения каталога хранения базы данных в контейнере к каталогу хоста.
version: '3.1'
services:
mongo:
# 使用docker hub 的mongo镜像
image: mongo
# 容器重启策略
restart: always
# 容器启动的参数
command:
- '--auth'
- '-f'
- '/etc/mongod.conf'
# 指定数据卷,配置文件以及数据存储的位置
volumes:
- '/etc/mongod.conf:/etc/mongod.conf'
- '/var/lib/mongodb:/var/lib/mongodb'
ports:
- '37017:27017'