Есть несколько способов как это можно сделать:
1-й способ.
Это использование файла Dockerfile для создания конфигурационного файла, который создаст контейнер. В этом файле можно указать почти все параметры и так же любые команды.
Dockerfile
Это центральный кусок для создания контейнера Докер. Конечно, можно Docker запустить «docker run -i -t foo /bin/bash», а затем настроить контейнер. Но это не сильно удобно и не знаешь как оно все работает + с конфигурационном файлом вы можете воспроизвести тот же контейнер, снова и снова без возможного отклонения.
Я возьму сейчас минимальную конфигурацию для Dockerfile, которая даст возможность установить nginx который будет работает в контейнере. Я объясню основы, пожалуйста, обратитесь к официальной документации Dockerfile для полного обзора (если потребуется).
FROM
Должна быть первая запись в вашем Dockerfile. Эта строчка сообщает Docker на базе которого дистрибутива будит создан новой образ.
FROM centos
MAINTAINER
Если Вы вылаживаете (публикуете) свои образы, то стоит прописать данную строку. Она даст возможность видеть кто автор данного образа или контейнера.
MAINTAINER mid <mid@sidmid.ru>
ADD
Я поддерживаю кастомную сборку Nginx + ModSecurity для своих потребностей. Мне нужно извлечь файл конфигурации хранилища. Я буду все ставить именно с данного репозитория.
ADD http://static.theroux.ca/repository/failshell.repo /etc/yum.repos.d/
В основном, «ADD» позволяет извлекать файлы и скопировать их куда-нибудь в вашем контейнере.
RUN
Используется для настройки вашего контейнера. Вы можете установить столько, сколько вы хотите в вашем Dockerfile.
RUN yum -y install nginx
Обратите вниманиена foreground vs background
По пути к докеру, на вашем контейнере должна работать только одна служба. Вот и вся цель использования контейнеров в конце концов. Таким образом вы запускаете ваши услуги на передний план (foreground), но не на background. Вы в основном работаете с одной командой, это единственная цель вашего контейнера.
Таким образом, мы должны сказать Nginx-у, чтобы он выполнил это!
RUN echo «daemon off;» >> /etc/nginx/nginx.conf
EXPOSE
Пробрасывает порты наружу.
EXPOSE 80
ПРИМЕЧАНИЕ: Это внутренний порт. Это будет отличаться один, который будет использоваться снаружи. Это назначается динамически Докер.
CMD
Сердце и душа вашего контейнера. Что он делает. Это цель жизни!
CMD /usr/sbin/nginx -c /etc/nginx/nginx.conf
Теперь соберём всё в кучу:
vim Dockerfile
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
FROM centos:centos7 MAINTAINER mid <mid@sidmid.ru> # Configure my repo to use my custom Nginx with modsec RUN mkdir -p /usr/local/src RUN cd /usr/local/src RUN yum -y install wget vim htop tar # install repo for centos # epel repo RUN rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm # remi repo RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm RUN yum repolist # install nginx RUN yum -y install nginx # tell Nginx to stay foregrounded ADD nginx.conf /etc/nginx/nginx.conf RUN echo "daemon off;" >> /etc/nginx/nginx.conf RUN mkdir -p /var/www RUN curl https://git.centos.org/sources/httpd/c7/acf5cccf4afaecf3afeb18c50ae59fd5c6504910 \ | tar -xz -C /var/www \ --strip-components=1 RUN sed -i -e 's/Apache/nginx/g' -e '/apache_pb.gif/d' \ /var/www/index.html # expose HTTP EXPOSE 80 EXPOSE 8080 EXPOSE 443 # Run CMD [ "/usr/sbin/nginx" ] |
[/codesyntax]
Так же нужен конфиг с nginx
vim nginx.conf
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes 1; error_log /var/log/nginx/error.log; #error_log /var/log/nginx/error.log notice; #error_log /var/log/nginx/error.log info; pid /run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; index index.html index.htm; server { listen 80; server_name localhost; root /var/www; # /usr/share/nginx/html; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { autoindex on; } # redirect server error pages to the static page /40x.html # error_page 404 /404.html; location = /40x.html { } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # root html; # location / { # } #} # HTTPS server # #server { # listen 443; # server_name localhost; # root html; # ssl on; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_timeout 5m; # ssl_protocols SSLv2 SSLv3 TLSv1; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # } #} } |
[/codesyntax]
Сборка контейнера.
Когда все необходимое прописать в файл Dockerfile, можно приступить к сборке контейнера:
docker build -t nginx:base .
или
docker build -rm -t captain/nginx:centos7 .
captain- пользователь (чтобы понимать кто создал контейнер).
nginx- говорит нам что в ОС есть nginx (чтобы не забыть).
centos7 — ОС.
После данной команды, начнется скачивание образа на CentOS и установки в него nginx. После завершения Вы должны увидеть ваш новый докер в имеющихся образах:
docker images
Итак, запустим его:
docker run -d nginx:base
Но лучше указывать еще порт (можно так же указать и ИП адрес), но перед этим я указал имя:
docker run --name test-nginx -p 8080:80 -d nginx:base /bin/bash
Я выполняю:
docker run -d -p 80:80 captain/nginx:centos7
Но есть одно но, необходимо переопределять (желательно):
- /var/log/nginx/ -это логи самого nginx.
- /var/www/ — это домашняя папка для сайтов.
- /etc/nginx/conf.d/ -папка с виртуальными хостами
То есть, должно запускаться следующим образом:
docker run -d -p 80:80 -v/var/log/nginx:/var/log/nginx/ captain/nginx:centos7
Как вы можете видеть, каждый раз когда вы запустите контейнер, Docker генерирует новый идентификатор для этого. Посмотреть можно следующим образом:
docker ps
Наш контейнер работает. С помощью curl проверим работу:
curl http://192.168.103.193
2-й способ.
Это использование готового контейнера на ОС (например, CentOS или Debian\Ubuntu).
Суть такова:
- Скачивается контейнер с ОС;
- Запускается данный контейнер с bash желательно с проброшенным портом ( но можно исправить если забыли);
- Устанавливается внутри самого контейнера nginx;
- После чего можно сохранить данный образ для дальнейшего использования.
Этот способ самый простой, но он имеет достаточно большой объем образа ( не нашел как его уменьшить).
Для сравнения :
- Готовый образ контейнера с nginx ~92 Мб.
- Готовый образ контейнера с nginx (мой)~ 340Мб.