This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
технология_docker [2022/09/23 06:53] val [Создание контейнера для приложения вручную] |
технология_docker [2024/05/30 08:05] (current) val [Настройка registry-mirrors] |
||
---|---|---|---|
Line 14: | Line 14: | ||
===== Установка ===== | ===== Установка ===== | ||
- | ==== Ubuntu ==== | + | ==== Ubuntu/Debian ==== |
* [[https://docs.docker.com/engine/install/ubuntu/|Install Docker Engine on Ubuntu]] | * [[https://docs.docker.com/engine/install/ubuntu/|Install Docker Engine on Ubuntu]] | ||
+ | * [[https://docs.docker.com/engine/installation/linux/docker-ce/debian/|Get Docker CE for Debian]] | ||
<code> | <code> | ||
# apt install docker.io | # apt install docker.io | ||
</code> | </code> | ||
- | ==== Debian ==== | ||
- | |||
- | * [[https://docs.docker.com/engine/installation/linux/docker-ce/debian/|Get Docker CE for Debian]] | ||
=== Debian 10 === | === Debian 10 === | ||
Line 36: | Line 34: | ||
# apt install docker-ce docker-ce-cli containerd.io | # apt install docker-ce docker-ce-cli containerd.io | ||
+ | </code> | ||
+ | |||
+ | ==== Настройка registry-mirrors ==== | ||
+ | |||
+ | * [[https://habr.com/ru/news/818177/|Docker hub перестал работать в России]] | ||
+ | |||
+ | <code> | ||
+ | # cat /etc/docker/daemon.json | ||
+ | </code><code> | ||
+ | { | ||
+ | "registry-mirrors": ["https://mirror.gcr.io"] | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Настройка загрузки образов через proxy ==== | ||
+ | |||
+ | * [[Переменные окружения]] | ||
+ | |||
+ | <code> | ||
+ | # systemctl edit docker.service | ||
+ | </code><code> | ||
+ | ... | ||
+ | [Service] | ||
+ | #Environment="http_proxy=http://proxy.isp.un:3128/" | ||
+ | Environment="https_proxy=http://proxy.isp.un:3128/" | ||
+ | Environment="no_proxy=localhost,127.0.0.1,isp.un,corpX.un" | ||
+ | ... | ||
+ | </code><code> | ||
+ | # systemctl daemon-reload | ||
+ | |||
+ | # service docker restart | ||
</code> | </code> | ||
==== Тестирование установки ==== | ==== Тестирование установки ==== | ||
+ | |||
<code> | <code> | ||
# systemctl status docker | # systemctl status docker | ||
Line 51: | Line 81: | ||
<code> | <code> | ||
# usermod -aG docker gitlab-runner | # usermod -aG docker gitlab-runner | ||
+ | |||
+ | # su - gitlab-runner | ||
</code> | </code> | ||
===== Работа с образами и контейнерами ===== | ===== Работа с образами и контейнерами ===== | ||
+ | * [[https://www.baeldung.com/ops/docker-image-layers-sizes|Finding the Layers and Layer Sizes for a Docker Image]] | ||
+ | * [[https://stackoverflow.com/questions/37966973/what-is-the-difference-between-the-size-and-the-virtual-size-of-the-docker-image|What is the difference between the size and the virtual size of the docker images?]] | ||
+ | * [[https://docs.docker.com/engine/reference/commandline/system_prune/|docker system prune - Remove unused data]] | ||
* [[Сервис Grafana]] | * [[Сервис Grafana]] | ||
==== Обзор и удаление ==== | ==== Обзор и удаление ==== | ||
Line 60: | Line 95: | ||
# docker images | # docker images | ||
- | # docker ps -a | + | # docker ps -a #--size |
# docker container ls -a | # docker container ls -a | ||
Line 72: | Line 107: | ||
# docker rmi -f $(docker images -aq) | # docker rmi -f $(docker images -aq) | ||
+ | |||
+ | # docker system prune | ||
# docker system prune -a --volumes | # docker system prune -a --volumes | ||
</code> | </code> | ||
+ | ==== Копирование файлов в контейнер ==== | ||
+ | |||
+ | <code> | ||
+ | root@webinar:~# docker cp ca.crt greenlight-v3:/usr/local/share/ca-certificates/ | ||
+ | |||
+ | root@webinar:~# docker exec -ti greenlight-v3 /usr/sbin/update-ca-certificates | ||
+ | |||
+ | root@webinar:~# docker exec greenlight-v3 wget -O /dev/null https://keycloak.corp13.un | ||
+ | |||
+ | root@webinar:~# docker commit greenlight-v3 bigbluebutton/greenlight:v3 | ||
+ | </code> | ||
Line 103: | Line 151: | ||
</code> | </code> | ||
- | "Забыли" сделать скрипт start.sh "выполнимым" нажали Ctrl+D | + | * Ctrl+D |
<code> | <code> | ||
- | server# docker diff webd | + | server# docker ps -a |
+ | server# docker diff webd | ||
+ | </code> | ||
+ | * Методически, "вспомнили", что "забыли" сделать скрипт start.sh "выполнимым" | ||
+ | <code> | ||
server# docker start webd | server# docker start webd | ||
Line 115: | Line 167: | ||
</code> | </code> | ||
- | * Методически, можно уже на этом этапе запустить скрипт, отключится от контейнера без его остановки, выяснить назначенный контейнеру ip, проверить работу приложения (curl --noproxy '*' http://172.17.0.2/) и если все работает, делать commit | + | * Методически, можно уже на этом этапе: запустить скрипт ./start.sh, отключится от контейнера без его остановки Ctrl+P, Q(still holding Ctrl), выяснить через docker inspect webd назначенный контейнеру ip, проверить через curl работу приложения и, если все работает (правда, будет сообщение, что такого файла нет), сделать docker stop webd, и commit |
* [[https://cpab.ru/kak-rabotajut-tegi-docker-cloudsavvy-it/|Как работают теги Docker?]] | * [[https://cpab.ru/kak-rabotajut-tegi-docker-cloudsavvy-it/|Как работают теги Docker?]] | ||
+ | |||
+ | * [[https://code.tutsplus.com/ru/tutorials/docker-from-the-ground-up-understanding-images--cms-28165|Докер с нуля: понимание слоев образов]] | ||
+ | * Пакет RSYNC - [[Пакет RSYNC#Инкрементное копирование (Incremental Backup)]] | ||
<code> | <code> | ||
server# docker commit webd test/webd | server# docker commit webd test/webd | ||
+ | |||
+ | gitlab-runner@server:~$ docker images | ||
</code> | </code> | ||
- | * [[#Запуск в режиме демона и подключение к контейнеру]] | + | * [[#Запуск в режиме демона и подключение к контейнеру]] из полученного образа |
==== Создание контейнера для приложения с использованием Dockerfile ==== | ==== Создание контейнера для приложения с использованием Dockerfile ==== | ||
* [[Сервис TACACS+]] | * [[Сервис TACACS+]] | ||
- | * [[Средства программирования shell#Web сервер на shell]] | ||
<code> | <code> | ||
- | server# mkdir /root/webd/ && cd /root/webd/ | + | server# mkdir -p /root/webd/ && cd /root/webd/ |
или | или | ||
- | gitlab-runner@server:~$ mkdir -p webd/webd/ && cd webd/webd/ | + | gitlab-runner@server:~$ mkdir -p ~/webd/webd/ && cd ~/webd/webd/ |
- | server# mv /usr/local/sbin/webd . | + | server# cp /usr/local/sbin/webd . |
+ | lan:~/webd# scp server:/usr/local/sbin/webd . | ||
+ | или | ||
+ | </code> | ||
+ | * [[Средства программирования shell#Web сервер на shell]] | ||
+ | <code> | ||
+ | gitlab-runner@server:~/webd/webd$ nano webd # добавляем закомментированные строки | ||
server# ###tar -cvzf www.tgz -C /var/ www/ | server# ###tar -cvzf www.tgz -C /var/ www/ | ||
Line 157: | Line 219: | ||
#FROM debian:buster | #FROM debian:buster | ||
FROM debian:bullseye | FROM debian:bullseye | ||
+ | #FROM debian:bookworm | ||
- | RUN apt-get update && apt-get install -y inetutils-inetd file && echo 'www stream tcp nowait root /usr/local/sbin/webd webd' > /etc/inetd.conf | + | RUN cp /usr/share/zoneinfo/Etc/GMT-3 /etc/localtime \ |
+ | && apt-get update \ | ||
+ | && apt-get install -y inetutils-inetd file \ | ||
+ | && apt-get clean \ | ||
+ | && echo 'www stream tcp nowait root /usr/local/sbin/webd webd' > /etc/inetd.conf | ||
COPY start.sh / | COPY start.sh / | ||
Line 164: | Line 231: | ||
### ADD www.tgz /var/ | ### ADD www.tgz /var/ | ||
- | ### for helm releases test | + | ### for helm readiness/liveness Probe |
### COPY index.html /var/www/ | ### COPY index.html /var/www/ | ||
Line 177: | Line 244: | ||
</code> | </code> | ||
- | ==== Запуск в режиме демона и подключение к контейнеру ==== | + | === Dockerfile Multistage Building === |
+ | |||
+ | * [[Язык программирования Golang]] | ||
+ | * [[https://habr.com/ru/articles/647255/|Рекомендации по работе с Docker для Golang-разработчиков (Multistage Building)]] | ||
+ | * [[https://www.docker.com/blog/containerize-your-go-developer-environment-part-2/|Containerize Your Go Developer Environment – Part 2]] | ||
<code> | <code> | ||
- | 1-й раз - запуск образа сделанного "вручную" | + | student@client1:~/gowebd$ cat Dockerfile |
+ | </code><code> | ||
+ | FROM golang | ||
+ | #FROM golang as builder | ||
- | server# docker run --name webd01 --hostname webd01 -itd -v /var/www/:/var/www/ -p 8000:80 test/webd /start.sh | + | WORKDIR /build |
+ | COPY . . | ||
+ | RUN test -e go.mod || go mod init gowebd | ||
- | 2-й раз - через Dockerfile задан entrypoint и expose, ключ --rm для удаления контейнера после остановки | + | #ENV CGO_ENABLED=0 |
+ | RUN go build -o /gowebd | ||
+ | #FROM alpine | ||
+ | #COPY --from=builder /gowebd /gowebd | ||
+ | |||
+ | ENTRYPOINT ["/gowebd"] | ||
+ | </code><code> | ||
+ | student@client1:~/gowebd$ docker images | ||
+ | |||
+ | student@client1:~/gowebd$ time docker build -t gowebd . | ||
+ | real 6m2.564s | ||
+ | |||
+ | student@client1:~/gowebd$ docker run -d -p 8080:80 --rm gowebd | ||
+ | </code> | ||
+ | ==== Запуск в режиме демона и подключение к контейнеру ==== | ||
+ | |||
+ | 1-й пример - запуск образа сделанного "вручную", можно запустить несколько экземпляров с -p 80 выяснить назначенные порты, настроить keepalived и провести нагрузочное тестирование | ||
+ | <code> | ||
+ | server# docker run --name webd01 --hostname webd01 -itd -v /var/www/:/var/www/ -p 8000:80 test/webd /start.sh | ||
+ | </code> | ||
+ | 2-й пример - через Dockerfile задан entrypoint и expose, ключ --rm для удаления контейнера после остановки, добавить, при необходимости, -v | ||
+ | <code> | ||
server# docker run --name webd01 -e MYMODE=TEST -itd --rm -P test/webd | server# docker run --name webd01 -e MYMODE=TEST -itd --rm -P test/webd | ||
+ | </code> | ||
+ | 3-й раз - запустить несколько экземпляров, указав параметры для подключения внешнего каталога /var/www/, выяснить назначенные порты, настроить keepalived, по журналам определять какой контейнер используется | ||
+ | === Процессы контейнера и системы === | ||
+ | |||
+ | * [[Технология cgroup]] | ||
+ | * [[https://www.baeldung.com/ops/docker-memory-limit|Setting Memory And CPU Limits In Docker]] | ||
+ | * [[https://stackoverflow.com/questions/72185669/what-is-the-real-memory-available-in-docker-container|What is the real memory available in Docker container?]] | ||
+ | * [[Технология namespaces]] | ||
+ | |||
+ | |||
+ | <code> | ||
server# docker top webd01 | server# docker top webd01 | ||
server# ps axw | grep inetd | server# ps axw | grep inetd | ||
+ | server# ps axw | grep start.sh | ||
+ | |||
server# cat /proc/<PID>/cgroup | server# cat /proc/<PID>/cgroup | ||
+ | server# systemd-cgls | ||
+ | |||
+ | cgroup-v1# cat /sys/fs/cgroup/memory/docker/NNNNNNNNNNNNNNNNNNNNNNNNNNNNN/memory.max_usage_in_bytes | ||
+ | cgroup-v2# cat /sys/fs/cgroup/system.slice/docker-NNNNNNNNNNNNNNNNNNNNNNNNNNNNN.scope/memory.max | ||
+ | |||
+ | server# docker stats | ||
+ | |||
+ | server# lsns | grep start.sh | ||
</code> | </code> | ||
- | * [[Технология cgroup]] | + | === Анализ параметров запущенного контейнера === |
<code> | <code> | ||
- | server# cat /sys/fs/cgroup/system.slice/docker-NNNNNNNNNNNNNNNNNNNNNNNNNNNNN.scope/memory.max | ||
- | |||
server# docker inspect webd01 | server# docker inspect webd01 | ||
Line 201: | Line 318: | ||
server# wget -qO - http://172.17.0.2/ | server# wget -qO - http://172.17.0.2/ | ||
- | server$ curl http://172.17.0.2/ | + | server$ curl --noproxy '*' http://172.17.0.2/ |
server# docker port webd01 | server# docker port webd01 | ||
Line 216: | Line 333: | ||
server# docker attach webd01 | server# docker attach webd01 | ||
+ | |||
+ | server# docker exec -it webd01 bash | ||
webd01# ps ax | webd01# ps ax | ||
Line 221: | Line 340: | ||
webd01# ls /proc/ | webd01# ls /proc/ | ||
webd01# cat /proc/1/cmdline | webd01# cat /proc/1/cmdline | ||
+ | |||
+ | webd01# ss -tpan | ||
+ | или | ||
+ | webd01# cat /proc/net/tcp | ||
+ | webd01# cat /proc/net/tcp6 | ||
Ctrl+P, Q(still holding Ctrl) | Ctrl+P, Q(still holding Ctrl) | ||
Line 234: | Line 358: | ||
server# docker stop webd01 && docker rm webd01 | server# docker stop webd01 && docker rm webd01 | ||
</code> | </code> | ||
+ | |||
==== Микросервисы ==== | ==== Микросервисы ==== | ||
Line 260: | Line 385: | ||
# docker stop sftp01 | # docker stop sftp01 | ||
+ | |||
+ | # docker rm sftp01 | ||
</code> | </code> | ||
Line 266: | Line 393: | ||
* [[https://habr.com/ru/company/ruvds/blog/450312/|Руководство по Docker Compose для начинающих]] | * [[https://habr.com/ru/company/ruvds/blog/450312/|Руководство по Docker Compose для начинающих]] | ||
* [[https://stackoverflow.com/questions/39663096/docker-compose-creating-multiple-instances-for-the-same-image|docker-compose creating multiple instances for the same image]] | * [[https://stackoverflow.com/questions/39663096/docker-compose-creating-multiple-instances-for-the-same-image|docker-compose creating multiple instances for the same image]] | ||
+ | |||
+ | * [[Инструмент GitLab#Установка через docker-compose]] GitLab | ||
+ | * Установка через [[Сервис Keycloak#docker-compose]] Keycloak | ||
+ | |||
<code> | <code> | ||
Line 315: | Line 446: | ||
# docker volume rm root_vol1 | # docker volume rm root_vol1 | ||
+ | |||
+ | gitlab-runner@server:~/webd$ docker-compose up -d --scale webd=N | ||
+ | |||
+ | gitlab-runner@server:~/webd$ docker ps | ||
+ | |||
+ | gitlab-runner@server:~/webd$ docker-compose down | ||
</code><code> | </code><code> | ||
- | node2_3# cat docker-compose.yml | + | gitlab-runner@server:~/webd$ cat docker-compose.yml |
</code><code> | </code><code> | ||
version: "3" | version: "3" | ||
Line 330: | Line 467: | ||
replicas: 3 | replicas: 3 | ||
</code><code> | </code><code> | ||
- | node1,2,3# docker-compose up -d --scale webd=3 | + | node1,2,3# docker-compose --compatibility up -d |
- | или | ||
- | |||
- | node1,2,3# docker-compose --compatibility up -d | ||
node1,2,3# docker-compose --compatibility down | node1,2,3# docker-compose --compatibility down | ||
- | + | node1,2,3# docker ps -q | xargs -l docker port | sort -n | |
- | node1,2,3# docker ps -q | xargs -l docker port | + | |
</code> | </code> | ||
Line 351: | Line 484: | ||
# cat /etc/docker/daemon.json | # cat /etc/docker/daemon.json | ||
</code><code> | </code><code> | ||
- | ... | ||
{ | { | ||
"insecure-registries" : ["server.corpX.un:5000"] | "insecure-registries" : ["server.corpX.un:5000"] | ||
} | } | ||
- | ... | ||
</code><code> | </code><code> | ||
# service docker restart | # service docker restart | ||
Line 361: | Line 492: | ||
gitlab-runner@server:~$ docker login http://server.corpX.un:5000 | gitlab-runner@server:~$ docker login http://server.corpX.un:5000 | ||
- | # less ~/.docker/config.json | + | gitlab-runner@server:~$ less ~/.docker/config.json |
</code><code> | </code><code> | ||
{ | { | ||
"auths": { | "auths": { | ||
- | "server.corp13.un:5000": { | + | "server.corpX.un:5000": { |
- | "auth": "c3R1ZGVudDpwYXNzd29yZA==" | + | "auth": "c3R1ZGVudDpQYSQkdzByZA==" |
} | } | ||
} | } | ||
Line 375: | Line 506: | ||
<code> | <code> | ||
+ | gitlab-runner@server:~$ docker images | ||
+ | |||
gitlab-runner@server:~$ docker tag test/webd server.corpX.un:5000/student/webd | gitlab-runner@server:~$ docker tag test/webd server.corpX.un:5000/student/webd | ||
gitlab-runner@server:~$ docker tag test/webd server.corpX.un:5000/student/webd:1.1 | gitlab-runner@server:~$ docker tag test/webd server.corpX.un:5000/student/webd:1.1 | ||
Line 384: | Line 517: | ||
... | ... | ||
node1_2_3# docker run --name webd01 --hostname webd01 -itd --rm -p 8000:80 server.corpX.un:5000/student/webd | node1_2_3# docker run --name webd01 --hostname webd01 -itd --rm -p 8000:80 server.corpX.un:5000/student/webd | ||
+ | |||
+ | node1_2_3# docker run --name webd0N --hostname webd0N -itd --rm -P -v /var/www/:/var/www/ server.corpX.un:5000/student/webd | ||
</code> | </code> | ||
- | ==== Использование образа Docker Registry ==== | + | ==== Secure Private Registry ==== |
+ | |||
+ | * [[Пакет OpenSSL#Импорт сертификата центра сертификации]] | ||
+ | |||
+ | <code> | ||
+ | # docker pull server.corp13.un:5050/student/gowebd | ||
+ | |||
+ | # docker login server.corp13.un:5050 | ||
+ | </code> | ||
+ | ==== Использование образа Docker Registry и on-premise CA ==== | ||
* [[https://docs.docker.com/registry/|Docker Registry]] | * [[https://docs.docker.com/registry/|Docker Registry]] | ||
Line 403: | Line 547: | ||
node1# curl --insecure -X GET https://gate.corp13.un:5000/v2/_catalog | node1# curl --insecure -X GET https://gate.corp13.un:5000/v2/_catalog | ||
{"repositories":["webd"]} | {"repositories":["webd"]} | ||
+ | |||
+ | val@gitlab-vkube:~$ curl -s https://gitlab-vkube.bmstu.ru:5000/v2/postgresql/tags/list | jq | ||
+ | { | ||
+ | "name": "postgresql", | ||
+ | "tags": [ | ||
+ | "13" | ||
+ | ] | ||
+ | } | ||
</code> | </code> | ||
+ | |||
+ | ===== Дополнительная информация ===== | ||
+ | |||
+ | ==== Приложение apwebd ==== | ||
+ | |||
+ | <code> | ||
+ | ~/apwebd$ cat Dockerfile | ||
+ | </code><code> | ||
+ | FROM debian:bookworm | ||
+ | |||
+ | RUN cp /usr/share/zoneinfo/Etc/GMT-3 /etc/localtime \ | ||
+ | && apt-get update \ | ||
+ | && apt-get install -y findutils gettext-base apache2 libapache2-mod-auth-openidc \ | ||
+ | && apt-get clean \ | ||
+ | && a2enmod cgid \ | ||
+ | && a2enmod auth_openidc | ||
+ | |||
+ | COPY rootfs/ / | ||
+ | |||
+ | EXPOSE 80 | ||
+ | |||
+ | ENTRYPOINT ["/start.sh"] | ||
+ | </code><code> | ||
+ | ~/apwebd$ find rootfs/ -type f | xargs tail -n +1 | ||
+ | </code><code> | ||
+ | ==> rootfs/var/www/html/index.html.apwebd-template <== | ||
+ | </code><code> | ||
+ | <HTML> | ||
+ | <HEAD> | ||
+ | <META HTTP-EQUIV="Refresh" CONTENT="10;URL=/cgi-bin/apwebd/"> | ||
+ | </HEAD> | ||
+ | <BODY text="blue"> | ||
+ | <H1><A HREF=/cgi-bin/apwebd/>Login to ${APWEBD_HOSTNAME}</A></H1> | ||
+ | Version: 1.2 | ||
+ | </BODY> | ||
+ | </HTML> | ||
+ | </code><code> | ||
+ | ==> rootfs/start.sh <== | ||
+ | </code><code> | ||
+ | #!/bin/sh | ||
+ | |||
+ | [ "$APWEBD_HOSTNAME" ] || { echo Please set env APWEBD_HOSTNAME; exit; } | ||
+ | [ "$KEYCLOAK_HOSTNAME" ] || { echo Please set env KEYCLOAK_HOSTNAME; exit; } | ||
+ | [ "$REALM_NAME" ] || { echo Please set env REALM_HOSTNAME; exit; } | ||
+ | |||
+ | find / -type f -name '*.apwebd-template' | while read -r FILE; do envsubst < "$FILE" > "${FILE%.apwebd-template}"; done | ||
+ | |||
+ | /etc/init.d/apache2 start | ||
+ | |||
+ | tail -f /var/log/apache2/error.log -f /var/log/apache2/access.log | ||
+ | |||
+ | </code><code> | ||
+ | ==> rootfs/etc/apache2/conf-available/serve-cgi-bin.conf.apwebd-template <== | ||
+ | </code><code> | ||
+ | <IfModule mod_alias.c> | ||
+ | <IfModule mod_cgi.c> | ||
+ | Define ENABLE_USR_LIB_CGI_BIN | ||
+ | </IfModule> | ||
+ | |||
+ | <IfModule mod_cgid.c> | ||
+ | Define ENABLE_USR_LIB_CGI_BIN | ||
+ | </IfModule> | ||
+ | |||
+ | <IfDefine ENABLE_USR_LIB_CGI_BIN> | ||
+ | |||
+ | OIDCSSLValidateServer Off | ||
+ | OIDCProviderMetadataURL https://${KEYCLOAK_HOSTNAME}/realms/${REALM_NAME}/.well-known/openid-configuration | ||
+ | OIDCRedirectURI http://${APWEBD_HOSTNAME}/cgi-bin/apwebd | ||
+ | OIDCClientID any-client | ||
+ | OIDCCryptoPassphrase anystring | ||
+ | |||
+ | ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ | ||
+ | <Directory "/usr/lib/cgi-bin"> | ||
+ | AllowOverride None | ||
+ | Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch | ||
+ | # Require all granted | ||
+ | AuthType openid-connect | ||
+ | Require valid-user | ||
+ | </Directory> | ||
+ | </IfDefine> | ||
+ | </IfModule> | ||
+ | </code><code> | ||
+ | ==> rootfs/usr/lib/cgi-bin/apwebd <== | ||
+ | </code><code> | ||
+ | #!/bin/sh | ||
+ | |||
+ | echo Content-type: text/html | ||
+ | echo | ||
+ | |||
+ | echo "<h1 style=\"color:blue;\">Hello ${OIDC_CLAIM_preferred_username}</h1>" | ||
+ | |||
+ | echo "<pre>"; env; echo "</pre>" | ||
+ | </code><code> | ||
+ | ~/apwebd$ docker build -t server.corp13.un:5000/student/apwebd:ver1.2 . | ||
+ | |||
+ | ~/apwebd$ docker run -e APWEBD_HOSTNAME=apwebd.corp13.un -e KEYCLOAK_HOSTNAME=keycloak.corp13.un -e REALM_NAME=corp13 -itd --rm -P server.corp13.un:5000/student/apwebd:ver1.2 | ||
+ | |||
+ | ~/apwebd$ docker run -e APWEBD_HOSTNAME=apwebd.corp13.un -e KEYCLOAK_HOSTNAME=keycloak.corp13.un -e REALM_NAME=corp13 -itd --entrypoint bash server.corp13.un:5000/student/apwebd:ver1.2 | ||
+ | |||
+ | ~/apwebd$ docker push server.corp13.un:5000/student/apwebd:ver1.2 | ||
+ | </code> | ||
+ | |||
===== Старая версия ===== | ===== Старая версия ===== |