[Обязательно к прочтению] Практическое руководство по Docker Container, часть 9, научит вас использовать Docker Compose для быстрой оркестрации контейнеров!
[Обязательно к прочтению] Практическое руководство по Docker Container, часть 9, научит вас использовать Docker Compose для быстрой оркестрации контейнеров!

0 Многоконтейнерные приложения отвратительны

  • Чтобы извлечь образ из образа сборки Dockerfile или Dockerhub
  • Чтобы создать несколько контейнеров
  • Для управления этими контейнерами (запуск, остановка, удаление)

Пакетная обработка Docker Compose

1 Предисловие

1.1 Обзор

  • Compose это определение и запуск нескольких контейнеров Docker инструменты приложения
  • Доступное приложение настройки YAML Служить
  • Используйте одну команду, чтобы удалить все Служить из конфигурации.

Compose работает во всех средах: производстве, промежуточном этапе, разработке, тестировании и рабочих процессах CI. Также есть команды для управления всем жизненным циклом приложения:

  • запускать、останавливатьсяиреконструкция Служить
  • Проверить статус работы
  • Потоковая передача вывода журнала работающего Служить
  • Запуск разовых команд на существование Служить

1.2 Этапы использования

  1. Использование Dokerfile определяет среду приложения.,чтобы он мог существовать где угодно копировать
  2. Определите компоненты, составляющие ваше приложение,docker-compose.yml чтобы они могли работать вместе в изолированной среде
  3. бегатьdocker compose up,Docker compose команда для запуска и выполнения всего приложения. Также docker-compose upЗапускайте автономно с помощью Compose (docker-composeдвоичный)

2 docker-compose.yml

Существует три версии, рекомендуется использовать версию 3.

2.1 Основные понятия

2.1.1 Services

Сервис представляет собой контейнер, который может быть создан из образа dockerhub или образа, созданного из локального файла Dockerfile.

Запуск службы аналогичен запуску докера. Мы можем указать для него сеть и том, поэтому мы можем указать ссылки на сеть и том для службы.

Язык кода:javascript
копировать
services:
	db:
		image: postgres:9.4
		volumes:
			-"db-data:/var/lib/postgresql/data'
		networks:
			- back-tier

Эквивалентно

Язык кода:javascript
копировать
docker run -d
--networks back-tier
-v db-data:/var/lib/postgresql/data
postgres:9.4
Язык кода:javascript
копировать
services:
	worker:
		# Не из dockerhub тянуть, но из местных build из. То есть указать dockerfile расположение
		build: ./worker
		# worker Какие контейнеры связаны?
		links:
			- db
			- redis
		networks:
    	- back-tier
Глубоко понимать взаимосвязь между сетью Docker и ссылками.

Используется для соединения контейнеров и реализации связи между контейнерами.

Мы все создадим новый докер-мост через compose. Если все контейнеры подключены к мосту, ссылки вообще не нужны. Ссылки необходимы для трансляции DNS-имени только при подключении к Docker-0 по умолчанию.

  • Docker Compose создаст сеть docker-compose (тип моста) и подключите все файлы в файле к этомусету.
  • в том же Docker контейнеры в сети могут напрямую ссылаться друг на друга по имени контейнера, нет необходимости links Это также может быть достигнуто DNS анализировать
  • Только когда контейнер подключен к стандартному docker0 Нужен только при наличии сети (когда сеть не указана) links Ручная настройка DNS анализировать,Чтобы передать доступ к имени контейнера
  • links Основная функция — настроить его под существование по умолчанию. DNS Вперед, отправь батюшку IP Ассоциация имени иконтейнера адреса, чтобы контейнер мог получить доступ к родительскому контейнеру.

Таким образом, если файл Docker Compose определяет сеть и добавляет в сеть все контейнеры, эти контейнеры можно автоматически обнаружить и получить к ним доступ напрямую через DNS. На этом этапе тег ссылок не имеет большого эффекта. Лишь в редких случаях, когда контейнер подключен к сети по умолчанию и ему необходимо взаимодействовать с другими контейнерами, ссылки необходимо использовать в качестве альтернативы ручной настройке. Однако метод ссылок имеет множество ограничений по сравнению с сетью Docker, поэтому Docker всегда рекомендовал использовать собственную сеть для подключения контейнеров вместо ссылок. Так что в целом это утверждение верно.

Сеть, созданная для нас compose, обеспечивает автоматическое обнаружение и доступ между контейнерами. В большинстве случаев ссылки бесполезны.

Однако метод ссылок имеет следующие недостатки:

  1. Не поддерживать Служить найдено: по ссылкам можно только вручную указать контейнер подключения,Автоматическое открытие Служить невозможно. Это не способствует динамике и масштабируемости развертывания приложений.
  2. Риск конфликта портов: ссылки будут предоставлять все порты родительского контейнера дочернему контейнеру, что может вызвать конфликты портов.
  3. Сложная конфигурация. В крупномасштабных проектах существует множество связей между Ручной настройкой и множеством контейнеров.
  4. Балансировка нагрузки без последствий: ссылки не могут обеспечить балансировку нагрузки для нескольких контейнеров и могут связывать только один контейнер.
  5. Влияние на производительность: способ работы ссылок требует создания правил iptables на хосте, что окажет некоторое влияние на производительность.

Таким образом, недостатки и ограничения ссылок в большинстве случаев делают их не идеальным решением для межконтейнерной связи. Docker рекомендует следующие альтернативы:

  1. Сеть Docker: используйте собственные функциональные возможности сети Docker.,Можно реализовать автоматическое открытие Служить, Изоляция портов、Для лучшей производительности и т. д.
  2. Консул: используйте Consul Такой инструмент обнаружения Служить может осуществлять автоматическую регистрацию и обнаружение Служить, избегая ручного управления. links
  3. Traefik: использование инструмента обратного прокси Traefik,Может автоматически обнаруживать внутренний контейнер,И реализовать такие функции, как балансировка нагрузки
  4. Переменные среды: разные существа контейнера задают одни и те же переменные среды.,Реализация простого совместного использования конфигурации и передачи параметров.

Таким образом, в целом использование ссылок было заменено более продвинутыми механизмами, такими как сетевые инструменты Docker и инструменты обнаружения сервисов. В новых проектах отдавайте приоритет использованию собственной сети Docker или сторонних инструментов обнаружения сервисов и балансировки нагрузки для обеспечения взаимодействия между контейнерами. Ссылки теперь работают только для очень простых контейнерных приложений или для совместимости со старыми файлами Docker Compose. Поэтому в большинстве случаев тег «Ссылки» бесполезен.

2.1.2 volume
Язык кода:javascript
копировать
services:
	db:
		image: postgres:9.4
		volumes:
			db-data:
		networks:
			- back-tier

docker volume create db-data

2.1.3 Networks
Язык кода:javascript
копировать
services:
	db:
		image: postgres:9.4
		volumes:
			db-data:
		networks:
			back-tier:
				driver: bridge
      front-tier:
      	driver: bridge

docker network create -d bridge back-tier

2.2 Примеры

Язык кода:javascript
копировать
version: '3'

services:

  wordpress:
    image: wordpress
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root
    networks:
      - my-bridge

  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - my-bridge

volumes:
  mysql-data:

networks:
  my-bridge:
    driver: bridge

Этот файл Docker Compose определяет приложение WordPress, состоящее из двух контейнеров:

  1. WordPress: используйте официальный WordPress Зеркало, порт сопоставлен с 8080, подключитесь к my-bridge сеть。
    • Настройка с использованием переменных среды WordPress информация о соединении с базой данных, соединение mysql контейнер。
  2. MySQL: используйте официальный MySQL зеркало, установка root Пароль исоздавать wordpress база данных, будет mysql-data Том, подключенный к /var/lib/mysql, также подключен к my-bridge сеть。
  3. mysql-данные: по имени mysql-data Том анонимных данных подключен к mysql контейнер. Используется для хранения файлов библиотеки данных.
  4. my-bridge:Docker Compose определенный bridge Типа сеть, к этой сети подключены два контейнера, осуществляющие взаимный доступ.

Этот файл Compose реализует совместное развертывание WordPress и MySQL. Оба подключены к одной сети. WordPress подключается к MySQL через переменные среды и использует тома данных для обеспечения постоянства файлов базы данных.

При первом запуске будет:

  1. тянуть WordPress и MySQL зеркало
  2. создавать my-bridge сеть
  3. создавать mysql-data объем данных
  4. запускать wordpress контейнер, подключить сеть, установить переменные среды и сопоставить порты
  5. запускать mysql контейнер, подключить сеть, установить переменные среды и смонтировать объем данных
  6. WordPress Подключение через переменные среды mysql контейнер,веб-сайтданныесохранить вобъем данных
  7. Доступ к веб-сайту WordPress можно получить через порт хоста 8080.

Будущие запуски будут лишь перезапускать контейнер, сеть и тома останутся без изменений.

3 операции

Язык кода:javascript
копировать
[root@icv-monitor-platform-dev ~]# yum install -y docker-compose
Loaded plugins: langpacks, versionlock
base                                                                                                                                                       | 3.6 kB  00:00:00     
docker-ce-stable                                                                                                                                           | 3.5 kB  00:00:00     
epel                                                                                                                                                       | 4.7 kB  00:00:00     
extras                                                                                                                                                     | 2.9 kB  00:00:00     
updates                                                                                                                                                    | 2.9 kB  00:00:00     
yum_bcm                                                                                                                                                    | 2.5 kB  00:00:00     
epel/x86_64/updateinfo         FAILED                                          
http://mirrors.agilecloud.com/epel/7/x86_64/repodata/e06414b68d54c610e042619ea9ed5efb25bb5a6d31e42dfdd38699029423209b-updateinfo.xml.bz2: [Errno 14] HTTP Error 404 - Not FoundTA 
Trying other mirror.
To address this issue please refer to the below knowledge base article 

https://access.redhat.com/articles/1320623

If above article doesn't help to resolve this issue please create a bug on https://bugs.centos.org/

epel/x86_64/primary_db         FAILED                                          
http://mirrors.agilecloud.com/epel/7/x86_64/repodata/a80f23383e955fc3c9c1874dcf2619d8abff2bd6c8dd2062923cdf91d1dcb464-primary.sqlite.bz2: [Errno 14] HTTP Error 404 - Not FoundTA 
Trying other mirror.
(1/3): docker-ce-stable/7/x86_64/primary_db                                                                                                                | 106 kB  00:00:00     
Excluding 1 update due to versionlock (use "yum versionlock status" to show it)
Resolving Dependencies
--> Running transaction check
---> Package docker-compose.noarch 0:1.18.0-4.el7 will be installed
...
--> Finished Dependency Resolution

Dependencies Resolved

==================================================================================================================================================================================
 Package                                                 Arch                                 Version                                    Repository                          Size
==================================================================================================================================================================================
Installing:
 docker-compose                                          noarch                               1.18.0-4.el7                               epel                               222 k
Installing for dependencies:
... epel                                59 k

Transaction Summary
==================================================================================================================================================================================
Install  1 Package (+15 Dependent packages)

Total download size: 1.4 M
Installed size: 7.5 M
Downloading packages:
...
(16/16): python36-websocket-client-0.47.0-2.el7.noarch.rpm                                                                                                 |  59 kB  00:00:00     
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                             8.8 MB/s | 1.4 MB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
...
  Verifying  : python36-websocket-client-0.47.0-2.el7.noarch                                                                                                                16/16 

Installed:
  docker-compose.noarch 0:1.18.0-4.el7                                                                                                                                            

Dependency Installed:
  python36-PyYAML.x86_64 0:3.13-1.el7          python36-cached_property.noarch 0:1.5.1-2.el7 python36-chardet.noarch 0:3.0.4-1.el7           python36-docker.noarch 0:2.6.1-3.el7
  python36-docker-pycreds.noarch 0:0.2.1-2.el7 python36-dockerpty.noarch 0:0.4.1-18.el7      python36-docopt.noarch 0:0.6.2-8.el7            python36-idna.noarch 0:2.7-2.el7    
  python36-jsonschema.noarch 0:2.5.1-4.el7     python36-pysocks.noarch 0:1.6.8-7.el7         python36-requests.noarch 0:2.14.2-2.el7         python36-six.noarch 0:1.14.0-2.el7  
  python36-texttable.noarch 0:1.6.2-1.el7      python36-urllib3.noarch 0:1.25.6-1.el7        python36-websocket-client.noarch 0:0.47.0-2.el7

Complete!
[root@icv-monitor-platform-dev ~]# docker compose version
Docker Compose version v2.17.3

3.1 Запуск

Язык кода:javascript
копировать
[root@icv-monitor-platform-dev docker]# docker-compose up
Recreating docker_wordpress_1 ... 
Recreating docker_wordpress_1 ... done
Attaching to docker_mysql_1, docker_wordpress_1
wordpress_1  | WordPress not found in /var/www/html - copying now...
mysql_1      | 2023-05-06 09:11:25+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
mysql_1      | 2023-05-06 09:11:25+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql_1      | 2023-05-06 09:11:25+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
mysql_1      | 2023-05-06 09:11:25+00:00 [Note] [Entrypoint]: Initializing database files
mysql_1      | 2023-05-06T09:11:25.184821Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.27) initializing of server in progress as process 42
mysql_1      | 2023-05-06T09:11:25.194319Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_1      | 2023-05-06T09:11:26.099933Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysql_1      | 2023-05-06T09:11:27.476271Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
mysql_1      | 2023-05-06T09:11:27.476300Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
mysql_1      | 2023-05-06T09:11:27.627812Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
mysql_1      | 2023-05-06 09:11:30+00:00 [Note] [Entrypoint]: Database files initialized
mysql_1      | 2023-05-06 09:11:30+00:00 [Note] [Entrypoint]: Starting temporary server
mysql_1      | 2023-05-06T09:11:31.071379Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.27) starting as process 91
mysql_1      | 2023-05-06T09:11:31.091286Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_1      | 2023-05-06T09:11:31.350282Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysql_1      | 2023-05-06T09:11:31.544377Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
mysql_1      | 2023-05-06T09:11:31.544407Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
mysql_1      | 2023-05-06T09:11:31.545449Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysql_1      | 2023-05-06T09:11:31.545492Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
mysql_1      | 2023-05-06T09:11:31.547265Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
mysql_1      | 2023-05-06T09:11:31.564869Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock
mysql_1      | 2023-05-06T09:11:31.565054Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 0  MySQL Community Server - GPL.
mysql_1      | 2023-05-06 09:11:31+00:00 [Note] [Entrypoint]: Temporary server started.
mysql_1      | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
mysql_1      | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
mysql_1      | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
mysql_1      | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
mysql_1      | 2023-05-06 09:11:33+00:00 [Note] [Entrypoint]: Creating database wordpress
mysql_1      | 
mysql_1      | 2023-05-06 09:11:33+00:00 [Note] [Entrypoint]: Stopping temporary server
mysql_1      | 2023-05-06T09:11:33.250603Z 11 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.27).
mysql_1      | 2023-05-06T09:11:34.554923Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.27)  MySQL Community Server - GPL.
mysql_1      | 2023-05-06 09:11:35+00:00 [Note] [Entrypoint]: Temporary server stopped
mysql_1      | 
mysql_1      | 2023-05-06 09:11:35+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
mysql_1      | 
mysql_1      | 2023-05-06T09:11:35.539635Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.27) starting as process 1
mysql_1      | 2023-05-06T09:11:35.551731Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_1      | 2023-05-06T09:11:35.804326Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysql_1      | 2023-05-06T09:11:36.004188Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
mysql_1      | 2023-05-06T09:11:36.004221Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
mysql_1      | 2023-05-06T09:11:36.005212Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysql_1      | 2023-05-06T09:11:36.005253Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
mysql_1      | 2023-05-06T09:11:36.008635Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
mysql_1      | 2023-05-06T09:11:36.026993Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
mysql_1      | 2023-05-06T09:11:36.027899Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.
wordpress_1  | Complete! WordPress has been successfully copied to /var/www/html
wordpress_1  | No 'wp-config.php' found in /var/www/html, but 'WORDPRESS_...' variables supplied; copying 'wp-config-docker.php' (WORDPRESS_DB_HOST WORDPRESS_DB_PASSWORD)
wordpress_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message
wordpress_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message
wordpress_1  | [Sat May 06 09:52:36.197040 2023] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.56 (Debian) PHP/8.0.28 configured -- resuming normal operations
wordpress_1  | [Sat May 06 09:52:36.197088 2023] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
Язык кода:javascript
копировать
[root@icv-monitor-platform-dev ~]# docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED              STATUS              PORTS                                         NAMES
08538a461949   wordpress           "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:8083->80/tcp, :::8083->80/tcp         docker_wordpress_1
fceb9e329624   mysql               "docker-entrypoint.s…"   43 minutes ago       Up 42 minutes       3306/tcp, 33060/tcp                           docker_mysql_1
28888809ef74   redis:myredis-1.0   "docker-entrypoint.s…"   8 days ago           Up 8 days           0.0.0.0:32768->6379/tcp, :::32768->6379/tcp   redisABC
[root@icv-monitor-platform-dev docker]# docker-compose  ps
       Name                     Command               State                  Ports                
--------------------------------------------------------------------------------------------------
docker_mysql_1       docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp                 
docker_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8083->80/tcp,:::8083->80/tcp
[root@icv-monitor-platform-dev docker]#  

3.2 Стоп

docker-compose stop и docker-compose down используются, чтобы остановить Docker Compose Контейнеры на подходе.

стоп-стоп сервис

останавливатьсятолькосуществоватьбегать的контейнер,но нетудалитьконтейнерисеть:

  • сеть останется,контейнерзапускать Подключусь позжесеть
  • объем данные также сохранятся, и данные контейнера не потеряются
Язык кода:javascript
копировать
[root@icv-monitor-platform-dev docker]# docker-compose stop
Stopping docker_wordpress_1 ... done
Stopping docker_mysql_1     ... done
[root@icv-monitor-platform-dev docker]# 
Язык кода:javascript
копировать
[root@icv-monitor-platform-dev docker]# docker-compose  ps
       Name                     Command               State    Ports
--------------------------------------------------------------------
docker_mysql_1       docker-entrypoint.sh mysqld      Exit 0        
docker_wordpress_1   docker-entrypoint.sh apach ...   Exit 0        
[root@icv-monitor-platform-dev docker]# 

Контейнер находится в остановленном состоянии, и доступ к нему можно получить через start Команда для перезапуска:

Язык кода:javascript
копировать
[root@icv-monitor-platform-dev docker]# docker-compose  start
Starting wordpress ... done
Starting mysql     ... done
[root@icv-monitor-platform-dev docker]# 
down

останавливатьсяиудалитьконтейнер、сетьиобъем данных:

  • контейнер был полностью удален,Больше не могузапускать
  • сеть так же удалена, контейнер нужно переподключать после пересоздания
  • объем данные также были удалены, а предыдущие данные были утеряны после восстановления.

Итак, вкратце:

  • остановка используется временно останавливаться контейнер,Можно повторнозапускатьисохранять данные. Подходит для таких сценариев, как техническое обслуживание при кратковременном останове.
  • Down полностью остановится и удалит контейнер и связанные с ним ресурсы. Требуется повторное подключение после выключения,Предыдущие данные также теряются. Он подходит для таких сценариев, как закрытие проекта и реконструкция окружающей среды.

Например: можно использовать повседневную среду разработки проекта. stop/start Используется для временного перезапуска контейнера.

Прежде чем проект выпустит новую версию, вам необходимо использовать down Остановите среду разработки, затем up Запустите производственную среду. Поэтому выбирайте различные способы остановки в соответствии с вашими потребностями:

  • Может использоваться на этапе разработки и тестирования. stop сохранять данные
  • Используется во время производственного выпуска down Обеспечьте чистую окружающую среду

3.3 exec

На основе примера yaml из раздела 2.2:

Язык кода:javascript
копировать
[root@icv-monitor-platform-dev docker]# docker-compose exec mysql bash
root@fceb9e329624:/# ls
bin   dev                         entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint-initdb.d  etc            lib   media  opt  root  sbin  sys  usr
root@fceb9e329624:/# exit
exit
[root@icv-monitor-platform-dev docker]# 

3.4 network

Язык кода:javascript
копировать
[root@icv-monitor-platform-dev docker]# docker network ls
NETWORK ID     NAME               DRIVER    SCOPE
64ad1eca60f7   bridge             bridge    local
4689aefb8f9b   docker_my-bridge   bridge    local
f2f555bed377   host               host      local
d02380dd3da4   none               null      local
[root@icv-monitor-platform-dev docker]# 

Видно, что механизм docker-compose автоматически поможет нам добавить префикс docker_ перед my-bridge.

4 Основные возможности Docker Compose

4.1. Имейте несколько изолированных сред на одной машине.

Compose использует имена проектов для изоляции сред друг от друга. Это имя проекта можно использовать в нескольких различных контекстах:

  • существоватьпринимающая сторона разработки,создать Несколько копий одной среды,Например, если вы хотите запустить стабильную копию для каждой функциональной ветки вашего проекта.
  • существовать CI Служитьустройство,Чтобы сборки не мешали друг другу,Вы можете установить имя проекта на уникальный номер сборки.
  • существует виртуальный хостинг или хостинг для разработки,Чтобы разные проекты, которые могут использовать одно и то же имя Служить, не мешали друг другу.

Имя проекта по умолчанию — это базовое имя каталога проекта:

Каталог проекта по умолчанию: Compose базовый каталог для файлов。--project-directory可以使用Параметры командной строки为其定义自定义值。

4.2 Сохранение данных тома при создании контейнера

Compose сохраню твой Служить Все использованные тома。бегать时docker compose up , если он находит какие-либо ранее запущенные контейнеры, он копирует тома из старого контейнера в новый контейнер. Этот процесс гарантирует, что любые данные, созданные вами в томе, не будут потеряны.

4.3 Воссоздавать только измененные контейнеры

Compose кэширует конфигурацию, используемую для создания контейнеров. Compose повторно использует существующие контейнеры при перезапуске неизмененной службы. Повторное использование контейнеров означает, что вы можете очень быстро изменить свою среду.

4.4 Поддержка переменных и перемещение комбинаций между средами

Compose поддерживает переменные в файлах Compose. Вы можете использовать эти переменные, чтобы настроить комбинацию для разных сред или разных пользователей.

Подробнее см.замена переменной

Вы можете использовать это поле или создать несколько Compose файл для расширения Compose документextends

5 распространенных случаев использования Docker Compose

Compose можно использовать по-разному.

5.1 Среда разработки

При разработке программного обеспечения решающее значение имеет возможность запускать приложения и взаимодействовать с ними в изолированной среде. Инструмент командной строки Compose можно использовать для создания сред и взаимодействия с ними.

Файлы Compose позволяют записывать и настраивать все зависимости приложения (данные библиотеки、очередь、кэш、Web Служить API и т. д.) метод. использовать Compose Инструмент командной строки, который работает с одной командой ( docker compose up) Для каждой зависимости создается один или несколько контейнеров.

Вместе эти функции предоставляют разработчикам удобный способ начать работу над своими проектами. Сочинить Многостраничное руководство для разработчика по началу работы можно сократить до одного машиночитаемого документа. Compose документинекоторые команды。

5.2 Автоматизированная среда тестирования

Важной частью любого процесса непрерывного развертывания или непрерывной интеграции является набор автоматизированных тестов. Для автоматизированного сквозного тестирования требуется среда для запуска тестов. Сочинить Предоставьте удобные методы,для вашего набора тестовсоздаватьи Уничтожить изолированную тестовую среду。

Полные среды определяются с помощью существующих файлов Compose, которые можно уничтожить всего несколькими командами:

Язык кода:javascript
копировать
$ docker compose up -d
$ ./run_tests
$ docker compose down

5.3 Развертывание на одном хосте

Compose традиционно фокусируется на рабочих процессах разработки и тестирования.,Но с каждым выпуском,Мы добиваемся прогресса в разработке более ориентированных на производство функций.

Дополнительные сведения об использовании функций, ориентированных на производство, см. в этом документеСовмещено в производстве.

6 Фактическая колба

6.1 Предварительные файлы

app.py
Язык кода:javascript
копировать
from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)


@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)
docker-compose.yml
Язык кода:javascript
копировать
version: "3"

services:

  redis:
    image: redis

  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8084:5000
    environment:
      REDIS_HOST: redis
dockerfile
Язык кода:javascript
копировать
FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]
Язык кода:javascript
копировать
[root@icv-monitor-platform-dev flask-redis]# ll
total 12
-rw-r--r-- 1 root root 432 May  8 09:49 app.py
-rw-r--r-- 1 root root 186 May  8 09:47 docker-compose.yml
-rw-r--r-- 1 root root 155 May  8 09:49 Dockerfile

6.2 Запуск

Язык кода:javascript
копировать
[root@icv-monitor-platform-dev flask-redis]# docker-compose up
flaskredis_redis_1 is up-to-date
Recreating flaskredis_web_1 ... done
Attaching to flaskredis_redis_1, flaskredis_web_1
redis_1  | 1:C 08 May 2023 01:54:53.395 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 08 May 2023 01:54:53.395 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 08 May 2023 01:54:53.395 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1  | 1:M 08 May 2023 01:54:53.396 * monotonic clock: POSIX clock_gettime
redis_1  | 1:M 08 May 2023 01:54:53.396 * Running mode=standalone, port=6379.
redis_1  | 1:M 08 May 2023 01:54:53.396 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1  | 1:M 08 May 2023 01:54:53.396 # Server initialized
redis_1  | 1:M 08 May 2023 01:54:53.396 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1  | 1:M 08 May 2023 01:54:53.397 * Ready to accept connections
web_1    |  * Serving Flask app "app" (lazy loading)
web_1    |  * Environment: production
web_1    |    WARNING: This is a development server. Do not use it in a production deployment.
web_1    |    Use a production WSGI server instead.
web_1    |  * Debug mode: on
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1    |  * Restarting with stat
web_1    |  * Debugger is active!
web_1    |  * Debugger PIN: 703-966-402

Посетите ip:8084 и получите ответ:

Язык кода:javascript
копировать
web_1    | 10.51.11.8 - - [08/May/2023 02:02:38] "GET / HTTP/1.1" 200 -
web_1    | 10.51.11.8 - - [08/May/2023 02:02:38] "GET /favicon.ico HTTP/1.1" 404 -

Тест завершен,останавливаться Служить:

Язык кода:javascript
копировать
^CGracefully stopping... (press Ctrl+C again to force)
Stopping flaskredis_web_1   ... done
Stopping flaskredis_redis_1 ... done
[root@icv-monitor-platform-dev flask-redis]# docker-compose down
Removing flaskredis_web_1   ... done
Removing flaskredis_redis_1 ... done
Removing network flaskredis_default
[root@icv-monitor-platform-dev flask-redis]# 

7 Docker Stack

Docker Stack: организованное развертывание на производственном уровне с помощью Docker Compose.

Docker Compose — популярный инструмент,Используется для определения и запуска нескольких приложений Docker. но,Когда вам нужно развернуть приложение в производственной среде,Для управления жизненным циклом и расширяемостью контейнера могут потребоваться более мощные инструменты.

Это Докер Роль Stack — это инструмент для оркестрации и управления несколькими докерами. Докера Composeдокумент Приходить定义Служить,и предоставляет более мощные функции,например скользящее обновление、Автоматическое расширение и Служить найдено.

Основные шаги для развертывания на рабочем уровне с использованием Docker Stack

  1. Написание Докера Создание файлов: и использование Docker Как и в Compose, вам нужно написать файл YAML, чтобы определить свой Служить. Однако существуют Docker В стеке вам нужно назвать файл docker-compose.yml и использовать версию 3 или более поздняя версия.
  2. Развертывание Служить: используйте команду doker stack Deploy для развертывания Служить. Эта команда прочитает определения Служить из вашего файла docker-compose.yml и развернет их в кластере.
  3. управлять Служить:ты можешьиспользование докера Команда стека для управления Служить. Например, использование докера stack Команда ls выводит список всех запущенных программ. докера stack Команда ps для проверки статуса Служить, использование докера stack Команда rm удаляет Служить и так далее.
  4. возобновлять Служить:ты можешьиспользование докера stack разверните команду для обновления Служить. Например, для опрокидывания Служить, использование докера service Команда обновления обновляет Служить и устанавливает для параметра --update-parallelismi --update-delay соответствующее значение.

Docker Stack — это мощный инструмент для оркестрации и управления несколькими приложениями Docker в производственной среде. Это использование Докера Создавайте файлы, чтобы определить Служить и предоставлять более мощные функции, такие как непрерывные обновления, автоматическое расширение и обнаружение Служить. Если вы ищете более мощный инструмент для управления контейнером Docker, то Docker Стек — хороший выбор.

Язык кода:javascript
копировать
docker stack deploy wordpress -c=docker-compose.yml

Эта команда использует Docker Стек для развертывания приложений WordPress. Он указывает стек с именем «wordpress» и использование докера-compose.ymlдокумент中определенный Служить Приходитьзапускатьприложение。

В частности, эта команда делает следующее:

  1. использование докера Команда stack создает новый стек с именем «wordpress».
  2. Используйте опцию -c, чтобы указать путь к файлу docker-compose.yml. Этот файл содержит информацию о развертываемом Служить, например библиотеку данных WordPressвеб-сайтиMySQL.
  3. Docker Стек прочитает определения Служить в файле docker-compose.yml и развернёт их в Docker. В кластере Swarm. Сюда входит создание Docker Служить, распространение контейнерисеть и многое другое.

Файлы Docker Stack и Docker Compose для упрощения процесса развертывания приложений WordPress.,и предоставляет более мощные функции,Например, непрерывные обновления, автоматическое расширение и Служить Discovery.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose