Burada bir şeyleri yanlış anladığımdan emin değilim, ancak sadece bir görüntüden yeni bir kap oluşturarak bağlantı noktası eşlemeleri ayarlamak mümkün görünüyor. Mevcut bir Docker kapsayıcısına bağlantı noktası eşlemesi atamanın bir yolu var mı?
Burada bir şeyleri yanlış anladığımdan emin değilim, ancak sadece bir görüntüden yeni bir kap oluşturarak bağlantı noktası eşlemeleri ayarlamak mümkün görünüyor. Mevcut bir Docker kapsayıcısına bağlantı noktası eşlemesi atamanın bir yolu var mı?
Yanıtlar:
Bağlantı noktası eşlemesini doğrudan hostconfig.json
adresindeki dosyayı düzenleyerek değiştirebilirsiniz .
/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
[Hash_of_the_container] docker inspect <container_name>
komutunu belirleyebilirsiniz ve "Id" alanının değeri hash olur.
1) stop the container
2) stop docker service (per Tacsiazuma's comment)
3) change the file
4) restart your docker engine (to flush/clear config caches)
5) start the container
Dolayısıyla bu yaklaşımla bir görüntü oluşturmanıza gerek yok. Yeniden başlatma bayrağını buradan da değiştirebilirsiniz.
Not : Docker motorunuzu ana makinenize göre doğru şekilde nasıl yeniden başlatacağınızı öğrenmek için https://docs.docker.com/engine/admin/ adresini ziyaret edebilirsiniz . Ben kullanılan sudo systemctl restart docker
Ubuntu 16.04 çalışıyorsa benim liman işçisi motoru yeniden başlatmak için
hostconfig.json
ve config.v2.json
bu işi yapmak önemlidir . Ayrıntıları görmek için @rohitmohta tarafından sağlanan bağlantıyı kullanın.
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
sizi çalıştıran tty olabilir olsun sana kez / var / lib / docker'a gidin
Ben de bu problemle ilgileniyorum.
As @Thasmo bahsedildiği, liman yönlendirmeler, SADECE ile belirtilebilir docker run
(ve docker create
) komutu.
Diğer komutlar, seçeneğe docker start
sahip değildir -p
ve docker port
yalnızca geçerli yönlendirmeleri görüntüler.
Bağlantı noktası yönlendirmeleri eklemek için her zaman şu adımları izlerim,
konteyner çalıştırmayı durdur
docker stop test01
taahhüt kabın
docker commit test01 test02
Not: Yukarıdaki, kapsayıcıdan test02
inşa ettiğim yeni bir görüntüdür test01
.
yeniden çalıştırmak kaydedilmeyen görüntüden
docker run -p 8080:8080 -td test02
İlk 8080 yerel bağlantı noktası ve ikinci 8080 konteyner bağlantı noktasıdır.
docker start
mı?
"Mevcut" ile "çalışıyor" demek istiyorsanız, bir bağlantı noktası eşlemesi eklemek (şu anda) mümkün değildir.
Ancak, çalışan bir kapsayıcıda bir hizmeti durdurmadan / yeniden başlatmadan açığa çıkarmanız gerekirse, örneğin Pipework ile dinamik olarak yeni bir ağ arabirimi ekleyebilirsiniz .
Çalışan bir kapsayıcıya bağlantı noktası eşleme uygulayıp uygulayamayacağınızdan emin değilsiniz. Yeni bir kapsayıcı oluşturmaktan farklı bir kapsayıcı çalıştırırken bağlantı noktası iletme uygulayabilirsiniz.
$ docker run -p <public_port>:<private_port> -d <image>
kapsayıcıyı çalıştırmaya başlayacak. Bu eğiticide bağlantı noktası yeniden yönlendirmesi açıklanmaktadır.
docker run
yeni bir kap oluşturur ve başlatır. Bunu yaparken eşdeğerdir docker create
izledi docker start
.
Hostconfig.json dosyasını düzenlemek artık çalışmıyor. Yalnızca bu bağlantı noktasının açığa çıkması ancak sunucuda yayınlanmamasıyla sona erer. Kapsayıcılık yapmak ve yeniden yaratmak benim için en iyi yaklaşım değil. Kimse bahsetmedi docker network
mi?
En iyi çözüm, ters çevrilmiş proxy'yi aynı ağ içinde kullanmak olabilir
Önceki kapsayıcı adınız yoksa yeni bir ağ oluşturun.
docker network create my_network
Mevcut kapsayıcınızı oluşturulan ağa katılın
docker network connect my_network my_existing_container
Aynı ağa katılarak, ihtiyacınız olan bağlantı noktalarını yayınlayan ters bir proxy hizmeti (örn. Nginx) başlatın
docker run -d --name nginx --network my_network -p 9000:9000 nginx
İsteğe bağlı olarak nginx'teki default.conf dosyasını kaldırın
docker exec nginx rm /etc/nginx/conf.d/default.conf
Yeni bir nginx yapılandırması oluşturma
server
{
listen 9000;
location / {
proxy_pass http://my_existing_container:9000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Yapılandırmayı nginx konteynerine kopyalayın.
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
Nginx'i yeniden başlat
docker restart nginx
Avantajları : Yeni bağlantı noktaları yayınlamak için, iş konteynerine dokunmadan nginx konteynerini güvenli bir şekilde durdurabilir / güncelleyebilirsiniz / yeniden oluşturabilirsiniz. Nginx için sıfır kesinti zamanına ihtiyacınız varsa, aynı ağa katılan daha fazla ters çevrilmiş proxy hizmetleri eklemek mümkündür. Ayrıca, bir kap birden fazla ağa katılabilir.
Düzenle:
Http olmayan proxy hizmetlerini tersine çevirmek için yapılandırma dosyası biraz farklıdır. İşte basit bir örnek:
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
Fujimoto Youichi örneğinde test01
bir konteyner, oysa test02
bir görüntüdür.
Yapmadan önce docker run
orijinal kabı çıkarabilir ve daha sonra kabı aynı adı tekrar atayabilirsiniz:
$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01
( -P
Portları manuel olarak atamak yerine rastgele portlara maruz bırakmak için kullanılır).
Eğer çalıştırırsanız docker run <NAME>
, muhtemelen istediğiniz gibi olmayan yeni bir görüntü ortaya çıkar.
Geçerli bir görüntüyü değiştirmek istiyorsanız aşağıdakileri yapın:
docker ps -a
Hedef kapsayıcınızın kimliğini alın ve şu adrese gidin:
cd /var/lib/docker/containers/<conainerID><and then some:)>
Kabı durdurun:
docker stop <NAME>
Dosyaları değiştirme
vi config.v2.json
"Config": {
....
"ExposedPorts": {
"80/tcp": {},
"8888/tcp": {}
},
....
},
"NetworkSettings": {
....
"Ports": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
Ve dosyayı değiştir
vi hostconfig.json
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"8888/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
Docker'ınızı yeniden başlatın ve çalışması gerekir.
Doble derinlik yapılandırması konusunda rahat değilseniz IPtables arkadaşınız olacaktır.
iptables -t nat -A DOCKER -p tcp --dport ${YOURPORT} -j DNAT --to-destination ${CONTAINERIP}:${YOURPORT}
iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source ${CONTAINERIP} --destination ${CONTAINERIP} --dport ${YOURPORT}
iptables -A DOCKER -j ACCEPT -p tcp --destination ${CONTAINERIP} --dport ${YOURPORT}
Bu sadece benim bir senaryo ile çalışır tavsiye edilen bir yol değil bir hile çünkü ben konteyner durduramadı umarım size de yardımcı olacaktır.
DOCKER_PORT
için MACHINE_PORT
, hangi parçaların değiştirilmesi gerektiğini?
bunu kolayca gerçekleştirmek için ssh gibi kullanışlı araçlar kullanıyoruz.
Ubuntu host ve ubuntu tabanlı docker imajını kullanıyordum.
yeni bir portun haritalandırılması gerektiğinde,
docker'ın içinde aşağıdaki komutu çalıştırın
ssh -R8888:localhost:8888 <username>@172.17.0.1
172.17.0.1, docker arayüzünün ipiydi (bunu ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
ana bilgisayarda çalıştırarak alabilirsiniz
).
Burada geri 8888 ana eşlenen yerel 8888 bağlantı noktası vardı. gerektiği gibi bağlantı noktasını değiştirebilirsiniz.
bir bağlantı noktasına daha ihtiyacınız varsa, ssh'ı öldürebilir ve yeni bağlantı noktasıyla bir -R satırı daha ekleyebilirsiniz.
Bunu netcat ile test ettim.
Windows ve Mac Kullanıcıları için, eşleme bağlantı noktasını değiştirmenin başka bir kolay ve kolay yolu daha vardır:
kitematic indir
kapsayıcının ayarlar sayfasına gidin, bağlantı noktaları sekmesinde, orada yayınlanan bağlantı noktasını doğrudan değiştirebilirsiniz.
kabı tekrar başlat
Kısa Yanıt: Mevcut bir Docker kapsayıcısına bağlantı noktası eşlemesi atayamazsınız
Yeni bir konteynere ihtiyacın var ... onunla uğraş.
Çalışan kabın bağlantı noktasını değiştirmek istiyorsanız, şunları yapabilirsiniz:
sudo docker durağı NAME
sudo docker run -d -p 81:80 İSİM
buna karşılık:
liman işçisine arka plan / deamon için "-d"
"-p" bağlantı noktası eşleştirmeyi etkinleştir
Tarayıcınızla erişmek için kullandığınız "81" harici (açık) bağlantı noktası
"80" dahili docker konteyneri dinleme bağlantı noktası
docker run
komut, NAME
oysa bir kabı çalıştırmak için görüntü adıdır durdurmak için kabın adını gösterir. docker stop
NAME