← Назад к вопросам

Какой командой можно запустить контейнер?

1.0 Junior🔥 121 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Команды для запуска контейнера

Для запуска контейнеров используются разные инструменты и команды в зависимости от сценария. Рассмотрю все основные варианты.

1. docker run - Основная команда

Описание: Создает и запускает новый контейнер из образа.

# Самая базовая команда
docker run hello-world

# С указанием имени контейнера
docker run --name my-app myimage:latest

# В фоновом режиме (detached)
docker run -d --name web-server nginx:latest

# Пробросить порты: host_port:container_port
docker run -d -p 8080:80 --name my-web nginx:latest
# Localhost:8080 маршрутизируется на 80 порт контейнера

# Указать переменные окружения
docker run -d \
  -e DATABASE_URL="postgres://localhost/mydb" \
  -e DEBUG=true \
  --name my-app myapp:latest

# Примонтировать volume
docker run -d \
  -v /host/path:/container/path \
  --name data-service myservice:latest

# Named volume
docker run -d \
  -v my-data-volume:/data \
  --name db postgres:latest

# Интерактивный режим (terminal)
docker run -it ubuntu:latest bash
# -i = interactive (stdin open)
# -t = terminal (allocate pseudo-TTY)

# С ограничением ресурсов
docker run -d \
  --memory 512m \
  --cpus 1.0 \
  --name resource-limited myapp:latest

# Полная команда с множеством опций
docker run \
  --name my-service \
  --detach \
  --port 8080:8000 \
  --env DATABASE_URL=postgres://localhost/mydb \
  --volume /data:/app/data \
  --memory 512m \
  --cpus 1.0 \
  --restart unless-stopped \
  --log-driver json-file \
  myapp:v1.0.0

Основные флаги:

  • -d, --detach - фоновый режим
  • -p, --port HOST:CONTAINER - проброс портов
  • -e, --env - переменные окружения
  • -v, --volume - монтирование томов
  • --name - имя контейнера
  • --restart - политика перезагрузки
  • --memory - лимит памяти
  • --cpus - лимит CPU
  • -it - интерактивный режим

2. docker-compose up - Для составных приложений

Описание: Запускает контейнеры согласно docker-compose.yml.

# Базовая команда
docker-compose up

# В фоновом режиме
docker-compose up -d

# С пересборкой образов
docker-compose up -d --build

# Только для определенного сервиса
docker-compose up -d web

# Масштабирование (запустить несколько инстансов)
docker-compose up -d --scale api=3

# Просмотр логов
docker-compose logs -f

# Остановить все
docker-compose down

# Остановить и удалить все (включая volumes)
docker-compose down -v

Пример docker-compose.yml:

version: '3.8'

services:
  web:
    image: myapp:latest
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgres://db/mydb
      - DEBUG=false
    volumes:
      - ./code:/app/code
    depends_on:
      - db
    restart: unless-stopped
  
  db:
    image: postgres:13
    environment:
      - POSTGRES_DB=mydb
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
    volumes:
      - postgres-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  postgres-data:

Запуск:

docker-compose up -d
# Запустит оба сервиса (web и db)
# web дождется пока db будет готов

3. Kubernetes - Для орхестрации

Описание: Запуск контейнеров в кластере Kubernetes.

# Применить конфигурацию
kubectl apply -f deployment.yaml

# Создать deployment
kubectl create deployment myapp --image=myapp:latest

# Запустить pod
kubectl run my-pod --image=myapp:latest

# Просмотр статуса
kubectl get pods
kubectl describe pod my-pod

# Логи
kubectl logs my-pod

# Удалить
kubectl delete pod my-pod

Пример deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1.0.0
        ports:
        - containerPort: 8000
        env:
        - name: DATABASE_URL
          value: "postgres://db:5432/mydb"
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8000
          initialDelaySeconds: 10
          periodSeconds: 5

Запуск:

kubectl apply -f deployment.yaml
# Kubernetes создаст 3 реплики контейнера

4. systemd / systemctl - Для системных сервисов

Описание: Запуск контейнеров как системные сервисы.

# Создать systemd unit файл
sudo nano /etc/systemd/system/my-app.service

Содержание my-app.service:

[Unit]
Description=My Application
After=network.target
Requires=docker.service

[Service]
Type=simple
Restart=always
RestartSec=5
User=root

ExecStart=/usr/bin/docker run \\
  --rm \\
  --name my-app \\
  -p 8000:8000 \\
  -e DATABASE_URL=postgres://localhost/mydb \\
  myapp:latest

ExecStop=/usr/bin/docker stop my-app

[Install]
WantedBy=multi-user.target

Команды:

# Перезагрузить systemd
sudo systemctl daemon-reload

# Запустить сервис
sudo systemctl start my-app

# Остановить
sudo systemctl stop my-app

# Автозапуск при старте системы
sudo systemctl enable my-app

# Просмотр логов
sudo journalctl -u my-app -f

# Статус
sudo systemctl status my-app

5. Podman - Альтернатива Docker

Описание: Совместимая альтернатива Docker, часто используется в системах без daemon.

# Почти идентично docker run
podman run --name my-app myimage:latest

# Запустить в pod (Kubernetes-like)
podman pod create --name my-pod
podman run -d --pod my-pod myimage:latest

# Без daemon (rootless)
podman run -u 1000 myimage:latest

6. LXC / LXD - Для системных контейнеров

Описание: Более легкие контейнеры, ближе к виртуальным машинам.

# Создать контейнер
lxc launch ubuntu:20.04 my-container

# Запустить команду
lxc exec my-container -- apt update

# Shell
lxc shell my-container

# Остановить
lxc stop my-container

# Удалить
lxc delete my-container

7. nerdctl - Docker-compatible (containerd)

Описание: Использует containerd вместо dockerd.

# Очень похоже на docker
nerdctl run -d -p 8000:8000 myapp:latest

# Но использует containerd namespace
nerdctl -n k8s.io run -d myapp:latest

Сравнительная таблица команд

ИнструментКомандаПрименениеСложность
Docker CLIdocker runДля разработки, тестированияНизкая
docker-composedocker-compose upMulti-container appsСредняя
Kuberneteskubectl applyProduction, масштабированиеВысокая
systemdsystemctl startСистемные сервисыСредняя
Podmanpodman runАльтернатива DockerНизкая
LXClxc launchСистемные контейнерыСредняя

Python примеры управления контейнерами

import subprocess
import docker

# Способ 1: subprocess (низкоуровнево)
def run_container_subprocess():
    cmd = [
        'docker', 'run',
        '-d',
        '-p', '8000:8000',
        '-e', 'DEBUG=true',
        '--name', 'my-service',
        'myapp:latest'
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    print(result.stdout)  # Container ID

# Способ 2: Docker SDK (высокоуровнево)
def run_container_docker_sdk():
    client = docker.from_env()
    
    container = client.containers.run(
        'myapp:latest',
        name='my-service',
        detach=True,
        ports={'8000/tcp': 8000},
        environment={'DEBUG': 'true'},
        volumes={'/data': {'bind': '/container/data', 'mode': 'rw'}}
    )
    
    print(f"Container {container.id} started")
    
    # Логи
    print(container.logs())
    
    # Остановить
    container.stop()
    container.remove()

# Способ 3: docker-compose (programmatically)
from compose.service import Service

def run_with_compose():
    import yaml
    
    compose_dict = {
        'version': '3',
        'services': {
            'web': {
                'image': 'myapp:latest',
                'ports': ['8000:8000'],
                'environment': ['DEBUG=true']
            }
        }
    }
    
    # Запустить через subprocess
    with open('docker-compose.yml', 'w') as f:
        yaml.dump(compose_dict, f)
    
    subprocess.run(['docker-compose', 'up', '-d'])

Best Practices для запуска контейнеров

class ContainerBestPractices:
    # 1. Всегда указывай tag образа (не latest)
    docker_run_1 = """
    # ✓ Хорошо
    docker run myapp:v1.0.0
    
    # ❌ Плохо
    docker run myapp  # Использует latest, может меняться
    """
    
    # 2. Проксируй сигналы (--init)
    docker_run_2 = """
    docker run --init myapp:latest
    # Гарантирует правильный shutdown
    """
    
    # 3. Ограничивай ресурсы
    docker_run_3 = """
    docker run \\
      --memory 512m \\
      --cpus 1.0 \\
      --memory-swap 1g \\
      myapp:latest
    """
    
    # 4. Используй health checks
    docker_run_4 = """
    docker run \\
      --health-cmd='curl -f http://localhost:8000/health' \\
      --health-interval=30s \\
      --health-timeout=10s \\
      --health-retries=3 \\
      myapp:latest
    """
    
    # 5. Не запускай как root если не нужно
    docker_run_5 = """
    # В Dockerfile
    RUN useradd -m appuser
    USER appuser
    
    # При запуске
    docker run --user appuser myapp:latest
    """
    
    # 6. Используй read-only filesystem
    docker_run_6 = """
    docker run --read-only myapp:latest
    # Только /tmp и /run для записи
    """

print(ContainerBestPractices.__doc__)

Итоговая сумма

Для разработки: docker run или docker-compose up Для production: Kubernetes с kubectl или Dokku Для системных сервисов: systemd units с docker Для простых скриптов: subprocess с docker CLI Для Python приложений: Docker SDK

Главное правило: Выбери инструмент в зависимости от complexity и requirements приложения. Не усложняй без нужды!