Docker容器化技术(下)

一、Dockerfile基础命令

1.1.FROM - 基于基准镜像
  • FROM centos #制作基准镜像(基于centos)

  • FROM scratch #不依赖任何基准镜像base image

  • FROM tomcat:9.022-jdk8-openjdk

  • 尽量使用官方的Base Image

1.2.LABEL&MAINTAINER - 说明信息
  • MAINTAINER xxx.com
  • LABEL version = "1.0"
  • LABEL description = "xxx啥作用"
1.3.WORKDIR - 设置工作目录
  • WORKDIR /usr/local
  • WORKDIR /usr/local/newdir #自动创建
  • 尽量使用绝对路径
1.4.ADD&COPY - 复制文件
  • ADD hello / #f复制到根路径
  • ADD test.tar.gz / #添加根目录并解压
  • ADD 除了复制,还具备添加远程文件的功能,+网址,类似wget
1.5.ENV - 设置环境常量
  • ENV JAVA_HOME /usr/local/openjdk8
  • RUN ${JAVA_HOME}/bin/java -jar test.jar
  • 尽量使用环境常量,可提高程序维护性

二、Dockerfile执行指令

RUN&CMD&ENTRYPOINT
  • RUN:在Build构建时执行 相当于shell的执行方式
  • ENTRYPOINT:容器启动时执行
  • CMD:容器启动后执行 CMD[“ps”,"ef"] 相当于exec的执行方式
执行方式
RUN yum install -y vim #shell命令格式
RUN ["yum","install","-y","vim"] #Exec命令格式

为什么要提供两种不同的执行方式呢?

  • shell执行

使用Shell执行,当前shell是父进程,生成一个子进程

在子shell中执行脚本,脚本执行完毕,退出子shell,回到当前shell

  • exec运行

当前进程执行

实战
FROM centos
RUN ["echo","image building!!!"]//执行在子进程了
CMD ["echo","container starting..."]//只有这句能看到的

注意 : CMD 如果增加了,则会取代CMD命令,CMD命令不一定执行

ENTRYPOINT 一定会执行

三、构建Redis镜像

  • Redis是一个NoSQL数据库
  • 2010.3.15开始,Redis开发工作,由VMWare主持

书写Dockerfile

FROM centos
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 //暴露7000端口
CMD ["redis-server","redis-7000.conf"]

之后执行镜像构建就行

docker build -t xxx/docker-redis:1.0 .
docker run -p 7000:7000 xxx/docker-redis:1.0

这边只是讲述Dockerfile的书写,实际工作中,直接使用redis镜像即可

四、容器间Link单向通信

  • 容器创建后,存在一个虚拟IP

容器单向访问

原理:虽然有内虚拟IP,容器中进行通讯,我们不采用IP通讯,采用容器名称进行通讯

我们使用--name指定名称

docker run -d --name web tomcat
docker run -d --name database -it centos /bin/bash

查看虚拟IP

docker inspect [containerID]

我们使用ping

ping 172.17.0.3 是可以ping通的
但是我们ping名称是ping不通的

所以我们创建第二个tomcat的时候,要进行链接数据库

docker run --name web --link database tomcat

这时候我们进入tomcat,然后进行ping,可以自然联通

ping database 可以自动ping通

五、基于Bridge网桥进行双向通信

网桥双向通信原理

具体操作:绑定tomcat和database

docker run -d --name web tomcat
docker run -d --name database centos /bin/bash
docker network ls
docker network create -d bridge my-bridge
docker network connect my-bridge web
docker network connect my-bridge database

六、Volume容器间共享数据

容器未使用volume

Volume容器原理

方法:

1.通过设置-v挂载宿主机目录

  • 格式:
  • docker run --name 容器名 -v 宿主机路径:容器内挂载路径 镜像名
  • 实例:
  • docker run --name t1 -v /usr/webapps:/usr/local/tomcat/webapps tomcat

2.通过共享容器

  • 格式:
  • docker create --name webpage -v /webapps:/tomcat/webapps tomcat /bin/true
  • 共享容器挂载点
  • docker run --volumes-from webpage --name t1 -d tomcat

七、Docker Compose

多容器部署会遇到很多麻烦,所以我们的Docker compose出来了

案例

  • Docker Compose 单机多容器部署工具
  • 通过yml文件定义多容器如何部署
  • WIN/MAC默认提供Docker Compose,Linux则需要安装

安装步骤:

1.获取自动安装

pip install -U docker-compose==1.23.2

2.进行执行权限

sudo chmod +x /usr/local/bin/docker-compose

安装WordPress

1.创建目录wordpress

mkdir wordpress

2.vim docker-compose.yml

复制官网上的

3.build the project

docker-compose up -d

八、Docker-compose应用实战

案例、两个SpringBoot项目构建docker-compose

SpringBoot打包

文件 applicaion-dev.yml application.yml bsbdj.jar

vim Dockerfile

FROM openjdk:8u222-jre
WORKDIR /usr/local/bsbdj //上述肯定没有这个目录,所以会创建
ADD bdbdj.jar //加入jar
ADD application.yml .
ADD application-dev.yml .
EXPOSE 80 //暴露端口80
CMD ["java","-jar","bsbdj.jar"] docker build -t msb.com/bsbdj-app .
docker run msb.com/bsbdj-app

数据库打包

vim Dockerfile

FROM mysql:5.7
WORKDIR /docker-entrypoint-initdb.d
ADD init-db.sql . docker build -t msb.com/bsbdj-db .
docker run -e -d MYSQL_ROOT_PASSWORD=root msb.com/bsbdj-db docker exec -it aae73fa77d75 /bin/bash

Docker-Compose进行关联和发布

vim docker-compose.yml

version: '3.3'
services:
db:
build: ./bsbdj-db/
restart: always //容错,自动重启
environment:
MYSQL_ROOT_PASSWORD: root
app:
build: ./bsbdj-app/
depends_on:
- db
ports:
- "80:80"
restart: always docker-compose up
docker-compose up -d
docker-compose logs
docker-compose down 我们连接数据库,那么yml中jdbc:mysql://db:3306/xxx即可

Docker容器化技术(下)的更多相关文章

  1. Docker容器化技术(上)

    目录 Docker容器化技术 一.介绍 二.Docker的发展 三.Docker安装 四.阿里云Docker镜像加速 五.Docker的基本概念 六.命令 七.Docker宿主机与容器通信 八.容器内 ...

  2. 新一代Java程序员必学的Docker容器化技术基础篇

    Docker概述 **本人博客网站 **IT小神 www.itxiaoshen.com Docker文档官网 Docker是一个用于开发.发布和运行应用程序的开放平台.Docker使您能够将应用程序与 ...

  3. Docker容器化技术

    1. 初始Docker 1.1 Docker概念 Docker概念:Docker是一个开源的应用容器引擎 诞生于2013年初,基于Go实现,dotCloud公司出品(后改名为Docker Inc) D ...

  4. Java 服务 Docker 容器化最佳实践

    转载自:https://mp.weixin.qq.com/s/d2PFISYUy6X6ZAOGu0-Kig 1. 概述 当我们在容器中运行 Java 应用程序时,可能希望对其进行调整参数以充分利用资源 ...

  5. spring boot本地开发与docker容器化部署的差异

    spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...

  6. Gogs的Docker容器化部署流程遇到的问题

    Gogs的Docker容器化部署流程遇到的问题   最近在学习CI/CD的一些方案,个人比较青睐容器化轻量级.CI方面一开始是想使用gitlab的,但是发现我自己买的服务器配置太低,内存根本不够(大写 ...

  7. docker容器化python服务部署(supervisor-gunicorn-flask)

    docker容器化python服务部署(supervisor-gunicorn-flask) 本文系作者原创,转载请注明出处: https://www.cnblogs.com/further-furt ...

  8. 通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署

    通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署 Intro Azure DevOps Pipeline 现在对于公开的项目完全免费,这对于开源项目来讲无疑是个巨大的 ...

  9. 利用 ELK 搭建 Docker 容器化应用日志中心

    利用 ELK 搭建 Docker 容器化应用日志中心 概述 应用一旦容器化以后,需要考虑的就是如何采集位于 Docker 容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志 ...

随机推荐

  1. 基于Emit的C#下DataTable转实体类方法,一直报错.

    xxxx ;WITH Tab AS ( SELECT CAST(ROW_NUMBER()OVER(ORDER BY CC.CreateTime DESC) AS INT) AS Sequency, ) ...

  2. [LeetCode] 149. Max Points on a Line 共线点个数

    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...

  3. 【神经网络与深度学习】【计算机视觉】图解YOLO

    图解YOLO 晓雷 3 个月前 YOLO核心思想:从R-CNN到Fast R-CNN一直采用的思路是proposal+分类 (proposal 提供位置信息, 分类提供类别信息)精度已经很高,但是速度 ...

  4. sql数据库查询相关操作,SQL的应用——SQL多表连查、子查询、多行子查询

    ? 1 **SQL多表连查** ? 1 2 3 4 5 6 7 8 --查询员工和部门信息 select * from emp e,dept d where e.deptno=d.deptno --查 ...

  5. SpringBoot系列教程之Redis集群环境配置

    之前介绍的几篇redis的博文都是基于单机的redis基础上进行演示说明的,然而在实际的生产环境中,使用redis集群的可能性应该是大于单机版的redis的,那么集群的redis如何操作呢?它的配置和 ...

  6. 九、Spring中使用@Value和@PropertySource为属性赋值

    首先回顾下在xml中我们是如何为spring的bean进行属性赋值呢? 大体是这样的 <bean id="person" class="com.atguigu.be ...

  7. Centos安装nodejs,并运行项目

    不建议编译安装,对gcc要求比较高 安装nodejs yum install nodejs nodejs升级 npm i -g n --force n stable npm升级 npm install ...

  8. UDP中一个包的大小最大能多大?TCP呢?

    (以上为以太网的帧格式) Preamble:前导同步码7个字节+帧开始定界符1个字节=8个字节 Destination MAC adress:目的MAC地址 Source MAC adress:源MA ...

  9. flask框架(八)—自定义命令flask-script、多app应用、wtforms表单验证、SQLAIchemy

    自定义命令flask-script 用于实现类似于django中 python3 manage.py runserver ...类似的命令,用命令行启动项目 首先安装:pip3 install fla ...

  10. html input复选框的checked属性

    input --checked: 只要复选框有checked属性,不管属性值为空或者为true or false或任意值,复选框都会被选中.切忌:checked属性值不要带引号 <input t ...