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
технология_docker [2022/06/30 08:21]
val [Создание контейнера для приложения с использованием Dockerfile]
технология_docker [2024/03/07 09:50] (current)
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 репозиторий ====+===== Дополнительная информация =====
  
-  * [[Инструмент GitLab#​GitLab Docker Registry]]+==== Приложение apwebd ====
  
 <​code>​ <​code>​
-cat /​etc/​docker/​daemon.json+~/​apwebd$ ​cat Dockerfile
 </​code><​code>​ </​code><​code>​
-... +FROM debian:​bookworm 
-{ + 
-  "​insecure-registries"​ : ["server.corpX.un:​5000"] +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>​ </​code><​code>​
-service docker restart+~/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
  
-# 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 <== 
 +</​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>​ </​code>​
 +
  
 ===== Старая версия ===== ===== Старая версия =====
технология_docker.1656566516.txt.gz · Last modified: 2022/06/30 08:21 by val