задний план
Дайте вам недавно приобретенный сервер (CentOS), соответствующую учетную запись и пароль, исходный пакет веб-приложения (zip), разработанный на основе Node.js, и потребуйте, чтобы вы использовали Docker для развертывания приложения на новом компьютере. На данный момент вы еще не поняли, что такое контейнер/образ, и не запомнили несколько связанных команд Linux, что вам делать? Эта статья поможет вам избежать неприятностей
строить планы
обработать
Для достижения конечной цели сначала разберемся с волной процессов:
Загрузите исходный zip-пакет на сервер
сервер входа
Разархивируйте zip-пакет
Установите последнюю версию Докера
Настроить отечественный зеркальный ускоритель
Написать Dockerfile
построить образ
Напишите скрипт для запуска контейнера
Выполните скрипт, чтобы проверить развертывание
Как это сделать будет подробно описано ниже
Серверная операционная система, указанная в этой статье, — 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
Посмотреть больше статеймой блог