Недавно мне нужно было предоставить некоторые ресурсы 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, которыми я уже поделился в своем репозитории. Попробуйте сначала запустить службу, а затем докеризовать службу, используя шаги, описанные выше. Удачи!