Wie Docker (Container mit) Ubuntu 14.04 Upgrade auf 18.04?

B3l3s3n3r-3H

Cadet 2nd Year
Registriert
Okt. 2018
Beiträge
23
Hallo,

ich habe ein Docker-Image welches ich gestartet habe. Danach bin ich mit exec in den Container und habe geschaut welches OS das Image (?) nutzt. Es wurde Ubuntu 14.04 angezeigt.
Bin dann hergegangen und habe per
Code:
apt-get install update-manager-core

do-release-upgrade
auf Ubuntu 16.04 upgraden können.
768914


Nun habe ich das Problem, wenn ich wieder den Container starte und wieder hineingehe (exec) und nochmals ein
Code:
do-release-upgrade
ausführen möchte, macht er aber kein weiteres Upgrade auf 18.04.
768912


Habe dann mal ein apt-get update gemacht und danach ein apt-get upgrade... letzteres bringt mir folgende Meldung:
dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the Problem.
Habe ich dann auch (im Container) eingegeben, dann schmeist er mich aus dem Container raus.
768915

Also wieder Container gestartet, wieder per exec rein, wieder apt-get upgrade und wieder dieselbe Fehlermeldung.:rolleyes:
dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the Problem.

Wie kann ich weiterverfahren, damit ich den Conainter mit Ubuntu 16.04 nun auf Ubuntu 18.04 upgraden kann?

PS: Ich teste das gerade alles über Play with Docker!
 
Völlig falscher Ansatz, wenn du ein Docker Image mit Ubuntu 18.04 als Basis haben willst, dann ändere das im Dockerfile!
Im Container sollte man keine Änderungen an Softwareversionen vornehmen, dass führt das ganze Konzept von Containern ad absurdum.
 
  • Gefällt mir
Reaktionen: Kanibal, memmex, TheCadillacMan und 2 andere
Darum teste ich das ja, ob das "schlimme" Auswirkungen hat oder nicht.;)
Von daher möchte ich das erstmal so umsetzen.
Ist eben nur die Frage wie ich eben jetzt auf 18.04 komme.
 
Davon abgesehen, dass man das, wie Ebrithil schon schrieb, nicht macht - führe doch einfach mal den vorgeschlagenen Befehl aus...
 
Hast du gelesen was ich gemacht habe?:rolleyes:
Hättest du das, dann hättest du gesehen, dass ich den Befehl eingegeben habe und aus dem Container geworfen wurde.;)
Wieder in den Container rein und apt-get upgrade bringt mir wiederum denselben Fehler!
Steht alles oben.:D
 
Schalte dich mal auf den Container und führe dann "uname -a" aus. Die Container benutzen z.T. den Kernel des Hosts

https://en.wikipedia.org/wiki/Docker_(software)
Building on top of facilities provided by the Linux kernel (primarily cgroups and namespaces), a Docker container, unlike a virtual machine, does not require or include a separate operating system.[33] Instead, it relies on the kernel's functionality and uses resource isolation for CPU and memory,[31] and separate namespaces to isolate the application's view of the operating system. Docker accesses the Linux kernel's virtualization features either directly using the libcontainer library, which is available as of Docker 0.9, or indirectly via libvirt, LXC (Linux Containers) or systemd-nspawn.[27][14]

Du hast da einige Sachen noch nicht verstanden
 
Container sind eben so gut, weil sie nicht ein komplettes OS mitbringen, sondern sich den Kernel des Hosts teilen. Das apt upgrade ist deshalb einfach Schwachsinn

Denk mal drüber nach. Ubuntu 14.04 hat Kernel 3.13 aber uname -a zeigt dir Kernel 4.4. 4.4 ist natürlich der Kernel des Hosts
 
  • Gefällt mir
Reaktionen: abcddcba
Play with Docker nutzt wohl Ubuntu 16.04, denn dort - direkt - geht (auch) kein apt-get.
 
Das ist auch nicht Sinn und Zweck eines Containers. Diese sind als immutable, also unveränderlich angedacht und damit reproduzierbar. Docker-Container werden deklarativ betrieben.

Du beschreibst also den gewünschten Zielzustand (Deklaration) und nutzt dann Docker als Hilfsmittel diesen Zustand reproduzierbar zu erreichen. Also kein "zuerst OS installieren, dann Programme/Pakete, dann Software einrichten", unabhängig ob man dies manuell oder per terraform/puppet/ansible/chef/saltstack/was-auch-immer macht.
Willst du an einem Container etwas ändern, dann aktualisierst du dein Dockerfile, baust ein neues Image,wirfst den alten Container weg und startest einen neuen aus dem neuen Image.

Die Versionierung der Dockerfiles kann man z.B. mit GIT managen und das Rollout, z.B. mit Unit-Tests, Funktion-Tests, Test-Umgebung, usw. usf sofern alles gewünscht mit gängigen CI/CD Tools wie Gitlab oder Jenkins abbilden.
Ja, klingt alles nach viel Aufwand, ist aber nicht zwingend notwendig in kleinen Tests aber sollte man sich unbedingt ansehen, wenn man selbst Dockerimages entwickeln/pflegen will, v.a. beruflich.

Grundlegend solltest du dich eher an den Basics und Grundsätzen orientieren.
1. Docker-Container werden zur Laufzeit nicht verändert. Dockerfiles anpassen, Image bauen, neu deployen.
2. Docker-Container niemals als persistent, also dauerhaft, ansehen. Jedwede dauerthaft zu speichernden Daten gehören in ein Docker-Volume. Dazu gehören Configfiles oder die eigentlichen Nutzdaten. Hälst du dich nicht dran und wirfst einen Container weg und erzeugst ihn neu, sind alle deine Änderungen in der Anwendung weg.
3. Ein Dienst pro Container. Benötigt eine Webanwendung eine Datenbank, hat man also mindestens zwei Container mit mindestens einem Volume pro Container. Ein Webserver-Container mit Volume wo in dem Beispiel /var/www/html drin liegt und ein Datenbank-Container mit Volume in dem die eigentliche Datenbank liegt, bei mariadb z.B. /var/lib/mysql.
4. Variablen wie Zeitzone, Credentials, welche Volumes etc gibt man als environment-Variablen beim Start mit oder nutzt docker-compose wenn mehr als ein Container zu einem Projekt/Anwendung gehört. Bei Kubernetes wäre dies dann die kubernetes resources, nur um es zumindest mal erwähnt zu haben. Kubernetes ist hier aber glaube ich fehl am Platz und für die meisten Anwender im privaten oder zuhause "overkill".
 
  • Gefällt mir
Reaktionen: abcddcba
Angenommen ich würde das Image doch selbst bauen, welche Pakete müsste ich denn dann im Dockerfile, mit welcher Versionsnummer, austauschen um aktuell zu sein?
Code:
FROM phusion/baseimage:0.9.15

VOLUME /srv/rukzuk/htdocs/cms

# proposed breaks some php packages (e.g. php-intl)
RUN rm -rf /etc/apt/sources.list.d/proposed.list

# phusion/baseimage is not always up to date. :-(
RUN apt-get update  && \
    apt-get dist-upgrade -y --no-install-recommends


# Set Timezone
RUN echo "Europe/Berlin" > /etc/timezone
RUN dpkg-reconfigure --frontend noninteractive tzdata

# Make Debian/Ubunut and Docker friends
ENV DEBIAN_FRONTEND noninteractive

# install phantomjs 2.0
RUN apt-get install -y --no-install-recommends software-properties-common && \
    add-apt-repository ppa:tanguy-patte/phantomjs && \
    apt-get update && \
    apt-get install -y --no-install-recommends phantomjs

# Install Apache httpd
RUN apt-get install -y --no-install-recommends \
        sqlite3 \
        apache2 \
        libapache2-mod-php5 \
        libv8-3.14.5 \
        msmtp \
        msmtp-mta \
        php5 \
        php5-sqlite \
        php5-cli \
        php5-curl \
        php5-gd \
        php5-intl \
        php5-mcrypt

# Activate Apache mods
RUN a2enmod ssl && \
    a2enmod rewrite

# Activate PHP mods
RUN php5enmod mcrypt

# Install php5-v8js
COPY php5-v8js_0.1.3-1_amd64.deb /tmp/php5-v8js.deb
RUN dpkg -i /tmp/php5-v8js.deb

# Activate apache2 in runit
RUN mkdir -p /etc/service/apache2
COPY apache2.runit /etc/service/apache2/run
RUN chmod +x /etc/service/apache2/run

# Create folder
ENV CMS_PATH /opt/rukzuk/htdocs
ENV INSTANCE_PATH /srv/rukzuk
RUN mkdir -p ${CMS_PATH}
RUN mkdir -p ${INSTANCE_PATH}/htdocs/cms
RUN chown -R www-data:www-data ${INSTANCE_PATH}/htdocs

# Install the release/cmsrelase.tar.gz (a version from our Jenkins)
RUN curl -L $(curl -s https://api.github.com/repos/rukzuk/rukzuk/releases/latest | grep browser_download_url | grep 'tgz\|tar.gz' | cut -d '"' -f 4) | tar -xz --strip 1 -C ${CMS_PATH}/..


RUN ln -s ${CMS_PATH}/app/server/environment ${INSTANCE_PATH}/environment
RUN ln -s ${CMS_PATH} ${INSTANCE_PATH}/application

# Initial
ENV APPLICATION_ENV standalone
ENV CMS_SQLITE_DB ${INSTANCE_PATH}/htdocs/cms/db.sqlite3
COPY config.php ${INSTANCE_PATH}/config.php
COPY cms.apache /etc/apache2/sites-available/000-default.conf
RUN mkdir -p /etc/my_init.d
COPY init.sh /etc/my_init.d/rukzuk_init.sh
RUN chmod +x /etc/my_init.d/rukzuk_init.sh
COPY msmtprc.tpl /etc/msmtprc.tpl

EXPOSE 80
Das phusion:baseimage sollte laut hub.docker.com noch Ubuntu 16.04 LTS sein; auf github enthält phusion aber wohl schon Ubuntu 18.04 LTS.
Wie kann ich also auch Ubuntu 18.04 für das Image verwenden?:confused_alt:

Danke!:)

Edit:
Gerne auch so, dass PHP7 und MySQL ein eigenes Image/Container nutzen und man das per Docker compose (?) einbindet.
Wichtig nur, dass am Ende alles zusammen läuft wie es soll.;)
Danke!:)
 
Zuletzt bearbeitet:
Ja, das phusion:baseimage ist vielleicht aktuell aber in dem von dir genannten Dockerfile ist nicht phusion:baseimage:latest sondern ein 2-3 Jahre alte Versionsnummer angegeben. Wenn du das aktuelle verwenden willst musst die die Versionsnummer entfernen, dann nimmst du automatisch immer :latest, zumindest in den meisten Fällen bzw machen die meisten Maintainer dies so, dass bei keiner Angabe entweder die aktuellste oder die aktuell stabile Version genommen wird.

+1 für mariadb und bei PHP musst dich entscheiden. Wenn du dies in einen extra container packen willst, brauchst noch einen extra Container für einen Webserver, z.B. nginx oder nutzt apache2+php in einem Container.

Wie du ein Compose-File aufbauen musst, findest du in der Doku. Ein Beispiel mit Wordpress findest du z.B. hier: https://docs.docker.com/compose/wordpress/ wobei in dem Beispiel der Container mit dem Webserver & Wordpress kein Volume für das eigentliche Webroot hat und somit Änderungen nur in der DB dauerhaft sind. Bei einer Nextcloud sieht es u.a. so aus: https://github.com/nextcloud/docker
Ist halt nur ein grober Vorschlag zur Orientierung und du musst das natürlich an deine Umgebung anpassen.

Der Unterschied zwischen LXC und Docker ist u.a. hier erklärt: https://pasztor.at/blog/lxc-vs-docker
 
Hallo,

bräuchte jetzt bitte eure aktive Hilfe;) (keine "Romane") da ich das Dockerfile aus Beitrag #11 nun "aufteilen möchte in:
Anwendung (mit OS) inkl. JavaScript, Webserver, DB, PHP7
Kann mir bitte jemand diese Befehle auf einzelne Docker Image-Dienste aufteilen helfen?:freak:

Für PHP7 gibt es ja auch so viele unterschiedliche Docker Images.
Woher weiß ich denn was ich davon benötige?

Leider tue ich mir schwer :( um zu wissen welche Pakete denn nun die aktuellsten sind.
Z.B. php5-v8js_0.1.3-1_amd64.deb, wie heißt das Paket für PHP7?:confused_alt:
Oder: libv8-3.14.5, welche Version ist die aktuellste?:confused_alt:

Würde mich wirklich sehr freuen, wenn mir jemand die benötigten Dockerfiles (z.B. für die Anwendung) schreiben und mir die auf dem Docker-Hub fertig nutzbaren Docker Images nennen könnte.
Danke!
 
@abcddcba
Da finde ich aber nichts mit libv, libv8, js oder v8js :( etc., wie also soll mir das helfen?:confused_alt:

Edit:
Achso, du meinst, man müsste dann aber alle von PHP durchsehen?
Aber latest müsste doch alles beinhalten.
 
Zuletzt bearbeitet: (Edit)
Du hast doch das ganze Dockerfile von irgendwo kopiert, oder?

Von hier: https://github.com/rukzuk/rukzuk/tree/master/docker

Dort siehst du auch, dass das .deb File einfach mit im Repo ist, also hard-codiert. Es wird wohl dort schon als Datei vorliegen, weil man es sonst noch kompilieren muss, und dann via pecl installieren.

Weißt du überhaupt was das Paket macht? Es ist eine Javascript Extension für PHP. Deine Aufgabe wäre es eigentlich gewesen rauszufinden wie man v8js mit PHP 7 einrichtet ... dev Paket installieren via apt, installieren via pecl. Kriegst du das hin?
Es ist nicht schwer, gibt wie für fast alles auch SO Einträge: https://stackoverflow.com/a/38022308/4744359
Das PPA dort solltest du aber aktualisieren, das wird für die Version nicht mehr gehen vermute ich.

Aktuellste Version der JS Engine für PHP findest du natürlich auch online: https://pecl.php.net/package/v8js

Es gibt übrirgens dafür auch ein Docker Image: https://hub.docker.com/r/stesie/v8js/

Bzgl. PHP, alle benötigten Images stehen auch auf der Startseite von dem Dockerfile, was du kopiert hast: https://github.com/rukzuk/rukzuk#requirements
Idealerweise ersetzt du diese dann durch die PHP Version deiner Wahl.
 
  • Gefällt mir
Reaktionen: B3l3s3n3r-3H
Danke!
Ob ich damit zurecht komme... Ja und nein.;)

Das original Dockerfile wollte ich ja aufteilen, da darin ja im Moment alles ist.
Z.B. wird darin ja auch das htdocs Verzeichnis angelegt - dieses könnte ich aber im Docker Image von Apache (httpd) anlegen.
Ich tue mir da wirklich noch schwer, deshalb ja die Bitte zur aktivien Hilfe um das Dockerfile aufzuteilen.:(
 
Zurück
Oben