Docker从入门到实战:Docker快速部署、Dockerfile编写、容器间通信及共享数据实战、Docker-compose详解

文章目录

  • 一、基本概念
    • 1、体系结构
    • 2、容器与镜像
      • 1)镜像
      • 2)容器
        • a、容器内部结构
        • b、容器生命周期
    • 3、执行流程
  • 二、常用命令
    • docker pull 镜像名<:tags> :从远程仓库抽取镜像
    • docker images:查看本地镜像
    • docker run 镜像名<:tags> :创建容器,启动应用
    • docker ps :查看正在运行中的容器
    • docker ps -a:查看所有容器
    • docker rm <-f> 容器id/容器名:删除容器、-f表示强制删除
    • docker rmi <-f> 镜像名:\<tags>:删除镜像
    • docker exec [-it] 容器id/容器名 命令:在容器中执行命令
  • 三、Docker快速部署Tomcat运行
  • 四、Dockerfile
    • 1、基础命令
      • FROM
      • LABEL 或 MAINTAINER
      • WORKDIR
      • ADD 或 COPY
      • ENV
      • EXPOSE
    • 2、运行指令
      • RUN执行命令
      • ENTRYPOINT启动命令
      • CMD默认命令
      • 案例演示
    • 3、Dockerfile自动部署Tomcat应用
    • 4、Dockerfile构建Redis镜像
  • 五、镜像分层
  • 六、容器间通信
    • 1、Link单向通信
    • 2、Bridge双向通信
  • 七、容器间共享数据
    • 1、为什么要数据共享?
    • 2、如何实现
  • 八、Docker-compose
    • 1、是什么?
    • 2、适用场景
    • 3、如何安装
    • 4、应用实战
  • 总结

一、基本概念

Docker是容器化平台,是提供应用打包,部署与运行应用的容器化平台
在这里插入图片描述

1、体系结构

  • 客户端通过API访问服务器

在这里插入图片描述

  • 运维人员可以通过API访问不同服务器在这里插入图片描述

2、容器与镜像

1)镜像

可以理解为软件的安装包
镜像是文件,是只读的,提供了运行程序完整的软硬件资源,是应用程序的"集装箱"

2)容器

可以理解为运行的软件
是镜像的实例,由Docker负责创建,容器之间彼此隔离

a、容器内部结构

每部署1个Tomcat容器,自动包含了3个组件
在这里插入图片描述
docker部署容器底层都会有1个迷你linux操作系统

  • docker本身具备了部分虚拟化职能,介于容器化和虚拟化之间的一个产品
  • 很迷你的操作系统,很多命令是没有的,比如没有ll命令
    在这里插入图片描述
    默认安装的镜像和容器存放位置:/var/lib/docker下的containers和image
    在这里插入图片描述
b、容器生命周期

在这里插入图片描述
kill和stop的区别:一个是杀掉进程,一个是暂停而已

3、执行流程

  • Client:用户发送命令
  • DOCKER_HOST:接受和处理命令
  • Registry:提供镜像
    在这里插入图片描述
    客户端发送命令-》服务器从本地仓库看看有没有,没有就去远程仓库获取-》等到运行时,会创建容器

二、常用命令

docker pull 镜像名<:tags> :从远程仓库抽取镜像

注:不加tags,默认拉取最多使用的

docker images:查看本地镜像

docker run 镜像名<:tags> :创建容器,启动应用

注:运行时,镜像不存在,会先进行拉取
拓展参数说明:-p、-d、-name
端口映射:加参数-p 宿主机端口:容器端口
后台运行:-d
指定容器名运行:–name dockerName

docker ps :查看正在运行中的容器

docker ps -a:查看所有容器

docker rm <-f> 容器id/容器名:删除容器、-f表示强制删除

docker rmi <-f> 镜像名:<tags>:删除镜像

docker exec [-it] 容器id/容器名 命令:在容器中执行命令

参数说明:
exec 在对应容器中执行后面的命令
-it 采用交互方式执行命令
例子:docker exec -it xxx /bin/bash
/bin/bash开启一个交互式的命令行会话,进入什么目录?
在这里插入图片描述
/usr/local/tomcat:就是我们进入Tomcat容器的默认路径(工作路径)

三、Docker快速部署Tomcat运行

官方提供的远程镜像仓库:hub.docker.com
进入官方,搜索Tomcat,有相关命令说明,各种环境参数,直接按照来即可
在这里插入图片描述
这里我们不用去看官方有什么镜像也可以,直接执行下面的命令,就会去拉取最常用的tomcat镜像了,会提示Using default tag: latest

docker pull tomcat

让容器跑起来,执行下面命令

docker run tomcat

这时候可以看到已经启动成功,显示8080端口,但是外部还是无法访问,为啥?默认情况下,容器内的Tomcat服务只会绑定到容器的内部IP地址,而不是主机的IP地址。
在这里插入图片描述
如果想在外部访问,我们可以这么操作,将容器的端口映射到主机的端口上。可以使用-p参数来指定端口映射。使用docker run -p 8000:8080 tomcat命令,将容器的8080端口映射到主机的8000端口上,这样我们就可以直接使用浏览器访问了,如下:访问返回404说明已经得到了响应
在这里插入图片描述
如果前面我们已经启动过,需要先删除容器,使用docker rm 容器ID,但可以提示运行的容器无法删除,可以先停止,执行docker stop 容器ID命令,然后再删除,或者直接加上-f参数,直接强制删除docker rm -f 容器ID
在这里插入图片描述

四、Dockerfile

Dockerfile是镜像描述文件,是一个包含用于组合镜像的命令的文本文档,Docker通过读取Dockerfile中的指令按步自动生成镜像
命令:docker build -t 机构/镜像名<:tags> Dockerfile目录

1、基础命令

FROM

基于基准镜
FROM centos #制作基准镜像(基于centos:lastest)
FROM scratch #不依赖任何基准镜像base image
FROM tomcat: 9.0.22-jdk8-openjdk
尽量使用官方提供的Base Image

LABEL 或 MAINTAINER

说明信息
MAINTAINER forlan.com
LABEL version = “1.0”
LABEL description = “forlan”

WORKDIR

设置工作目录
WORKDIR /usr/local
WORKDIR /usr/local/newdir
新目录或不存在的会自动创建
尽量使用绝对路径

ADD 或 COPY

复制文件
ADD hello /:复制到根路径
ADD test.tar.gz /:添加根目录并解压
ADD 除了复制,还具备添加远程文件功能

ENV

设置环境常量
比如,设置JDK,ENV JAVA_HOME /usr/local/openjdk8
RUN ${JAVA_HOME}/bin/java -jar test.jar
尽量使用环境常量,可提高程序维护性

EXPOSE

声明容器运行时将监听的网络端口,并不会实际打开或映射端口,只是作为一种文档形式的声明,用于向用户和其他开发人员传达容器的预期网络接口
比如,EXPOSE 8080,实际上外部还是访问不到这个
要实现端口映射,还是得执行这个docker run -p 8000:8080 tomcat,将容器内部端口暴露给物理机

2、运行指令

RUN 或 CMD 或 ENTRYPOINT

RUN : 在Build构建时执行命令
ENTRYPOINT : 容器启动时执行的命令
CMD : 容器启动后执行默认的命令或参数

两种运行方式

  • Shell运行方式

格式:xx1 xx2
使用Shell执行时,当前shell是父进程,生成一个子shell进程
在子shell中执行脚本,脚本执行完毕,退出子shell,回到当前shell。

  • Exec运行方式

格式:[“xx1”,“xx2”]
使用Exec方式,会用Exec进程替换当前进程,并且保持PID不变
执行完毕,直接退出,并不会退回之前的进程环境

常用的方式:推荐使用Exec

RUN执行命令

构建时运行
RUN yum install -y vim:Shell运行方式
RUN [“yum”,“install”,“-y”,“vim”]:Exec运行方式

ENTRYPOINT启动命令

一定会执行

ENTRYPOINT(入口点)用于在容器启动时执行命令
Dockerfile中只有最后一个ENTRYPOINT会被执行
ENTRYPOINT [“ps”]
注:一定会被运行

CMD默认命令

不一定会被运行,后面会演示案例

CMD用于设置默认执行的命令
如Dockerfile中出现多个CMD,则只有最后一个被执行
如容器启动时附加指令ls,则CMD被忽略,比如这种,会被取代
CMD [“ps” , “-ef”] 在这里插入图片描述

案例演示

写dockfile文件,echo打印东西到控制台
在这里插入图片描述
cmd可以外部传参,因为我们附加了其它命令,它会被替代
在这里插入图片描述
ENTRYPOINT和CMD的东西会被拼接在一起执行

3、Dockerfile自动部署Tomcat应用

1)编辑Dockerfile
vi Dockerfile

FROM tomcat
MAINTAINER forlan.com
WORKDIR /usr/local/tomcat/webapps
ADD docker-web ./docker-web

参数说明:

  • FROM:基准镜像
  • WORKDIR:类似cd命令,进入目录,特殊:不存在会创建目录
  • ADD:复制文件A到B

2)创建docker-web目录,上传index.html
index.html内容如下:

<h1>forlan测试Docker应用1</h1>

3)构建镜像
docker build -t forlan.cn/webapp:1.0 .
注:镜像名要小写
在这里插入图片描述在这里插入图片描述
4)查看所有镜像
在这里插入图片描述
5)运行容器
docker run -p 8001:8080 -d forlan.cn/webapp:1.0
6)验证
http://192.168.56.100:8001/docker-web/index.html
在这里插入图片描述

4、Dockerfile构建Redis镜像

1)上传我们下下载好的文件
redis-4.0.14.tar.gz和redis-7000.conf
2)创建dockerfile文件

FROM centos
RUN ["yum","install","-y","gcc","gcc-c++","net-tools","make"]
WORKDIR /docker/docker-redis
ADD redis-4.0.14.tar.gz .
WORKDIR /docker/docker-redis/redis-4.0.14/src
RUN make && make install
WORKDIR /docker/docker-redis/redis-4.0.14
ADD redis-7000.conf .
EXPOSE 7000
CMD ["redis-server","redis-7000.conf"]

3)构建镜像

docker build -t forlan.com/docker-redis .

五、镜像分层

在这里插入图片描述

  • 镜像层:只读
  • 容器层:可读可写、独立

mywebapp执行过程:每执行一步,都会有个临时容器,相当于快照
在这里插入图片描述
有啥好处?

命令没有发生变化时,使用的是缓存
在这里插入图片描述

六、容器间通信

1、Link单向通信

注:容器间不建议使用ip进行通信,可以使用容器名称
1)运行一个tomcat容器,指定容器名为web
docker run -d --name web tomcat
2)运行一个MySQL容器,指定容器名为database
docker run -d --name database -it centos /bin/bash
3)查看容器ip
docker inspect 容器id/容器名 | grep "IPAddress"
在这里插入图片描述
4)链接两个容器,使用docker run -d --name web --link database tomcat命令,但只是单向通信,如图
在这里插入图片描述

2、Bridge双向通信

其实Link也可以实现双向通信,但是麻烦,我们来看看Bridge。
1)查看网桥:docker network ls
在这里插入图片描述
2)创建新的网桥:docker network create -d bridge forlan-bridge
在这里插入图片描述

3)容器和网桥绑定:docker network connect forlan-bridge 容器名
在这里插入图片描述
这样就实现双向通信了,网桥相当于虚拟网卡,如果需要和外部通信,容器数据包需要通过虚拟网卡,转成物理网卡的数据包
在这里插入图片描述

七、容器间共享数据

1、为什么要数据共享?

假设我们部署了2个Tomcat容器,存在相同的web页面文件,发生变化,每个容器都要进行,其实我们可以把共享文件放到物理机上,统一维护即可

2、如何实现

其实就是通过数据卷volume,它就是保存数据的单位,把共享文件放到宿主机

从原来下图的东西,单独放各自的容器内
在这里插入图片描述
在容器外宿主机内挂一个目录,控制容器内的目录文件
在这里插入图片描述
通过设置-v挂载宿主机目录

格式:docker run --name 容器名 -v 宿主机路径:容器内挂载路径 镜像名
实例:docker run --name t1 -v /usr/webapps:/usr/local/tomcat/webapps tomcat
缺点:每次都要输入很长的命令,而且大小写要一样

通过–volumes-from 共享容器内挂载点

创建共享容器:docker create --name webpage -v /webapps:/tomcat/webapps tomcat /bin/true,/bin/true就是占位符,没啥用
共享容器挂载点:docker run --volumes-from webpage --name t1 -d tomcat
创建新的话,就很简单了,只需要t1改为t2:docker run --volumes-from webpage --name t2 -d tomcat

八、Docker-compose

1、是什么?

容器编排工具,通过yml文件定义多容器如何部署,可以控制先部署容器1,再部署容器2…
Docker Compose

2、适用场景

单机部署,它是单机多容器部署工具

3、如何安装

WIN/MAC默认提供Docker Compose,Linux需安装

1)下载最新版本的Docker Compose

curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2) 设置为可执行权限

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

3)验证Docker Compose是否已成功安装

docker-compose --version

4、应用实战

这里借鉴了一个bsbdj应用来实战下
1)bsbdj上传到服务器
在这里插入图片描述
2)编写Dockerfile,构建镜像
app镜像

FROM openjdk:8u222-jre
WORKDIR /docker/bsbdj
ADD bsbdj.jar .
ADD application.yml .
ADD application-dev.yml .
EXPOSE 80
CMD ["java","-jar","bsbdj.jar"]

执行构建

docker build -t forlan.com/app .

db镜像,官方规定:SQL文件放到docker-entrypoint-initdb.d该目录,就会自动初始化

FROM mysql:5.7
WORKDIR /docker-entrypoint-initdb.d
ADD init-db.sql .

执行构建

docker build -t forlan.com/db .

3)运行容器

docker run -d --name db -e MYSQL_ROOT_PASSWORD=root forlan.com/db

4)进入MySQL容器内部验证数据库是否正常

docker exec -it db /bin/bash
mysql -uroot -proot

执行show databases,可以看到数据库已经安装好
在这里插入图片描述
5)一键发布两个镜像

创建yml文件:vim docker-compose.yml

restart: always:容器宕机会自动重启,保证容器稳定
设置依赖的容器,进行通信
端口映射,宿主机端口:容器端口

version: '3.3'
services:db:build: ./bsbdj-db/restart: alwaysenvironment:MYSQL_ROOT_PASSWORD: rootapp:build: ./bsbdj-app/depends_on:- dbports:- "80:80"restart: always

启动容器

docker-compose up -d

查看日志

docker-compose logs [容器名]

停止并移除容器:docker-compose down
在这里插入图片描述

注意,这里记得改下,原先会报错,localhost读取的是web容器的ip,肯定读取不到,改为db容器的
在这里插入图片描述
访问ip验证:192.168.56.100

总结

首先,我们介绍了Docker的体系结构、容器与镜像的基本概念以及执行流程。接着,我们详细解释了常用的Docker命令,包括镜像的抽取、本地镜像的查看、容器的创建与启动、正在运行中的容器的查看以及容器的删除与镜像的删除等。此外,我们还介绍了在容器中执行命令的方法。然后,我们通过一个案例演示了如何使用Docker快速部署Tomcat运行,并详细解释了Dockerfile的编写,包括基础命令、运行指令以及案例演示。此外,我们还介绍了镜像分层和容器间通信的相关内容。最后,我们解释了为什么要数据共享以及如何实现数据共享,并介绍了Docker-compose的相关内容,包括其定义、适用场景、安装方法以及应用实战。

  总的来说,Docker用于创建和管理容器化的应用程序环境,Dockerfile用于定义构建镜像的步骤,而Docker-compose用于定义和管理多个容器的组合,Link和Bridge用于实现容器间通信,Volume用于持久化存储数据,共享数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/191908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达梦8搭建DataWatch集群

一、集群配置 官方文档本次配置集群需要两台服务器主库&#xff1a;dmdw1&#xff0c;10.0.0.100备库&#xff1a;dmdw2&#xff0c;10.0.0.110确认监视器&#xff1a;10.0.0.110普通监视器&#xff1a;10.0.0.100 二、初始化数据库 2.1 主库执行 su - dmdba cd /opt/dmdbm…

利用Python爬虫爬取豆瓣电影排名信息

可以使用第三方库Beautiful Soup和Requests来编写一个简单的爬虫&#xff0c;从豆瓣电影Top100页面获取信息 import requests from bs4 import BeautifulSoupdef get_douban_top100():url https://movie.douban.com/top250headers {User-Agent: Mozilla/5.0 (Windows NT 10.…

C++11入门

目录 C11简介 统一的列表初始化 声明 范围for循环 STL中一些变化 C11简介 在2003年C标准委员会提交了一份技术勘误表(简称TC1).使得C03这个名字取代了C98成为C11之前的最新C标准名称.但由于C03主要是对C98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯的把…

给定一组经纬度如何判断某点是否在这组经纬度的范围之内(电子围栏实现代码)

方法一&#xff1a; 使用JTS Topology Suite 是 Java 的空间数据模型和空间分析操作的库&#xff0c;用于处理地理空间数据和进行空间分析。 1.1引入maven <dependency><groupId>org.locationtech.jts</groupId><artifactId>jts-core</artifactId…

代数学笔记6: 群同态基本定理,循环群结构定理

群同态 ρ : G 1 ( , ⋅ ) → G 2 ( , ∘ ) g ↦ ρ ( g ) \rho:G_1(\ ,\cdot)\to G_2(\ ,\circ)\\ \qquad\ \ g\mapsto \rho(g) ρ:G1​( ,⋅)→G2​( ,∘) g↦ρ(g) ∀ g 1 , g 2 ∈ G \forall g_1,g_2\in G ∀g1​,g2​∈G, 有 ρ ( g 1 ⋅ g 2 ) ρ ( g 1 ) ∘ ρ ( g 2 …

解决报错:error: (-215:Assertion failed) inv_scale_x > 0 in function ‘cv::resize‘

需求背景 欲使用opencv的resize函数将图像沿着纵轴放大一倍&#xff0c;即原来的图像大小为(384, 512), 现在需要将图像放大为(768, 512)。 源码 import cv2 import numpy as np# 生成初始图像 img np.zeros((384, 512), dtypenp.uint8) img[172:212, 32:-32] 255 H, W …

卷积神经网络-3D医疗影像识别

文章目录 一、前言二、前期工作1. 介绍2. 加载和预处理数据 二、构建训练和验证集三、数据增强四、数据可视化五、构建3D卷积神经网络模型六、训练模型七、可视化模型性能八、对单次 CT 扫描进行预测 一、前言 我的环境&#xff1a; 语言环境&#xff1a;Python3.6.5编译器&a…

题目:DNA序列修正(蓝桥OJ 3904)

题目描述&#xff1a; 解题思路&#xff1a; 从左到右扫描第一条 DNA 序列和第二条 DNA 序列的每一个位置&#xff0c;检查它们是否互补。 如果某个位置不互补&#xff0c;我们需要寻找第二条 DNA 序列中后续位置的碱基&#xff0c;看是否可以通过交换使这两个位置都互补。如果…

〖大前端 - 基础入门三大核心之JS篇㊹〗- DOM事件委托

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

ssl下载根证书和中间证书

为了保证客户端和服务端通过HTTPS成功通信&#xff0c;您在安装SSL证书时&#xff0c;也需要安装根证书和中间证书。本文介绍如何获取根证书和中间证书。 使用说明 如果您的业务用户通过浏览器访问您的Web业务&#xff0c;则您无需关注根证书和中间证书&#xff0c;因为根证书…

ELK高级搜索,深度详解ElasticStack技术栈-下篇

前言&#xff1a;ELK高级搜索&#xff0c;深度详解ElasticStack技术栈-上篇 14. search搜索入门 14.1. 搜索语法入门 14.1.1 query string search 无条件搜索所有 GET /book/_search结果&#xff1a; {"took" : 969,"timed_out" : false,"_shar…

头歌JUnit单元测试相关实验进阶

JUnit是一个由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架&#xff08;regression testing framework&#xff09;&#xff0c;主要供 Java 开发人员编写单元测试。Junit在极限编程和重构中被极力推荐使用&#xff0c;因为它可以大大地提高开发的效率。 Junit的特性&…

Spring——全局异常处理(介绍@RestControllerAdvice和@ExceptionHandler)

目录 1.RestControllerAdviceExceptionHandler的作用2.实现原理3.各种特性 1.RestControllerAdviceExceptionHandler的作用 RestControllerAdvice注解 RestControllerAdvice是Spring框架提供的注解&#xff0c;用于全局异常处理。它将异常处理方法集中在一个类中&#xff0c;…

力扣66. 加一

文章目录 力扣66. 加一示例代码实现总结收获 力扣66. 加一 示例 代码实现 class Solution {public int[] plusOne(int[] digits) {int ndigits.length;for(int in-1;i>0;i--){if(digits[i]!9){digits[i];for(int ji1;j<n;j){digits[j]0;}return digits;}}int[] resnew i…

selenium环境安装

一、下载安装python 下载python安装python设置python环境变量安装selenium &#xff08;1&#xff09;下载python 您可以从Python官方网站&#xff08;https://www.python.org/downloads/&#xff09;下载Python。在页面上&#xff0c;您将看到不同版本的Python供您选择。根…

Qt中对Udp数据打包发送和接收(续)

这次用一个更加复杂的数据包举例。 心跳报文结构如下&#xff1a; struct HeartbeatPacket {quint16 protocolId;quint16 version;quint16 totalLength;quint16 reserve;QByteArray senderAddress;QByteArray receiverAddress;quint8 sequenceNumber;quint8 acknowledgementN…

MVCC-

文章目录 1. 什么是MVCC2. 快照读和当前读3. 复习4. MVCC实现原理之ReadView5. 总结 文章目录 1. 什么是MVCC2. 快照读和当前读3. 复习4. MVCC实现原理之ReadView5. 总结 1. 什么是MVCC 口述&#xff1a;MVCC其实他是解决这种读-写的情况的&#xff0c;当然读-写也可以用 锁来…

医保支付方式探索——利益共享机制的文章分析

Care-coordination: Gain-sharing Agreements in Bundled Payment Models 分析一下这篇文章&#xff0c;这篇文章于2021年发表在POMS上&#xff0c;但是引用量没有那么高。这篇文章涉及到医疗捆绑支付&#xff0c;应该可以学习一下。 文章研究一个在一个以最小成本为目标的质…

python+Appium自动化:python多线程多并发启动appium服务

Python启动Appium 服务 使用Dos命令或者bat批处理来手动启动appium服务&#xff0c;启动效率低下。如何将启动Appium服务也实现自动化呢&#xff1f; 这里需要使用subprocess模块&#xff0c;该模块可以创建新的进程&#xff0c;并且连接到进程的输入、输出、错误等管道信息&…

oj塞氪算法练习

向量点积计算 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int[] a new int[n];int[] b new int[n];for (int i 0; i < n; i) {a[i] scanner.nextInt();}…