Tôi không chắc mình đã hiểu nhầm điều gì ở đây, nhưng có vẻ như chỉ có thể đặt ánh xạ cổng bằng cách tạo một thùng chứa mới từ một hình ảnh. Có cách nào để gán ánh xạ cổng cho bộ chứa Docker hiện tại không?
Tôi không chắc mình đã hiểu nhầm điều gì ở đây, nhưng có vẻ như chỉ có thể đặt ánh xạ cổng bằng cách tạo một thùng chứa mới từ một hình ảnh. Có cách nào để gán ánh xạ cổng cho bộ chứa Docker hiện tại không?
Câu trả lời:
Bạn có thể thay đổi ánh xạ cổng bằng cách chỉnh sửa trực tiếp hostconfig.json
tệp tại
/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
Bạn có thể xác định [hash_of_the_container] thông qua docker inspect <container_name>
lệnh và giá trị của trường "Id" là hàm băm.
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
Vì vậy, bạn không cần phải tạo một hình ảnh với phương pháp này. Bạn cũng có thể thay đổi cờ khởi động lại ở đây.
PS Bạn có thể truy cập https://docs.docker.com/engine/admin/ để tìm hiểu cách khởi động lại chính xác công cụ docker của bạn theo máy chủ của bạn. Tôi đã sử dụng sudo systemctl restart docker
để khởi động lại công cụ docker đang chạy trên Ubuntu 16.04
hostconfig.json
và config.v2.json
để làm cho công việc này. Sử dụng liên kết được cung cấp bởi @rohitmohta để xem chi tiết.
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
khi bạn có thể chạy tty điều hướng đến / var / lib /
Tôi cũng quan tâm đến vấn đề này.
Như @Thasmo đã đề cập, chuyển tiếp cổng có thể được chỉ định CHỈ với lệnh docker run
(và docker create
).
Các lệnh khác, docker start
không có -p
tùy chọn và docker port
chỉ hiển thị chuyển tiếp hiện tại.
Để thêm chuyển tiếp cổng, tôi luôn làm theo các bước sau,
dừng chạy container
docker stop test01
cam kết container
docker commit test01 test02
LƯU Ý: Trên đây, test02
là một hình ảnh mới mà tôi đang xây dựng từ test01
container.
chạy lại từ hình ảnh được cam kết
docker run -p 8080:8080 -td test02
Trong đó 8080 đầu tiên là cổng cục bộ và 8080 thứ hai là cổng container.
docker start
?
Nếu "hiện tại" bạn có nghĩa là "đang chạy", thì hiện tại không thể (hiện tại) có thể thêm ánh xạ cổng.
Tuy nhiên, bạn có thể tự động thêm giao diện mạng mới, ví dụ như Pipework , nếu bạn cần để lộ một dịch vụ trong một container đang chạy mà không dừng / khởi động lại nó.
Không chắc chắn nếu bạn có thể áp dụng ánh xạ cổng một container đang chạy. Bạn có thể áp dụng chuyển tiếp cổng trong khi chạy một container khác với việc tạo một container mới.
$ docker run -p <public_port>:<private_port> -d <image>
sẽ bắt đầu chạy container. Hướng dẫn này giải thích chuyển hướng cổng.
docker run
tạo và bắt đầu một container mới. Nó tương đương với việc làm docker create
theo sau docker start
.
Chỉnh sửa hostconfig.json dường như không hoạt động. Nó chỉ kết thúc với cổng đó được tiếp xúc nhưng không được công bố để lưu trữ. Cam kết và tái tạo container không phải là cách tiếp cận tốt nhất với tôi. Không ai nhắc đến docker network
?
Giải pháp tốt nhất sẽ là sử dụng proxy đảo ngược trong cùng một mạng
Tạo một mạng mới nếu vùng chứa trước của bạn không nằm trong bất kỳ mạng nào được đặt tên.
docker network create my_network
Tham gia container hiện tại của bạn vào mạng đã tạo
docker network connect my_network my_existing_container
Bắt đầu dịch vụ proxy đảo ngược (ví dụ nginx) xuất bản các cổng bạn cần, tham gia cùng một mạng
docker run -d --name nginx --network my_network -p 9000:9000 nginx
Tùy chọn xóa default.conf trong nginx
docker exec nginx rm /etc/nginx/conf.d/default.conf
Tạo cấu hình nginx mới
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;
}
}
Sao chép cấu hình vào nginx container.
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
Khởi động lại nginx
docker restart nginx
Ưu điểm : Để xuất bản các cổng mới, bạn có thể dừng / cập nhật / tạo lại container nginx một cách an toàn mà bạn muốn mà không cần chạm vào vùng chứa doanh nghiệp. Nếu bạn cần thời gian xuống 0 cho nginx, có thể thêm nhiều dịch vụ proxy đảo ngược tham gia vào cùng một mạng. Ngoài ra, một container có thể tham gia nhiều hơn một mạng.
Biên tập:
Để đảo ngược dịch vụ proxy không phải http, tệp cấu hình hơi khác một chút. Đây là một ví dụ đơn giản:
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
Trong ví dụ của Fujimoto Youichi test01
là một container, trong khi đó test02
là một hình ảnh.
Trước khi làm, docker run
bạn có thể loại bỏ container ban đầu và sau đó gán lại container cùng tên:
$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01
(Sử dụng -P
để hiển thị các cổng thành các cổng ngẫu nhiên thay vì gán thủ công).
Nếu bạn chạy docker run <NAME>
nó sẽ sinh ra một hình ảnh mới, rất có thể đó không phải là điều bạn muốn.
Nếu bạn muốn thay đổi một hình ảnh hiện tại, hãy làm như sau:
docker ps -a
Lấy id của thùng chứa mục tiêu của bạn và đi đến:
cd /var/lib/docker/containers/<conainerID><and then some:)>
Dừng container:
docker stop <NAME>
Thay đổi tập tin
vi config.v2.json
"Config": {
....
"ExposedPorts": {
"80/tcp": {},
"8888/tcp": {}
},
....
},
"NetworkSettings": {
....
"Ports": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
Và thay đổi tập tin
vi hostconfig.json
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"8888/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
Khởi động lại docker của bạn và nó sẽ hoạt động.
Một cách khác xung quanh bạn nếu bạn không thoải mái với IPtables cấu hình độ sâu Docker sẽ là bạn của bạn.
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}
Đây chỉ là một mẹo không phải là cách được đề xuất với kịch bản của tôi bởi vì tôi không thể dừng container, tôi hy vọng cũng sẽ giúp được bạn.
DOCKER_PORT
tới MACHINE_PORT
, những phần nào nên được thay đổi?
chúng tôi sử dụng các công cụ tiện dụng như ssh để thực hiện điều này một cách dễ dàng.
Tôi đã sử dụng máy chủ ubfox và hình ảnh docker dựa trên Ubuntu.
khi cần một cổng mới để được lập bản đồ,
bên trong docker chạy lệnh sau
ssh -R8888:localhost:8888 <username>@172.17.0.1
172.17.0.1 là ip của giao diện docker (bạn có thể lấy cái này bằng cách chạy
ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
trên máy chủ).
Ở đây tôi đã có cổng 8888 cục bộ được ánh xạ trở lại máy chủ 8888. bạn có thể thay đổi cổng khi cần.
nếu bạn cần thêm một cổng, bạn có thể tắt ssh và thêm một dòng -R vào cổng đó với cổng mới.
Tôi đã thử nghiệm điều này với netcat.
Là một bổ sung cho phản ứng của @ Fujimoto-Youichi
Bạn cũng có thể sử dụng $ docker run -P CONTAINER
để ánh xạ các cổng một cách ngẫu nhiên trong khi tạo vùng chứa của mình, nhưng hãy cẩn thận với sự bảo mật!
-P
eq to--publish-all
: "Nó xuất bản tất cả các cổng tiếp xúc với các cổng ngẫu nhiên",
sau đó chạy docker inspect CONTAINER
đến ánh xạ cổng vây như trong hình bên dưới:
Đọc thêm về docker run -P
ở Docker chạy
Đối với người dùng Windows và Mac, có một cách khá dễ dàng và thân thiện khác để thay đổi cổng ánh xạ:
tải về
đi đến trang cài đặt của container, trên tab cổng, bạn có thể trực tiếp sửa đổi cổng được xuất bản ở đó.
bắt đầu lại container
Trả lời ngắn: Bạn không thể chỉ định ánh xạ cổng cho bộ chứa Docker hiện có
Bạn cần một container mới ... đối phó với nó.
Nếu bạn chỉ muốn thay đổi cổng của container đang chạy, bạn làm:
sudo docker dừng NAME
sudo docker chạy -d -p 81:80 TÊN
trong khi:
"-d" để làm nền / deamon docker
"-p" cho phép ánh xạ cổng
Cổng "81" bên ngoài (được hiển thị) mà bạn sử dụng để truy cập bằng trình duyệt của mình
Cổng nghe "docker" nội bộ 80 "
docker run
lệnh, NAME
là tên của hình ảnh để chạy một container từ, trong khi ở docker stop
các NAME
đề cập đến tên của các container để dừng lại.