This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
технология_docker [2022/06/29 13:40] val [Запуск в режиме демона и подключение к контейнеру] |
технология_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 100: | Line 103: | ||
/etc/init.d/inetutils-inetd start | /etc/init.d/inetutils-inetd start | ||
- | /bin/bash | + | bash |
</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 | ||
- | ###/bin/bash # not work in k8s | + | touch /var/log/webd.log |
- | tail -F /var/log/webd.log | + | #chown 10003 /var/www/ |
+ | |||
+ | if [ "$MYMODE" = 'TEST' ]; then | ||
+ | bash # not work in k8s | ||
+ | else | ||
+ | tail -f /var/log/webd.log | ||
+ | fi | ||
</code><code> | </code><code> | ||
server# cat Dockerfile | server# cat Dockerfile | ||
Line 148: | 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 | ||
+ | #ENV MYMODE=TEST | ||
ENTRYPOINT ["/start.sh"] | ENTRYPOINT ["/start.sh"] | ||
Line 163: | 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 | ||
+ | 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 183: | 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 242: | 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 257: | Line 348: | ||
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 266: | 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 278: | 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.N | ||
+ | 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# docker push gate.corp13.un:5000/webd | + | node1,2,3# docker ps -q | xargs -l docker port | sort -n |
- | + | ||
- | 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> | ||