Створення Dockerfile і запуск його для генерації контейнера – це більш стандартний спосіб створення контейнерів Docker. У цьому випадку ви створюєте Dockerfile, який містить всі необхідні команди та налаштування для створення вимог до контейнера. Після цього ви запускаєте цей Dockerfile, щоб згенерувати образ контейнера, а потім запускаєте цей образ, щоб створити новий контейнер.
У випадку, який я описав раніше, ви запускаєте порожній контейнер зі стандартним образом Ubuntu server, а потім ви заходите всередину цього контейнера і встановлюєте всі необхідні додатки, один за одним, вручну. Цей метод може бути корисним, якщо ви хочете зробити якісь експерименти або тестування в обмеженому середовищі, але, зазвичай, створення Dockerfile більш зручне та ефективне.
Щоб створити порожній контейнер і встановити nginx, PHP та Flask, потрібно виконати наступні кроки:
- Створити Dockerfile:
FROM ubuntu:latest
# Встановлюємо nginx, PHP та Flask
RUN apt-get update && \
apt-get install -y nginx python3 python3-pip && \
pip3 install Flask
# Копіюємо конфігураційні файли nginx
COPY nginx.conf /etc/nginx/nginx.conf
COPY default.conf /etc/nginx/conf.d/default.conf
# Копіюємо файл зі скриптом Flask
COPY app.py /app/
# Відкриваємо порти для nginx
EXPOSE 80
# Запускаємо nginx та скрипт Flask
CMD ["nginx", "-g", "daemon off;"]
- Створити файли конфігурації nginx:
nginx.conf
:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/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;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
default.conf
:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
- Створити файл зі скриптом Flask:
app.py
:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
4. Перейти у терміналі в папку з Dockerfile та іншими файлами і виконати команду для збирання контейнера:
docker build -t mycontainer .
Запустити контейнер:
docker run -p 80:80 mycontainer
це запустить контейнер
Це другий спосіб створення контейнера, він більш експериментальний, отже дозволяє вручну все налаштувати і т.д. ну скажем, для тих хто любить процесс )))
Для створення порожнього контейнера на основі Ubuntu сервера та запуску його виконайте наступні кроки:
- Встановіть Docker на свою машину та переконайтеся, що він успішно запущений.
- Відкрийте командний рядок та введіть наступну команду, щоб завантажити образ Ubuntu сервера:
docker pull ubuntu
3. Створіть новий порожній контейнер на основі завантаженого образу Ubuntu за допомогою команди:
docker create --name mycontainer ubuntu
4. Запустіть контейнер за допомогою команди:
docker start mycontainer
Тепер контейнер запущено та готовий до встановлення додатків.
Або такий спосіб (в документації Docker)
docker run -it ubuntu bash
- Зайдіть в контейнер, виконавши наступну команду:
docker exec -it mycontainer bash
6. Встановіть необхідні пакети за допомогою команди apt-get:
apt-get update
apt-get install nginx php python3 python3-pip -y
7. Встановіть Flask та всі потрібні бібліотеки Python за допомогою pip:
pip3 install flask
Вийдіть з контейнера за допомогою команди exit:
exit
Тепер у вашому контейнері містяться всі необхідні додатки: nginx, php, python та Flask. Ви можете запускати свої веб-додатки, використовуючи цей контейнер як базовий образ.