You are here

Dockerfile: cобираем и проверяем

Linux: 

Собираем и проверяем Dockerfile Image

Dockerfile - позволяет собрать Docker Images с вашим содержимым. Docker подразумевает только один процесс в качестве "отправной точки" контейнера, это не значит, что в контейнере нельзя запустить несколько процессов, просто контейнер рождается из одного процесса и вместе с ним умирает.

В данной статье рассмотрим Dockerfile на примере: nginx и apache2.

1. "Dockerfile": Nginx

Начнем сразу со сборки файла, для этого создаем директорию dockerfiles, там где вам удобно:

  1. mkdir dockerfiles
  2. cd dockerfiles

Создаем файл с именем "Dockerfile":

  1. nano Dockerfile

Заполняем файл следующей информацией (комментарии внутри кода):

  1. #--------------------------------------------------------
  2. # My Dockerfile: build Docker Image Nginx v.1
  3. #--------------------------------------------------------
  4.  
  5. # Базовая платформа для запуска Nginx
  6. FROM ubuntu:18.04
  7.  
  8. # Стандартный апдейт репозитория
  9. RUN apt-get -y update
  10. # Установка Nginx
  11. RUN apt-get install -y nginx
  12.  
  13. # Указываем Nginx запускаться на переднем плане (daemon off)
  14. RUN echo "daemon off;" >> /etc/nginx/nginx.conf
  15. # В индексном файле меняем первое вхождение nginx на docker-nginx
  16. RUN sed -i "0,/nginx/s/nginx/docker-nginx/i" /usr/share/nginx/html/index.html
  17. # Запускаем Nginx. CMD указывает, какую команду необходимо запустить, когда контейнер запущен.
  18. CMD [ "nginx" ]

Краткая справка по основным полям:

  • FROM — указывает название образа (image), который будет взят за основу.
  • ENV — устанавливает переменную среды
  • RUN — запустить команду в контейнере (все команды исполняются с полными правами в пределах контейнера)
  • ADD — добавить файл в контейнер
  • VOLUME — указать монтируемые директории (их можно монтировать на хост машину или на другие контейнеры)
  • EXPOSE — указать транслируемые порты (их можно транслировать на хост машину или на другие контейнеры)
  • CMD — запустить процесс (это и будет процесс, вокруг которого построен контейнер)

Сохраняем наш файл и проверяем список образов:

  1. docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE

Собираем наш Dockerfile:

  1. docker build -t nginx:01 .
  2. # имя "nginx:версия" задаете любое удобное имя. В конце . текущий каталог
  3. [... идёт сборка docker images]
  4. ---> 40a44338c135
  5. Step 5/6 : RUN sed -i "0,/nginx/s/nginx/docker-nginx/i" /usr/share/nginx/html/index.html
  6. ---> Running in 56439f2da040
  7. Removing intermediate container 56439f2da040
  8. ---> f8ba0a093524
  9. Step 6/6 : CMD [ "nginx" ]
  10. ---> Running in 620c7580077e
  11. Removing intermediate container 620c7580077e
  12. ---> 809e140394b2
  13. Successfully built 809e140394b2
  14. Successfully tagged nginx:01

Проверяем созданные Docker Images:

  1. docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. nginx 01 809e140394b2 About a minute ago 152MB
  4. ubuntu 18.04 cf0f3ca922e0 3 days ago 64.2MB

Что произошло? Скачался images с ubuntu, на основе него собрался наш nginx:01.
Запускаем наш images nginx:01 (внешний порт зададим 1234, порт Nginx 80):

  1. docker run -d -p 1234:80 nginx:01
  2. cba76f273bfdd6b94550916314ab7c1d1c263aeb976ab67fdf6e47c13297ba05

Проверяем запущенные контейнеры Docker:

  1. docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. cba76f273bfd nginx:01 "nginx" 2 minutes ago Up 2 minutes 0.0.0.0:1234->80/tcp nice_poincare

Теперь попробуем проверить адрес [IP]:[Port]:

Собираем и проверяем Dockerfile Image

Все работает! Останавливаем и удаляем наш контейнер, переходим к следующей настройке:
  1. docker stop cba76f273bfd
  2. docker rm cba76f273bfd

2. "Dockerfile": Apache

Заполняем файл следующей информацией (комментарии внутри кода):

  1. #--------------------------------------------------------
  2. # My Dockerfile: build Docker Image Apache v.1
  3. #--------------------------------------------------------
  4.  
  5. FROM ubuntu:18.04
  6.  
  7. # Указываем автора
  8. MAINTAINER LinuxSQL.ru <mail@linuxsql.ru>
  9.  
  10. RUN apt-get -y update
  11. # Установка Apache
  12. RUN apt-get install -y apache2
  13.  
  14. # Создаем тестовую страницу для Apache
  15. RUN echo 'Hello Docker Apache v.1' > /var/www/html/index.html
  16.  
  17. # Запускаем на DFOREGROUND
  18. CMD ["/usr/sbin/apache2ctl","-DFOREGROUND"]
  19.  
  20. # Указываем порт
  21. EXPOSE 80

Собираем наш Dockerfile:

  1. docker build -t apache:02 .

Проверяем наш images:

  1. docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. apache 02 0054100ec2a5 13 seconds ago 188MB
  4. ubuntu 18.04 cf0f3ca922e0 3 days ago 64.2MB

Стартуем:

  1. docker run -d -p 1240:80 apache:02
  2. 10d03e8ca0032212c98627c8439d2e3c1fa9e3d10eedefc323decd1a8e57f438

Проверяем:

  1. docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 10d03e8ca003 apache:02 "/usr/sbin/apache2ct…" 32 seconds ago Up 29 seconds 0.0.0.0:1240->80/tcp trusting_pike
  4. # Смотрим процессы
  5. netstat -lptun
  6. Active Internet connections (only servers)
  7. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  8. tcp6 0 0 :::1240 :::* LISTEN 23310/docker-proxy

Проверяем страницу:

Собираем и проверяем Dockerfile Image

Все работает!

Источник: http://linuxsql.ru