Начало работы с интерфейсной докерой

внешний интерфейс

Эта статья призвана дать читателям общее представление обо всей системе докеров и определенное понимание механизма работы докеров. Чтобы углубиться, начните с глубокого понимания Linux.

1. Docker

1.1 Что такое докер

Docker — это механизм контейнерной технологии с открытым исходным кодом на базе Linux, который объединяет API для изолированных приложений для доступа к ядру системы. Попытка решить проблему разработчика века在我的机器上可以跑.

Студенты, изучающие интерфейс, могут рассматривать образ как пакет npm, а хранилище — как хранилище npm. Это облегчает понимание.

1.2 Зачем использовать Докер

Docker — это уменьшенная версия аналогичной технологии виртуальных машин.Поскольку процесс запуска виртуальной машины слишком долгий, а программа выполняется на виртуализированном оборудовании, он плохо подходит для физической машины.Типичный пример — разработка мобильного терминала, запуск При виртуализации системы, процесс очень долгий.

Мы часто запускаем виртуальную машину только для того, чтобы изолировать приложение, но создание виртуальной машины занимает полный набор системных ресурсов (гостевая ОС), возникает проблема избыточности, и стоимость тесно связана.

Docker появился с обновлением функций Linux, Docker по сути только изолирует приложения и разделяет ядро ​​текущей системы.

На следующем рисунке показано сравнение виртуальной машины и архитектуры Docker:

На следующем рисунке показано сравнение функций виртуальной машины-контейнера:

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

Используйте Docker для быстрого создания конфигурацийСреда приложения, упрощает операции, обеспечивает согласованность операционной среды, «компилируете один раз, запускайте везде», изоляцию на уровне приложений, гибкое масштабирование и быстрое расширение.

1.3 Основные понятия Docker

1.3.1 Зеркало

Образ представляет собой специальную файловую систему, которая не только предоставляет программы, библиотеки, ресурсы, конфигурацию и другие файлы, необходимые для запуска контейнера, но также содержит некоторые параметры конфигурации, подготовленные для среды выполнения (такие как анонимные тома, переменные среды, пользователи и др.). Образ не содержит никаких динамических данных и его содержимое не будет изменено после построения.

Использование образа (объединенная файловая система) предоставляет доступный только для чтения шаблон для запуска приложения. Он может предоставлять только одну функцию или несколько функций, которые могут быть созданы путем объединения нескольких образов.

1.3.2 Контейнеры

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

Контейнер для чтения и записи должен использовать**Volume**, или среда хранения хоста, после перезапуска или закрытия контейнера данные, существующие в работающем контейнере, будут потеряны.Каждый раз, когда контейнер запускается, новый контейнер создается через образ.

1.3.3 Склад

DockerХранилище — это место, где файлы изображений хранятся централизованно. После создания образа его можно легко запустить на текущем хосте, однако, если образ необходимо использовать на других серверах, нам потребуется служба централизованного хранения и распространения образа.Docker Registry(Warehouse Registry Server) является такой услугой. склад иногда(Repository)и сервер реестра репозитория(Registry)объединены, строго не дифференцированы.Dockerконцепция складаGitТочно так же сервер регистрации можно понимать какGitHubтакой хостинг. Фактически,Docker Registryможет содержать несколько репозиториев(Repository), каждый репозиторий может содержать несколько тегов(Tag), каждая метка соответствует зеркалу. Итак, зеркальный репозиторийDockerМесто, используемое для централизованного хранения файлов изображений, похоже на репозиторий кода, который мы использовали ранее.

Обычно репозиторий содержит образы разных версий одного и того же программного обеспечения, и теги часто используются для каждой версии программного обеспечения. мы можем пройти<仓库名>:<标签>формат, чтобы указать, какая версия программного обеспечения является зеркальным отображением. Если метка не указана, она будет начинаться сlatestкак ярлык по умолчанию..

Существует два типа складов:

  • public(общественный склад)
  • private(частный репозиторий)

1.3.4 Docker client

Клиент Docker — это общий термин, используемый для инициирования запросов к указанному механизму Docker и выполнения соответствующих операций по управлению контейнерами. Это может быть либо инструмент командной строки Docker, либо любой клиент, использующий Docker API. В настоящее время сообщество поддерживает типы Docker. клиенты очень богаты, охватывая такие распространенные языки, как C# (поддерживающий Windows), Java, Go, Ruby, JavaScript и даже клиенты формата WebU, написанные с использованием библиотеки Angular, чего достаточно для удовлетворения потребностей большинства пользователей.

1.3.5 Docker Engine

Docker Engine — это основной фоновый процесс Docker, который отвечает за ответы на запросы от клиентов Docker, а затем преобразовывает эти запросы в системные вызовы для завершения операций управления контейнерами. Процесс запускает сервер API в фоновом режиме, который отвечает за получение запросов, отправленных клиентом Docker; полученные запросы будут распределяться и планироваться через маршрут внутри Docker Engine, а затем определенные функции будут выполнять запросы.

2. Практичный докер

##2.1 Установите Докер

Все среды в этой статье работают наcentos7Вниз.

Во-первых, удалите все старые версии Docker.

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

Если это совершенно новая среда, вы можете пропустить этот шаг.

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

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

После завершения установки вы можете запуститьdocker versionПроверьте, прошла ли установка успешно.

➜  ~ docker version
Client: Docker Engine - Community
 Version:           19.03.3
 API version:       1.40
 Go version:        go1.12.10
 Git commit:        a872fc2f86
 Built:             Tue Oct  8 00:58:10 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.3
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.10
  Git commit:       a872fc2f86
  Built:            Tue Oct  8 00:56:46 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

##2.2 Получить изображение

Теперь нам нужно вытащитьnginxзеркало, разверните одинnginxзаявление.

➜  ~ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
68ced04f60ab: Pull complete 
28252775b295: Pull complete 
a616aa3b0bf2: Pull complete 
Digest: sha256:2539d4344dd18e1df02be842ffc435f8e1f699cfc55516e2cf2cb16b7a9aea0b
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

После завершения вытягивания используйтеdocker image lsПросмотрите текущий список локальных образов Docker.

➜  ~ docker image ls
REPOSITORY                      TAG                            IMAGE ID            CREATED             SIZE
nginx                           latest                         6678c7c2e56c        13 hours ago        127MB

Повторите ту же командуdocker pull nginxЛокальное зеркало будет обновлено.

##2.3 Запуск контейнера Docker

Создаватьshellфайл сценария, напишите следующее:

docker run \
	# 指定容器停止后的重启策略:
	#		no:容器退出时不重启 
	#		on-failure:容器故障退出(返回值非零)时重启
	#		always:容器退出时总是重启
	--restart=always \
	# 指定docker运行在后台,如果不加-d,在执行完这条命令之后
	# 你退出命令行也会将这个docker容器退掉
	-d \
	# 将宿主机端口号绑定至容器端口上
	-p 8080:80 \
	# 指定容器暴露的端口,即修改镜像的暴露端口
	--expose=80  \
	# 映射宿主目录至
	-v /wwwroot:/usr/share/nginx/html \
	# 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
	--name=testdocker \
	# 用哪个镜像初始化这个容器
	nginx:lastest

Давайте разберемся с докером容器Сеть изолирована от хоста, и к ней нельзя получить прямой доступ, если не указан сетевой режим контейнера, полагающийся на хост.

Теперь давайте запустим скрипт, затем откройте браузер и введитеhttp://ip:8080вы можете видеть, используяnginxЗеркальное отображение запущенных приложений.

2.3.1 Краткая версия параметров команды

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]    
02.  
03.  -d, --detach=false         指定容器运行于前台还是后台,默认为false     
04.  -i, --interactive=false   打开STDIN,用于控制台交互    
05.  -t, --tty=false            分配tty设备,该可以支持终端登录,默认为false    
06.  -u, --user=""              指定容器的用户    
07.  -a, --attach=[]            登录容器(必须是以docker run -d启动的容器)  
08.  -w, --workdir=""           指定容器的工作目录   
09.  -c, --cpu-shares=0        设置容器CPU权重,在CPU共享场景使用    
10.  -e, --env=[]               指定环境变量,容器中可以使用该环境变量    
11.  -m, --memory=""            指定容器的内存上限    
12.  -P, --publish-all=false    指定容器暴露的端口    
13.  -p, --publish=[]           指定容器暴露的端口   
14.  -h, --hostname=""          指定容器的主机名    
15.  -v, --volume=[]            给容器挂载存储卷,挂载到容器的某个目录    
16.  --volumes-from=[]          给容器挂载其他容器上的卷,挂载到容器的某个目录  
17.  --cap-add=[]               添加权限,权限清单详见:http://linux.die.net/man/7/capabilities    
18.  --cap-drop=[]              删除权限,权限清单详见:http://linux.die.net/man/7/capabilities    
19.  --cidfile=""               运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法    
20.  --cpuset=""                设置容器可以使用哪些CPU,此参数可以用来容器独占CPU    
21.  --device=[]                添加主机设备给容器,相当于设备直通    
22.  --dns=[]                   指定容器的dns服务器    
23.  --dns-search=[]            指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件    
24.  --entrypoint=""            覆盖image的入口点    
25.  --env-file=[]              指定环境变量文件,文件格式为每行一个环境变量    
26.  --expose=[]                指定容器暴露的端口,即修改镜像的暴露端口    
27.  --link=[]                  指定容器间的关联,使用其他容器的IP、env等信息    
28.  --lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc时使用    
29.  --name=""                  指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字    
30.  --net="bridge"             容器网络设置:  
31.                                bridge 使用docker daemon指定的网桥       
32.                                host    //容器使用主机的网络    
33.                                container:NAME_or_ID  >//使用其他容器的网路,共享IP和PORT等网络资源    
34.                                none 容器使用自己的网络(类似--net=bridge),但是不进行配置   
35.  --privileged=false         指定容器是否为特权容器,特权容器拥有所有的capabilities    
36.  --restart="no"             指定容器停止后的重启策略:  
37.                                no:容器退出时不重启    
38.                                on-failure:容器故障退出(返回值非零)时重启   
39.                                always:容器退出时总是重启    
40.  --rm=false                 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)    
41.  --sig-proxy=true           设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理    

2.4 Доступ к контейнеру

мы можем использоватьdocker exec -it [docker container id] /bin/bashвойти в работающий контейнер.

И выйти из контейнера можно двумя способами:

  1. Введите прямо в командной строкеexitпросто уйди
  2. Используйте сочетания клавишctrl+P Qтакже бросить

Оба вышеуказанных метода могут выйти из контейнера и оставить контейнер работать в фоновом режиме.

##2.5 Настройка Dockerfile образа

Dockerfile разделен на четыре части: основная информация об образе, информация для сопровождающего, инструкции по работе с образом и инструкции по выполнению при запуске контейнера.

Здесь я использую простой Dockerfile для узла, чтобы запустить среду разработки.

# 1. 设置来源的基础镜像
FROM node:12.0
# 指定后续 RUN、CMD、ENTRYPOINT 指令的工作目录
WORKDIR /workspace
# 在上一次通过WORKDIR指定的目录运行 RUN 后续命令
RUN npm install --registry=https://registry.npm.taobao.org
# 初始化暴露 8080 8001 8800端口号
# 以下端口号 也可以在docker run时暴露出去
EXPOSE 8080
EXPOSE 8001
EXPOSE 8800
# 默认执行的命令,如果在宿主机通过docker run -it /bin/bash进入时,以下命令不会被执行
# 完全不被覆盖的指令为 ENTRYPOINT
CMD ["npm","run","dev-server"]

Сохранить и выйти из редактирования, выполнитьdocker build -t nodeapp:v1.0 .Обратите внимание на последнее.Представляет текущий каталог.

После завершения запуска используйтеdocker image lsПроверьте, есть ли образ, который был скомпилирован.

В это время у некоторых людей может возникнуть вопрос, то есть вам нужен npm install для установки файлов каждый раз?

На самом деле, если ваш пакет приложения node не изменится, и ваш образ специально разработан для этого приложения, вы можете рассмотреть возможность использованияADDинструкция, воляnode_modulesДобавьте к образу докера. (На самом деле это в основном не обрабатывается, потому что, если внешний том данных отображается, каталог будет перезаписан. Это просто для демонстрации файла добавления изображения.)

##2.6 Запуск нескольких контейнеров: Docker-compose

Docker-compose необходимо устанавливать отдельно.

Давайте предположим сценарий, в котором мы начинаем интерфейсный проект. нужно начатьnginxЗапустите проект переднего плана, запустите базу данных для записи данных и убедитесь в целостности всего приложения. И тут на помощь приходит docker-compose.

Первое, что нужно знать, это то, что docker-compose состоит из следующих двух типов:

  • Служить (service): контейнер приложения, который фактически может запускать несколько экземпляров одного и того же образа.
  • проект (project): полная бизнес-единица, состоящая из набора связанных контейнеров приложений.

Мы возвращаемся к созданию доDockerfileкаталог, напишитеdocker-compose.ymlфайл для настройки нескольких контейнеров.

version: '1'
services:
  web:
    build: .
    ports:
     - "8080:80"
		volumes:
		 - /wwwroot:/usr/share/nginx/html
  redis:
    image: "redis:alpine"

Команда выполненияdocker-compose upПосле этого проходимdocker statsВы можете видеть, что два докера (web, redis) были запущены.

доступhttp://ip:8080Вы можете увидеть ту же страницу, что и раньше.

2.7 Сеть

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

2.3 представил, как связывать порты и экспортировать контейнерные порты. Давайте посмотрим на взаимосвязь контейнеров здесь.

# 运行命令创建一个docker网络
$ docker network create -d bridge my-net
# 创建两个容器 加入my-net网络
$ docker run -it --rm --name busybox1 --network my-net busybox sh
$ docker run -it --rm --name busybox2 --network my-net busybox sh
# 接着我们进入busybox1
$ docker exec -it busybox1 /bin/bash
# ping 另外一个容器,可以看到他的IP信息
$ root@busybox1:ping busybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms

3. Расширить знания

3.1 Принцип Докера

Docker написан на языке Go и использует ряд функций, предоставляемых ядром Linux, для выполнения своих функций.

Система, которая может запускать Docker, делится на две части:

  • Основные элементы Linux
  • Компоненты, связанные с Docker

Функции модуля ядра Linux, используемые Docker, включают следующее:

  • Cgroup — используется для выделения аппаратных ресурсов
  • Пространство имен — используется для изоляции пространства выполнения различных контейнеров.
  • AUFS (chroot) — файловая система, используемая для создания различных контейнеров.
  • SELinux — используется для защиты сети Контейнера.
  • Netlink — используется для связи между различными контейнерами.
  • Netfilter — создание фильтрации пакетов сетевого брандмауэра на основе порта контейнера
  • AppArmor — сетевая безопасность и безопасность выполнения для контейнеров
  • Linux Bridge — обеспечивает связь между контейнерами в разных контейнерах или на разных хостах.

3.2 Принцип запуска Docker на mac window

Используйте виртуальную машину для запуска Linux, а затем запустите Docker Engine в Linux. Запустите клиент Docker локально.

3.3 Не удается запустить Docker с помощью CMD['node']

Проблемы передовых студентов

почему бы не использоватьCMD ['node','app.js']Запускается по умолчанию, потому что «Node.js не предназначен для работы с PID 1, что приводит к неожиданному поведению при работе внутри Docker», — написано в официальных рекомендациях для Node.js. Картинка ниже взята изGitHub.com/node будет /dock….

Эта проблема связана с операционным механизмом Linux.Проще говоря, процесс с pid 1 в Linux является процессом системного демона и получит все потерянные процессы. И при необходимости посылайте этим процессам сигналы завершения работы.

Однако процесс pid 1 в докере — это узел, и узел ничего не делает для повторного использования осиротевших процессов. Итак, если ваше приложение запускает приложение, подобное краулеру, повесьте процесс на pid 1 после выполнения, и постепенно контейнер будет БУМ.

решение:

1. 用`/bin/bash`启动。

2. 在`docker run`后面追加`--init`用于初始化一个docker的进程为pid 1。docker提供的进程可以回收所有孤儿进程。

3. 前端学习培训、视频教程、学习路线,添加威信kaixin666haoyun与我联系