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 09:47]
val [docker-compose]
технология_docker [2023/09/20 14:12] (current)
val [docker-compose]
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]]
   * [[Сервис Grafana]]   * [[Сервис Grafana]]
 ==== Обзор и удаление ==== ==== Обзор и удаление ====
Line 103: Line 106:
 </​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 122:
 </​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 143:
 <​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 158:
 /​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 172:
 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 195:
 </​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]]
 +  * [[Технология 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 266:
  
 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 246: Line 332:
  
   * [[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]]
  
 <​code>​ <​code>​
Line 261: Line 348:
     ports:     ports:
       - "​8000:​80"​       - "​8000:​80"​
 +#      - "​80"​
     volumes:     volumes:
       - /​var/​www/:/​var/​www/​       - /​var/​www/:/​var/​www/​
 +#      - vol1:/​var/​www/​
 +
 #    environment:​ #    environment:​
 #      - MYMODE=TEST #      - MYMODE=TEST
 #    stdin_open: true #    stdin_open: true
     tty: true     tty: true
 +    ​
   sftp:   sftp:
     image: atmoz/sftp     image: atmoz/sftp
Line 273: Line 364:
     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 285: Line 379:
 # docker-compose down # docker-compose down
  
-# docker-compose rm    #​Возможно,​ не требуется +# docker-compose rm
-</​code>​ +
-===== Дополнительные материалы =====+
  
-==== Локальный репозиторий ====+# docker volume rm root_vol1
  
- * [[https://docs.docker.com/​registry/​|Docker Registry]]+gitlab-runner@server:~/webd$ docker-compose up -d --scale webd=N
  
-<​code>​ +gitlab-runner@server:~/webd$ docker ps
-gate# docker run -d -p 5000:5000 -v /root:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/​certs/​gate.crt -e REGISTRY_HTTP_TLS_KEY=/​certs/​gate.key --name registry registry:2+
  
-node1# cp ~vagrant/gate.crt ​/etc/docker/certs.d/gate.corp13.un\:5000/ca.crt+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.
 +    ports: 
 +      - "​80"​ 
 +    volumes: 
 +      - /​var/​www/:/​var/​www/​ 
 +    deploy: 
 +      mode: replicated 
 +      replicas: 3 
 +</​code><​code>​ 
 +node1,2,3# docker-compose --compatibility up -d
  
-node1# ​service ​docker ​restart+node1,2,3# docker-compose --compatibility down
  
-node1# docker ​tag val/​webd:​latest gate.corp13.un:​5000/​webd +node1,2,3# docker ​ps -q | xargs -l docker port | sort -n
- +
-node1# docker push gate.corp13.un:​5000/​webd +
- +
-node1# curl --insecure ​-X GET https://​gate.corp13.un:​5000/​v2/​_catalog +
-{"​repositories":​["​webd"​]}+
 </​code>​ </​code>​
  
-==== GitLab ​репозиторий ====+===== Локальные ​репозитории ===== 
 + 
 +==== Insecure Private Registry ​====
  
   * [[Инструмент GitLab#​GitLab Docker Registry]]   * [[Инструмент GitLab#​GitLab Docker Registry]]
 +  * [[https://​docs.docker.com/​registry/​insecure/​|Test an insecure registry/​Deploy a plain HTTP registry]]
  
 <​code>​ <​code>​
 # 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
  
-docker login http://​server.corpX.un:​5000+gitlab-runner@server:​~$ ​docker login http://​server.corpX.un:​5000
  
-# docker tag test/​webd ​server.corpX.un:5000/student/webd +gitlab-runner@server:~$ less ~/.docker/config.json 
-# docker tag test/webd server.corpX.un:​5000/​student/​webd:wwwdir+</code><​code>​ 
 +
 +        "​auths":​ { 
 +                "server.corpX.un:​5000"
 +                        "​auth":​ "​c3R1ZGVudDpQYSQkdzByZA=="​ 
 +                } 
 +        } 
 +
 +</​code>​
  
-docker push server.corpX.un:​5000/​student/​webd +  * [[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?]] 
-docker push server.corpX.un:​5000/​student/​webd:​wwwdir+ 
 +<​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
 ... ...
-# docker run --name webd01 --hostname webd01 -itd -p 8000:80 server.corp13.un:​5000/​student/​webd:​wwwdir+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 ==== 
 +<​code>​ 
 +docker login gitlab.bmstu.ru:​5050 
 +docker tag gowebd gitlab.bmstu.ru:​5050/​val/​gowebd 
 +docker push gitlab.bmstu.ru:​5050/​val/​gowebd 
 +</​code>​ 
 +==== Использование образа Docker Registry и on-premise CA ==== 
 + 
 +  * [[https://​docs.docker.com/​registry/​|Docker Registry]] 
 + 
 +<​code>​ 
 +gate# docker run -d -p 5000:5000 -v /​root:/​certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/​certs/​gate.crt -e REGISTRY_HTTP_TLS_KEY=/​certs/​gate.key --name registry registry:​2 
 + 
 +node1# cp ~vagrant/​gate.crt /​etc/​docker/​certs.d/​gate.corp13.un\:​5000/​ca.crt 
 + 
 +node1# service docker restart 
 + 
 +node1# docker tag val/​webd:​latest gate.corp13.un:​5000/​webd 
 + 
 +node1# docker push gate.corp13.un:​5000/​webd 
 + 
 +node1# curl --insecure -X GET https://​gate.corp13.un:​5000/​v2/​_catalog 
 +{"​repositories":​["​webd"​]}
 </​code>​ </​code>​
  
технология_docker.1656571647.txt.gz · Last modified: 2022/06/30 09:47 by val