🐠 Докеризируйте свое приложение Node.js с нуля

Node.js внешний интерфейс сервер Docker
🐠 Докеризируйте свое приложение Node.js с нуля

задний план

Дайте вам недавно приобретенный сервер (CentOS), соответствующую учетную запись и пароль, исходный пакет веб-приложения (zip), разработанный на основе Node.js, и потребуйте, чтобы вы использовали Docker для развертывания приложения на новом компьютере. На данный момент вы еще не поняли, что такое контейнер/образ, и не запомнили несколько связанных команд Linux, что вам делать? Эта статья поможет вам избежать неприятностей

строить планы

обработать

Для достижения конечной цели сначала разберемся с волной процессов:

  1. Загрузите исходный zip-пакет на сервер

  2. сервер входа

  3. Разархивируйте zip-пакет

  4. Установите последнюю версию Докера

  5. Настроить отечественный зеркальный ускоритель

  6. Написать Dockerfile

  7. построить образ

  8. Напишите скрипт для запуска контейнера

  9. Выполните скрипт, чтобы проверить развертывание

Как это сделать будет подробно описано ниже

Серверная операционная система, указанная в этой статье, — CentOS 7. Если ваш сервер не подходит, детали операции могут немного отличаться, и вам необходимо отдельно проверить соответствующую информацию.

транспорт rsync

Предположения:

  • Адрес сервера${ip}

  • Аккаунт${user}

  • пароль${pass}

  • Исходный пакет${zip}

  • Каталог, в котором находится zip-пакет на сервере:${path}

Затем в каталоге того же уровня локального исходного пакета используйтеscpкоманда, пример передачи zip-пакета на сервер выглядит следующим образом

rsync -avzP ./${zip} ${user}@${ip}:${path}
​
# 后面会提示输入密码

вход по ssh

Следуя вышеизложенному, пример сервера входа по ssh выглядит следующим образом.

ssh ${user}@${ip}
​
# 后面会提示输入密码
# 第一次登录会提示保存ssh信息,输入yes即可

Если вы не хотите каждый раз вводить адрес/учетную запись/пароль, вы можете написать простой скрипт автоматического входа в систему.ssh.sh

# 创建文件
touch ssh.sh
# 赋予脚本可执行权力
chmod +x ssh.sh

ssh.shСодержание следующее, не забудьте поставить${pass}, ${user},${ip}заменить реальными данными

#!/usr/bin/expect
set timeout 30
set password ${pass}
spawn ssh ${user}@${ip}
expect "*assword:"
send "$password\r"
interact

Выполните скрипт для входа на сервер 😄

./ssh.sh

разархивировать разархивировать

Как упоминалось выше, исходный пакет называется${zip}, команда декомпрессии выглядит следующим образом

unzip ${zip}

Между прочим, если вы хотите использовать команду для создания zip-пакета, предположите, что исходный каталог файлаdist, создаваемый zip-пакетdist.zip, команда следующая

zip -r dist.zip dist
# 或简写为
zip -r dist dist

Установите Докер-CE

CE означаетCommunity Edition, то есть версия для сообщества, которая бесплатна; ее аналог — EE,Enterprise Edition, Enterprise Edition с упором на безопасность, платное использование.

  • Удалите старые версии Docker

Если на новом компьютере нет Docker, перейдите к следующему шагу и установите зависимости Docker напрямую.

sudo yum remove docker \
                  docker-common \
                  container-selinux \
                  docker-selinux \
                  docker-engine \
                  docker-engine-selinux  
  • Установите зависимости Docker

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  • Установите официальный репозиторий Docker

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  • Обновить источник репозитория

sudo yum makecache fast
  • Установите Docker-CE из репозитория

sudo yum install docker-ce

Настроить ускоритель

При использовании Docker часто необходимо получать образы с официального сайта, однако по понятным сетевым причинам процесс извлечения образов занимает очень много времени, что серьезно влияет на опыт использования Docker.

Рекомендуемое использованиеУскоритель DaoCloud

Dockerfile

Все конфигурации среды подготовлены, и Dockerfile можно записать в соответствии с приложением Node.js.

Предположим, что команда запуска приложения Node.jsnpm start, прослушивающий порт${app_port}

  • Создать Dockerfile

touch Dockerfile

DockerfileСодержание выглядит следующим образом

# 可以指定依赖的node镜像的版本 node:<version>,如果不指定,就会是最新的
FROM node:8
​
# 创建工作目录,对应的是应用代码存放在容器内的路径
WORKDIR /usr/src/app
​
# 把 package.json,package-lock.json(npm@5+) 或 yarn.lock 复制到工作目录(相对路径)
COPY package.json *.lock .
​
# 只安装dependencies依赖
# node镜像自带yarn
RUN yarn --only=prod --registry=https://registry.npm.taobao.org
​
# 把其他源文件复制到工作目录
COPY . .
​
# 替换成应用实际的端口号
EXPOSE ${app_port}
​
# 这里根据实际起动命令做修改
CMD [ "npm", "start" ]
  • Добавлен .dockerignore

touch .dockerignore

.dockerignoreСодержание выглядит следующим образом

node_modules
npm-debug.log

построить образ

пиши хорошоDockerfile, вы можете создать образ в каталоге, где находится Dockerfile.

Команда выглядит следующим образом.-tЭто чтобы добавить метку к изображению, чтобы было удобно пользоватьсяdocker imagesполучено из команды

# ${your_name} 可以省略
# ${tag} 省略时为 latest
docker build -t ${your_name}/${image_name}:${tag} .
​
# 省略版本
docker build -t ${image_name} .

Посмотреть зеркало

docker images
​
# 示例输出
REPOSITORY                      TAG        ID              CREATED
node                            8          1934b0b038d1    5 days ago
${your_name}/${image_name}    latest     d64d3505b0d2    1 minute ago

запустить скрипт контейнера

touch start.sh
chmod +x start.sh

start.shНовый контейнер будет создан и запущен на основе образа следующим образом.

#!/usr/bin/env bash
​
container=${container_name}
image=${image_name || image_id}
​
docker run \
--rm \
-d \
-p ${host_port}:${app_port} \
--name $container \
$image

${host_port}Это соответствующий порт при доступе к развернутому приложению из внешней сети.

${app_port}это порт, который прослушивает приложение Node.js в контейнере.

${image_name}имя ранее построенного образа, доступногоdocker imagesПроверить

${container_name}это имя, данное контейнеру, удобноеdocker psПолучить по команде

- Удалить его после выхода из контейнера RM

-d работать в фоновом режиме

-p указывает сопоставление портов, первый — это порт сервера, то есть порт, через который внешний мир получает доступ к вашему развернутому веб-приложению;DockerfileвнутриEXPOSEпорт

--name указывает имя контейнера

тестовое задание

Получите доступ к приложению в контейнере, который вы только что запустили

curl -i localhost:${host_port}
​
# 示例输出
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
...

Поздравляем, развертывание прошло успешно 👏

Общие команды

  • Просмотр запущенных контейнеров

docker ps
# 或使用新命令
docker container ls
​
# 示例输出
ID            IMAGE                                COMMAND    ...   PORTS
ecce33b30ebf  ${your_name}/${image_name}:latest  npm start  ...   49160->8080
  • Посмотреть все контейнеры (в том числе терминированные)

docker ps -a
# 或使用新命令
docker container ls -a
  • Просмотр журналов в контейнере

docker logs -f ${container_id}
  • Войдите в контейнер и получите среду выполнения оболочки

# 进入容器
# -i表示:交互式操作,-t表示:终端
docker exec -it ${container_id} bash
# 可通过输入 exit 退出 
  • стоп-контейнер

docker container stop ${container_id}
  • Запустить завершенный контейнер

docker container start ${container_id}
  • удалить контейнер

docker container rm ${container_name || container_id}
  • Посмотреть зеркало

docker images
# 或使用新命令
docker image ls
  • удалить зеркало

docker image rm ${image_id}

FAQ

  • Я не знаю vi, я не знаю, как его редактировать на сервереDockerfileЖду файл, что делать?

Вы можете обратиться к этой статье, создать файл локально, а затем пройтиscpЗагрузите созданный файл вместе с исходным пакетом на сервер

  • Зачем использовать пряжу?

Поскольку пряжа быстрее, чем npm, а образ узла в докере поставляется с пряжей, что просто побуждает всех использовать пряжу.

  • Если в проекте есть глобальные зависимости, такие как Bower, как написать Dockerfile?

Вы можете сначала установить другие глобальные зависимости, а затем использовать пряжу для установки, не забудьте написать команду в команде RUN, ниже приведены некоторые примеры

RUN yarn config set registry https://registry.npm.taobao.org \
    && yarn global install bower \
    && bower i --allow-root \
    yarn

Посмотреть больше статеймой блог

Ссылаться на