Saya tidak yakin apakah saya salah mengerti sesuatu di sini, tetapi sepertinya hanya mungkin untuk mengatur pemetaan port dengan membuat wadah baru dari sebuah gambar. Apakah ada cara untuk menetapkan pemetaan port ke wadah Docker yang ada?
Saya tidak yakin apakah saya salah mengerti sesuatu di sini, tetapi sepertinya hanya mungkin untuk mengatur pemetaan port dengan membuat wadah baru dari sebuah gambar. Apakah ada cara untuk menetapkan pemetaan port ke wadah Docker yang ada?
Jawaban:
Anda dapat mengubah pemetaan port dengan langsung mengedit hostconfig.json
file di
/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
Anda dapat menentukan [hash_of_the_container] melalui docker inspect <container_name>
perintah dan nilai bidang "Id" adalah hash.
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
Jadi Anda tidak perlu membuat gambar dengan pendekatan ini. Anda juga dapat mengubah bendera mulai ulang di sini.
PS Anda dapat mengunjungi https://docs.docker.com/engine/admin/ untuk mempelajari cara memulai ulang mesin docker dengan benar sesuai mesin host Anda. Saya digunakan sudo systemctl restart docker
untuk me-restart mesin buruh pelabuhan saya yang berjalan di Ubuntu 16.04
hostconfig.json
dan config.v2.json
untuk membuat ini bekerja. Gunakan tautan yang disediakan oleh @rohitmohta untuk melihat detailnya.
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
Setelah Anda mendapatkan tty berjalan Anda bisa arahkan ke / var / lib / docker
Saya juga tertarik dengan masalah ini.
Seperti yang disebutkan @Thasmo , penerusan port dapat ditentukan HANYA dengan perintah docker run
(dan docker create
).
Perintah lain, docker start
tidak memiliki -p
opsi dan docker port
hanya menampilkan penerusan saat ini.
Untuk menambahkan penerusan porta, saya selalu mengikuti langkah-langkah ini,
berhenti menjalankan wadah
docker stop test01
komit wadah
docker commit test01 test02
CATATAN: Di atas, test02
adalah gambar baru yang saya buat dari test01
wadah.
jalankan kembali dari gambar yang dikomit
docker run -p 8080:8080 -td test02
Dimana 8080 pertama adalah port lokal dan 8080 kedua adalah port container.
docker start
?
Jika dengan "yang ada" yang Anda maksudkan "berjalan", maka (saat ini) tidak mungkin untuk menambahkan pemetaan port.
Anda dapat, bagaimanapun, secara dinamis menambahkan antarmuka jaringan baru dengan misalnya Pipework , jika Anda perlu mengekspos layanan dalam wadah yang sedang berjalan tanpa menghentikan / memulai kembali.
Tidak yakin apakah Anda bisa menerapkan pemetaan port wadah yang berjalan. Anda dapat menerapkan penerusan porta saat menjalankan wadah yang berbeda dari membuat wadah baru.
$ docker run -p <public_port>:<private_port> -d <image>
akan mulai menjalankan wadah. Tutorial ini menjelaskan pengalihan pelabuhan.
docker run
membuat dan memulai wadah baru. Ini setara dengan melakukan docker create
diikuti oleh docker start
.
Mengedit hostconfig.json tampaknya tidak berfungsi sekarang. Itu hanya berakhir dengan port yang terbuka tetapi tidak dipublikasikan untuk menjadi tuan rumah. Berkomitmen dan menciptakan kembali wadah bukanlah pendekatan terbaik bagi saya. Tidak ada yang disebutkan docker network
?
Solusi terbaik akan menggunakan proxy terbalik dalam jaringan yang sama
Buat jaringan baru jika wadah Anda sebelumnya tidak dalam yang bernama.
docker network create my_network
Bergabunglah dengan wadah Anda saat ini ke jaringan yang dibuat
docker network connect my_network my_existing_container
Mulai layanan proxy yang dibalik (mis. Nginx) menerbitkan port yang Anda butuhkan, bergabung dengan jaringan yang sama
docker run -d --name nginx --network my_network -p 9000:9000 nginx
Secara opsional hapus default.conf di nginx
docker exec nginx rm /etc/nginx/conf.d/default.conf
Buat konfigurasi nginx baru
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;
}
}
Salin konfigurasi ke wadah nginx.
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
Mulai ulang nginx
docker restart nginx
Keuntungan : Untuk mempublikasikan port baru, Anda dapat menghentikan / memperbarui / membuat ulang wadah nginx dengan aman sesuai keinginan tanpa menyentuh wadah bisnis. Jika Anda membutuhkan nol waktu turun untuk nginx, dimungkinkan untuk menambahkan lebih banyak layanan proxy yang dibalik yang bergabung dalam jaringan yang sama. Selain itu, sebuah wadah dapat bergabung dengan lebih dari satu jaringan.
Edit:
Untuk membalikkan layanan proxy non-http, file konfigurasi sedikit berbeda. Ini adalah contoh sederhana:
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
Dalam contoh Fujimoto Youichi test01
adalah wadah, sedangkan test02
gambar.
Sebelum melakukan, docker run
Anda dapat menghapus wadah asli dan kemudian menetapkan wadah nama yang sama lagi:
$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01
(Menggunakan -P
untuk mengekspos port ke port acak daripada menetapkan secara manual).
Jika Anda menjalankannya docker run <NAME>
akan muncul gambar baru, yang kemungkinan besar bukan yang Anda inginkan.
Jika Anda ingin mengubah gambar saat ini lakukan hal berikut:
docker ps -a
Ambil id wadah target Anda dan buka:
cd /var/lib/docker/containers/<conainerID><and then some:)>
Hentikan wadah:
docker stop <NAME>
Ubah file
vi config.v2.json
"Config": {
....
"ExposedPorts": {
"80/tcp": {},
"8888/tcp": {}
},
....
},
"NetworkSettings": {
....
"Ports": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
Dan ganti file
vi hostconfig.json
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"8888/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
Mulai ulang buruh pelabuhan Anda dan itu akan berhasil.
Cara lain di sekitar Anda jika Anda tidak nyaman dengan konfigurasi Docker depth IPtables akan menjadi teman Anda.
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}
Ini hanya tipuan bukan cara yang disarankan ini bekerja dengan skenario saya karena saya tidak bisa berhenti wadah saya harap akan membantu Anda juga.
DOCKER_PORT
untuk MACHINE_PORT
, bagian mana yang harus diubah?
kami menggunakan alat praktis seperti ssh untuk melakukannya dengan mudah.
Saya menggunakan host ubuntu dan gambar buruh pelabuhan berbasis ubuntu.
ketika port baru perlu dipetakan,
di dalam buruh pelabuhan jalankan perintah berikut
ssh -R8888:localhost:8888 <username>@172.17.0.1
172.17.0.1 adalah ip dari antarmuka docker (Anda bisa mendapatkannya dengan menjalankannya
ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
di host).
di sini saya memiliki port 8888 lokal yang dipetakan kembali ke host 8888. Anda dapat mengubah port sesuai kebutuhan.
jika Anda memerlukan satu port lagi, Anda dapat mematikan ssh dan menambahkan satu baris lagi -R ke port baru tersebut.
Saya telah menguji ini dengan netcat.
Untuk Pengguna Windows & Mac, ada cara lain yang cukup mudah dan ramah untuk mengubah port pemetaan:
unduh kitematic
pergi ke halaman pengaturan wadah, pada tab port, Anda dapat langsung memodifikasi port yang diterbitkan di sana.
mulai wadah lagi
Jawaban Singkat: Anda tidak dapat menetapkan pemetaan port ke wadah Docker yang ada
Anda membutuhkan wadah baru ... menanganinya.
Jika Anda hanya ingin mengubah port wadah yang sedang berjalan, Anda harus:
sudo docker menghentikan NAME
sudo docker run -d -p 81:80 NAME
dimana sebagai:
"-d" untuk latar belakang / deamon buruh pelabuhan
"-p" aktifkan pemetaan port
Port "81" eksternal (terbuka) yang Anda gunakan untuk mengakses dengan browser Anda
"80" port docker container internal dengarkan port
docker run
perintah, NAME
adalah nama dari gambar untuk menjalankan wadah dari, sedangkan di docker stop
dalam NAME
mengacu pada nama wadah untuk berhenti.