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