Dockerfile - по сути файл инструкций, которые выполняются с верху в низ
С помощью него можно создавать образы
В файле есть синтаксис, инструкция - значение FROM - с каким образом будем работать, пишется в самом начале, обязательная RUN - что будем делать, команды, каждый RUN по сути создает свой слой CMD - команда в запущенном контейнере # - комментарий MAINTAINER - контакт разработчика
Создадим Dockerfile:
mkdir /data/hello
vi /data/hello/Dockerfile #My new Dockerfile FROM ubuntu:15.04 MAINTAINER user@domain.local RUN sed -i -re 's/([a-z]{2}\.)?archive.ubuntu.com|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list RUN apt update && apt upgrade RUN apt-get update RUN apt-get install -y nginx CMD ["echo", "'test hello'"]
Перейдем в папку и создадим образ, -t - задаваемое имя образа, 1.1 - версия, . - указывает на данный каталог(/data/hello):
cd /data/hello
docker build -t hello:1.1 .
Кстати, чтоб не было ошибки - _amd64.deb 404 Not Found [IP: 91.189.88.162 80], сделана строка с sed
При отработке команды мы видим: Successfully built 96c899b5c29e - это новый id образа
В каждом Step создается новый контейнер, который по окончанию удаляется:
... Removing intermediate container a4b244212d8b
...
Посмотрим историю образа:
docker history 96c899b5c29e IMAGE CREATED CREATED BY SIZE 96c899b5c29e About an hour ago /bin/sh -c #(nop) CMD ["echo" "'test hello'… 0B 1867207a28ca About an hour ago /bin/sh -c apt-get install -y nginx 51.9MB f8a5833b54f5 About an hour ago /bin/sh -c apt-get update 21.8MB 1d7bd1a29c1c About an hour ago /bin/sh -c apt update && apt upgrade 21.8MB b6bc234aa765 About an hour ago /bin/sh -c sed -i -re 's/([a-z]{2}\.)?archiv… 1.96kB dbd99557c395 About an hour ago /bin/sh -c #(nop) MAINTAINER user@domain.lo… 0B d1b55fd07600 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 2 years ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$… 1.88kB <missing> 2 years ago /bin/sh -c echo '#!/bin/sh' > /usr/sbin/poli… 701B <missing> 2 years ago /bin/sh -c #(nop) ADD file:3f4708cf445dc1b53… 131MB
docker run hello:1.1 'test hello'
Как мы видим команда из CMD выполнилась при запуске CMD может быть записана с помощью двух вариантов: 1. (Типа shell): CMD echo test_hello 2. (Типа exec, 1 - команда, 2 - аргумент): CMD ["echo", "test_hello"]
Предпочтительней использовать вместо CMD - ENTRYPOINT
При запуске контейнера или каждом входе в него будет исполняться команда, указанная в ENTRYPOINT
К примеру мы вместо CMD ["echo", "'test hello'"] указали ENTRYPOINT ["apache2ctl"]
При запуке контенера можно передать аргументы (пример: -D FOREGROUND), и команда выполнится:
docker run -d -p 80:80 web -D FOREGROUND
В разделе "Supported tags and respective Dockerfile links" мы увидим линки, там описан код из Dockerfile
Создаим машину на примере nginx:
vi /data/hello/Dockerfile FROM nginx:alpine RUN mkdir /www RUN cp /usr/share/nginx/html/* /www RUN chown -R nginx:nginx /www