Недавно мне нужно было предоставить некоторые ресурсы JSON для мобильных клиентов. Вот быстрый и пошаговый способ открыть веб-API поверх Docker. Служба предоставляется с помощью Express, поэтому мне нужно создать свою службу поверх node:latest изображения. Подробности следуют.

0. Откройте 2 терминала/шелла. В одном терминале активируйте dockerd как root. Следующие команды выполняются в другом терминале.
1. Сначала создайте приложение (см.: https://github.com/bpdp/all-things-docker/tree/master/images/expressjs-restful)< br /> 2. Создайте Dockerfile: см. Dockerfile внутри репозитория
3. Соберите образ docker:

$ docker build -t bpdp/express-web-api .

В результате процесса сборки вы можете увидеть кучу сообщений:

Sending build context to Docker daemon 7.68 kB
Step 1/8 : FROM node:latest
latest: Pulling from library/node
5040bd298390: Pull complete
fce5728aad85: Pull complete
76610ec20bf5: Pull complete
52f3db4b5710: Pull complete
7e5867712a67: Pull complete
563b602246dd: Pull complete
b63b7336ef88: Pull complete
Digest: sha256:aa90bf69be3b6c29d7c877a2a12414ec908272eaa91422732b9270a3e19b3421
Status: Downloaded newer image for node:latest
 — -> b554dc4860d7
Step 2/8 : RUN mkdir -p /usr/src/app
 — -> Running in b1c1cb7e3774
 — -> 95bc1f9227ea
Removing intermediate container b1c1cb7e3774
Step 3/8 : WORKDIR /usr/src/app
 — -> a9b3046ecb21
Removing intermediate container 6282e4041346
Step 4/8 : COPY package.json /usr/src/app/
 — -> ac5c4f018d05
Removing intermediate container 00144f4d66dc
Step 5/8 : RUN npm install
-> Running in ebff082215ac
…. < installation message >
npm WARN [email protected] No repository field.
npm info ok
 — -> d0270459b5c9
Removing intermediate container ebff082215ac
Step 6/8 : COPY . /usr/src/app
 — -> 6380ae399088
Removing intermediate container fdecaacbdd1d
Step 7/8 : EXPOSE 8080
 — -> Running in 9b126dc5ff31
 — -> bac6efa53f37
Removing intermediate container 9b126dc5ff31
Step 8/8 : CMD node index.js
 — -> Running in 9bd5ed9fb7e7
 — -> bf0167e88692
Removing intermediate container 9bd5ed9fb7e7
Successfully built bf0167e88692

4. Образ создан, используйте эту команду, чтобы увидеть результат:

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
bpdp/express-web-api latest bf0167e88692 About a minute ago 663 MB
node latest b554dc4860d7 11 days ago 660 MB

5. Запускаем сервис:

$ docker run -p 49160:8080 -d bpdp/express-web-api5f256434c6b2a05075d6647c56345702d0ad04df9b64960e9bacd891beef5420

6. См. процесс докера:

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f256434c6b2 bpdp/express-web-api “node index.js” 56 seconds ago Up 52 seconds 0.0.0.0:49160->8080/tcp keen_fermat

7. Если вы хотите увидеть лог от сервиса:

$ docker logs 5f256434c6b2
Running on http://localhost:8080

8. Протестируйте сервис:

Корневой сервис:

$ curl -i localhost:49160 
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 268
ETag: W/”10c-hwhEZGfr800ouK/RU2Bmug”
Date: Sun, 29 Jan 2017 11:11:31 GMT
Connection: keep-alive
URI HTTP Method POST body Result
 1 listProducts GET empty Show list of all the products.
 2 show/:id GET empty Show details of a product.
 3 / GET service available

Список продуктов:

$ curl -i localhost:49160/listProducts
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 327
ETag: W/”147-hvM6C347UQoOIgHb8LCc3Q”
Date: Sun, 29 Jan 2017 11:12:02 GMT
Connection: keep-alive
[{“id”:2,”name”:”An ice sculpture”,”price”:12.5,”tags”:[“cold”,”ice”],”dimensions”:{“length”:7,”width”:12,”height”:9.5},”warehouseLocation”:{“latitude”:-78.75,”longitude”:20.4}},{“id”:3,”name”:”A blue mouse”,”price”:25.5,”dimensions”:{“length”:3.1,”width”:1,”height”:1},”warehouseLocation”:{“latitude”:54.4,”longitude”:-32.7}}]

Показать продукт

$ curl -i localhost:49160/show/2
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 178
ETag: W/”b2-ir5Cps7qLLfUyxO/QbW2Gg”
Date: Sun, 29 Jan 2017 11:13:23 GMT
Connection: keep-alive
[{“id”:2,”name”:”An ice sculpture”,”price”:12.5,”tags”:[“cold”,”ice”],”dimensions”:{“length”:7,”width”:12,”height”:9.5},”warehouseLocation”:{“latitude”:-78.75,”longitude”:20.4}}]

Теперь вы можете изучить Dockerfile и .dockerignore, которыми я уже поделился в своем репозитории. Попробуйте сначала запустить службу, а затем докеризовать службу, используя шаги, описанные выше. Удачи!