Вход в Docker и практика переднего плана

Docker
Вход в Docker и практика переднего плана

Спасибо и ссылка

Содержание этой статьи все еще относительно неглубокое.Содержимое распределенного и кластеризованного в Docker не охватывается, поэтому в этой статье рекомендуется взглянуть на студентов, изучающих интерфейс, но не рекомендуется на это. Все команды в этой статье предназначены дляUbuntu16.04, будьте осторожны при копировании и вставке. (В этой статье есть несколько повторителей 🎺, если вас интересует докер, вы можете напрямую увидеть следующие ссылки)

Эта статья в основном относится к следующим материалам

Сводка команд

Сводка команд, быстрый запрос аспекта


# 创建镜像
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

image

image

Виртуализация Docker реализована на системном уровне, а виртуальная машина реализована на аппаратном уровне.

зеркало

Docker Images — это исполняемый пакет. Содержит все для запуска приложения, код, среду выполнения, переменные среды, библиотеки, файлы конфигурации.

Зеркальная композиция

Построение образа строится слой за слоем, и предыдущий слой является основой следующего слоя. После того, как каждый слой построен, он не изменится. Последующие модификации будут происходить только с текущим слоем изображения. Например, удаление файлов в предыдущем слое на самом деле не является удалением. Вместо этого он помечается как удаленный на следующем слое изображения, и удаленные файлы всегда будут существовать в образе.

Многоуровневый характер позволяет легко расширять и повторно использовать изображения. Например, различные базовые образы доступны на Docker Hub.

image

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

image


# 允许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

image

запустить приложение


# 将服务器的4000端口映射到容器的80端口
docker run -p 3999:80 hellodocker

# 查看正在运行的容器
docker container ls

# curl测试,返回helloworld
curl 0.0.0.0:3999

image

image

Подробное объяснение инструкций 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

Создать репозиторий

image

знак зеркало


# 登录
docker login

# 标记镜像
# docker tag [镜像名] [用户名]/[存储库]:[标签]
docker tag hellodocker zhangyue9467/learn-docker:test

image

выпускное зеркало


docker push zhangyue9467/learn-docker:test

В репозиториях Docker Hub будут наши опубликованные образы.

image

Извлекайте и запускайте образы из DockerHub

После использования Docker нам не нужно ничего устанавливать на другую машину, его можно запустить. Нужно только вытащить удаленное зеркало Docker


docker run -p 3998:80 zhangyue9467/learn-docker:test

объем данных

Что такое объем данных?

Том данных — это специальный каталог, который может использоваться одним или несколькими контейнерами, а данные в томе данных могут совместно использоваться и повторно использоваться между контейнерами. Изменения объема данных вступают в силу немедленно.

Создать том данных


# 创建一个名为vol的数据卷
docker volume create vol

# 查看数据卷中的信息
docker volume inspect vol 

image

Точка монтирования — это место, где том данных монтируется на хосте. Создаем файл в папке, соответствующей полю Mountpoint

image

Запустите контейнер с подключенным томом данных

С --mount том данных монтируется при запуске контейнера, и при запуске контейнера можно монтировать несколько томов данных.


# 启动了name为web的容器
# 使用vol数据卷,加载到容器的/webapp中

docker run -d -P \
    --name web \
    --mount source=vol,target=/webapp \
    hello

image

Войдите в веб-контейнер для просмотра, содержимое тома данных vol монтируется в каталог /webapp контейнера.

image

Смонтируйте каталог хоста как том данных

Путь хоста должен быть абсолютным.Если используется --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

image

Монтировать локальные файлы как тома данных


# /root/.bash_history 作为卷

docker run -d -P \
    --name web3 \
    --mount type=bind,source=/root/.bash_history,target=/root/.bash_history \
    hello

image

Историю внешней командной строки можно получить внутри контейнера

Интернет

контейнер внешнего доступа


# 映射任意端口到容器的端口
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] [容器的端口]

image

Контейнер имеет свою сеть и ip, которые можно получить в «NetworkSettings» с помощью команды docker inspect.


# 查看容器内部的ip信息
docker inspect [容器id]

image

контейнерная связь

Реализуйте взаимодействие контейнеров с помощью пользовательской сети 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

image

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

image

ps

Запустите команду ps в корневом каталоге проекта, чтобы получить списокпроектвсе контейнеры


docker-compose ps

image

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 развертывает клиентские приложения

image

Создайте новую задачу 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 на ☁️ облачном сервере для доступа к контейнеру.

image
(Мы перенаправим запрос на интерфейс, отображаемый контейнером)

Docker развертывает службу Node

image

Интерфейсное развертывание такое же, как и в предыдущем проекте (пропустите его здесь). Используйте Dockerfile для определения образа серверной службы, используйте команду FROM, чтобы использовать узел в качестве родительского образа, используйте команду RUN для глобальной установки pm2, используйте команду CMD и используйте pm2 для запуска серверной службы.


FROM node

WORKDIR /server

COPY . /server
    
EXPOSE 8888

RUN npm install pm2 -g

CMD ["pm2-runtime", "app.js"]

image

Докер развертывает 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'