Hizmet kapsayıcıları
Azure DevOps Services
İşlem hattınız bir veya daha fazla hizmetin desteğini gerektiriyorsa, iş başına hizmetleri oluşturmanız, bu hizmetlere bağlanmanız ve hizmetleri temizlemeniz gerekebilir. Örneğin işlem hattınız, işlem hattındaki her iş için yeni oluşturulan bir veritabanına ve bellek önbelleğine erişim gerektiren tümleştirme testleri çalıştırabilir.
Kapsayıcı, işlem hattınızın bağlı olduğu bir hizmeti çalıştırmak için basit ve taşınabilir bir yol sağlar. Hizmet kapsayıcısı, kapsayıcılı bir hizmetin yaşam döngüsünü otomatik olarak oluşturmanıza, ağ oluşturmanıza ve yönetmenize olanak tanır. Her hizmet kapsayıcısına yalnızca bunu gerektiren iş erişebilir. Hizmet kapsayıcıları her türlü işle çalışır, ancak en yaygın olarak kapsayıcı işleriyle kullanılır.
Gereksinimler
Hizmet kapsayıcıları veya
CMD
ENTRYPOINT
tanımlamalıdır. İşlem hattı, sağlanan kapsayıcı için bağımsız değişken olmadan çalışırdocker run
.Azure Pipelines, Linux veya Windows kapsayıcılarını çalıştırabilir. Linux kapsayıcıları için barındırılan Ubuntu kapsayıcı havuzunu veya Windows kapsayıcıları için barındırılan Windows havuzunu kullanabilirsiniz. Barındırılan macOS havuzu, kapsayıcı çalıştırmayı desteklemez.
Not
Hizmet kapsayıcıları Klasik işlem hatlarında desteklenmez.
Tek kapsayıcılı iş
Aşağıdaki örnek YAML işlem hattı tanımı tek bir kapsayıcı işini gösterir.
resources:
containers:
- container: my_container
image: buildpack-deps:focal
- container: nginx
image: nginx
pool:
vmImage: 'ubuntu-latest'
container: my_container
services:
nginx: nginx
steps:
- script: |
curl nginx
displayName: Show that nginx is running
Yukarıdaki işlem hattı Docker Hub'dan ve buildpack-deps
kapsayıcılarını nginx
getirir ve kapsayıcıları başlatır. Kapsayıcılar birbirine adlarıyla ulaşabilmeleri services
için birbirine bağlanır.
Bu iş kapsayıcısının nginx
içinden, ana bilgisayar adı Docker ağını kullanarak doğru hizmetlere çözümleniyor. Ağdaki tüm kapsayıcılar, tüm bağlantı noktalarını otomatik olarak birbirine gösterir.
Tek bir bağımsız iş
Aşağıdaki örnekte olduğu gibi hizmet kapsayıcılarını iş kapsayıcısı olmadan da kullanabilirsiniz.
resources:
containers:
- container: nginx
image: nginx
ports:
- 8080:80
env:
NGINX_PORT: 80
- container: redis
image: redis
ports:
- 6379
pool:
vmImage: 'ubuntu-latest'
services:
nginx: nginx
redis: redis
steps:
- script: |
curl localhost:8080
echo $AGENT_SERVICES_REDIS_PORTS_6379
Yukarıdaki işlem hattı en son nginx
kapsayıcıları başlatır. İş bir kapsayıcıda çalışmadığından otomatik ad çözümlemesi yoktur. Bunun yerine, kullanarak localhost
hizmetlere ulaşabilirsiniz. Örnek, bağlantı noktasını açıkça sağlar 8080:80
.
Alternatif bir yaklaşım, çalışma zamanında rastgele bir bağlantı noktasının dinamik olarak atanmasına izin vermektir. Ardından değişkenleri kullanarak bu dinamik bağlantı noktalarına erişebilirsiniz. Bu değişkenler şu biçimdedir: agent.services.<serviceName>.ports.<port>
. Bash betiğinde, işlem ortamını kullanarak değişkenlere erişebilirsiniz.
Yukarıdaki örnekte, redis
konakta rastgele kullanılabilir bir bağlantı noktası atanır. agent.services.redis.ports.6379
değişkeni bağlantı noktası numarasını içerir.
Birden çok iş
Hizmet kapsayıcıları, aynı hizmetin birden çok sürümünde aynı adımları çalıştırmak için de kullanışlıdır. Aşağıdaki örnekte, aynı adımlar PostgreSQL'in birden çok sürümünde çalıştırılır.
resources:
containers:
- container: my_container
image: ubuntu:22.04
- container: pg15
image: postgres:15
- container: pg14
image: postgres:14
pool:
vmImage: 'ubuntu-latest'
strategy:
matrix:
postgres15:
postgresService: pg15
postgres14:
postgresService: pg14
container: my_container
services:
postgres: $[ variables['postgresService'] ]
steps:
- script: printenv
Bağlantı Noktaları
Bir kapsayıcı kaynağını veya satır içi kapsayıcıyı çağırdığınızda, aşağıdaki örnekte olduğu gibi kapsayıcıda kullanıma sunma dizisi belirtebilirsiniz ports
.
resources:
containers:
- container: my_service
image: my_service:latest
ports:
- 8080:80
- 5432
services:
redis:
image: redis
ports:
- 6379/tcp
ports
İşiniz bir kapsayıcıda çalışıyorsa belirtme gerekli değildir, çünkü aynı Docker ağındaki kapsayıcılar varsayılan olarak tüm bağlantı noktalarını otomatik olarak birbirine gösterir.
İşiniz konakta çalışıyorsa hizmete ports
erişmek için gereklidir. Bağlantı noktası formu alır veya sonunda <containerPort>
isteğe bağlı /<protocol>
olan bir bağlantı <hostPort>:<containerPort>
noktası alır. Örneğin, 6379/tcp
konak makinedeki rastgele bir bağlantı noktasına 6379
bağlı bağlantı noktası üzerinden kullanıma sunartcp
.
Konak makinede rastgele bir bağlantı noktasına bağlı bağlantı noktaları için işlem hattı, işin bağlantı noktasına erişebilmesi için formun agent.services.<serviceName>.ports.<port>
bir değişkenini oluşturur. Örneğin, agent.services.redis.ports.6379
konak makinede rastgele atanan bağlantı noktasına çözümler.
Birimler
Birimler, hizmetler arasında veri paylaşmak veya bir işin birden çok çalıştırması arasında verileri kalıcı hale göstermek için kullanışlıdır. Birim bağlamalarını, konak makinede adlandırılmış birim veya mutlak bir yol olabileceği ve <destinationPath>
kapsayıcıdaki mutlak bir yol olabileceği form <source>
<source>:<destinationPath>
dizisi volumes
olarak belirtirsiniz. Birimler Docker birimleri, anonim Docker birimleri veya konak üzerindeki bağlama bağlamaları olarak adlandırılabilir.
services:
my_service:
image: myservice:latest
volumes:
- mydockervolume:/data/dir
- /data/dir
- /src/dir:/dst/dir
Not
Microsoft tarafından barındırılan havuzlar kullanıyorsanız, konak makine her iş tamamlandıktan sonra temizlendiğinden birimleriniz işler arasında kalıcı olmaz.
Başlangıç seçenekleri
Hizmet kapsayıcıları, kapsayıcı işleri ile aynı kapsayıcı kaynaklarını paylaşır. Bu, aynı başlangıç seçeneklerini kullanabileceğiniz anlamına gelir.
Durum denetimi
Herhangi bir hizmet kapsayıcısı healthcheck belirtirse aracı isteğe bağlı olarak kapsayıcının durumu iyi olana kadar işi çalıştırmadan önce bekleyebilir.
Hizmetlerle birden çok kapsayıcı örneği
Aşağıdaki örnekte PostgreSQL ve MySQL veritabanı kapsayıcılarına bağlı bir Django Python web kapsayıcısı vardır.
- PostgreSQL veritabanı birincil veritabanıdır ve kapsayıcısı olarak adlandırılır
db
. - Kapsayıcı
db
birimi/data/db:/var/lib/postgresql/data
kullanır ve aracılığıylaenv
kapsayıcıya geçirilen üç veritabanı değişkeni vardır. - Kapsayıcı
mysql
bağlantı noktasını3306:3306
kullanır ve aracılığıylaenv
geçirilen veritabanı değişkenleri de vardır. - Kapsayıcı
web
, bağlantı noktası8000
ile açık.
Adımlarda bağımlılıkları pip
yükler ve ardından Django testleri çalıştırılır.
Çalışan bir örnek ayarlamak için iki veritabanıyla ayarlanmış bir Django sitesi gerekir. Örnekte, manage.py dosyanızın kök dizinde olduğu ve Django projenizin de bu dizinde olduğu varsayılır. Aksi takdirde, içindeki /__w/1/s/manage.py test
yolu güncelleştirmeniz /__w/1/s/
gerekebilir.
resources:
containers:
- container: db
image: postgres
volumes:
- '/data/db:/var/lib/postgresql/data'
env:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
- container: mysql
image: 'mysql:5.7'
ports:
- '3306:3306'
env:
MYSQL_DATABASE: users
MYSQL_USER: mysql
MYSQL_PASSWORD: mysql
MYSQL_ROOT_PASSWORD: mysql
- container: web
image: python
volumes:
- '/code'
ports:
- '8000:8000'
pool:
vmImage: 'ubuntu-latest'
container: web
services:
db: db
mysql: mysql
steps:
- script: |
pip install django
pip install psycopg2
pip install mysqlclient
displayName: set up django
- script: |
python /__w/1/s/manage.py test