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. [LeetCode] 60. Permutation Sequence 序列排序

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  2. [LeetCode] 73. Set Matrix Zeroes 矩阵赋零

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place. Exampl ...

  3. [LeetCode] 138. Copy List with Random Pointer 拷贝带随机指针的链表

    A linked list is given such that each node contains an additional random pointer which could point t ...

  4. [LeetCode] 270. Closest Binary Search Tree Value 最近的二叉搜索树的值

    Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...

  5. [LeetCode] 314. Binary Tree Vertical Order Traversal 二叉树的垂直遍历

    Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...

  6. Altera FPGA 远程升级有关的几个IP的使用

    在做在线远程升级的时候,一般需要两步:1.将数据写到外挂的flash中.2重新启动FPGA配置. 不过要做到远程升级,一般需要在原始程序中就考虑到加入远程升级模块,remote updata IP, ...

  7. Qt qml调试,qml性能分析和优化工具

    QML语言为qt推出的用于界面编程的语言. 1)如何在qt creator中进行调试qml: 以Qt Creator 4.6.2为例: 在qt creator的debug模式下,可以直接在qml中打断 ...

  8. 如何在一个文件中写多个Vue组件(译-有删改)

    原文地址 Writing multiple Vue components in a single file 在一个文件中编写多个组件是React的模式,其中一些文件包含多个组件. 走开发过程中,有些组 ...

  9. TZOJ5697: 数据结构实验:归并排序

    #include<stdio.h> #include<stdlib.h> void merge(int a[], int start,int mid,int end) { )) ...

  10. ByteArray、16进制、字符串之间的转换

    ByteArray.16进制.字符串之间的转换: package fengzi.convert { import flash.utils.ByteArray; public class ByteArr ...