Developer.

Docker: podstawowe informacje

Praca na Linuksie pozwoliła mi w końcu skorzystać z zalet konteneryzacji. na razie wykorzystuje go wyłącznie do uruchamiania Jupyter Lab w odseparowanym środowisku korzystając z oficjalnego obrazu jupyter/scipy-notebook.

Docker: podstawowe informacje

Do instalacji posłuzyłem się oficjalną instrukcją oficjalną instrukcj (Ubuntu).

Udało mi się też znaleźć prosty tutorial z opisem pobierania obrazów i zarządzania kontenerami: A Docker Tutorial for Beginners.

Pierwszy problem pojawił się zaraz na początku, próba uruchomienia:

docker run hello-world

poskutkowała komunikatem:

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create?name=jupyter: dial unix /var/run/docker.sock: connect: permission denied. See ‘docker run –help’.

Rozwiązaniem okazało się zminienie uprawnien do pliku docker.sock (żródło):

sudo chmod 666 /var/run/docker.sock

można też ominąć ten krok uruchamiając komendę jako administrator (sudo)

Kolejnym znaczacym problemem było znalezienie sposobu na kontynyuację pracy po zamknięciu kontenera. Po serii eksperymentów i lekturze oficjalnej dokumentacji oraz artykułu Tutorial: Running a Dockerized Jupyter Server for Data Science doszedłem do optymalnego dla mnie sposobu pracy.

Pierwszym krokiem było utworzenie katalogu w którym będą przechowywane dane do pracy:

mkdir ~/notebooks
chmod 777 ~/notebooks

Kolejnym było odpowiednie uruchamianie kontenera, finalnie doszedłem do postaci:

docker run --rm -p 10000:8888 --name jupyterl --env JUPYTER_TOKEN=1234 --volume "$PWD/notebooks":/home/jovyan/work -e JUPYTER_ENABLE_LAB=yes jupyter/scipy-notebook
  • –rm : usuwa kontener na koniec działania
  • -p 10000:8888 : przekierowanie portów
  • –name jupyterl: nazwa kontenera
  • –env JUPYTER_TOKEN=1234 : urucho z tokenem użytkownika
  • –volume “$PWD/notebooks”:/home/jovyan/work : montuje katalog ~/notebooks
  • -e JUPYTER_ENABLE_LAB=yes : włącz JupyterLab, zamiast Notebook
  • jupyter/scipy-notebook - nazwa obrazu

Tak uruchomiony kontener wymaga już tylko wpisania w oknie przeglądarki:

127.0.0.1:10000/?token=1234

Et voila! Można pracować wszystkie pliki zapisane w katalogu work będą przechowywane na lokalnym systemie plików w katalogu ‘~/notebooks/’.

Na końcu jeszcze kilka przydatnych komand:

docker pull jupyter/scipy-notebook // pobiera obraz dockera
docker images // obrazy dockera
docker ps -a // kontenery (łącznie z nieaktywnymi)
docker system prune //usuwa wszystkie nieaktywne kontenery
docker stop {name}
docker container start {id}

docker inspect {name} //szczegółowe informacje

Modyfikacja obrazu

Jeżeli potrzebny jest jakiś pakiet który nie jest dostępny w pobranym obrazie, to potrzebna będzie jego modyfikacja (zmiana pliku dockerfile). Ten etap jeszcze przede mną, ale myślę ze wkrótce go tutaj dopiszę.

Dockerfile : https://github.com/jupyter/docker-stacks/blob/master/scipy-notebook/Dockerfile

Docker-compose

Spięcie kilku kontenerów w jedną całość jest możliwe z wykorzystaniem docker-compose.

Instalacja (oficjalna instrukcja):

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

lub po prostu:

sudo apt  install docker-compose

Sprawdzenie działania:

docker-compose --version
docker-compose version 1.27.3, build 4092ae5d

Plik docker-compose.yml dla Wordpress:

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8800:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}

Po uruchomieniu komendy docker-compose up (w katalogu gdzie znajduje się plik yml) wordpress będzie dostępny pod adresem http://localhost:8800/

Logi z kontenerów

docker compose logs <name-of-service:web/db/etc.>

-f, --follow Follow log output -n, --tail Number of lines to show from the end of the logs for each container

Plik .env

Przechowywanie haseł w pliku docker-compose.yml nie jest bezpieczne, lepiej mieć je w osobnym miejscu.

MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}

plik maria.env:

MYSQL_ROOT_PASSWORD=root
MYSQL_USER=user
MYSQL_PASSWORD=pass

Przekazanie informacji o pliku .env podczas uruchamiania kontenera:

docker-compose --env-file maria.env up -d

Dostęp do kontenera

Potrzebny będzie CONTAINER ID,

docker ps

Wyświetli wszystkie kontenery:

CONTAINER ID   IMAGE                      COMMAND                  CREATED        STATUS       PORTS                  NAMES
e193b49525f9   nginx:latest               "/docker-entrypoint.…"   22 hours ago   Up 3 hours   0.0.0.0:8080->80/tcp   discountcodesbackend_web_1

Znając ten identyfikator mozna zalogować się poleceniem

docker exec -it CONTAINER_ID /bin/bash