Dockerfile - позволяет собрать Docker Images с вашим содержимым. Docker подразумевает только один процесс в качестве "отправной точки" контейнера, это не значит, что в контейнере нельзя запустить несколько процессов, просто контейнер рождается из одного процесса и вместе с ним умирает.
В данной статье рассмотрим Dockerfile на примере: nginx и apache2.
1. "Dockerfile": Nginx
Начнем сразу со сборки файла, для этого создаем директорию dockerfiles, там где вам удобно:
mkdir dockerfiles cd dockerfiles
Создаем файл с именем "Dockerfile":
nano Dockerfile
Заполняем файл следующей информацией (комментарии внутри кода):
#-------------------------------------------------------- # My Dockerfile: build Docker Image Nginx v.1 #-------------------------------------------------------- # Базовая платформа для запуска Nginx FROM ubuntu:18.04 # Стандартный апдейт репозитория RUN apt-get -y update # Установка Nginx RUN apt-get install -y nginx # Указываем Nginx запускаться на переднем плане (daemon off) RUN echo "daemon off;" >> /etc/nginx/nginx.conf # В индексном файле меняем первое вхождение nginx на docker-nginx RUN sed -i "0,/nginx/s/nginx/docker-nginx/i" /usr/share/nginx/html/index.html # Запускаем Nginx. CMD указывает, какую команду необходимо запустить, когда контейнер запущен. CMD [ "nginx" ]
Краткая справка по основным полям:
Сохраняем наш файл и проверяем список образов:
docker images REPOSITORY TAG IMAGE ID CREATED SIZE
Собираем наш Dockerfile:
docker build -t nginx:01 . # имя "nginx:версия" задаете любое удобное имя. В конце . текущий каталог [... идёт сборка docker images] ---> 40a44338c135 Step 5/6 : RUN sed -i "0,/nginx/s/nginx/docker-nginx/i" /usr/share/nginx/html/index.html ---> Running in 56439f2da040 Removing intermediate container 56439f2da040 ---> f8ba0a093524 Step 6/6 : CMD [ "nginx" ] ---> Running in 620c7580077e Removing intermediate container 620c7580077e ---> 809e140394b2 Successfully built 809e140394b2 Successfully tagged nginx:01
Проверяем созданные Docker Images:
docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 01 809e140394b2 About a minute ago 152MB ubuntu 18.04 cf0f3ca922e0 3 days ago 64.2MB
Что произошло? Скачался images с ubuntu, на основе него собрался наш nginx:01.
Запускаем наш images nginx:01 (внешний порт зададим 1234, порт Nginx 80):
docker run -d -p 1234:80 nginx:01 cba76f273bfdd6b94550916314ab7c1d1c263aeb976ab67fdf6e47c13297ba05
Проверяем запущенные контейнеры Docker:
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cba76f273bfd nginx:01 "nginx" 2 minutes ago Up 2 minutes 0.0.0.0:1234->80/tcp nice_poincare
Теперь попробуем проверить адрес [IP]:[Port]:
docker stop cba76f273bfd docker rm cba76f273bfd
2. "Dockerfile": Apache
Заполняем файл следующей информацией (комментарии внутри кода):
#-------------------------------------------------------- # My Dockerfile: build Docker Image Apache v.1 #-------------------------------------------------------- FROM ubuntu:18.04 # Указываем автора MAINTAINER LinuxSQL.ru <mail@linuxsql.ru> RUN apt-get -y update # Установка Apache RUN apt-get install -y apache2 # Создаем тестовую страницу для Apache RUN echo 'Hello Docker Apache v.1' > /var/www/html/index.html # Запускаем на DFOREGROUND CMD ["/usr/sbin/apache2ctl","-DFOREGROUND"] # Указываем порт EXPOSE 80
Собираем наш Dockerfile:
docker build -t apache:02 .
Проверяем наш images:
docker images REPOSITORY TAG IMAGE ID CREATED SIZE apache 02 0054100ec2a5 13 seconds ago 188MB ubuntu 18.04 cf0f3ca922e0 3 days ago 64.2MB
Стартуем:
docker run -d -p 1240:80 apache:02 10d03e8ca0032212c98627c8439d2e3c1fa9e3d10eedefc323decd1a8e57f438
Проверяем:
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 10d03e8ca003 apache:02 "/usr/sbin/apache2ct…" 32 seconds ago Up 29 seconds 0.0.0.0:1240->80/tcp trusting_pike # Смотрим процессы netstat -lptun Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp6 0 0 :::1240 :::* LISTEN 23310/docker-proxy
Проверяем страницу:
Все работает!
Источник: http://linuxsql.ru