Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
system:docker [2018/06/23 04:18] – [Образы] mirocow | system:docker [2025/01/22 18:24] (текущий) – 192.168.1.104 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | {{tag> | + | {{tag> |
====== Docker ====== | ====== Docker ====== | ||
Строка 5: | Строка 5: | ||
{{https:// | {{https:// | ||
- | | VIRTUAL MACHINES | ||
- | | {{https:// | ||
- | | Virtual machines include the application, | ||
- | ===== Установка ===== | + | ====== Установка |
- | * https:// | + | ===== Ubuntu ===== |
- | + | ||
- | nano / | + | |
- | < | + | |
- | deb https:// | + | |
- | </ | + | |
<code bash> | <code bash> | ||
- | $ apt autoremove | + | $ apt update && \ |
- | $ apt install docker-engine | + | apt install ca-certificates curl gnupg lsb-release |
- | $ docker run hello-world | + | mkdir -p / |
- | $ cd ./project/ | + | curl -fsSL https:// |
- | $ docker-compose | + | echo "deb [arch=$(dpkg |
+ | apt update && \ | ||
+ | apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y | ||
</ | </ | ||
- | * Запуск производится от root | + | ===== Debian ===== |
- | * [[system: | + | |
- | * [[system: | + | |
- | * [[system: | + | |
- | * [[system: | + | |
- | + | ||
- | === Запуск от пользователя | + | |
<code bash> | <code bash> | ||
- | $ sudo groupadd | + | $ apt update && \ |
- | $ sudo gpasswd | + | apt install ca-certificates curl gnupg lsb-release -y && \ |
- | $ sudo service | + | mkdir -p / |
+ | curl -fsSL https:// | ||
+ | echo "deb [arch=$(dpkg --print-architecture) signed-by=/ | ||
+ | apt update && \ | ||
+ | apt install | ||
</ | </ | ||
- | ==== Mac OS ==== | ||
- | <code bash> | + | ====== |
- | $ brew install docker docker-machine docker-compose docker-machine-driver-xhyve | + | |
- | </ | + | |
- | Подробнее: | + | |
- | ==== Установить последнюю версию | + | |
- | + | ||
- | <note tip>< | + | |
- | $ curl -L " | + | |
- | $ chmod +x / | + | |
- | </ | + | |
- | Работает с docker-compose.yml файлом</ | + | |
- | Подробнее: | + | |
- | Пример: | + | |
- | ===== Настройка ===== | + | |
- | + | ||
- | ==== Dockerfile ==== | + | |
- | + | ||
- | * FROM — указывает название образа (image), который будет взят за основу. | + | |
- | * ENV — устанавливает переменную среды | + | |
- | * RUN — запустить команду в контейнере (все команды исполняются с полными правами в пределах контейнера) | + | |
- | * ADD — добавить файл в контейнер | + | |
- | * VOLUME — указать монтируемые директории (их можно монтировать на хост машину или на другие контейнеры) | + | |
- | * EXPOSE — указать транслируемые порты (их можно транслировать на хост машину или на другие контейнеры) | + | |
- | * CMD — запустить процесс (это и будет процесс, | + | |
- | + | ||
- | * [[system: | + | |
- | * [[system: | + | |
- | ==== docker-compose ==== | + | |
- | + | ||
- | * docker-compose - средство сборки и настройки контейнеров | + | |
- | * docker-compose up - поднять контейнеры с учетом правил сборки docker-compose.yml | + | |
- | * -d - Для запуска сервисов в фоне (for " | + | |
<code bash> | <code bash> | ||
- | $ docker-compose config | + | $ sudo groupadd |
- | $ docker-compose up | + | $ sudo usermod |
+ | $ newgrp | ||
</ | </ | ||
- | Отдельно стоит запомнить команду docker-compose up. Она представляет собой упрощенный вызов docker-compose build && docker-compose run | + | ====== UI ====== |
- | Сборочные контейнеры в связке с docker-compose удобно использовать в окружении разработчика, | + | * https:// |
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
- | <note tip>С docker-compose все просто, | + | ===== Использование |
- | === Рабочий процесс === | + | * [[Dockerfile]] |
+ | * [[docker-compose.yml]] | ||
- | Определение Dockerfile для каждого из сервисов | + | ==== Работа с образами |
- | Определение связей между сервисами | + | |
- | Запус системы при помощи docker-compose up | + | |
- | == Документация == | ||
- | * https://ast.rocks/ | + | <note important> |
+ | $ docker image | ||
+ | </code>< | ||
- | ==== docker-compose-mixer ==== | + | === Вывести список образов |
- | Содержание конфигурационного docker-compose-mixer.yml файла по своей сути является небольшим конфигом, | + | <code bash> |
- | + | $ docker | |
- | <note tip><code bash> | + | REPOSITORY |
- | $ wget https:// | + | yii2_php |
- | $ chmod +x / | + | |
</ | </ | ||
- | Работает с docker-compose-mixer.yml файлом</ | ||
- | Решает проблемы: | + | === Удалить образ === |
- | * Конфликты имен контейнеров c обновлением всего дерева конфигурации | + | <code bash> |
- | * Конфликты портов пробрасываемых на хост-машину | + | $ docker image rm 6a950c96e01d |
- | * Переопределение свойств сервиса | + | </ |
- | * Разрешение относительных путей | + | |
- | * Удаление лишних или дублирующихся сервисов | + | |
- | Подробнее: https:// | + | === Удалить все |
- | ==== docker-machine ==== | + | <code bash> |
+ | $ sudo docker | ||
+ | $ sudo docker rmi -f $(sudo docker images -q) | ||
+ | </ | ||
- | В GitHub-репозитории Docker Machine можно | + | === Анализировать образ === |
- | === Использование === | ||
- | |||
- | == создания нового хоста == | ||
- | |||
- | <code bash>$ docker-machine create --driver virtualbox machine-name</ | ||
- | |||
- | * -d --driver задаёт драйвер ([[https:// | ||
- | * generic | ||
- | * [[https:// | ||
- | * virtualbox | ||
- | * [[https:// | ||
- | |||
- | **generic** | ||
<code bash> | <code bash> | ||
- | $ docker-machine create \ | + | $ docker |
- | | + | [ |
- | | + | { |
- | --generic-ssh-key ~/.ssh/id_rsa \ | + | " |
- | | + | " |
+ | " | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | ... | ||
+ | } | ||
</ | </ | ||
- | * где machine-name - название создаваемой машины | + | === Избавляемся от неиспользуемых образов === |
- | == запустить == | + | <code bash>$ docker image prune</ |
- | <code bash>$ docker-machine start machine-name</ | + | === Список образов === |
- | == выполнение команд на удаленном хосте == | + | <note tip>Алиас |
- | <code bash>$ docker-machine ssh machine-name cat /etc/hosts</ | + | <code bash> |
+ | $ docker | ||
+ | REPOSITORY | ||
+ | yii2_php | ||
+ | yii2_nginx | ||
+ | yii2_kibana | ||
+ | yii2_elasticsearch | ||
+ | yii2_redis | ||
+ | yii2_mariadb | ||
+ | </ | ||
- | или подключится к удаленному хосту | + | === Получение образов === |
- | <code bash>$ docker-machine ssh machine-name</ | + | <note tip> |
+ | $ docker | ||
+ | </code></ | ||
- | == просмотреть список доступных хостов | + | === Установка образа === |
- | <code bash>$ docker-machine ls</ | + | <note tip> |
+ | $ docker | ||
+ | </code></ | ||
- | == получить подробную информацию о хосте | + | ==== Работа с контейнерами / Containers ==== |
- | <code bash>$ docker-machine inspect machine-name</ | + | <note important> |
+ | $ docker | ||
+ | $ docker exec --help | ||
+ | </code></ | ||
- | == настройки соединения хоста, == | + | === Запуск контейнера === |
- | <code bash>$ docker-machine config machine-name</code> | + | <note important>Необходим Dockerfile</note> |
- | == отображает IP-адрес хоста == | + | <code bash>$ docker up</ |
- | <code bash>$ docker-machine ip machine-name</ | + | === Список запущеных контейнеров === |
- | == отключение == | + | <code bash> |
+ | $ docker ps | ||
+ | CONTAINER ID IMAGE COMMAND | ||
+ | a50423920e0d | ||
+ | fa24abd60049 | ||
+ | </ | ||
- | <code bash>$ docker-machine stop machine-name</ | + | === Подсоеденение к контейнеру === |
- | == удаление | + | <note tip> |
- | <code bash>$ docker-machine rm machine-name</ | + | <code bash> |
+ | $ sudo docker | ||
+ | $ sudo docker exec -i -t a50423920e0d /bin/sh | ||
+ | </ | ||
- | == список удаленных хостов | + | ==== Запустить контейнер ==== |
- | <code bash>$ docker-machine ls</ | + | <code bash>$ docker |
- | === Сценарии === | + | ==== Остановить контейнер ==== |
- | == 1 Сценарий == | + | <code bash>$ docker stop a50423920e0d</ |
- | <code bash>$ wget https:// | + | ==== Пребить контейнер ==== |
- | Чтобы завершить установку этого файла, нужно | + | < |
- | < | + | ===== Использование docker-composer.yml ===== |
- | Этот файл содержит три строки, которые начинаются с PS1: | + | <note important> |
+ | $ docker-compose | ||
+ | $ docker-compose exec | ||
+ | </ | ||
- | < | + | <hidden docker-composer.yml> |
- | PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' | + | < |
- | PS1="\[\e]0;${debian_chroot: | + | version: ' |
+ | services: | ||
+ | mariadb: | ||
+ | build: ./ | ||
+ | restart: always | ||
+ | environment: | ||
+ | MYSQL_ROOT_PASSWORD: | ||
+ | MYSQL_DATABASE: | ||
+ | MYSQL_USER: skringo | ||
+ | MYSQL_PASSWORD: | ||
+ | ports: | ||
+ | - ' | ||
+ | expose: | ||
+ | - ' | ||
+ | volumes: | ||
+ | - ' | ||
+ | redis: | ||
+ | build: ./ | ||
+ | restart: always | ||
+ | environment: | ||
+ | - REDIS_VERSION=4.0.9 | ||
+ | ports: | ||
+ | - '6379:6379' | ||
+ | expose: | ||
+ | - '6379' | ||
+ | | ||
+ | container_name: | ||
+ | hostname: redis-commander | ||
+ | image: rediscommander/ | ||
+ | build: . | ||
+ | restart: always | ||
+ | environment: | ||
+ | - REDIS_HOSTS=local: | ||
+ | ports: | ||
+ | - 8081:8081 | ||
+ | nginx: | ||
+ | build: ./ | ||
+ | restart: always | ||
+ | links: | ||
+ | - php | ||
+ | volumes: | ||
+ | - './:/ | ||
+ | - ' | ||
+ | - ' | ||
+ | environment: | ||
+ | - NGINX_VERSION=1.13.12-1~stretch | ||
+ | - NGINX_HOST=skringo.loc | ||
+ | - NGINX_PORT=80 | ||
+ | ports: | ||
+ | - ' | ||
+ | command: 'sh -c "envsubst | ||
+ | elasticsearch: | ||
+ | build: ./ | ||
+ | restart: always | ||
+ | ports: | ||
+ | - ' | ||
+ | expose: | ||
+ | - ' | ||
+ | environment: | ||
+ | - ELASTICSEARCH_VERSION=5.6.9 | ||
+ | - JAVA_ALPINE_VERSION=8.151.12-r0 | ||
+ | - JAVA_VERSION=8u151 | ||
+ | - LANG=C.UTF-8 | ||
+ | - cluster.name=docker-cluster | ||
+ | - bootstrap.memory_lock=true | ||
+ | - " | ||
+ | ulimits: | ||
+ | memlock: | ||
+ | soft: -1 | ||
+ | hard: -1 | ||
+ | mem_limit: 1g | ||
+ | kibana: | ||
+ | build: ./ | ||
+ | links: | ||
+ | - elasticsearch | ||
+ | ports: | ||
+ | - ' | ||
+ | php: | ||
+ | build: ./ | ||
+ | restart: always | ||
+ | links: | ||
+ | - mariadb | ||
+ | - redis | ||
+ | - elasticsearch | ||
+ | ports: | ||
+ | - ' | ||
+ | expose: | ||
+ | - ' | ||
+ | - ' | ||
+ | environment: | ||
+ | - PHP_IDE_CONFIG=serverName=skringo.loc | ||
+ | volumes: | ||
+ | - ' | ||
+ | - ' | ||
+ | - ' | ||
+ | - ' | ||
- | В конец каждой строки нужно вставить | + | networks: |
+ | default: | ||
+ | external: | ||
+ | name: nginx-proxy | ||
+ | </code> | ||
+ | </hidden> | ||
- | < | + | ==== Подсоеденение к контейнеру ==== |
- | PS1=' | + | |
- | PS1=" | + | |
- | Теперь имя | + | <code bash>$ docker-compose exec php / |
+ | Где php название | ||
- | == 2 Сценарий == | + | ==== Запуск с использованием локального конфига ==== |
- | Второй сценарий называется | + | <code bash> |
- | <code bash>$ wget https:// | + | ==== Сети ==== |
- | == 3 Сценарий == | + | === Сетевые драйверы === |
- | Последний сценарий называется docker-machine.bash. Он отвечает | + | **bridge**: |
+ | Если вы не указываете драйвер, | ||
+ | Мостовые сети обычно используются, | ||
- | <code bash>$ wget https:// | + | **host**: для автономных контейнеров, |
+ | Хост доступен только для служб swarm в Docker версии 17.06 и выше. | ||
- | Чтобы активировать внесённые изменения, закройте и снова откройте терминал. Если вы находитесь в сессии SSH, закройте и снова | + | **overlay**: |
- | ===== Контейнер | + | Вы также можете использовать overlay сети для облегчения |
+ | Или между двумя | ||
+ | Эта стратегия устраняет необходимость | ||
- | ==== О контейнере | + | **macvlan**: |
+ | Демон Docker направляет трафик в контейнеры по их MAC-адресам. | ||
+ | Использование драйвера macvlan иногда является лучшим выбором при работе с устаревшими приложениями. | ||
+ | Приложениям, | ||
- | <code bash> | + | **none**: для этого контейнера отключит все сети. |
- | $ docker info | + | Обычно используется в сочетании с пользовательским сетевым драйвером. Ни один не доступен для swarm услуг |
- | Containers: 9 | + | === Установка |
- | | + | |
- | | + | |
- | | + | |
- | Images: 28 | + | |
- | Server Version: 1.12.5 | + | |
- | Storage Driver: aufs | + | |
- | Root Dir: / | + | |
- | | + | |
- | Dirs: 90 | + | |
- | | + | |
- | Logging Driver: json-file | + | |
- | Cgroup Driver: cgroupfs | + | |
- | Plugins: | + | |
- | | + | |
- | | + | |
- | Swarm: inactive | + | |
- | Runtimes: runc | + | |
- | Default Runtime: runc | + | |
- | Security Options: seccomp | + | |
- | Kernel Version: 3.16.0-4-amd64 | + | |
- | Operating System: Debian GNU/Linux stretch/ | + | |
- | OSType: linux | + | |
- | Architecture: | + | |
- | CPUs: 2 | + | |
- | Total Memory: 7.8 GiB | + | |
- | Name: nas.ztc | + | |
- | ID: 6JPA: | + | |
- | Docker Root Dir: / | + | |
- | Debug Mode (client): false | + | |
- | Debug Mode (server): false | + | |
- | Registry: https:// | + | |
- | WARNING: No memory limit support | + | |
- | WARNING: No swap limit support | + | |
- | WARNING: No kernel memory limit support | + | |
- | WARNING: No oom kill disable support | + | |
- | WARNING: No cpu cfs quota support | + | |
- | WARNING: No cpu cfs period support | + | |
- | Insecure Registries: | + | |
- | | + | |
- | </ | + | |
- | + | ||
- | ==== Статус ==== | + | |
<code bash> | <code bash> | ||
- | $ docker | + | $ docker |
- | + | $ docker network create --driver=bridge bridge-network | |
- | CONTAINER | + | $ docker network create -d overlay my-multihost-network |
- | c8d1eb7a8f7a | + | $ docker network create --driver overlay overlay_network |
- | 271073504ac9 | + | $ docker network create --subnet |
- | 462c8942181f | + | $ docker network create nginx-proxy |
- | 94e2422ce234 | + | |
- | 6a43329858d9 | + | |
- | 404d5b6bf024 | + | |
</ | </ | ||
- | ==== Работа с контейнером ==== | + | === Использование === |
<code bash> | <code bash> | ||
- | $ docker | + | $ docker |
- | $ docker | + | $ docker |
</ | </ | ||
- | ==== Список контейнеров (запущенных и нет) ==== | + | === Аанализ сетей === |
<code bash> | <code bash> | ||
- | $ docker | + | $ docker |
- | CONTAINER ID IMAGE | + | $ docker |
- | c8d1eb7a8f7a | + | $ docker |
- | 271073504ac9 | + | |
- | 462c8942181f | + | |
- | 94e2422ce234 | + | |
- | 6a43329858d9 | + | |
- | 404d5b6bf024 | + | |
</ | </ | ||
- | * -a - Позволяет увидеть | + | ====== Особенности работы с MAC OS ====== |
- | * -l - Выведет | + | |
- | * где docker-grand-ambassador прокси для 2-ух направленной связи контейнеров | + | |
- | * curl -L http:// | + | |
- | + | ||
- | ==== Остановка контейнера | + | |
- | + | ||
- | < | + | |
- | $ docker stop 7d0eb5cd3b3b | + | |
- | </ | + | |
- | + | ||
- | ==== Удаление контейнера | + | |
- | + | ||
- | <code bash> | + | |
- | $ docker rm 7d0eb5cd3b3b | + | |
- | </ | + | |
- | ===== Образы ===== | + | Все контейнеры в MAC OS находятся в виртуальной машине qcow2 и находятся по адресу |
+ | / | ||
+ | * где mirocow имя вашего пользователя | ||
<note tip> | <note tip> | ||
**screen ~/ | **screen ~/ | ||
- | ==== Поиск образов ==== | ||
- | <code bash>$ docker search alpine</ | + | ====== Автоматический запуск контейнеров в Debian ====== |
- | ==== Загрузка образа в систему | + | ===== System V ===== |
+ | nano / | ||
<code bash> | <code bash> | ||
- | $ docker pull alpine | + | #!/bin/sh |
- | $ docker pull alpine: | + | |
- | </code> | + | |
- | ==== Чистые образы ==== | + | |
- | * https:// | + | ### BEGIN INIT INFO |
- | * https://hub.docker.com/ | + | # Provides: portainer |
- | * https://hub.docker.com/ | + | # Required-Start: $docker |
+ | # Required-Stop: $docker | ||
+ | # Default-Start: | ||
+ | # Default-Stop: | ||
+ | # Short-Description: | ||
+ | ### END INIT INFO | ||
- | ==== Готовые сервисы ==== | + | set -e |
- | * https://hub.docker.com/r/mvertes/alpine-mongo/ (mvertes/ | + | PROJECT_NAME=portainer |
- | * https:// | + | YAMLFILE=/var/lib/jenkins/workspace/portainer/docker-compose.yml |
- | * https:// | + | OPTS="-f $YAMLFILE |
- | * https:// | + | UPOPTS=" |
- | * https:// | + | |
- | * https:// | + | |
- | * https:// | + | |
- | * https:// | + | |
- | * https:// | + | |
- | * https:// | + | |
- | ==== Готовые сборки ==== | + | . / |
- | * https:// | + | case " |
- | * https:// | + | start) |
- | * https:// | + | |
- | * https:// | + | docker-compose $OPTS up $UPOPTS |
- | * https:// | + | ;; |
- | ==== Создание образа ==== | + | |
- | <code bash> | + | stop) |
- | $ docker | + | |
- | </ | + | |
+ | ;; | ||
- | * Где . папка, где расположен Dockerfile | + | reload) |
- | * container-name - название создаваемого контейнера | + | |
+ | docker-compose $OPTS up $UPOPTS | ||
+ | ;; | ||
- | ==== Вывод списка образов ==== | + | restart) |
+ | docker-compose $OPTS stop | ||
+ | docker-compose $OPTS up $UPOPTS | ||
+ | ;; | ||
- | <code bash> | + | status) |
- | $ docker | + | |
- | </ | + | if [ ! -z " |
+ | echo " | ||
+ | fi | ||
+ | ;; | ||
- | ==== Запуск образа ==== | + | *) |
+ | log_action_msg " | ||
+ | exit 1 | ||
+ | ;; | ||
+ | esac | ||
- | <code bash> | + | exit 0 |
- | $ docker run -d -p 80:80 -t image-name | + | |
- | $ docker run -d --publish 8080:80 -t image-name | + | |
</ | </ | ||
- | * 8080 - Порт хост машины | + | ===== System D ===== |
- | * 80 - Порт контейнера | + | |
- | * -i - откроет интерактивную оболочку контейнера (лучше не использова, | + | |
- | * -t - название запускаемого контейнера | + | |
- | ===== Пример управления контейнером из другого контейнера ===== | + | nano / |
+ | <code bash> | ||
+ | [Unit] | ||
+ | Description=Portainer service with docker-compose | ||
+ | Requires=docker.service | ||
+ | After=docker.service | ||
- | <code bash>$ docker run -v / | + | [Service] |
- | -v $(which docker):/ | + | Restart=always |
- | -ti nachine_name</ | + | |
- | ===== Пространства ===== | + | WorkingDirectory=/ |
- | Применяется для монтирования пространств из внешних источников. К примеру virtualbox | + | # Remove old containers, network and volumes |
+ | ExecStartPre=/ | ||
+ | ExecStartPre=-/ | ||
+ | ExecStartPre=-/ | ||
- | * https://docs.docker.com/engine/extend/plugins_volume/ | + | # Compose up |
+ | ExecStart=/usr/bin/docker-compose -f /var/lib/jenkins/workspace/ | ||
- | ===== Сетевые драйверы ===== | + | # Compose down, remove containers |
- | + | ExecStop=/usr/bin/docker-compose -f /var/lib/jenkins/workspace/portainer/docker-compose.yml down | |
- | * https:// | + | |
- | + | ||
- | ===== Логирование ===== | + | |
- | + | ||
- | * https://docs.docker.com/engine/ | + | |
- | + | ||
- | ====== Рецепты ====== | + | |
- | + | ||
- | * [[system:docker: | + | |
- | * https:// | + | |
- | * https://github.com/trntv/yii2-starter-kit | + | |
- | * https://github.com/ | + | |
- | * https:// | + | |
+ | [Install] | ||
+ | WantedBy=multi-user.target | ||
+ | </ | ||
====== Проблемы и их решения ====== | ====== Проблемы и их решения ====== | ||
- | ===== Circular import between fpm and nginx ===== | + | ==== Circular import between fpm and nginx ==== |
Возникает при циклическом связывании контейнеров (2-ух сторонее связывание) | Возникает при циклическом связывании контейнеров (2-ух сторонее связывание) | ||
Строка 439: | Строка 469: | ||
</ | </ | ||
- | ===== ERROR: Couldn' | + | ==== ERROR: Couldn' |
скорее всего вам потребуется сделать следующее: | скорее всего вам потребуется сделать следующее: | ||
<code bash>$ docker-machine create --driver=xhyve dev --xhyve-experimental-nfs-share</ | <code bash>$ docker-machine create --driver=xhyve dev --xhyve-experimental-nfs-share</ | ||
+ | |||
====== Компоненты ====== | ====== Компоненты ====== | ||
* [[https:// | * [[https:// | ||
+ | * [[https:// | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
Строка 451: | Строка 483: | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | ====== Репозитории ====== | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
====== Документация / Статьи ====== | ====== Документация / Статьи ====== | ||
+ | * [[system: | ||
+ | * http:// | ||
* [[https:// | * [[https:// | ||
* [[http:// | * [[http:// | ||
Строка 472: | Строка 516: | ||
* https:// | * https:// | ||
* https:// | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
- | ====== | + | ====== |
- | {{topic> | + | {{topic> |