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. js中 这些值是false

  2. [LeetCode] 107. Binary Tree Level Order Traversal II 二叉树层序遍历 II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  3. [LeetCode] 787. Cheapest Flights Within K Stops K次转机内的最便宜航班

    There are n cities connected by m flights. Each fight starts from city u and arrives at v with a pri ...

  4. 解决GitHub访问速度慢的问题

    https://github.com,但是页面很久才能打开 命令窗口,输入 ping github.com,超时 优化方法: 通过绕过DNS解析,直接在本地绑定host 1.查看ip DNS查看 地址 ...

  5. Django文档阅读之查询

    创建对象 为了在Python对象中表示数据库表数据,Django使用直观的系统:模型类表示数据库表,该类的实例表示数据库表中的特定记录. 要创建对象,请使用模型类的关键字参数对其进行实例化,然后调用s ...

  6. linux线程间同步方式总结梳理

    线程间一般无需特别的手段进行通信,由于线程间能够共享数据结构,也就是一个全局变量能够被两个线程同时使用.只是要注意的是线程间须要做好同步! 使用多线程的理由: 1. 一个是和进程相比,它是一种非常&q ...

  7. 怎么查看服务器的cpu和内存的硬件信息

    在linux 下怎么查看服务器的cpu和内存的硬件信息     可以按照如下方式进行操作: 一.查看cpu总个数方法: 1.首先执行top命令,如下图中内容所表示. 2.在top命令的显示界面,按数字 ...

  8. Java开发笔记(一百一十九)AWT布局

    前面介绍了如何在窗口上添加一个按钮,可是每个软件界面都包含了许多控件,这些控件又是按照什么规则在界面上排列的呢?仍以按钮为例,假如要在窗口上依次添加多个按钮,那么界面会怎样显示这些按钮?想当然的话,按 ...

  9. ########django-基于中间件写一个限制频繁登陆########

    django-基于中间件写一个限制频繁登陆 额额,标题已经很醒目了,通过中间件去实现,其他方法也可以实现 浏览器前端传来的请求,必须通过中间件,才能到后面路由,视图函数,所以我们在中间件那里做一层处理 ...

  10. flask报错 KeyError: <flask.cli.ScriptInfo object at 0x000001638AC164E0>

    (flask_venv) D:\DjangoProject\flask_test>flask db init Traceback (most recent call last): File &q ...