Konténerek

Futtatás konténerben

Az operációs rendszerek 2 kurzuson már volt szó konténerekről, az ott tanultak alapján építsünk fel egy konténert egy egyszerű Python alkalmazással. A program a test.py legyen. Készítsünk egy batch programot is a konténer alapvető kezeléséhez.

test.py

print ("Hello")
print ("Ez a program egy manuálisan létrehozott konténerben fut.")

Dockerfile

FROM python:3
WORKDIR /
ADD test.py .
CMD ["python3", "/test.py"]

Run

docker image list
pause
docker image rm dockertest:1
pause
docker build -t dockertest:1 .
pause
docker run -it --rm dockertest:1
pause
docker ps -a
docker image list

Konténer összefoglaló

Az alábbi cheatsheet tartalmazza a docker parancssori alkalmazásának legfontosabb eseteit.

  • docker version

  • docker run hello-world

  • docker run –name hw hello-world

  • docker ps # Futó konténerek listázása

  • docker ps -a # Összes konténer listázása

  • docker start vibrant_solomon

  • docker stop vibrant_solomon

  • docker kill vibrant_solomon

  • docker rm 6d7e1cec74fa # Egy konténer törlése

  • docker container prune # Összes leállított konténer törlése

  • docker image ls

  • docker image rm ubuntu:latest # Image törlése

  • docker rmi hello-world -f # Az összes Hello-world törlése

  • for I in $(docker image ls -q) ; do docker image rm $I ; done # Az összes image törlése

  • docker run busybox

  • docker run busybox ls

  • docker run –restart=always -it ubuntu bash

  • docker attach vibrant_solomon

  • docker run -it ubuntu bash # indítás és belépés

  • docker run -it ubuntu:16.04 bash

Futtatás konténerben

dockerpy
  Dockerfile
  main.py
  run
print ("Hello World!")

Run

#!/bin/bash
docker build -t myapp .
docker run -it --rm --name python-ex myapp
FROM python:3
MAINTAINER Koczka Ferenc <koczka.ferenc@uni-eszterhazy.hu>
WORKDIR /
ADD main.py .
CMD ["python3", "./main.py"]

Egyszerű php példa

php-webserver
  + src
    + index.php
  Dockerfile
  run

src/index.php

<?php phpinfo();

Dockerfile

FROM php:latest
RUN mkdir webroot
WORKDIR webroot
ADD src/ .
EXPOSE 8080
CMD [ "php", "-S", "0.0.0.0:8080" ]

Run

#!/bin/bash
docker build -t phpwebserver .
docker run -p 8080:8080 -it --rm --name ws phpwebserver

Egyszerű php példa

php-webserver
  + src
    + index.php
  docker-compose.yaml
  run

src/index.php

<?php phpinfo();

docker-compose.yaml

version: "3.0"
services:
  php:
    container_name: php
    image: php:8.1
    ports:
      - 8080:80
    command: php -S 0.0.0.0:80 -t /var/www/html
    volumes:
      - type: bind
        source: ./src
        target: /var/www/html

volumes:
  src:

Run

#!/bin/bash
docker stop php
docker rm php
for I in $(docker image ls -q) ; do docker image rm $I --force ; done
docker-compose up

Php-MySql

php-webserver
  + src
     + index.php
  + php
     + Dockerfile
  + mysql
  docker-compose.yaml
  run

php/Dockerfile

FROM php:8.1
MAINTAINER Koczka Ferenc <koczka.ferenc@uni-eszterhazy.hu>
RUN docker-php-ext-install mysqli

docker-compose.yaml

version: "2"
services:
  php:
    container_name: php
    build: php
    ports:
      - "8080:8080"
    command: "php -S 0.0.0.0:8080 -t /var/www/html"
    volumes:
      - type: bind
        source: src
        target: /var/www/html

  mysql:
    container_name: mysql
    image: mysql:8.0
    ports:
      - "3306:3306"
  volumes:
      - type: bind
        source: mysql
        target: /var/lib/mysql
  environment:
      MYSQL_USER: webdb
      MYSQL_PASSWORD: webdb
      MYSQL_DATABASE: webdb
      MYSQL_ROOT_PASSWORD: nagyonTitKosJelszo
      MYSQL_ROOT_HOST: "0.0.0.0/0"

volumes:
  src:

Run

#!/bin/bash
docker stop php
docker rm php
docker rm mysql
for I in $(docker image ls -q) ; do docker image rm $I --force ; done
docker image list
docker ps -a
docker compose up

Feladatok:

  1. Ellenőrizd a konténerek működőképességét a http://localhost:8080 megtekintésével! Van a php-ben mysqli támogatás?

  2. Készíts egy programot az src könyvtárban, amely:

  1. Kapcsolódik a webdb adatbázishoz, hibaüzenetet ad, amennyiben ez sikertelen.

  2. Törli a users nevű táblát, amennyiben az létezik.

  3. Létrehozza az users nevű táblát id, név és születési idő mezőkkel.

  4. Beszúr három rekordot ebbe a táblába.

  5. Lekérdezi és megjeleníti ezeket abécé sorrendben.

<!DOCTYPE html>
  <html lang="hu">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>mySQL Demo</title>
  </head>
  <body>
    <?php
        $names=["Kiss Lajos","Szabó Aladár", "Szeleczki János"];

        echo "Connecting to the mySql Server.<br>";
        $db = mysqli_connect("mysql","webdb","webdb","webdb");
        if ( ! $db ) die ("Database connection error.");

        echo "Creating table.<br>";
        $result = mysqli_query($db, "
          CREATE TABLE IF NOT EXISTS users (
            id serial,
            name varchar(64),
            primary key(id)
          )");
          if ( ! $result )
            die ("Table creation error.");
          else
            echo ("Table has just been created.<br>");

        for ( $i=0; $i<sizeof($names); $i++ ) {
          $result = mysqli_query($db, "
            INSERT INTO users (name) VALUES ('" . $names[$i] . "')");
          if ( ! $result )
            die ("Data insertion error.<br>");
          else
            echo "Inserted: " . $names[$i] . ".<br>";
        }

        $sql = "SELECT id, name FROM users ORDER BY id";
        $result = mysqli_query($db, $sql);

        $c=1;
        if (mysqli_num_rows($result) > 0) {
          while($row = mysqli_fetch_assoc($result)) {
            echo $c . ". id: " . $row["id"]. " - Name: " . $row["name"] . "<br>";
            $c++;
          }
        } else {
          echo "There are no names in that table.<br>";
        }

        mysqli_close($db);
    ?>
  </body>
</html>

Konténer feltöltése a DockerHubra

Az elkészült konténerek a DockerHub-ra felölthetők, melyhez először egy hozzáférést kell készíteni, makd be kell jelentkezni. Ezt követően létre kell hozni egy új repository-t a konténerünknek. Ez a bejelentkezési nevünk, mint namespace alatt jelenik majd meg. A repository lehet privát és nyilvános is. Egy példa a repository nevére: koczkaferenc/hello. A konténerünk most legyen nagyon egyszerű, egy pythonban írt helloworld. A dockerfile tartalma:

FROM python:latest
RUN echo "print ('Hello')" >/hello.py
CMD ["python3", "/hello.py"]

Készítsük el a konténert a docker build -t hello:1 . paranccsal, elindítani nem is szükséges.

A konténer feltöltésének első lépése az összerendelés a repository nevével, amit a docker tag paranccsal kell elvégezni. A példában a helyi konténer neve hello, amit a DockerHubon koczkaferenc/demo néven szeretnék elérhetővé tenni.

docker tag hello:1 koczkaferenc/hello

A feltöltéshez be kell jelentkeznünk:

docker login
username:
password:

A feltöltést az alábbi paranccsal végezhetjük el:

docker push koczkaferenc/hello:1

A letöltést a már ismert paranccsal végezhetjük el:

docker run koczkaferenc/hello:latest