User Tools

Site Tools


технология_docker

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
технология_docker [2022/06/30 08:21]
val [Создание контейнера для приложения с использованием Dockerfile]
технология_docker [2024/03/07 09:44]
val [Дополнительная информация]
Line 51: Line 51:
 <​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://​docs.docker.com/​engine/​reference/​commandline/​system_prune/​|docker system prune - Remove unused data]]
   * [[Сервис Grafana]]   * [[Сервис Grafana]]
 ==== Обзор и удаление ==== ==== Обзор и удаление ====
Line 72: Line 76:
  
 # 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 120:
 </​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 136:
 </​code>​ </​code>​
  
-Ctrl+D+  * Методически,​ можно уже на этом этапе: запустить скрипт ./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://​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 ====
  
Line 129: Line 157:
 <​code>​ <​code>​
 server# mkdir /root/webd/ && cd /root/webd/ server# mkdir /root/webd/ && cd /root/webd/
 +  или
 +gitlab-runner@server:​~$ mkdir -p ~/​webd/​webd/​ && cd ~/​webd/​webd/​
 +
 +server# cp /​usr/​local/​sbin/​webd .
  
-server# mv /usr/​local/​sbin/webd .+gitlab-runner@server:~/webd/webd$ nano webd      # добавляем закомментированные строки
  
 server# ###tar -cvzf www.tgz -C /var/ www/ server# ###tar -cvzf www.tgz -C /var/ www/
Line 140: Line 172:
 /​etc/​init.d/​inetutils-inetd start /​etc/​init.d/​inetutils-inetd start
  
 +touch /​var/​log/​webd.log
 +#chown 10003 /var/www/
 +  ​
 if [ "​$MYMODE"​ = '​TEST'​ ]; then if [ "​$MYMODE"​ = '​TEST'​ ]; then
   bash      # not work in k8s   bash      # not work in k8s
 else else
-  tail -/​var/​log/​webd.log+  tail -/​var/​log/​webd.log
 fi fi
 </​code><​code>​ </​code><​code>​
Line 151: Line 186:
 FROM debian:​bullseye FROM debian:​bullseye
  
-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 /
 COPY webd /​usr/​local/​sbin/​webd COPY webd /​usr/​local/​sbin/​webd
-### ADD www.tgz /var/     ​#for simple test in k8s+### ADD www.tgz /var/ 
 + 
 +### for helm readiness/​liveness Probe  
 +### COPY index.html /var/www/
  
 EXPOSE 80 EXPOSE 80
Line 167: Line 209:
 </​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
  
 +WORKDIR /build
 +COPY . .
 +RUN test -e go.mod || go mod init gowebd
 +
 +#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 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
 +</​code>​
 +3-й раз - запустить несколько экземпляров,​ указав параметры для подключения внешнего каталога /var/www/, выяснить назначенные порты, настроить keepalived, по журналам определять какой контейнер используется
  
-2-й раз задан entrypoint и expose (можно добавить ключ --rm для удаления ​контейнера ​после остановки)+=== Процессы ​контейнера ​и системы ===
  
-server# docker run --name webd01 --hostname webd01 -itd -v /​var/​www/:/​var/​www/​ -P test/webd+  * [[Технология cgroup]] 
 +  * [[Технология 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
 +
 +server# cat /​sys/​fs/​cgroup/​memory/​docker/​NNNNNNNNNNNNNNNNNNNNNNNNNNNNN/​memory.max_usage_in_bytes
 +
 +server# docker stats
 +
 +server# lsns | grep start.sh
 +</​code>​
 +=== Анализ параметров запущенного контейнера ===
 +<​code>​
 server# docker inspect webd01 server# docker inspect webd01
  
Line 187: Line 280:
  
 server# wget -qO - http://​172.17.0.2/​ server# wget -qO - http://​172.17.0.2/​
 +server$ curl --noproxy '​*'​ http://​172.17.0.2/​
  
 server# docker port webd01 server# docker port webd01
  
 server# docker logs webd01 server# docker logs webd01
 +
 +node1# docker logs webd01 -f
  
 server# wget -qO - http://​localhost:​8000/​ server# wget -qO - http://​localhost:​8000/​
 +server$ curl http://​localhost:​8000
 +server$ curl http://​localhost:​8000/​not_exit_file
  
 host browser -> http://​server.corpX.un:​8000/​ host browser -> http://​server.corpX.un:​8000/​
  
 server# docker attach webd01 ​ server# docker attach webd01 ​
 +
 +server# docker exec -it webd01 bash
  
 webd01# ps ax webd01# ps ax
Line 202: Line 302:
 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 215: Line 320:
 server# docker stop webd01 && docker rm webd01 server# docker stop webd01 && docker rm webd01
 </​code>​ </​code>​
 +
  
 ==== Микросервисы ==== ==== Микросервисы ====
Line 246: Line 352:
  
   * [[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]]
 +
 +  * [[Инструмент GitLab#​Установка через docker-compose]] GitLab
 +  * Установка через [[Сервис Keycloak#​docker-compose]] Keycloak
 +
  
 <​code>​ <​code>​
Line 261: Line 372:
     ports:     ports:
       - "​8000:​80"​       - "​8000:​80"​
 +#      - "​80"​
     volumes:     volumes:
       - /​var/​www/:/​var/​www/​       - /​var/​www/:/​var/​www/​
 +#      - vol1:/​var/​www/​
 +
 +#    environment:​
 +#      - MYMODE=TEST
 +#    stdin_open: true
     tty: true     tty: true
 +    ​
   sftp:   sftp:
     image: atmoz/sftp     image: atmoz/sftp
Line 270: Line 388:
     volumes:     volumes:
       - /​var/​www/:/​home/​user3/​www       - /​var/​www/:/​home/​user3/​www
 +#      - vol1:/​home/​user3/​www
     command: user3:​password3:​10003     command: user3:​password3:​10003
 +#volumes:
 +#  vol1:
 </​code><​code>​ </​code><​code>​
 # docker-compose build # docker-compose build
Line 282: Line 403:
 # docker-compose down # docker-compose down
  
-# docker-compose rm    #Возможноне требуется+# docker-compose rm 
 + 
 +# 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>​ 
 +gitlab-runner@server:​~/​webd$ cat docker-compose.yml 
 +</​code><​code>​ 
 +version: "​3"​ 
 +services: 
 +  webd: 
 +    image: server.corpX.un:​5000/​student/​webd:​ver1.N 
 +    ports: 
 +      - "​80"​ 
 +    volumes: 
 +      - /​var/​www/:/​var/​www/​ 
 +    deploy: 
 +      mode: replicated 
 +      replicas: 3 
 +</​code><​code>​ 
 +node1,2,3docker-compose --compatibility up -d 
 + 
 +node1,2,3# docker-compose --compatibility down 
 + 
 +node1,2,3# docker ps -q | xargs -l docker port | sort -n
 </​code>​ </​code>​
-===== Дополнительные материалы ===== 
  
-==== Локальный репозиторий ====+===== Локальные репозитории =====
  
- * [[https://​docs.docker.com/​registry/​|Docker Registry]]+==== Insecure Private Registry ==== 
 + 
 +  * [[Инструмент GitLab#​GitLab Docker Registry]] 
 +  * [[https://​docs.docker.com/​registry/​insecure/​|Test an insecure registry/​Deploy a plain HTTP registry]] 
 + 
 +<​code>​ 
 +# cat /​etc/​docker/​daemon.json 
 +</​code><​code>​ 
 +
 +  "​insecure-registries"​ : ["​server.corpX.un:​5000"​] 
 +
 +</​code><​code>​ 
 +# service docker restart 
 + 
 +gitlab-runner@server:​~$ docker login http://​server.corpX.un:​5000 
 + 
 +gitlab-runner@server:​~$ less ~/​.docker/​config.json 
 +</​code><​code>​ 
 +
 +        "​auths":​ { 
 +                "​server.corpX.un:​5000":​ { 
 +                        "​auth":​ "​c3R1ZGVudDpQYSQkdzByZA=="​ 
 +                } 
 +        } 
 +
 +</​code>​ 
 + 
 +  * [[https://​serverfault.com/​questions/​703344/​how-to-remove-an-image-tag-in-docker-without-removing-the-image-itself|How to remove an image tag in Docker without removing the image itself?]] 
 + 
 +<​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:​1.1 
 + 
 +gitlab-runner@server:​~$ docker images 
 + 
 +gitlab-runner@server:​~$ docker push server.corpX.un:​5000/​student/​webd 
 +gitlab-runner@server:​~$ docker push server.corpX.un:​5000/​student/​webd:​1.1 
 +... 
 +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>​ 
 + 
 +==== 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]]
  
 <​code>​ <​code>​
Line 303: Line 507:
 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>​
  
-==== GitLab репозиторий ====+===== Дополнительная информация ===== 
 +<​code>​ 
 +$ cat Dockerfile 
 +</​code><​code>​ 
 +FROM debian:​bookworm
  
-  * [[Инструмент GitLab#​GitLab Docker Registry]]+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
  
-<​code>​ +COPY rootfs/ / 
-# cat /etc/docker/daemon.json+ 
 +EXPOSE 80 
 + 
 +ENTRYPOINT ["/start.sh"]
 </​code><​code>​ </​code><​code>​
-... +$ find rootfs/ ​-type f | xargs tail -n +1
-+
-  "​insecure-registries"​ : ["​server.corpX.un:​5000"​] +
-+
-...+
 </​code><​code>​ </​code><​code>​
-service docker restart+==> 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
  
-# docker login http://​server.corpX.un:​5000+[ "​$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; }
  
-# docker tag test/webd server.corpX.un:​5000/​student/​webd +find -type f -name '*.apwebd-template'​ | while read -r FILE; do envsubst < "​$FILE"​ > "​${FILE%.apwebd-template}";​ done
-# docker tag test/webd server.corpX.un:​5000/​student/​webd:​wwwdir+
  
-# docker push server.corpX.un:5000/student/webd +/etc/init.d/apache2 start 
-# docker push server.corpX.un:​5000/​student/webd:wwwdir + 
-... +tail -f /​var/​log/​apache2/​error.log -f /var/log/​apache2/​access.log 
-# docker run --name webd01 ​--hostname webd01 ​-itd -p 8000:80 server.corp13.un:5000/student/webd:wwwdir+ 
 +</​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 <== 
 +#!/bin/sh 
 + 
 +echo Content-typetext/html 
 +echo 
 + 
 +echo "<​h1 style=\"​color:blue;​\">​Hello ${OIDC_CLAIM_preferred_username}<​/h1>"​ 
 + 
 +echo "<​pre>";​ env; echo "</pre>"​
 </​code>​ </​code>​
 +
  
 ===== Старая версия ===== ===== Старая версия =====
технология_docker.txt · Last modified: 2024/04/11 15:27 by val