服务部署可分为三种方式

1)蓝绿发布

蓝绿发布是通过冗余的方式来解决部署问题,生产环境为绿色配置,冗余的服务为蓝色配置。在部署服务时,首先在冗余服务器上部署最新代码,由部分用户使用,

若使用没有问题,则通过负载均衡将所有用户请求转发到冗余服务器中,即冗余的服务转变为生产环境服务。优点是无需停机部署,服务回滚方便。缺点耗费服务器资源。

2)滚动发布

滚动发布指每次只部署一个或多个服务,直到服务部署完成为止。优点:用户无感知,平滑过渡;相比蓝绿发布节省服务器资源。缺点:部署复杂,且时间长;遇到

问题回滚比较复杂。

3)灰度发布

只升级部分服务,让少量用户访问新部署的服务,其他用户使用老服务,用户反馈无误后,整个集群部署,将用户迁移到新服务上来。优点:在灰度时即可发现问题及

时处理,保证系统稳定性;如果出现问题,影响范围小;用户无感知,过渡平滑。

灰度发布实现步骤:

1)定义规则:哪些用户可以访问灰度环境,比如按百分比(10%的用户可以访问灰度),或让固定用户先体验灰度环境;

2)利用网关实现路由策略,即网关到服务的路由;

3)服务与服务之间的调用使用ribbon实现灰度规则。

作者:BK
https://www.jianshu.com/u/a5230c4f0b7a
鉴于本人才疏学浅,不足之处还望斧正,也欢迎关注我,无特殊说明的都是自己一字一句码出来的,尊重原创,如果转载请说明出处!

此处输入图片的描述

前言

最近读了一本书《分布式缓存-原理、架构及Go语言实现》作者:胡世杰
代码是go语言实现的,这本书不是很厚,这本书在排版上字体比较大,代码占用了较大的篇幅,读起来很快。这本书可以带我们去很快的学习一个缓存框架,整个过程中主要学习作者的一些想法和用的一些技术框架

作者从一个简单的基于http满足基本的setgetdel操作的In Memeory缓存服务,然后通过自己编写的性能测试工具,对这个缓存服务进行性能测试并与redis做对比,给出两个框架结果的差异,整本书就是通过找出性能差异提出问题解决问题验证结果,这样的思路,逐步的对框架进行优化,最终实现一个高性能的分布式缓存

个人的一些见解

  • 作者可以很轻松的驾驶分布式缓存框架,单从get、set、del来说性能高于redis
  • 基于开源的高性能框架去扩展,可以很快去设计一款适合自己业务发展的框架,降底很大的开发成本,比如作者选择RockDB来做数据持久化
  • 去了解 RockDBABNF(Augmented Backus-Naur Form)gossip协议
  • 整个阅读过程中,可以验证一些自己对缓存框架的思考
  • 在高性能框架开发时,选择合适的语言很有必要,比如作者实现的分布式缓存框架高于redis,部分原因归于go语言对多线程很好的支持、
  • 去实现一个go语言开发的版本redis,性能更上一层
  • 高性能框架的实现,需要发挥多种语言的优势
  • 框架中的技术点很多都是类似的,通信协议选择、pipeline技术、异步提或读取性能、批量写入提升写入性能等,对他们的原理有了解,可以指导框架的设计

对于一个好的框架,需要涉及到各方各面的技术点,对设计者的技术广度有很高的要求,在平时工作中,大多数IT开发还是偏向于业务系统开发,大量的CRUD。我们可以对这些技术不太了解,但是我们一定要知道它,知道每种技术的原理、可以解决什么样的问题,这对我们的职业发展很有帮助,包括你去理解一些框架设计也会感觉很轻松。

从书中整理的一些问题

  • 设计中如何选择通信协议?
  • pipeline的原理,在哪些框架中应用了
  • 高性能的数据持久化的框架
  • 如果提升写入速度?
  • 如何提升查询速度
  • 如何保证命令被服务端按顺序处理?
  • 为什么要集群?实现方式?
  • 分布式集群中扩容和缩容时,如何避免全量数据迁移?如何去做数据迁移?
  • CAP理论,如何实现CP ? 如何实现AP?
  • 什么是节点再平衡,如何实现?其它分布式框架怎么实现?
  • 缓存的TTL如何实现?redis怎么实现的?
  • 如何提供一套框架自身的性能测试工具?
  • In memory有哪些缺陷?怎么解决?

闲聊几句

在平时工作中,大多数IT开发偏向于业务系统开发,大量的CRUD,因为在工作中接触到的技术是有限的,在工作多年之后,就会出现工作年限和能力不匹配的情况,之前听一个老师说过一句话,印象挺深的。

“有些人有10年的工作经验,却达不到10年的能力,对于企业这种人是把1年的工作能力用了10年”

这句话特别有道理,现在培训机构很多,每几个月就会培训出大量的IT人员,想在众多人脱颖而出就需要你比其它人知道的更多,更深。

企业招聘你是为了公司业务向前推进,不是让你来学习的,当然好的企业对于员人的个人发展也是很看重的,大多数企业招聘人员,还是希望来了可以直接上手的。

在工作中接触的知识是有限的,这就需要我们在工作以外的时间去了解一些未接触过的技术,提升自己技术的知识面,技术广度好的同学,在读这本书时候会发现,作者在上一章尾巴留下疑问的时候,就会在读者脑海中想出相应的解决方案,在下一章阅读时会发现和作者所想一致,整个阅读过程中会行云流水,读起来很快,相关的go代码可以不用仔细去看,但是整个过程和设计思路是我们一定要深思一下,作者为什么要这样做,有哪些优势劣势,

整本书中对于细节的描述不是很多,我们在阅读中可以多问几个问题,自己多想一想,这样的过程会促使我们成长,当一个问题出现了,解决之后要多围绕当前问题多发散一下,出现的其它问题怎么解决,当自己都想明白了,会有满满的成就感,对于每个问题我们都这样做,我们会很快成长起来。

其实在平时面试中,一些连环炮的问题都是从一个问题点儿,向外发散的,技术深度都可以通过这些问题反映出来的,多思考是好事儿,

图书推荐

  • Java特种兵
  • 实战Java高并发程序设计
  • Java多线程编程实战指南(核心篇)
  • java并发编程的艺术
  • 深入理解 Java虚拟机 JVM高级特性与最佳实践 周志明
  • 大话设计模式 程杰
  • 漫画算法 小灰的算法之旅 魏梦舒
  • Redis深度历险 核心原理与应用实践
  • 从Paxos到Zookeeper分布式一致性原理与实践
  • Mysql技术内幕 InnoDB存储引擎 第二版 姜承尧

结束语

相同各类的书可以多搞几本,都穿插着看一下,因为部分知识重叠,不会浪费太多时间。同一个知识点从多作者的角度去看,对自己的理解会有很大的帮助
偏基础的书,要不定时的拿出来多看一下,看完第一遍后面再看的话会很快,加深一下印象,要不时间长了还是会忘记的,多看几次让它成为自己的知识。

扫码关注公众号albk,相关文章会先在公众号发布

此处输入图片的描述


前言

近一周在学习docker,到现在也算对docker有了初步的了解,相关的学习笔记通过公众号与大家分享,希望对每一位想学习docker的人有所帮助…

主要内容


docker: Error response from daemon: Conflict. The container name “/myubuntu” is already in use

docker container ls
docker container rm 容器名

docker rm $(docker ps -a -q) 删除所有容器

centos无法上网

ifup ens33 // 启用网卡
vim /etc/sysconfig/network-scripts/ifcfg-ens33 #修改配置文件,需要root权限,切换root用户或sudo执行

执行 ifup ens33 出现错误:Error:Connection activation failed: No suitable device found for this connection

chkconfig NetworkManager off
chkconfig network on
service NetworkManager stop
service network start

查看防火墙状态

查看防火墙状态 systemctl status firewalld
开启防火墙 systemctl start firewalld
关闭防火墙 systemctl stop firewalld
开启防火墙 service firewalld start
若遇到无法开启
先用:systemctl unmask firewalld.service
然后:systemctl start firewalld.service

本地docker镜像中,出现大量 none的镜像,删除none的镜像,要先删除镜像中的容器。要删除镜像中的容器,必须先停止容器。

docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }') //停止容器
docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }') //删除容器
docker rmi $(docker images | grep "none" | awk '{print $3}') //删除镜像

执行docker build 一直失败

博主在 Docker学习(七)实战 - 构建REDIS镜像 文章中打包 albk.tech/docker-redis时,总是失败,提示内容,

后来发现是centos下载下来的镜像无法联网, 需要调整虚拟机的网络连接方式

Docker学习(十一)Docker系列结束-新的开始K8S

标签(空格分隔): docke k8s

此处输入图片的描述


上一篇讲到使用docker官方提供的容器编排工具docker-compose,但是docker-compose强调的是单机机进行容器编排,使用起来比较受限,对于一些大公司,应用不是部署在一台机器上的,在这种情况下,Docker-compose就无能为力了,在这样的情况下,需要使用集群容器编排工具,比如,google的Kubernetes(k8s),官方提供的Docker Swarm

基于google运维开发经验和技术能力,目前 Kubernetes已经有明显的优势,很多大公司已经站在了kubernates的阵营,所以我们在学习的时候,不能跑偏

新的开始 K8S

生产环境我们需要使用功能更为强大的k8s来实现,接下来会写一个和K8S相关的系列文章,一边学习一边记录

Docker系统文章汇总

写在最后

相关文章会先发布到个人公众号,可以关注公众号albk获取取一手资料和学习视频。

此处输入图片的描述


容器编排是什么

应用一般由单独容器化的组件组成,须按照一定顺序在网络级别进行组织,以使其能够按照计划运行,这种对多个容器进行组织的流程称为容器编排,它主要是对容器之间的依赖关系进行编排

Docker-compose

docker官方提供的工具,强调单机多容器的编排,能力相对有限,只能在一台宿主机上对容器编排,对于大规模集群环境中,多台机器无法支持,在windows, mac 安装完docker后默认提供docker-compose,但是在windows server , Linux中默认是不提供的,需要自行安装

示例场景

在一个简单的应用部署中,如图

此处输入图片的描述

需要用到 nginx , tomcat , mysql 三个组件,而且这每个组件在部署的时候是有依赖关系的,比如要先有mysql,因为tomcat中的应用需要使用到mysql,最后需要安装nginx,对tocmcat做负载均衡实现集群

顺序如下:mysql -> tomcat -> nginx

如果是人工处理的话,虽然简单,但是需要花费长时间, 现在有了docker-compose,就可以对容器进行编排,通过一个yml文件来维护容器编排的逻辑,再通过docker-compose命令对配置文件进行编译解析,就可以实现一个应用的部署

接下来我们使用docker-compose 部署一个开源博客wordpress

示例一 搭建wordpress开源博客

整个过程比较简单

安装docker-compose

  • 获取并自动安装docker-comppose
    sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    默认安装目录是/usr/local/bin/docker-compose

  • 文件夹授权
    sudo chmod +x /usr/local/bin/docker-compose

    因为要连接国外网站,下载会很慢,可能会被拒绝,多试几次就好

  • 查看安装的版本
    docker-compose -version

此处输入图片的描述

安装部署开源博客wordpress

创建目录mkdir -p /usr/local/docker/wordpress

  • 编写docker-compose 配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    version: '3.3'
    services:
    db:
    image: mysql:5.7
    volumes:
    - db_data:/var/lib/mysql
    restart: always
    environment:
    MYSQL_ROOT_PASSWORD: somewordpress
    MYSQL_DATABASE: wordpress
    MYSQL_USER: wordpress
    MYSQL_PASSWORD: wordpress
    wordpress:
    depends_on:
    - db
    image: wordpress:latest
    ports:
    - "8000:80"
    restart: always
    environment:
    WORDPRESS_DB_HOST: db:3306
    WORDPRESS_DB_USER: wordpress
    WORDPRESS_DB_PASSWORD: wordpress
    WORDPRESS_DB_NAME: wordpress
    volumes:
    db_data: {}
  • 配置文件解读

  • 解析配置文件并安装 docker-compose up -d

    • up 解析执行
    • -d 后台运行

此处输入图片的描述

  • 执行过程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Creating network "wordpress_default" with the default driver
    Creating volume "wordpress_db_data" with default driver
    Pulling db (mysql:5.7)...
    5.7: Pulling from library/mysql
    ......
    Status: Downloaded newer image for mysql:5.7
    Pulling wordpress (wordpress:latest)...
    latest: Pulling from library/wordpress
    ......
    Creating wordpress_db_1 ... done
    Recreating wordpress_wordpress_1 ... done
  • 查看创建的应用
    docker ps
    此处输入图片的描述
    wordpress_wordpress_1 博客的web应用
    wordpress_db_1 博客的mysql5.7容器

初始化wordpress

从上面进程看到WEB应用对外暴露的是8000端口
http://宿主机ip:8000 对博客进行一下初始化
此处输入图片的描述

此处输入图片的描述

此处输入图片的描述

此处输入图片的描述

此处输入图片的描述

到这里都是个应用上的一些流程,有兴趣的可以体验一下这个博客,很不错的

成果展示

到这里我们已经完成了开源博客的部署, 整个过程很简单,整个过程是由docker-compose 这个容器编排工具完成的,通过一个yml配置文件 ,就完成了一个应用的部署,很大节省了运维人员工作量,整个应用的维护,只需要一个yml配置文件

参考资料

docker-compose-install
QuickStart : compose and wordpress

写在最后

通过docker-compose部署自己的应用时里面有很多东西,本文的例子一个很简单,实际工作中一定不止于此,docker-compose文件中的内容有很多学问,可以到docker官网上看一下,以mysql为例,如果指定初始化数据库的脚本,root用户的密码如何指定等,这块需要用到mysql容器的一些环境变量,这块内容可以参考docker-mysql

相关文章会首发公众号,可以关注公号albk,关注后可以获取大量学习视频

此处输入图片的描述

volume是什么

volume在英文中是容量的意思, 在docker中是数据卷的意思,是用来保存数据的容器

为什么要进行数据共享

此处输入图片的描述

在集群中有多台tomcat,对于集群中的tomcat部署的代码是同一份代码的副本,如果页面文件发生变化,意味着每个容器中的页面文件都要进行更新,在大规模的集群中这样的工作量会被无限放大,这时候就需要用到数据共享解决此问题,所谓数据共享指的是多个容器共享一个数据副本,在docker环境中我们该如何实现?

数据共享原理

在宿主机的硬盘上开辟一个空间,用来存放共享的数据,多个容器共享这个目录

实现数据共享的解决方案

说到数据共享我们其实很容易想到linux中的mount命令,通过挂载一共享目录来

  • 使用参数 -v 宿主机目录:/容器内容目录 将共享的文件放在宿主机的某个文件中,然后多个容器之前共享这一个目录,实现数据共享,这需要在启动时

此处输入图片的描述

  • 使用参数 -v 宿主机目录:/容器内容目录共享容器挂载宿主机共享目录,然后通过挂载共享容器实现数据共享

此处输入图片的描述

容器直接挂载共享目录

资源列表

准备2个tomcat容器:
tomcat8000 tomcat8001

详细步骤

  1. 创建共享数据
    创建共享目录:mkdir -p /usr/local/docker/volumn/pages/
    在共享目录中增加共享文件: index.html,内容如下

    1
    我是一个volumn 共享目录 albk!
  2. 创建tomcat8000tomcat8001

    docker run -d --name tomcat8000 -p 8000:8080 -v /usr/local/docker/volumn:/usr/local/tomcat/webapps tomcat

    docker run -d --name tomcat8001 -p 8001:8080 -v /usr/local/docker/volumn:/usr/local/tomcat/webapps tomcat

启动容器时将宿主机的/usr/local/docker/volumn目录,挂载到tomcat容器的/usr/local/tomcat/webapps 这个目录,这样就可以实现数据共享

  1. 验证容器是否正常启动
    docke ps

此处输入图片的描述

docker exec -it a05a987b6da0 /bin/bash
查看一下webapps目录下,是否挂载成功

此处输入图片的描述

  1. 浏览器访问
    http://宿主机ip:8000/pages/index.html
    http://宿主机ip:8001/pages/index.html

此处输入图片的描述

  1. 修改共享文件
    echo "我是一个volumn 共享目录 albk! 被修改了" > index.html
  2. 浏览器再次验证

此处输入图片的描述

可以看到我们修改的内容,已经实时生效了,不需要重新部署tomcat容器,但是这样实现每次容器启动的时候,参数会很长,很容易出错,在集群较小的时候可以这样,但是规模大的时候,这也是不少的工作量,下面我们看一下另一种方法

共享容器挂载

  • 创建一个共享容器 webpages,通过上述的方法,使用-v 挂载共享目录
    docker create --name webpages -v /usr/local/docker/volumn/pages:/usr/local/tomcat/webapp tomcat /bin/true

  • 挂载共享容器

    docker run --name tomcat8000 -d -p 8000:8080 --volumes-from webpages tomcat
    docker run --name tomcat8001 -d -p 8001:8080 --volumes-from webpages tomcat

    验证过程和上面的一样,容器webpages实际作用就是定义了一个挂载点,修改内容的时候,只需要修改共享容器的共享目录即可

总结

如果容器少的话用-v 如果容器多的话, 可以使用-volumes-from 本质与-v是一样的,具体使用哪个根据实际情况而定

写在最后

相关文章会首发公众号,可以关注公号albk,关注后可以获取大量学习视频

前言

在之前的文章中介绍的内容都是容器镜像和容器运行,没有涉及到多个容器之前通信,如果是多个容器之间需要互相调用,如何通信呢?

docker维护着每个容器的元信息,可以通过IP通信,但是在docker环境中每个容器重启之后,容器的虚拟IP都会变动,这样的情况下我们该如何处理? 我们带着这两个疑问看一下今天的内容

场景

如果我们部署了一个tomcat应用,这个应用需要连接mysql数据库,这种场景下,我们需要让tomcat可以访问mysql数据库,这就需要使两个容器之间可以通信

实现通信的方法

  • 在容器启动的时候,为每个容器指定一个名字,两者通信使用容器名称来识别对方容器
  • 基于bridge实现容器间双向通信

环境准备

  • tomcat容器

    • 应用名称 mywebapp
  • 数据库容器(只是为了测试,我们使用一个centos容器模拟mysql )

    • 应用名 database

创建目录/usr/local/docker/communication

目标:tomcat容器可以访问database容器

实现容器间的单向通信

  • 创建 mywebapp tomcat容器
    docker run -d --name mywebapp tomcat

  • 创建 database
    docker run -d --name database -it centos7 /bin/bash

  • 查看容器运行情况
    docker ps

    此处输入图片的描述

  • 查看容器元数据 docker inspect bf7b05ce9a06

此处输入图片的描述

NetworkSettings中的属性IPAddress可以看到容器的虚拟IP地址 172.17.0.3

  • 进入mywebapp容器
    docker exec -it 7e631f5cf4b3 /bin/bash
    mywebapp 容器中执行ping 172.17.0.3 可以正常访问database容器,说明IP访问天然互通的

此处输入图片的描述

但是ping database 是不通的,因为我们没有进行网络方面的配置

此处输入图片的描述

  • 退出容器,移除mywebapp
    docker rm 7e631f5cf4b3 -f

此处输入图片的描述

  • 重新启动容器mywebapp时增加一个参数 -link 启动容器
    docker run -d --name mywebapp --link database tomcat

此处输入图片的描述

  • 进入容器内部
    docker ps
    docker exec -it 0c435a5112c4 /bin/bash

此处输入图片的描述

> 执行ping database 是可以访问通的,这样就通过link 实现了容器间的单向通信,在mywebapp中连接数据库时,使用database这个容器名即可,只要容器名称不变,就可以访问到

使用网桥实现双向通信

通过link可以实现单向通过,当然 也可以实现双向通过,但是配置会比较麻烦,当应用集群过大的时候,工作量太大,其实我们可以使用网桥实现,容器间的互相通信

此处输入图片的描述

网桥是虚拟的网络桥接,作用是从网络层面对容器进行分组,将指定的容器都绑定到同一个网桥上,这些被绑定的容器就可以实现互相通信

实验开始

  • 我们先将刚才的两个容器移除,再重新创建一下这两个容器,并查看一下这两容器的状态

docker rm -f 0c435a5112c4
docker rm -f bf7b05ce9a06
docker run -d --name mywebapp tomcat
docker run -d -it --name database centos /bin/bash
docker ps

此处输入图片的描述

  • 查看docker的谨慎网络服务明细
    docker network ls

此处输入图片的描述

默认每一个docker底层都会提供一个默认的网桥,承担容器与外部的通信的职责

  • 如果要实现多个容器间的互连互通,需要新建一个网桥
    docker network create -d bridge my-bridge
    docker network ls

此处输入图片的描述

这样所有绑定到my-bridge上的容器,都可以互相通信

  • 进行容器和网桥的绑定
    docker network connect my-bridge mywebapp
    docker network connect my-bridge database

  • 我们验证一下

  • docker ps

    此处输入图片的描述

  • 进入mywebapp执行ping命令
    docker exec -it 16fbe8f31ce5 /bin/bash
    ping database

此处输入图片的描述

  • 进入database,执行ping命令
    docker exec -it 15e732e718c2 /bin/bash
    ping mywebapp

    此处输入图片的描述

    到这里我们已经实现了两个容器的互连互通了

总结

作为容器的互通,最核心的点就是创建一个新的网桥,然后将容器与这个网桥绑定是即可

网桥为什么可以实现互联互通

每当创建一个网桥,会在宿主机上就创建一个虚拟网卡,承担了一个网关的作用,实现两个容器的互通
此处输入图片的描述

  • 虚拟网卡和宿主机的物理网卡进行通信,将数据 包转成物理网卡的数据包发出去
  • 反之物理网卡收到的数据包,也会转换成虚拟网卡的数据 包,转发给虚拟网卡,虚拟网卡然后再转给容器

写在最后

相关文章会首发公众号,可以关注公号albk,关注后可以获取大量学习视频

此处输入图片的描述


前言

官网已提供了Redis的基础镜像,在生产环境尽量使用官网提供的基础镜像,这篇文章主要是为了综合使用一下Dockerfile相关命令,让我们理解更加深入一些

实战

前期准备

准备Redis源文件包
配置文件

1
2
3
cd /usr/local/docker
mkdir docker-redis
cd docker-redis

将我们使用到的源文件上传到当前目录

此处输入图片的描述

编写Dockerfile

vim Dockerfile 增加下如下内容

1
2
3
4
5
6
7
8
9
10
11
FROM centos:centos7
RUN ["yum" , "install" , "-y" ,"gcc","gcc-c++","net-tools","make"]
WORKDIR /usr/local
ADD redis-4.0.14.tar.gz .
WORKDIR /usr/local/redis-4.0.14/src
RUN make && make install
WORKDIR /usr/local/redis-4.0.14
ADD redis-7000.conf .
EXPOSE 7000
CMD ["redis-server","redis-7000.conf"]

此处输入图片的描述

Dockerfile解读

  1. 设置基准镜像centos
  2. 增加RUN命令,构建时运行指令 yum install -y gcc gcc-c++ net-tools make
  • 安装 gcc gcc-c++ 两个组件对redis源代码进行编译
  • net-tools网络工具的安装包
  • make安装程序的必备组件
  1. 切换容器的目录到 /usr/local
  2. 解压redis-4.0.14.tar.gz到容器目录/usr/local
  3. 进入解压完的源代码目录
  4. 对源代码目录使用gcc编译并进行安装
  5. 切换工作目录到/usr/local/redis-4.0.14
  6. redis-7000.conf到当前的工作目录
  7. 暴露容器内部的7000端口对宿主机
  8. 运行命令 redis-server redis-7000.conf启动 Redis

打包镜像

docker build -t albk.tech/docker-redis .

此处输入图片的描述

查看镜像

docker images

此处输入图片的描述

后台运行镜像

docker run -p 7000:7000 albk.tech/docker-redis

此处输入图片的描述

查看7000端口是否可用

netstat -tulnp

此处输入图片的描述

进入redis容器

1
2
docker ps 
docker exec -it f80c151f5d2f /bin/bash

此处输入图片的描述

redis-7000.conf已按我们的脚本打到REDIS的安装目录中

总结

到这里我们已经打包好一个自己的redis镜像了, 在实际中工作没有必要这样做,官方早已提供好相关的镜像了, 本文只是对前面Dockerfile命令和docker命令的综合应用

附录

实际环境中启动redis

docker pull redis
docker run -d redis
这两行命令就已经可以创建一个redis容器,如果对版本有要求,可以指定对应版本的tag即可

写在最后

本文中所需要的安装包已经打包好,百度云分享,可以关注公号albk,回复指令”docker redis“获取,相关文章会首发公众号,关注后可以获取大量学习视频

此处输入图片的描述


前言

通过前面一篇文章可以知道怎么去使用一个镜像搭建服务,但是,如何构造自己的一个镜像呢,docker提供了dockerfile可以让我们自己构造一个属于自己的镜像

什么是dockerfile

是一个包含用于组合镜像的命令的文本文档
Docker通过读取Dockerfile中的指令按步自动生成镜像

实战-打包自定义tomcat镜像

Dockerfile编写

mkdir -p /usr/local/docker/bk-web-dockerfile
cd /usr/local/docker/bk-web-dockerfile
上传bk-web包到此/usr/local/docker/bk-web-dockerfile目录

vim Dockerfile 录入如下内容

1
2
3
4
FROM tomcat:latest
MAINTAINER albk.tech
WORKDIR /usr/local/tomcat/webapps
ADD bk-web ./bk-web

编译dockerfile生成镜像

docker build -t albk.tech/bkwebapp:1.0 .

docker images

此处输入图片的描述

运行自定义的镜像

docker run -d -p 8000:8080 albk.tech/bkwebapp:1.0

此处输入图片的描述

进入tomcat容器内部

docker ps

此处输入图片的描述

docker exec -it 43825ec40a2 /bin/bash
进入容器后,自动进入Dockerfile配置的目录/usr/local/tomcat/webapp 可以看到目录bk-web

此处输入图片的描述

查看bk-web中的内容

此处输入图片的描述

测试容器内访问有没有问题

在tomcat容器中使用8080端口访问

此处输入图片的描述

测试宿主机访问

在宿主机中使用8000端口访问

此处输入图片的描述

测试浏览器访问tomcat

此处输入图片的描述

到这里我们的项目就搭建起来了,可以通过浏览器直接访问了


遇到的问题

从浏览器无法访问到tomcat

可能是因为防火墙原因,在开发测试阶段使用命令systemctl stop firewalld关掉防火墙即可

写在最后

本文中所需要的素材已经打包好,百度云分享,可以关注公号albk,回复指令”docker Dockerfile“获取

相关文章会首发公众号,可以关注公号albk,关注后可以获取大量学习视频

0%