¿Te ha servido? No te pierdas el próximo lab
Creamos un directorio de trabajo dedicado (~/docker/portainer) donde vivirá el compose.yaml del stack. Tener cada stack en su propia carpeta facilita versionarlo, respaldarlo y gestionarlo con `docker compose` desde ahí.
mkdir -p ~/docker/portainer
Escribimos compose.yaml siguiendo la Compose Specification actual: sin clave `version:`, imagen pineada a `portainer-ce:2.40.0` (nunca `:latest`), puertos 9443 (UI HTTPS) y 8000 (túnel del Edge Agent), el socket de Docker montado en solo lectura (`:ro`) porque Portainer lo gestiona todo por API, y un volumen nombrado `portainer_data` para que los datos sobrevivan a las actualizaciones.
cat > ~/docker/portainer/compose.yaml <<'YAML'
services:
portainer:
image: portainer/portainer-ce:2.40.0
container_name: portainer
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- "9443:9443"
- "8000:8000"
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- portainer_data:/data
volumes:
portainer_data:
YAML
Validamos la sintaxis antes de arrancar nada: `docker compose config` parsea el fichero y falla si hay un error de indentación o una clave inválida. Si imprime `compose.yaml OK`, está listo.
docker compose -f ~/docker/portainer/compose.yaml config -q && echo 'compose.yaml OK'
Levantamos el stack en segundo plano (`-d`). Docker descarga la imagen si falta, crea el volumen `portainer_data` y arranca el contenedor `portainer` con la política `restart: unless-stopped`, que lo devuelve a la vida tras un reinicio del host.
cd ~/docker/portainer && docker compose up -d
Comprobamos que el servicio está `running` y escuchando en `0.0.0.0:9443` antes de abrir el navegador. `docker compose ps` muestra el estado del stack definido en este directorio.
cd ~/docker/portainer && docker compose ps
Abrimos https://<IP>:9443 (certificado autofirmado: aceptamos el aviso), creamos el usuario administrador con una contraseña de 12+ caracteres —el formulario caduca a los 5 minutos— e iniciamos sesión: ya vemos el entorno Docker local y la instalación funciona.
¿Te ha sido útil este lab? Puntúalo:
Chuleta
-
mkdir -p ~/docker/portainer -
cat > ~/docker/portainer/compose.yaml <<'YAML' services: portainer: image: portainer/portainer-ce:2.40.0 container_name: portainer restart: unless-stopped security_opt: - no-new-privileges:true ports: - "9443:9443" - "8000:8000" volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - portainer_data:/data volumes: portainer_data: YAML -
cd ~/docker/portainer && docker compose up -d