下記のように-p
オプションでコンテナの8080をホストOSの8080にマッピングして、コンテナの外からアクセスすることができます。
docker run -it -p 8080:8080 ubuntu:18.04 bash
コンテナで動かすプログラムが8080以外のポートをLinstenする場合は、下記のようにNET_ADMIN
を付与してiptables
でポートフォワードします。
例えば、下記のようなコマンドでnginxのデフォルト設定で8080ポートでアクセスできます。
docker run -it -p 8080:8080 --cap-add=NET_ADMIN ubuntu:18.04 bash apt update && apt install -y nginx nmap iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80 /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
ホストOSから下記のようにアクセスできます。
$ curl -s -I http://localhost:8080 HTTP/1.1 200 OK Server: nginx/1.14.0 (Ubuntu) Date: Sat, 23 Jun 2018 07:32:07 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Sat, 23 Jun 2018 07:28:02 GMT Connection: keep-alive ETag: "5b2df682-264" Accept-Ranges: bytes $
下記でiptablesの設定を確認できます。
$ docker exec -it adoring_galileo iptables -L -t nat | head -3 Chain PREROUTING (policy ACCEPT) target prot opt source destination REDIRECT tcp -- anywhere anywhere tcp dpt:8080 redir ports 80