У меня Dockerfile выглядит следующим образом:
$ cat Dockerfile
FROM node
RUN npx degit sveltejs/template svelte-login-form
WORKDIR svelte-login-form
RUN pwd
RUN npm install
EXPOSE 5000
ENTRYPOINT ["npm", "run", "dev"]
Я могу собрать его и запустить как контейнер:
$ docker build -t example-for-port-mapping .
Sending build context to Docker daemon 8.192kB
Step 1/7 : FROM node
---> 4ac0e1872789
Step 2/7 : RUN npx degit sveltejs/template svelte-login-form
---> Using cache
---> c3c9e0ff2612
Step 3/7 : WORKDIR svelte-login-form
---> Using cache
---> ba9cc2ea671c
Step 4/7 : RUN pwd
---> Using cache
---> cce7a5f9e8fa
Step 5/7 : RUN npm install
---> Using cache
---> 864e37465ec8
Step 6/7 : EXPOSE 5000
---> Using cache
---> 6984ebf0de18
Step 7/7 : ENTRYPOINT ["npm", "run", "dev"]
---> Using cache
---> e4a92c7c1da5
Successfully built e4a92c7c1da5
Successfully tagged example-for-port-mapping:latest
$ docker run --rm -p 5000 -d example-for-port-mapping
7ee5af59b7fd45f8b839520a88fa34fe99992365a78579f19bf2b62924279676
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ee5af59b7fd example-for-port-mapping "npm run dev" 5 seconds ago Up 4 seconds 0.0.0.0:32792->5000/tcp jovial_chatterjee
Как и ожидалось, я могу получить доступ к порту 5000 внутри контейнера:
$ docker exec jovial_chatterjee /bin/bash -c 'curl http://localhost:5000'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 355 100 355 0 0 14961 0 --:--:-- --:--:-- --:--:-- 15434
<!doctype html>
<html>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width'>
<title>Svelte app</title>
<link rel='icon' type='image/png' href='/favicon.png'>
<link rel='stylesheet' href='/global.css'>
<link rel='stylesheet' href='/bundle.css'>
<script defer src='/bundle.js'></script>
</head>
<body>
</body>
</html>
Поскольку в моем примере порт 5000 сопоставлен с портом 32792, я ожидаю того же результата при локальном доступе к порту 32792, но я получаю пустой ответ:
$ curl http://0.0.0.0:32792
curl: (52) Empty reply from server
Как я могу отладить это? Я ожидаю увидеть тот же результат на подключенном хост-порту, что и на порту 5000 в контейнере.
В других случаях это прекрасно работает, например:
$ docker run -dit --name my-apache-app -p 80 httpd:2.4
ba81cbafe62b2409abad9c2a428533aa43b00547f5f192080a4c6c96c2794fea
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba81cbafe62b httpd:2.4 "httpd-foreground" 4 seconds ago Up 3 seconds 0.0.0.0:32794->80/tcp my-apache-app
$ curl 0.0.0.0:32794
<html><body><h1>It works!</h1></body></html>
Я использую Docker на Mac OS 10.15:
$ docker -v
Docker version 19.03.2, build 6a30dfc
Спасибо!