Недавно я столкнулся со сценарием, когда хочу установить на сервер Mysql, Nginx, EasyMock и другие инструменты. Вот запись моего процесса установки с помощью Docker, и я надеюсь помочь вам в подобных сценариях~
Предварительное знание этой статьи требует некоторых основных команд Linux.Рекомендуется сначала ознакомиться с ней.Эта статья.
Версия CentOS:7.6
Версия Nginx:1.16.1
Версия докера:19.03.12
Чем больше вы узнаете одну вещь, тем меньше вы говорите ни слова о попрошайничестве
1. Введение
1.1 Причины появления
В процессе от front-end и back-end разработки до тестирования и продакшена я часто сталкиваюсь с проблемой.Очевидно, у меня нет проблем с запуском локально.Почему я получаю сообщение об ошибке при переходе в тестовую среду или производственную среду?Вызвано по разной комплектации.
Кто метался с настройкой окружения, тот понимает беду: если менять систему, виртуальную машину или машину, то приходится все делать заново, что трудоемко и занимает много времени. Из-за среды и конфигурации всегда появляются всевозможные странные ошибки в среде и конфигурации, как суслики в игре «Ударь крота» 🐹
Docker предлагает хорошее решение этой проблемы.Благодаря зеркалированию системная среда, необходимая в дополнение к системе, упаковывается снизу вверх для обеспечения бесперебойной работы сервисов на разных платформах. То есть при установке точно так же переместите конкретную среду, чтобы решить ситуацию «работает на моем компьютере, но не работает в среде xx».
Другой важной причиной является облегченная виртуализация на основе контейнеров. Образ Docker содержит только среду выполнения, необходимую для бизнес-операций. Базовый образ CentOS/Ubuntu занимает всего 170 МБ, потому что легкий хост может легко установить сотни контейнеров.
1.2 Что такое
Docker — это облачный проект с открытым исходным кодом, основанный на языке Go, который широко используется с момента его выпуска в 2013 году. Docker позволяет создавать приложения так же быстро, как с помощью контейнеров, и может максимально скрывать различия на уровне кода, например стандартные контейнеры. Он упаковывает приложение и зависимости программы в один файл. Запуск этого файла создаст виртуальный контейнер.
Программы запускаются в этом виртуальном контейнере, как если бы они работали на реальной физической машине. С Docker вам не нужно беспокоиться об окружающей среде.
В этой статье не будет сравниваться разница и плюсы и минусы виртуальной машины и Docker.Он есть в каждой статье.Если хотите узнать,можете в Baidu.Больше не буду здесь говорить.Бар.
2. Установка и настройка
2.1 Установка под Mac
Непосредственно используйте Homebrew Cask для установки под Mac:
# Homebrew 安装
braw cask install docker
Вы можете ввести команду после установки и сразу сообщить об ошибке!
➜ ~ docker
zsh: command not found: docker # 报错
Не волнуйтесь, если вы столкнулись с этой ошибкой, дважды щелкните приложение Docker в списке приложений после установки и введите пароль для использования этой команды 😅.
2.2 Установка под CentOS
Docker требует, чтобы была установлена версия CentOS 6.5 или выше.
# 安装
sudo yum install yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce
# 开启 Docker
$ sudo systemctl start docker
Непосредственно в WindowsЗагрузите установочный пакетустановить, или вы можете перейти на Mac без HomebrewОфициальный сайтЗагрузите установочный пакет напрямую, чтобы установить его.В Baidu полно способов установки, и нет необходимости говорить что-либо еще.
3. Простая настройка и запуск
3.1 Настройка ускорения изображения
Конфигурация Docker на MacOSPerferences -> Docker Engine
или для WindowsSettings -> Deamon
Добавьте элемент в JSON вregistry-mirrors
следующим образом
После настройки в командной строкеdocker info
Вы можете просмотреть адрес ускорения зеркала, который мы настроили.
➜ ~ sudo docker info
...
Registry Mirrors:
https://reg-mirror.qiniu.com/
http://hub-mirror.c.163.com/
https://registry.docker-cn.com/
...
Если в Docker вашей системы нет клиента, такого как CentOS, вы можете напрямую изменить файл конфигурации демона:
# 修改/创建 docker 的 deamon 配置文件
$ sudo vi /etc/docker/daemon.json
# 修改为如下配置
{
"experimental": false,
"debug": true,
"registry-mirrors": [
"https://reg-mirror.qiniu.com",
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
}
# 修改完 :wq 重启
$ sudo systemctl restart docker
3.2 Привет, мир!
Затем мы можем с радостью запустить нашу первую команду Docker Hello World.
Хорошее начало! 🎉
4. Изображение, контейнер и репозиторий
Отношения между образом и контейнером подобны классу и экземпляру класса.Образ может запускать несколько контейнеров одновременно, а один экземпляр контейнера может создавать новый образ. Как показано ниже:
Элементы, которые появляются на этой диаграмме, объясняются ниже.
концепция | иллюстрировать |
---|---|
Докер-образы | Только чтение для создания контейнеров Dockerшаблон, такие как система Ubuntu 16.04, Nginx 1.16.0 и т. д., — это специальная файловая система, включающая программы, библиотеки, ресурсы, параметры и т. д., необходимые для выполнения контейнера, но не содержащая динамических данных, и содержимое не будет быть изменены после построения. , изображение может создавать несколько контейнеров |
Докер-контейнер Контейнер | Контейнер — это приложение или группа приложений, которые работают независимо друг от друга и изолированы друг от друга. Это запущенный экземпляр, созданный образом.Простая среда Linux + работающие в ней приложения |
Докер-клиент Клиент | Клиент использует Docker SDK (docs.docker.com/develop/fast…) для связи с демоном Docker |
Докер-хост | Физическая или виртуальная машина для запуска демонов и контейнеров Docker. |
Репозиторий Docker Репозиторий | Место, где файлы изображений хранятся централизованно, делится на общедоступные репозитории и частные репозитории. |
Реестр сервера реестра Docker | Это централизованный сервис хранения и распространения изображений, официально именуемыйDocker Hub. Реестр Docker может содержать несколько репозиториев, каждый репозиторий может содержать образы с несколькими тегами, а разные теги соответствуют разным версиям. |
Docker Machine | Docker Machine – это инструмент командной строки, упрощающий установку Docker. Docker можно установить на соответствующую платформу с помощью простой командной строки, например VirtualBox, Digital Ocean, Microsoft Azure. |
Схема жизненного цикла контейнера
Пять основных состояний контейнера, представленные на рисунке цветными блоками: Создано, Выполняется, Приостановлено, Остановлено, Удалено:
- Created: Контейнер создан, и соответствующие ресурсы, необходимые для контейнера, готовы, но программа в контейнере еще не запущена.
- Running: Контейнер запущен, то есть запущено приложение в контейнере.
- Paused: Контейнер приостановлен, что означает, что все программы в контейнере находятся в приостановленном (не остановленном) состоянии.
- Stopped: Контейнер находится в остановленном состоянии, занятые ресурсы и среда песочницы все еще существуют, но приложения в контейнере остановлены.
- Deleted: Контейнер удален, а занятые ресурсы и управляющая информация, хранящиеся в Docker, также освобождены и удалены.
Эта статья в основном посвящена использованию и не будет вдаваться в подробности о переключении этих состояний.Давайте начнем непосредственно.
5. Основное использование
5.1 Операционные команды
# 开启 Docker 开机自启动
$ sudo systemctl enable docker
# 关闭 Docker 开机自启动
$ sudo systemctl disable docker
5.2 Команда «Зеркало»
# 去下载镜像,先从本地找,没有去镜像,最后没有去 hub,标签不写默认为 lastest
$ docker pull [镜像名]:[标签Tag]
# 列出本机的所有 image 文件,-a 显示本地所有镜像(包括中间镜像),-q 只显示镜像ID,--digests 显示镜像的摘要信息
$ docker image ls
$ docker images
# 删除 image 文件, -f 强制删除镜像
$ docker rmi [镜像名][:标签Tag]
$ docker rmi [镜像名1][:标签Tag] [镜像名2][:标签Tag] # 删多个
$ docker rmi $(docker ps -a -q) # 删全部,后面是子命令
# 查询镜像名称,--no-trunc 显示完整的镜像描述,--filter=stars=30 列出star不少于指定值的镜像,--filter=is-automated=true 列出自动构建类型的镜像
$ docker search [关键字]
# 下载镜像,标签 tag 不写默认为 lastest,也可以自己加比如 :3.2.0
$ docker pull [镜像名][:标签Tag]
5.3 Контейнерные команды
# 列出本机正在运行的容器,-a 列出本机所有容器包括终止运行的容器,-q 静默模式只显示容器编号,-l 显示最近创建的容器
$ docker container ls # 等价于下面这个命令
$ docker ps
# 新建并启动容器
$ docker run [option] [容器名]
# 启动容器
$ docker start [容器ID]/[容器Names]
# 重启容器
$ docker restart [容器ID]/[容器Names]
# 终止容器运行
$ docker kill [容器ID] # 强行终止,相当于向容器里面的主进程发出 SIGKILL 信号,那些正在进行中的操作会全部丢失
$ docker kill $(docker ps -a -q) # 强行终止所有容器
$ docker stop [容器ID] # 从容终止,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号
$ docker stop $(docker ps -a -q) # 终止所有容器
# 终止运行的容器文件,依然会占据硬盘空间,可以使用 docker container rm 命令删除,-f 强制删除可以删除正在运行的容器
$ docker rm [容器ID]
$ docker rm `docker ps -aq` # 删除所有已经停止的容器,因为没停止的rm删不了需要加-f
# 查看容器的输出,-t加入时间戳,-f跟随最新日志打印,--tail数字显示最后多少条,如果docker run时,没有使用-it,就要用这个命令查看输出
$ docker logs [容器ID]
# 查看容器进程信息
$ docker top [容器ID]/[容器Names]
$ docker port [容器ID]/[容器Names]
# 退出容器
$ exit # 容器退出
ctrl + p + q # 容器退出,快捷键
# 进入容器
$ docker attach [容器ID] # 退出容器时会让容器停止,本机的输入直接输到容器中
$ docker exec -it [容器ID] # 退出容器时不会让容器停止,在已运行的容器中执行命令,不创建和启动新的容器
# 设置容器在docker启动时自动启动
$ docker container update --restart=always [容器名字]
Особое упоминание здесьdocker run
изoption
, Потому что самые распространенные:
-
--name
дать контейнеру имя; -
-d
После запуска контейнера он уходит в фон и возвращает идентификатор контейнера, то есть контейнер-демон запущен; -
-P
случайное сопоставление портов; -
-p 80:8080
Сопоставьте локальный порт 80 с портом 8080 контейнера; -
bash
После того, как контейнер запущен, первая команда должна быть выполнена внутри. Запустите здесь bash, чтобы пользователи могли использовать Shell; -
-i
Запустите контейнер в интерактивном режиме, обычно с-t
использовать одновременно; -
-t
Переназначьте псевдотерминал ввода для контейнера, оболочка контейнера будет сопоставлена с текущей оболочкой, а затем команда, введенная в локальном окне, будет передана в контейнер, обычно с-i
использовать одновременно; -
--rm
Автоматически удалять файлы контейнера после закрытия контейнера; -
--restart=always
Установите контейнер на автоматический запуск; -
-v /xxx:/yyy
Команда сопоставления сопоставляет локальный каталог xxx с каталогом yyy в контейнере, то есть, если содержимое в локальном каталоге xxx изменяется, содержимое в каталоге контейнера yyy также изменится;
Например, я запускаю контейнер CentOS Docker под CentOS:
# 下载
$ docker pull centos
# 在上面下载的 centos 镜像基础上,新建一个容器名为 mycentos0901 的 centos 实例,并进入这个容器的 bash
$ docker run -it --name mycentos0901 0d120b6ccaa8
[root@169c9fffeecd /] # 进入容器,下面输入命令,注意这里 root 后面的一串 ID
$ ls # 可以看到centos的根目录文件列表
$ docker # bash: docker: command not found 这个容器没有安装docker
Разве это не удивительно, мы можем запустить его под CentOS в началеdocker ps
чтобы увидеть список контейнеров:
Вы обнаружите, что идентификатор выше — это идентификатор контейнера, запущенного в списке ниже, и идентификатор образа также находится перед нами.pull
Идентификатор образа CentOS, который вышел, также назван нами.mycentos0901
.
еслиdocker run
сообщить позжеConflict. The container name "xxxx" is already in use by container
просто бегиdocker rm $(docker ps -a -q)
Удалить остановленные контейнеры, или точнее удалитьdocker rm [containerID]
Все в порядке, это так.
5.4 Использование команды в нескольких распространенных сценариях
контейнер запуска демона
использоватьcentos
Запустить контейнер в фоновом режимеdocker run -d --name mycentos0903 0d120b6ccaa8
, после запускаdocker ps -a
Проверьте и обнаружите, что контейнер не запущен, это связано с механизмом работы Docker:Контейнер Docker работает в фоновом режиме, должен быть процесс переднего плана.
Если команды, запускаемые контейнером, не те, которые постоянно зависают, напримерtop
,tail
, он автоматически выйдет после завершения операции. Поэтому, чтобы контейнер работал в фоновом режиме, вам нужно запустить запущенную программу как процесс переднего плана.
Например, вот команда, работающая в фоновом режиме, эта команда печатаетdocker run -d centos /bin/sh -c "while true; do echo hello zzyy; sleep 2; done"
,тогда мыlogs
Проверьте это:
Операции над контейнером после выхода из контейнера
После выхода из контейнера вы можете пройтиexec
Методы работают с запущенными контейнерами:
Скопируйте файлы из контейнера наружу
Скопируйте файлы для использованияcp
Заказ
$ docker cp [容器ID]/[容器Names]:[要拷贝的文件目录] [本机目录] # 容器文件拷贝到本机
$ docker cp [本机目录] [容器ID]/[容器Names]:[要拷贝的文件目录] # 本机文件拷贝到容器
cp
Не только файлы/папки в контейнере могут быть скопированы на локальный компьютер, но и файлы/папки на локальном компьютере могут быть скопированы в контейнер.
Чтобы продемонстрировать, здесь сначала перейдите к контейнеру, чтобы создать скучный файл.xixi.txt
, а затем скопируйте на этот компьютер:
Когда это целесообразно, мы можем скопировать конфигурацию, журнал и другие файлы в локальный.
6. Установите MySQL
# 查询镜像
$ docker search mysql
# 下载镜像,实测没配置镜像加速的时候会比较慢,配置了就好一些
$ docker pull mysql
# 查看镜像
$ docker images
# 创建并运行容器
$ docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=888888 -v /Users/sherlocked93/Personal/configs/mysql.d:/etc/mysql/conf.d --name localhost-mysql mysql
Чтобы немного объяснить вышеуказанные параметры:
-
-p 3307:3306
Сопоставьте порт 3307 машины с портом 3306 контейнера mysql и измените его в соответствии с вашими потребностями; -
-e MYSQL_ROOT_PASSWORD=<string>
Установите пароль пользователя root для удаленного входа в систему; -
--name <string>
Необязательно, установите псевдоним контейнера; -
-v xxx/mysql.d:/etc/mysql/conf.d
Сопоставьте папку настроек в локальном каталоге с папкой контейнера./etc/mysql/conf.d
-
-v xxx/logs:/logs
Поместите файлы в указанный каталог машиныlogs
каталог, подключенный к контейнеру/logs
-
-v xxx/data:/var/lib/mysql
Сделать хост под каталогомdata
каталог, подключенный к контейнеру/var/lib/mysql
Запустите скриншот:
Затем перейдите в Navicat, чтобы подключиться к MySQL.
Это тоже так круто! Он действительно устанавливается в несколько строк команд, я намного счастливее, чем раньше 😂
7. Установите Nginx
Установка Nginx аналогична другим.Если вы не знаете, как использовать Nginx, вы можете обратиться к
# 查询/下载镜像
$ docker search nginx
$ docker pull nginx
Затем создайте временный контейнер, цель которого - скопировать конфигурацию по умолчанию на эту машину, я помещаю файл конфигурации здесь/mnt
В каталоге в основном есть три папки конфигурации:
-
/etc/nginx
Поместите файл конфигурации Nginx; -
/var/log/nginx/
Разместите лог-файлы Nginx; -
/usr/share/nginx/html/
Поместите статические файлы внешнего интерфейса Nginx в эту папку;
Скопируйте эти каталоги на локальный компьютер/mnt
в папкеnginx
,nginx_logs
,html
папка.
Только что созданный эфемерный контейнер бесполезенdocker rm -f [临时容器ID]
высушить временный контейнер, затемdocker run
Воссоздайте контейнер Nginx:
$ docker run -d --name localhost-nginx -p 8082:80 \
-v /mnt/nginx:/etc/nginx \
-v /mnt/nginx_logs:/var/log/nginx \
-v /mnt/html:/usr/share/nginx/html \
--privileged=true nginx
--privileged=true
Указывает, что у контейнера есть права на чтение и запись в смонтированный каталог.
Другие конфигурации только что были упомянуты выше и не должны упоминаться.
Затем вы можете получить к нему доступ в своем браузере.Если это облачный сервер, не забудьте открыть соответствующий порт.
8. Установите Easy Mock
Поскольку Easy Mock опирается на Redis и MongoDB, рекомендуется использовать docker-compose для сборки Easy Mock в локальной среде.
Установить докер-компоновку
Официальная документация:docs.docker.com/compose/ins...
Прежде всего, вы должны убедиться, что у вас есть среда Docker.Если вы являетесь пользователем Windows/Mac, то установка клиента принесет ваш собственный docker-compose.
Поскольку на этот раз мы собираем на облачном сервере CentOS7.6, нам нужно установить docker-compose самостоятельно, выполните следующую команду, чтобы загрузить текущую стабильную версию docker-compose.
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Изменить права доступа к исполняемому файлу
$ sudo chmod +x /usr/local/bin/docker-compose
Убедитесь, что установка прошла успешно
$ docker-compose version
Напишите файл конфигурации docker-compose.yml
может относиться кофициальная документацияПриведенная документация по развертыванию, вы также можете обратиться к моему процессу настройки ниже.
Сначала создайте новый файлdocker-compose.yml
и скопируйте содержимое следующего файла docker-compose вdocker-compose.yml
, а затем замените местоположение комментария в контенте на нужный вам локальный адрес.
version: '3'
services:
mongodb:
image: mongo:3.4.1
volumes:
# /apps/easy-mock/data/db 是数据库文件存放地址,根据需要修改为本地地址
- '/apps/easy-mock/data/db:/data/db'
networks:
- easy-mock
restart: always
redis:
image: redis:4.0.6
command: redis-server --appendonly yes
volumes:
# /apps/easy-mock/data/redis 是 redis 数据文件存放地址,根据需要修改为本地地址
- '/apps/easy-mock/data/redis:/data'
networks:
- easy-mock
restart: always
web:
image: easymock/easymock:1.6.0
# easy-mock 官方给出的文件,这里是 npm start,这里修改为 npm run dev
command: /bin/bash -c "npm run dev:server"
ports:
- 7300:7300 # 改为你自己期望的映射
volumes:
# 日志地址,根据需要修改为本地地址
- '/apps/easy-mock/logs:/home/easy-mock/easy-mock/logs'
networks:
- easy-mock
restart: always
networks:
easy-mock:
Начать легкий макет
В каталоге файлов docker-compose выполните следующую команду:
$ docker-compose up -d
Если вы столкнулись с экземпляром докера easymock, сообщающим об ошибке разрешения файла
Error: EACCES: permission denied....
Чтобы выполнить следующую команду в корневом каталоге проекта
$ chmod 777 /yourfile/logs
Тогда вы можете использовать браузер你的域名.com:7300
Посетите easy-mock!
Если вы считаете, что доменное имя, за которым следует номер порта, выглядит некрасиво, вы можете получить доступ к своему развернутому easy-mock, настроив доменное имя второго уровня Nginx.Метод настройки доменного имени второго уровня см.эта статья
9. Визуальное управление
Что касается инструмента визуальных запросов, вот краткая рекомендацияLazyDocker, потому что он работает на терминале и поддерживает работу с клавиатурой и щелчок мышью, это довольно раздражает.С этими операторами запроса вы можете печатать в несколько раз меньше.
Установка относительно проста, выполните следующую команду:
$ docker run --rm -it -v \
/var/run/docker.sock:/var/run/docker.sock \
-v ~/.config/lazydocker:/.config/jesseduffield/lazydocker \
lazyteam/lazydocker
Вы можете установить псевдоним для терминала
$ alias lzd='docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock -v ~/.config/lazydocker:/.config/jesseduffield/lazydocker lazyteam/lazydocker'
Затем вы вводите в терминалеlzd
Вы можете просматривать свои образы, контейнеры, журналы, конфигурацию, статус и многое другое.
10. Заключение
Поскольку основным сценарием использования Docker в дальнейшем является установка таких инструментов, как MySQL и Nginx, большая часть контента, представленного в этой статье, также относится к этому сценарию.
Причины пробела В Docker все еще есть некоторый контент, который не представлен в этой статье, но вышеуказанный контент в основном подходит для повседневного использования, другой контент Docker можно обратить внимание на последующие статьи ниже ~
Большинство сообщений в Интернете имеют разную глубину и даже некоторые несоответствия. Следующие статьи являются кратким изложением процесса обучения. Если вы найдете какие-либо ошибки, пожалуйста, оставьте сообщение, чтобы указать ~
Справочная документация:
- Расширение возможностей разработки приложений для разработчиков | Официальный сайт Docker
- Базовая технология Docker (базовая)
- Докер устанавливает mysql
- Документация по докеру
- Документация по созданию Docker
- Запуск easy-mock с докером - Ищу программиста
- docker-compose easy-mock - Требуется программист
- Запуск easy-mock | CodingDiary с докером
- Официальный репозиторий докеров easymock: easy-mock/easy-mock-docker
- Установить nginx через докер
Другие высоко оцененные статьи автора:
- Советы по улучшению счастья в JS
- Советы по использованию Vue
- Nginx от начала до практики, подробное объяснение на 10 000 слов!
- Полчаса, чтобы познакомиться с базовыми знаниями, необходимыми для начала работы с CentOS
- Непосредственная практика конфигурации Webpack с несколькими входами
- Основной принцип перехода к интерфейсной маршрутизации
PS: Эта статья включена в мой блог, адресGithub - SHERlocked93/blog, и приглашаю всех обратить внимание на мой публичный аккаунт [Front End Afternoon Tea], давайте работать вместе. Если вы считаете, что статья хороша, не забудьте поставить лайк и поддержать автора~