Основано на видеоуроках с youtube.
Запуск контейнера
docker run -d -p 80:80 docker/getting-started
- -d — работа в фоне (не блокируется terminal)
- -p 80:80 привязка портов (проброс)
Просмотр образов
docket images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker/getting-started latest 3e4394f6b72f 2 months ago 47MB
Просмотр контейнеров
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1d58b01e8210 docker/getting-started "/docker-entrypoint.…" 11 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp strange_kirch
Остановка контейнера
docker stop 1d58b01e8210
Где 1d58b01e8210 — идентификатор контейнера полученный из команды docker ps
Аналогичны команды:
- docker start — запуск
- docker pause — пауза
- docker unpause — запуск после паузы
- docker restart — перезапуск
Запуск и остановка по имени
docker run -it --name MyJava openjdk
docker stop MyJava
Создание образа Ubuntu
docker pull ubuntu
docker run -it --name MyUbuntu ubuntu
Создание контейнера Ubuntu с именем MyUbuntu
Сборка контейнера
#Dockerfile
FROM openjdk:11
COPY . /java
WORKDIR /java
RUN javac Main.java
CMD [ "java", "Main" ]
#Main.java
package com.itproger;
class Main {
public static void main(String[] args) {
System.out.println("Hello World!!!"); // Показываем строку
}
}
Выполняем команду: docker build .
Где символ точка — это каталог откуда должны быть получены данные
# с указанием имени
docker build -t my-php-app ./php
Удаление образа
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 90389505100b 24 seconds ago 654MB
ubuntu latest 08d22c0ceb15 2 weeks ago 77.8MB
openjdk latest 71260f256d19 6 weeks ago 470MB
docker/getting-started latest 3e4394f6b72f 3 months ago 47MB
docker image rm 90389505100b
Deleted: sha256:90389505100b8a62cd0a8aab3c8e92eb0c7fccda068563cd41cd6611cccf3b6f
Удаление контейнера
#check container
docker ps -a
#remove container
docker rm containerID
Если образ не удаляется
docker image rm 935492793c47
Error response from daemon: conflict: unable to delete 935492793c47 (must be forced) - image is being used by stopped container 0f632ed0d1b5
# можно запустить так
docker image rm -f 935492793c47
Deleted: sha256:935492793c475e0d0f3208ef3a193a7b5ba26c246a65fe8e16716c41e4aee16d
Ещё один пример создания и запуска контейнера
# ./php/Dockerfile
FROM php:7.2-apache
COPY . /var/www/html
WORKDIR /var/www/html
EXPOSE 80
# ./php/index.php
<?php
echo "Hello";
# создаём образ с именем my-php-app
docker build -t my-php-app ./php
# запускаем образ
docker run -p 8001:80 -d my-php-app
Docker compose
# docker-compose.yml
version: '3.1'
services:
db:
image: mariadb:10.6
restart: always
environment:
MYSQL_ROOT_PASSWORD: notSecureChangeMe
phpmyadmin:
image: phpmyadmin
restart: always
ports:
- 8080:80
environment:
- PMA_ARBITRARY=1
docker-compose build
# сборка
docker-compose up
Подключение собственного образа
# docker-compose.yml
version: '3.1'
services:
php:
build: ./php
ports:
- 8081:80
...
Публикация образа в dockerhub
Создание тома
docker volume create test
docker volume inspect test
На WSL эта информация хранится в папке:
\\wsl$\docker-desktop-data\data\docker\volumes
Привязка тома налету
docker run -it --rm -v newdata:/data busybox
Аргумент -v
имеет собственный синтаксис, что видно по двоеточию, которое ставится сразу же после имени тома (мы выбрали для него очень оригинальное название newdata
). А далее через слэш указывается путь монтирования тома в контейнере. Теперь можно записывать туда данные, например:
echo "Timeweb" > /data/timeweb
Работа с файлами и папками
Для монтирования данных используются следующие параметры:
- -v или —volume
- —mount
Их различие в том, что mount более явно заставляет указывать источник и цель монтирования папки. Вы можете использовать эти параметры совместно, отдельно, повторяя несколько раз — ограничений нет
Для примера — у меня есть следующая папка на хосте:
/home/alex/docker_data
В случае параметра «-v» указывается два пути «откуда:куда». В случае «—mount» это именованные параметры разделенные запятыми. Пример работы обоих:
-v /home/alex/docker_data:/usr/share/nginx/html
# или
--mount type=bind,source=/home/alex/docker_data,destination=/usr/share/nginx/html
В mount мы используем следующие параметры:
- type — со значением ‘bind’ говорит, что мы монтируем папку или файл;
- source — источник т.е. папка или файл, который мы хотим подключить к контейнеру;
- destination — папка или файл внутри контейнера.
В обоих случаях мы можем монтировать данный доступные только для чтения (read-only) добавив «ro» в конце:
-v /home/alex/docker_data:/usr/share/nginx/html:ro
--mount type=bind,source=/home/alex/docker_data,destination=/usr/share/nginx/html,ro
Так выглядит запуск контейнера с проброшенной папкой:
docker run -d --name nginx_vol1 -v /home/alex/docker_data:/usr/share/nginx/html:ro nginx
# или
docker run -d --name nginx_vol2 --mount type=bind,source=/home/alex/docker_data,destination=/usr/share/nginx/html,ro nginx