2015-02-15 27 views
7

Tôi có Dockerfile sau cho container của tôi:Docker Soạn không ràng buộc cổng

FROM  centos:centos7 

# Install software 
RUN   yum -y update && yum clean all 
RUN   yum install -y tar gzip wget && yum clean all 

# Install io.js 
RUN   mkdir /root/iojs 
RUN   wget https://iojs.org/dist/v1.1.0/iojs-v1.1.0-linux-x64.tar.gz 
RUN   tar -zxvf iojs-v1.1.0-linux-x64.tar.gz -C /root/iojs 
RUN   rm -f iojs-v1.1.0-linux-x64.tar.gz 

# add io.js to path 
RUN   echo "PATH=$PATH:/root/iojs/iojs-v1.1.0-linux-x64/bin" >> /root/.bashrc 

# go to /src 
WORKDIR  /src 

CMD   /bin/bash 

tôi xây dựng chứa này và bắt đầu hình ảnh với docker run -i -t -p 8080:8080 -v /srv/source:/usr/src/app -w /usr/src/app --rm iojs-dev bash. Docker gắn cổng 8080 với cổng máy chủ 8080, để tôi có thể truy cập ứng dụng iojs từ máy khách của tôi. Mọi thứ đều hoạt động tốt.

Bây giờ tôi muốn bắt đầu container của tôi với Docker-soạn, sử dụng Docker-compose.yml sau

webfrontend: 
    image: iojs-dev 
    links: 
     - db 
    command: bash -c "iojs test.js" 
    ports: 
     - "127.0.0.1:8080:8080" 
    volumes: 
     - /srv/source:/usr/src/app 
     - /logs:/logs 
db: 
    image: mariadb 
    environment: 
     MYSQL_ROOT_PASSWORD: 12345 

Khi tôi bây giờ chạy docker-compose run webfrontend bash tôi không thể truy cập vào cổng 8080 trên máy chủ của tôi. Không có cổng nào bị ràng buộc. Kết quả của docker ports trống và cũng là kết quả của docker inspect là trống ở các thiết lập cổng:

"NetworkSettings": { 
    "Bridge": "docker0", 
    "Gateway": "172.17.42.1", 
    "IPAddress": "172.17.0.51", 
    "IPPrefixLen": 16, 
    "MacAddress": "02:42:ac:11:00:33", 
    "PortMapping": null, 
    "Ports": { 
     "8080/tcp": null 
    } 
}, 
"HostConfig": { 
    "Binds": [ 
     "/srv/source:/usr/src/app:rw", 
     "/logs:/logs:rw" 
    ], 
    "CapAdd": null, 
    "CapDrop": null, 
    "ContainerIDFile": "", 
    "Devices": null, 
    "Dns": null, 
    "DnsSearch": null, 
    "ExtraHosts": null, 
    "Links": [ 
     "/docker_db_1:/docker_webfrontend_run_34/db", 
     "/docker_db_1:/docker_webfrontend_run_34/db_1", 
     "/docker_db_1:/docker_webfrontend_run_34/docker_db_1" 
    ], 
    "LxcConf": null, 
    "NetworkMode": "bridge", 
    "PortBindings": null, 
    "Privileged": false, 
    "PublishAllPorts": false, 
    "RestartPolicy": { 
     "MaximumRetryCount": 0, 
     "Name": "" 
    }, 
    "SecurityOpt": null, 
    "VolumesFrom": [] 
}, 
+2

[Bản phát hành RC mới nhất 1.1.0-rc2] (https://github.com/docker/fig/releases) (bây giờ được gọi là docker-compose) hỗ trợ cờ '--service-ports', sẽ liên kết các cổng trong 'fig run'. – dnephin

+0

@dnephin Cảm ơn, tôi chuẩn bị từ bỏ kịch bản lệnh 'run' tùy chỉnh của mình. Đã thêm vào câu trả lời. –

Trả lời

4

Đây là hành vi cố ý cho fig run.

Chạy lệnh một lần trên dịch vụ.

Lệnh một lần được bắt đầu trong vùng chứa mới có cùng cấu hình như vùng chứa bình thường cho dịch vụ đó, do đó, khối lượng, liên kết, v.v ... sẽ được tạo như mong đợi. Thứ duy nhất khác với bình thường là lệnh sẽ được ghi đè với một vùng được chỉ định và sẽ không có cổng nào được tạo trong trường hợp chúng va chạm.

source.

fig up có lẽ là lệnh bạn đang tìm kiếm, nó sẽ (lại) tạo tất cả các vùng chứa dựa trên fig.yml của bạn và bắt đầu chúng.

+0

Bạn đúng và tôi nên RTFM ;-) Nó hoạt động ngay bây giờ, cảm ơn bạn. – rotespferd

6

Đây là hành vi cố ý cho docker-compose run, theo documentation:

Khi sử dụng run, có hai sự khác biệt từ đưa lên một container thường:

  1. ...

  2. theo mặc định sẽ không có cổng nào được tạo trong trường hợp chúng va chạm với các cổng đã mở.

Một cách để khắc phục điều này là sử dụng up thay vì run, trong đó:

xây dựng, (lại) tạo ra, bắt đầu, và gắn vào container cho một dịch vụ.

Một cách khác, nếu bạn đang sử dụng phiên bản 1.1.0 hoặc mới hơn, là để vượt qua --service-ports tùy chọn:

Chạy lệnh với cổng của dịch vụ được kích hoạt và ánh xạ tới máy chủ.

P.S. Đã cố chỉnh sửa câu trả lời gốc, bị từ chối, hai lần. Ở đẳng cấp, SO.

Các vấn đề liên quan