docker 生产环境基础应用
项目背景
此项目是在已有项目基础上,开发的一套相对独立的系统。项目总体分为三部分,前端、中间应用服务、流媒体服务。前端技术选型为vue+elementui,中间应用服务为.net core webapi+mysql+redis,流媒体服务为第三方成熟应用。在项目开发完毕之后,起初部署方式为在虚机上统一部署,倒也方便直观。但是对个人而言,一直关注着docker,但是一直没有应用到生产环境,于是就借此机会更新下部署模式,采用docker。关于docker的简介就不必多说了,网上的介绍很多,但是想要详细了解,建议参考官方文档。
docker架构
docker 包括三个基本概念,如下所示(采摘于菜鸟教程):
之所以有此介绍,是因为了解这几个基本概念,在应用上会方便许多。
- 镜像(Image):
- Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):
- 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):
- 仓库可看着一个代码控制中心,用来保存镜像。
详细信息自行百度
应用实战
1. 安装docker
博主所用主机为centos 7+,关于docker的部署,可参考官方文档
1. 卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2. 安装yum-utils
软件包、设置仓库
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3. 安装DOCKER引擎
sudo yum install docker-ce docker-ce-cli containerd.io
4. 启动docker
sudo systemctl start docker
5.通过运行hello-world
映像来验证是否正确安装了Docker Engine 。
sudo docker run hello-world
6.登陆docker
执行命令 sudo docker login
输入账号、密码登陆成功即可。
2. 创建仓库
仓库就是存放镜像的地方,博主所用仓库为docker-hub。当然还有很多厂商提供,如果考虑企业化建设,也可以私有化搭建。 docker-hub官方地址
就像git一样,自由创建私有仓库。
3. 制作镜像
本篇以前端项目为例,制作镜像发布到仓库。
前端项目采用的vue,进入打包好的dist文件中,创建Dockerfile文件,编写内容如下:
FROM nginx
WORKDIR /app
COPY . /dist
from nginx 指的是 依赖于nginx, workdir /app 指的是设置工作目录 copy . /dist 指的是 将dist文件夹中的内容 copy到外部 dist文件夹
完毕之后,在dist文件夹,即dockerfile文件所在文件夹,执行命令如下: docker build -t zy/bg:vmp-web .
创建镜像。改命令意思是,制作一个隶属于bg仓库下的镜像,并且为改镜像打标签为:vmp-web。 完毕之后,通过 docker images
查看已有镜像
按照我个人习惯,一个仓库包含web、server等多个项目的镜像。通过tag进行区分。
镜像制作完毕后,可通过push命令将 镜像推送到远程仓库,便于后续使用。docker push zy/bg:vmp-web
推送完毕后,便可以在docker-hub中看到。
镜像制作完毕之后,便可以运行了。docker run --name vmp-web -p 80:80 -d zy/bg:vmp-web
-p 是进行端口映射,因为每一个容器就是一个沙盒,可以理解为一个精简版的虚机,80(外):80(容器) 就是把容器80端口,映射到外部的80端口。-d 是保持后台运行。--name 设置容器名称。 至此,访问地址就可以看到部署在容器内的应用了。
既然容器就是一台精简版的虚机,我们当然也可以进入他的文件系统。
进入docker容器有如下四种方式
- docker attach
- SSH
- nsenter
- exec
在这里前三种不是特别推荐使用,不方便且不适用于生产环境,推荐用exec的方式。exec命令相对简单,操作方便适用生产。该命令必须适用于正在运行的容器,参数如下表所示:
参数 | 描述 |
---|---|
--detach , -d | 分离模式:在后台运行命令 |
--detach-keys | 覆盖分离容器的键序列 |
--env , -e | 设置环境变量 |
--interactive , -i | 即使没有附加也保持STDIN 打开 |
--privileged | 赋予命令扩展权限 |
--tty , -t | 分配伪TTY |
--user , -u | 用户名或UID |
--workdir , -w | 容器内的工作目录 |
以我们刚才创建的vmp-web容器为例,我们想要修改容器内nginx的配置信息,我们可以通过命令 docker exec -it vmp-web /bin/bash
进入容器,进入容器之后,就和平常操作linux几乎一致了。通过vim nginx.conf
修改时,会提示命令无法找到,也是正常现象。因为该容器内只包含了程序运行的必须条件,并不包含vim。此时我们想要修改容器nginx.conf,可以通过从外部copy文件的形式,也可以通过vim 直接修改。通过vim修改的时候,先在容器内安装vim,通过命令apt-get install vim
进行安装,但是会提示如下信息:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim
并不是命令有误,输入apt-get update
命令,这条命令的作用就是同步 /etc/apt/sources.list
和 /etc/apt/sources.list.d
中列出的源的索引。更新完毕后,再键入apt-get install vim
即可。此时容器内已正常安装vim,可使用vim编辑nginx.conf文件了。
但是很多时候我们想要直接从外部copy到容器内部,比如替换个文件,可以采用docker cp
命令,该命令使用方式如下:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
从容器内部copy文件到外部,从外部copy文件到容器内部。
以刚才运行的vmp-web容器为例,想要将index.html copy到容器内部,docker cp index.html vmp-web:/
改命令即是将index.html 文件复制到vmp-web容器内的根目录。如果想要将此文件从容器内复制到外部,可 通过 docker cp vmp-web:/index.html /index.html
命令,即将容器内index.html文件复制到根目录中。想要退出docker容器,输入exit
命令即可。
至此,举一反三,想要将项目应用上docker已经差不多了,但是docker远不止这么简单,目前所介绍的也仅仅是应用基础。
docker 常用命令介绍
命令 | 使用方式 | 说明 |
---|---|---|
login | docker login -p -u | 登陆docker仓库 |
logout | docker logout | 退出 |
search | docker search nginx | 搜索nginx镜像 |
build | docker build -t zy/bg:vmp-web . | 构建bg镜像,打标签为vmp-web,其中zy 为个人docker用户名 |
pull | docker pull nginx | 拉取nginx镜像 |
push | docker push zy/bg:vmp-web | 将本地生成的镜像推送到bg仓库,并且打标签为vmp-web |
images | docker images | 列出所有镜像 |
tag | docker tag zy/bg:vmp-web vmp-webOld | 标记镜像 |
rmi | docker rmi vmp-webOld | 删除镜像 |
run | docker run --name vmp-web -p 80:80 -d zy/bg:vmp-web | 选择镜像启动容器 |
ps | docker ps | 列出正在运行的容器,docker ps -a 列出所有容器,包括已经停止的容器 |
start | docker start vmp-web | 启动容器 |
stop | docker stop vmp-web | 停止容器 |
kill | docker kill vmp-web | 杀掉容器 |
rm | docker rm vmp-web | 删除容器 |
exec | docker exec -it vmp-web /bin/bash | 进入容器内部 |
cp | docker cp index.html vmp-web:/ | 将index.html文件复制到docker容器内部根目录 |
更多命令请参考官方文档
在本篇中,博主大都以name:tag 的形式删除、停止等操作镜像、容器,当然可以以image id和container id的形式操作。并且在以id操作的时候,并不需要完全键入id,以前几位形成唯一标识即可。
docker知识点还有很多,需要继续探索。且描述有诸多不足,且请见谅。
docker 生产环境基础应用的更多相关文章
- Docker生产环境实践指南
技术栈:1. 构建系统2. 镜像仓库3. 宿主机管理4. 配置管理5. 部署6. 编排7. 日志8. 监控 镜像:1. 如果用户像往常一样运行包安装命令,这些永远也用不上的缓存包文件将会永远地成为镜像 ...
- [转]Docker 生产环境之配置容器 - 限制容器资源
默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的给定资源.Docker 提供了一些方法来控制容器可以使用多少内存.CPU 或块 IO,并设置 docker run 命令的运行时配置标志.本 ...
- Docker 生产环境之配置容器 - 自动启动容器
原文地址 Docker 提供了重启策略,以控制容器在退出时是否自动启动,或在 Docker 重新启动时自动启动.重启策略可确保链接的容器以正确的顺序启动.Docker 建议使用重启策略,并避免使用流程 ...
- 用前端姿势玩docker【四】基于docker快速构建webpack的开发与生产环境
目录 用前端姿势玩docker[一]Docker通俗理解常用功能汇总与操作埋坑 用前端姿势玩docker[二]dockerfile定制镜像初体验 用前端姿势玩docker[三]基于nvm的前端环境构建 ...
- 理解Docker(6):若干企业生产环境中的容器网络方案
本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- 在生产环境使用Docker部署应用
导读 Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程.作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产 ...
- 生产环境中使用Docker Swarm的一些建议
译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...
- 云计算之路-阿里云上-2017年最错误的选择: 生产环境使用 docker swarm
2017年12月29日 10:18 ~ 11:00 左右,由于整个 docker swarm 集群宕机,造成我们迁移至 .net core 跑在 docker swram 上的所有站点无法正常访问,由 ...
- Docker标准化开发测试和生产环境
对于大部分企业来说,搭建 PaaS 既没有那个精力,也没那个必要,用 Docker 做个人的 sandbox 用处又小了点. 可以用 Docker 来标准化开发.测试.生产环境. Docker 占用资 ...
随机推荐
- Java课程设计之——爬虫篇
主要使用的技术 Httplcient Jsoup 多线程 dao模式 网络爬虫简介 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取 ...
- Java并发编程实战 02Java如何解决可见性和有序性问题
摘要 在上一篇文章当中,讲到了CPU缓存导致可见性.线程切换导致了原子性.编译优化导致了有序性问题.那么这篇文章就先解决其中的可见性和有序性问题,引出了今天的主角:Java内存模型(面试并发的时候会经 ...
- 01、WireShark——ARP 协议包分析
1. 什么是ARP ARP(Address Resolution Protocol)协议,即地址解析协议.该协议的功能就是将 IP 地 址解析成 MAC 地址. ARP(Address Resolu ...
- ChaosBlade--动态脚本实现 Java 实验场景
动态脚本实现 : 参考文档:https://github.com/chaosblade-io/chaosblade/wiki/%E5%8A%A8%E6%80%81%E8%84%9A%E6%9C%AC% ...
- Gatling脚本编写技巧篇(二)
脚本示例: import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.durati ...
- 详解 普通数组 —— Arrays类 与 浅克隆
我们在C语言中,编一些代码量规模比较大的程序,几乎都会用到 "数组" 或 "链表" ,但是,在本人之前的博文中,却对这两个知识点从未提到过,那么,本人将通过这篇 ...
- iview使用之怎样通过render函数在table组件表头添加图标及判断多个状态
在实际项目开发中,我们经常会用到各种各样的表格,比如在表格中填加下拉菜单,按钮,图标及可以根据状态显示对应文字等等,因为这段时间一直在做后台管理系统,所以表格用的就比较多,当然UI组件库我用的是ivi ...
- 2层感知机(神经网络)实现非线性回归(非线性拟合)【pytorch】
import torch import numpy import random from torch.autograd import Variable import torch.nn.function ...
- PHP中静态(static)调用非静态方法详解--调用!!!
来源:https://www.cnblogs.com/yolo-bean/p/7739265.html 这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么 ...
- phpcms 用phpexcel导入导出excel
html <form method="post" action="?m=content&c=content&a=public_add_excel&q ...