Это пятый день моего участия в августовском испытании обновлений, подробности о мероприятии:Испытание августовского обновления
Ранее я изучил команды docker и принципы зеркалирования, Docker — это простая запись, а сегодня я могу сделать кое-что посложнее и узнать о томе данных контейнера.
чтообъем данных контейнера? Если данные существуют в контейнере, данные будут потеряны, если контейнер их удалит.В Docker, чтобы добиться сохранения данных (так называемое сохранение данных Docker означает, что данные не заканчиваются с концом контейнера) , данные нужно хранить.Подключив с хоста к контейнеру, мы увидим, что такое объем данных, через конкретные операции позже
Используйте объемы данных
Монтировать напрямую по команде
docker run -it -v 主机目录:容器目录
Я смонтирую каталог /home в контейнере в каталог /Users/cb/test хост-компьютера (если у вас нет локального образа centos, вы сначала загрузите его)
$ docker run -it -v /Users/cb/test:/home centos /bin/bash
[root@78c0a6fa144b /]#
После выполнения вышеуказанной команды мы можем просмотреть ее с помощью команды docker inspect.
docker inspect 容器id
В следующей выходной информации вы можете увидеть взаимосвязь монтирования контейнера, то есть мы успешно смонтировали
- Источник: адрес внутри хоста
- Назначение: адрес внутри контейнера докеров.
"Mounts": [
{
"Type": "bind",
"Source": "/Users/cb/test",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
После успешной привязки или успешного монтирования, то есть существует двусторонняя связь привязки, и данные могут быть синхронизированы.Давайте посмотрим на эффект.
В начале папки с обеих сторон пустые
Давайте добавим файл внутрь контейнера, чтобы увидеть
Вы можете видеть, что файлы в контейнере успешно синхронизированы с хостом.
Затем мы остановили контейнер, изменили файл на хосте, а затем запустили контейнер, чтобы убедиться, что данные нормально синхронизируются.
Я перечислю команды здесь, вы можете сделать это сами
1、exit 退出容器
2、修改宿主机文件
3、docker ps -a 查看最近启动的容器 、docker run 容器id 启动容器
4、查看容器中的文件内容
Этот пример является наиболее интуитивно понятным томом данных.Том данных также имеет другое назначение.Для некоторых конфигураций мы также можем использовать сопоставление, чтобы сопоставить часто изменяемую конфигурацию с локальной, и локальная модификация будет автоматически синхронизирована с контейнером.
установить mysql
Если mysql установлен в докере, данные не должны помещаться в контейнер, и данные в контейнере будут удалены после удаления контейнера. Мы можем синхронизировать данные через объем данных
Синхронизируйте конфигурацию и данные mysql в контейнере с хостом с помощью следующих команд
docker run -d -p 3310:3306 -v /Users/chenbang/home/mysql/conf:/etc/mysql/conf.d -v /Users/chenbang/home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
- -d работать в фоновом режиме
- -p сопоставление портов
- -v монтирование тома данных
- -e конфигурация среды (обязательно настройте пароль при запуске mysql)
После успешного запуска используйте трехстороннее клиентское соединение локально, чтобы убедиться, что оно может быть подключено нормально.
Посмотрим, есть ли соответствующие конфиги и данные по целевому пути на хосте.
В данных есть соответствующие данные, просмотр данных синхронизируется...
Создаем новую библиотеку в средстве визуализации, а соответствующие данные должны быть файлом
Давайте посмотрим на содержимое папки данных в целевом пути хост-компьютера.Конечно же, мы только что добавили больше библиотек ajtest.
Затем удаляем контейнер и смотрим
После операции можно обнаружить, что данные все еще живы... данные не будут потеряны
Это реализует сохранение данных в контейнере!
Анонимное крепление
Запустите контейнер с помощью следующей команды
docker run -d -P --name nginx01 -v /etc/nginx nginx
Мы смотрим на ситуацию со всеми объемами данных по
docker volume ls
Как видно из рисунка выше, VOLUME NAME — это случайно сгенерированная строка, для этого — анонимное монтирование, потому что при использовании -v записывается только путь внутри контейнера, а путь вне контейнера — нет. написано.
названная гора
Запустите контейнер с помощью следующей команды
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
Вы видите том данных с указанным именем, поэтому именованному монтированию можно передать "-v имя тома: путь внутри контейнера"
Давайте посмотрим на путь этого тома
➜ ~ docker volume inspect juming-nginx
[
{
"CreatedAt": "2021-08-17T12:18:04Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
Все тома в контейнере докеров, если каталог не указан, находятся в /var/lib/docker/volumes/XXX
Мы можем заглянуть в этот каталог
Если хостом является Mac, вы обнаружите, что невозможно найти /var/lib/docker... Причина в том, что docker фактически добавляет еще один уровень к виртуальной машине под Mac, поэтому вам нужно войти в виртуальную машину для работы.
Решения, найденные в Интернете, следующие:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
Попробовав, я обнаружил, что он мигает напрямую и предлагает следующее:
[screen is terminating]
Поэтому необходимо решить эту проблему воспоминаний.Решения следующие:
docker run -it --privileged --pid=host justincormack/nsenter1 Unable to find image 'justincormack/nsenter1:latest' locally latest: Pulling from justincormack/nsenter1 5bc638ae6f98: Pull complete Digest: sha256:e876f694a4cb6ff9e6861197ea3680fe2e3c5ab773a1e37ca1f13171f7f5798e Status: Downloaded newer image for justincormack/nsenter1:latest / # cd /var/lib/docker/
Вы можете увидеть содержимое рабочего каталога докера
Перейдите к томам и посмотрите, вы можете увидеть все тома данных
Взгляните на juming-nginx
Мы легко можем найти один из наших томов через именованные монтирования, он используется в большинстве случаев, анонимные монтирования использовать не рекомендуется.
Как определить, является ли это именованным монтированием, анонимным монтированием или монтированием по указанному пути?
-v путь внутри контейнера #anonymous mount
-v имя тома: путь в контейнере #named mount
-v host path: путь в контейнере #указанный путь mount
расширять:
Через путь к контейнеру -v: ro/rw может изменить права на чтение и запись
ро только для чтения #только для чтения
rw readwrite #Читать и писать
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
Как только разрешения контейнера установлены, у контейнера есть ограничения на то, что мы монтируем!
Давайте сегодня поговорим об использовании томов данных docker, а позже мы продолжим принимать Dockerfile и как можно полнее изучим быстрое использование docker. ! !
Десять шагов, чтобы убить человека, тысяча миль, не выходя - Ли Бай