项目背景

此项目是在已有项目基础上,开发的一套相对独立的系统。项目总体分为三部分,前端、中间应用服务、流媒体服务。前端技术选型为vue+elementui,中间应用服务为.net core webapi+mysql+redis,流媒体服务为第三方成熟应用。在项目开发完毕之后,起初部署方式为在虚机上统一部署,倒也方便直观。但是对个人而言,一直关注着docker,但是一直没有应用到生产环境,于是就借此机会更新下部署模式,采用docker。关于docker的简介就不必多说了,网上的介绍很多,但是想要详细了解,建议参考官方文档

docker架构

docker 包括三个基本概念,如下所示(采摘于菜鸟教程):

之所以有此介绍,是因为了解这几个基本概念,在应用上会方便许多。

  1. 镜像(Image):

    • Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  2. 容器(Container):
    • 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  3. 仓库(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 生产环境基础应用的更多相关文章

  1. Docker生产环境实践指南

    技术栈:1. 构建系统2. 镜像仓库3. 宿主机管理4. 配置管理5. 部署6. 编排7. 日志8. 监控 镜像:1. 如果用户像往常一样运行包安装命令,这些永远也用不上的缓存包文件将会永远地成为镜像 ...

  2. [转]Docker 生产环境之配置容器 - 限制容器资源

    默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的给定资源.Docker 提供了一些方法来控制容器可以使用多少内存.CPU 或块 IO,并设置 docker run 命令的运行时配置标志.本 ...

  3. Docker 生产环境之配置容器 - 自动启动容器

    原文地址 Docker 提供了重启策略,以控制容器在退出时是否自动启动,或在 Docker 重新启动时自动启动.重启策略可确保链接的容器以正确的顺序启动.Docker 建议使用重启策略,并避免使用流程 ...

  4. 用前端姿势玩docker【四】基于docker快速构建webpack的开发与生产环境

    目录 用前端姿势玩docker[一]Docker通俗理解常用功能汇总与操作埋坑 用前端姿势玩docker[二]dockerfile定制镜像初体验 用前端姿势玩docker[三]基于nvm的前端环境构建 ...

  5. 理解Docker(6):若干企业生产环境中的容器网络方案

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  6. 在生产环境使用Docker部署应用

    导读 Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程.作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产 ...

  7. 生产环境中使用Docker Swarm的一些建议

    译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...

  8. 云计算之路-阿里云上-2017年最错误的选择: 生产环境使用 docker swarm

    2017年12月29日 10:18 ~ 11:00 左右,由于整个 docker swarm 集群宕机,造成我们迁移至 .net core 跑在 docker swram 上的所有站点无法正常访问,由 ...

  9. Docker标准化开发测试和生产环境

    对于大部分企业来说,搭建 PaaS 既没有那个精力,也没那个必要,用 Docker 做个人的 sandbox 用处又小了点. 可以用 Docker 来标准化开发.测试.生产环境. Docker 占用资 ...

随机推荐

  1. Java课程设计之——爬虫篇

    主要使用的技术 Httplcient Jsoup 多线程 dao模式 网络爬虫简介 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取 ...

  2. Java并发编程实战 02Java如何解决可见性和有序性问题

    摘要 在上一篇文章当中,讲到了CPU缓存导致可见性.线程切换导致了原子性.编译优化导致了有序性问题.那么这篇文章就先解决其中的可见性和有序性问题,引出了今天的主角:Java内存模型(面试并发的时候会经 ...

  3. 01、WireShark——ARP 协议包分析

     1. 什么是ARP ARP(Address Resolution Protocol)协议,即地址解析协议.该协议的功能就是将 IP 地 址解析成 MAC 地址. ARP(Address Resolu ...

  4. ChaosBlade--动态脚本实现 Java 实验场景

    动态脚本实现 : 参考文档:https://github.com/chaosblade-io/chaosblade/wiki/%E5%8A%A8%E6%80%81%E8%84%9A%E6%9C%AC% ...

  5. Gatling脚本编写技巧篇(二)

    脚本示例: import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.durati ...

  6. 详解 普通数组 —— Arrays类 与 浅克隆

    我们在C语言中,编一些代码量规模比较大的程序,几乎都会用到 "数组" 或 "链表" ,但是,在本人之前的博文中,却对这两个知识点从未提到过,那么,本人将通过这篇 ...

  7. iview使用之怎样通过render函数在table组件表头添加图标及判断多个状态

    在实际项目开发中,我们经常会用到各种各样的表格,比如在表格中填加下拉菜单,按钮,图标及可以根据状态显示对应文字等等,因为这段时间一直在做后台管理系统,所以表格用的就比较多,当然UI组件库我用的是ivi ...

  8. 2层感知机(神经网络)实现非线性回归(非线性拟合)【pytorch】

    import torch import numpy import random from torch.autograd import Variable import torch.nn.function ...

  9. PHP中静态(static)调用非静态方法详解--调用!!!

    来源:https://www.cnblogs.com/yolo-bean/p/7739265.html 这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么 ...

  10. phpcms 用phpexcel导入导出excel

    html <form method="post" action="?m=content&c=content&a=public_add_excel&q ...