Hizmet kapsayıcıları
Azure DevOps Services
İşlem hattınız bir veya daha fazla hizmetin desteğini gerektiriyorsa, çoğu durumda her hizmeti iş başına oluşturmak, bağlanmak ve temizlemek istersiniz. Örneğin, bir işlem hattı veritabanına ve bellek önbelleğine erişim gerektiren tümleştirme testleri çalıştırabilir. Veritabanı ve bellek önbelleğinin işlem hattındaki her iş için yeni bir şekilde oluşturulması gerekir.
Kapsayıcı, işlem hattınızın bağımlı olduğu bir hizmeti çalıştırmak için basit ve taşınabilir bir yol sağlar. Bir hizmet kapsayıcısı, kapsayıcılı hizmetinizin 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ı, yalnızca onu gerektiren iş tarafından erişilebilir. Hizmet kapsayıcıları her türlü işle çalışır, ancak bunlar en yaygın olarak kapsayıcı işlerinde kullanılır.
Gereksinimler
Hizmet kapsayıcıları veya CMD
ENTRYPOINT
tanımlamalıdır.
sağlanan kapsayıcı için işlem hattı ek bağımsız değişkenler olmadan çalıştırılır docker run
.
Azure Pipelines, Linux veya Windows Kapsayıcıları çalıştırabilir. Linux kapsayıcıları için barındırılan Ubuntu veya Windows kapsayıcıları için Barındırılan Windows Kapsayıcı havuzu kullanın. (Barındırılan macOS havuzu kapsayıcı çalıştırmayı desteklemez.)
Tek kapsayıcı işi
Kapsayıcı işlerini kullanmanın basit bir örneği:
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
Bu işlem hattı, vebuildpack-deps
kapsayıcılarını nginx
Docker Hub 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ğı kullanarak doğru hizmetlere çözümlenmektedir.
Ağdaki tüm kapsayıcılar tüm bağlantı noktalarını otomatik olarak birbirine gösterir.
Tek iş
Hizmet kapsayıcılarını iş kapsayıcısı olmadan da kullanabilirsiniz. Basit bir örnek:
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
Bu işlem hattı en son nginx
kapsayıcıları başlatır. İş bir kapsayıcıda çalışmadığından otomatik ad çözümlemesi yoktur.
Bu örnekte, kullanarak localhost
hizmetlere nasıl ulaşabileceğiniz gösterilir.
Yukarıdaki örnekte, bağlantı noktasını açıkça (örneğin, 8080:80
) sağlıyoruz.
Alternatif bir yaklaşım, çalışma zamanında rastgele bir bağlantı noktasının dinamik olarak atanmasına izin vermektir. Daha sonra değişkenleri kullanarak bu dinamik bağlantı noktalarına erişebilirsiniz.
Bash betiğinde işlem ortamını kullanarak bir değişkene erişebilirsiniz. Bu değişkenler şu biçimi alır: agent.services.<serviceName>.ports.<port>
.
Yukarıdaki örnekte konakta redis
rastgele kullanılabilir bir bağlantı noktası atanmıştı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 yararlı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ı
Kapsayıcı kaynağını veya satır içi kapsayıcıyı belirtirken, 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
aynı Docker ağındaki kapsayıcılar varsayılan olarak tüm bağlantı noktalarını otomatik olarak birbirine sunduğundan, işiniz kapsayıcıda çalışıyorsa belirtme gerekli değildir.
İşiniz konakta çalışıyorsa hizmete ports
erişmek için gereklidir. Bağlantı noktası, sonunda isteğe bağlı /<protocol>
olan, örneğin 6379/tcp
konak makinedeki rastgele bir bağlantı noktasına bağlı bağlantı noktası 6379
üzerinden kullanıma sunma tcp
gibi bir form <hostPort>:<containerPort>
veya yalnızca <containerPort>
alır.
İşlem hattı, konak makinedeki rastgele bir bağlantı noktasına bağlı bağlantı noktaları için, iş tarafından erişilmesi 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ı dizisi volumes
olarak belirtebilirsiniz. Birimler Docker birimleri, anonim Docker birimleri veya konağa bağlamalar olarak adlandırılabilir.
services:
my_service:
image: myservice:latest
volumes:
- mydockervolume:/data/dir
- /data/dir
- /src/dir:/dst/dir
Birimler, <source>
konak makinede adlandırılmış bir birim veya mutlak yol olabilecek biçimdedir <source>:<destinationPath>
ve <destinationPath>
kapsayıcıdaki mutlak bir yoldur.
Not
Barındırılan havuzlarımızı kullanırsanız, konak makine iş tamamlandıktan sonra temizlendiğinden birimleriniz işler arasında kalıcı olmaz.
Diğer seçenekler
Hizmet kapsayıcıları, kapsayıcı işleri ile aynı kapsayıcı kaynaklarını paylaşır. Bu, aynı ek seçenekleri kullanabileceğiniz anlamına gelir.
Sistem Durumu Denetimi
İsteğe bağlı olarak, herhangi bir hizmet kapsayıcısı HEALTHCHECK belirtirse aracı, işi çalıştırmadan önce kapsayıcının iyi durumda olmasına kadar bekler.
Hizmetler içeren birden çok kapsayıcı örneği
Bu örnekte iki veritabanı kapsayıcısına bağlı bir Django Python web kapsayıcısı vardır: PostgreSQL ve MySQL. PostgreSQL veritabanı birincil veritabanıdır ve kapsayıcısı adına db
sahiptir. Kapsayıcı db
birimi /data/db:/var/lib/postgresql/data
kullanır ve aracılığıyla env
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ığıyla env
geçirilen veritabanı değişkenleri de vardır. Kapsayıcı web
, bağlantı noktası 8000
ile açık. Adımlarda pip
bağımlılıkları yükler ve ardından Django testi çalıştırılır. Çalışan bir örnek ayarlamak isterseniz , iki veritabanıyla ayarlanmış bir Django sitesi gerekir. Bu örnekte dosyanızın manage.py
kök dizinde ve Django projenizin de bu dizinde olduğu varsayılır. 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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin