Почну з визнання, що я досить новачок у Докер, і я, можливо, підходжу до цієї проблеми з неправильного набору припущень ... дайте мені знати, чи це так. Я бачив багато дискусій про те, як Docker корисний для розгортання, але немає прикладів того, як це робиться насправді.
Ось як я подумав, що це буде працювати:
- створити контейнер даних для зберігання деяких постійних даних на машині A
- створити контейнер програми, який використовує томи з контейнера даних
- виконати певну роботу, потенційно змінивши дані в контейнері даних
- зупинити контейнер програми
- здійснити та позначати контейнер даних
- перенесіть контейнер даних у (приватне) сховище
- витягніть і запустіть зображення з кроку 6 на машині B
- підберіть, де ви зупинилися на машині B
Основний крок тут - це крок 5, який, на мою думку, дозволить зберегти поточний стан (включаючи вміст файлової системи). Потім ви можете перенести цей стан у сховище та витягнути його з іншого місця, давши вам новий контейнер, який по суті ідентичний оригіналу.
Але це, здається, не працює таким чином. Я вважаю, що або крок 5 не робить те, що я думаю, що це робить, або крок 7 (витягування та запуск зображення) "скидає" контейнер до його початкового стану.
Я зібрав набір з трьох зображень та контейнерів Докера, щоб перевірити це: контейнер даних, письменник, який записує випадкову рядок у файл у контейнері даних кожні 30 с, і зчитувач, який просто echo
видає значення в даних файл контейнера та виходи.
Контейнер даних
Створено с
docker run \
--name datatest_data \
-v /datafolder \
myrepository:5000/datatest-data:latest
Докерфайл:
FROM ubuntu:trusty
# make the data folder
#
RUN mkdir /datafolder
# write something to the data file
#
RUN echo "no data here!" > /datafolder/data.txt
# expose the data folder
#
VOLUME /datafolder
Письменник
Створено с
docker run \
--rm \
--name datatest_write \
--volumes-from datatest_data \
myrepository:5000/datatest-write:latest
Докерфайл:
FROM ubuntu:trusty
# Add script
#
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/*.sh
CMD ["/usr/local/sbin/run.sh"]
run.sh
#!/bin/bash
while :
do
sleep 30s
NEW_STRING=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
echo "$NEW_STRING" >> /datafolder/data.txt
date >> /datafolder/data.txt
echo "wrote '$NEW_STRING' to file"
done
Цей скрипт записує випадковий рядок та дату / час /datafolder/data.txt
у контейнер даних.
Читач
Створено с
docker run \
--rm \
--name datatest_read \
--volumes-from datatest_data \
myrepository:5000/datatest-read:latest
Докерфайл:
FROM ubuntu:trusty
# Add scripts
ADD run.sh /run.sh
RUN chmod 0777 /run.sh
CMD ["/run.sh"]
run.sh:
#!/bin/bash
echo "reading..."
echo "-----"
cat /datafolder/data.txt
echo "-----"
Коли я будую та запускаю ці контейнери, вони працюють добре і працюють так, як я очікую:
Зупинка та старт на машині розробки:
- створити контейнер даних
- запустити письменника
- негайно запустіть читач, подивіться "тут немає даних!" повідомлення
- почекайте трохи
- запустіть читач, подивіться випадковий рядок
- зупинити письменника
- перезапустити письменника
- запустіть читач, побачите ту саму випадкову рядок
Але вчинення та натискання не роблять те, що я очікую:
- створити контейнер даних
- запустити письменника
- негайно запустіть читач, подивіться "тут немає даних!" повідомлення
- почекайте трохи
- запустіть читач, подивіться випадковий рядок
- зупинити письменника
- зробити і позначити контейнер даних
docker commit datatest_data myrepository:5000/datatest-data:latest
- натисніть на сховище
- видалити всі контейнери та відтворити їх
На цьому етапі я очікував би запустити читач і побачити ту саму випадкову рядок, оскільки контейнер даних був зроблений, висунутий у сховище, а потім відтворений з того самого зображення у сховищі. Однак те, що я насправді бачу, - це "немає даних тут!" повідомлення.
Може хтось пояснить, де я тут помиляюся? Або, як альтернатива, вказати мені на приклад того, як відбувається розгортання за допомогою Docker?