Docker容器技术

目录

1.初识Docker

1.1 为什么使用docker

1.2 Docker技术

1.3.安装Docker

1.4.Docker架构

1.5.配置Docker镜像加速器

2.Docker常用命令

2.1.Docker服务相关的命令

2.2.Docker镜像相关的命令

2.3.Docker容器相关的命令

3. 容器的数据卷

3.1.数据卷的概念和作用

3.2.配置数据卷

4.Docker应用部署

4.1.Docker部署mysql

4.2.Docker部署Redis

4.3.Docker部署tomcat

4.4.Docker部署nginx

4.5.Docker部署RabbitMQ

5.自定义镜像

5.1.Docker镜像的原理

 5.2 镜像制作

5.3 dockerfile的概念[重]

5.4 Dockerfile关键字

5.5 Dockerfile案例


1.初识Docker

1.1 为什么使用docker

我就可以把项目以及项目依赖的配置和软件一起打包---【镜像】---直接在测试环境下运行该镜像。无需担心环境的不同导致无法运行的问题。  

1.2 Docker技术

Docker是基于Go语言实现的云开源项目。

Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。

Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

Docker的应用

1.3.安装Docker

Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,

演示:CentOS7安装Docker

官网: Docker: Accelerated, Containerized Application Development

虚拟机中执行步骤:

# 1、yum包更新到最新
yum update
#2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置yum源--指定你下载docker软件的网址
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#4、安装docker ,出现输入的界面都按y---下载并安装docker-ce[社区版] docker-ee[企业版]
yum install -y docker-ce
# 5、查看docker版本,验证是否验证成功
docker -v

1.4.Docker架构

  • Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。

  • 容器(Container) :Docker 利用容器(Container)独立运行的一个或一组应用。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台

  • 仓库(Repository)是集中存放镜像文件的场所。

    类似于

    Maven仓库,存放各种jar包的地方;

    github仓库,存放各种git项目的地方;

    Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。

    仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

    最大的公开仓库是 Docker Hub(https://hub.docker.com/),

    存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等

1.5.配置Docker镜像加速器

默认情况下,将来从docker hub (https://hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器:

USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)

阿里云--网易云--腾讯云

演示:阿里云中配置镜像加速器

进入阿里云官网

搜索

 

 

2.Docker常用命令

2.1.Docker服务相关的命令

  • 停止docker服务: systemctl stop docker
  • 启动docker服务: systemctl start docker
  • 重启docker服务: systemctl restart docker
  • 开机启动docker服务: systemctl enable docker

2.2.Docker镜像相关的命令

1.从仓库中搜索相关的镜像

docker search 镜像名
例如: docker search mysql

2. 拉取镜像到本地

docker pull 镜像名:版本号 ===如果没有跟版本号,那么它会拉取最新的latest

3.查看本地有哪些镜像

docker images

4.删除本地指定的镜像

docker rmi 镜像名:版本号 或镜像编号

5.删除所有的镜像

docker rmi $(docker images -q)    [慎用]

6.帮助命令

docker --help  [找到所有的docker命令]docker 命令 --help  [命令的语法]

2.3.Docker容器相关的命令

运行centos容器:并进入到容器内

docker run -it --name=c1 centos:7 /bin/bash
  •  -i:进入容器内部
  • -t:交互平台 ===它几乎和-i一起使用。
  • --name: 为容器起个名称--如果没有使用--name那么docker为自动分配一个名字
  • centos:7===镜像名:版本号
  • /bin/bash===提供一个shell命令窗口

退出容器

exit: ---会关闭容器
ctrl+q+p:--退出不会关闭容器

查看当前的容器

docker ps:  查看所有正在运行的容器
docker ps -a:查看所有的容器。
docker ps -aq: 查看所有容器的id

创建一个容器不进入到该容器内部

docker run -id --name=容器的名称  centos:7 /bin/bash

进入指定的容器内部:---使用exit不会关闭容器

docker exec 容器的id或者容器的名称  /bin/bash

关闭|启动|删除容器

docker stop 容器名|容器id
docker start 容器名|容器id
docker rm 容器名|容器id  [只能删除停止的容器]
docker rm -f 容器名|容器id [强制删除容器]
docker rm -f $(docker ps -aq): 删除所有容器

查看容器的日志

docker logs 容器id

3. 容器的数据卷

3.1.数据卷的概念和作用

思考: dockers容器删除后,容器中的产生的数据还在吗?

思考: Docker容器和外部机器可以直接交换文件吗?

 思考: 容器之间想要进行数据交互

 

 

为了保证容器数据的可靠性,----需要把容器内部的某个目录--挂载到宿主机中的某个目录中。

宿主机中的这个目录就是数据卷

 概念:

  • 数据卷是宿主机中的一个目录或文件
  • 当容器目录和数据卷目录绑定后对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以被挂载多个数据卷

作用:

  • 解决数据持久化问题
  • 解决外部机器和容器的间接通讯问题
  • 解决容器之间的数据交换

3.2.配置数据卷

  • 创建启动容器时,使用-v参数设置数据卷
  • docker run ... -v 宿主机目录(文件):容器内目录(文件) ...

注意事项:

  • 目录必须是绝对路径
  • 如果目录不存在,会自动创建
  • 可以挂载多个数据卷

例子:

 docker run -id --name=c2 -v /usr/app:/usr/ykq -v /usr/app2:/usr/ykq2 centos:7 /bin/bash

4.Docker应用部署

4.1.Docker部署mysql

 

 

搜索mysql镜像

docker search mysql

 拉取mysql镜像

docker pull mysql:5.7

 创建容器,设置端口映射、目录映射

# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql

mysql完整版容器

docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7

参数说明

  • -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
  •  -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录

  • -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录

  • -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录

  • -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。

 

 

4.2.Docker部署Redis

(1)拉取redis镜像

docker pull redis:6.0.20 

(2)运行redis镜像

docker run -id --name=redis6 -p 6380:6379 redis:6.0.20 
-p: 端口映射  容器内部的端口和宿主机之间的映射。

(3)使用外部机器连接redis

如果把redis容器删除了---里面的数据还有吗?---如果我想修改redis的配置内容。


持久化

1.启动redis容器时指定配置文件

  • 创建一个目录/app/redis,并把redis.conf放入该目录
  • 创建一个目录/app/redis/data---存放redis持久化数据
  • mkdir -p /app/redis/data
  • 运行redis容器
  • docker run -id --name=redis6 -v /app/redis/redis.conf:/usr/redis/redis.conf -v /app/redis/data:/usr/redis/data -p 6379:6379 redis:6.0.20 redis-server /usr/redis/redis.conf
    

  • 每个容器相当于一个虚拟机

4.3.Docker部署tomcat

搜索tomcat镜像

docker search tomcat

 拉取tomcat镜像

docker pull tomcat

创建容器,设置端口映射、目录映射

# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat

运行tomcat容器

docker run -id --name=tomcat -p 8080:8080 镜像名

 进入tomcat 并修改

访问端口--成功

4.4.Docker部署nginx

 

 

搜索nginx镜像

docker search nginx

拉取nginx镜像

docker pull nginx

创建容器,设置端口映射、目录映射

# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
# 在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容
vim nginx.conf
user  nginx;
worker_processes  1;error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;include /etc/nginx/conf.d/*.conf;
}
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
  • 参数说明:

    • -p 80:80:将容器的 80端口映射到宿主机的 80 端口。

    • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录

    • -v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录

4.5.Docker部署RabbitMQ

搜素rabbitmq的镜像

docker search rabbitmq

拉取rabbitmq镜像

docker pull rabbitmq

运行rabbitmq:

docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5673:5672 rabbitmq

 通过docker ps -a查看部署的mq容器id,在通过 docker exec -it 容器id /bin/bash 进入容器内部在
运行:rabbitmq-plugins enable rabbitmq_management

现在可以通过访问http://linuxip:15672,访问web界面,这里的用户名和密码默认都是guest
输入命令:exit退出容器目录.

5.自定义镜像

上面讲解的内容需要的镜像 都是从远程仓库拉取,我们能否把自己写的工程也变成一个镜像。可以的。 需要自定义镜像

5.1.Docker镜像的原理

思考:

  • Docker镜像本质是什么?---它就是一个文件Dockerfile[ 写着一条一条得到命令]

  • Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G?

  • Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有10多MB?

linux文件系统由bootfs和rootfs两部分组成。

  • bootfs:包含bootloader (引导加载程序)和kernel(内核)

  • rootfs: root文件系统,包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件

  • ·不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等

 

  • Docker镜像是由特殊的文件系统叠加而成

  • 最底端是bootfs,并使用宿主机的bootfs;

  • 第二层是root文件系统rootfs,称为base image: 基础镜像

  • 然后再往上可以叠加其他的镜像文件

  • 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。

  • 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

总结:

 5.2 镜像制作

自定义镜像:提供了两种方式:

  • 第一种:基于容器来制作
  • 第二种: 通过dockerfile文件来制作

第一种 容器转为镜像:只能在已有的镜像的容器上进行制作新镜像-----了解 

步骤: 把现有的镜像--运行成一个容器---修改容器中的内容--->变成镜像---把镜像压缩文件--->交给其他人---变成本地镜像

演示:

 

 

 

 

 

 

  • docker commit 容器id 镜像名:版本号 [把指定的容器变成镜像]
  • docker save -o 压缩文件名 镜像名:版本号 [把指定的镜像压缩为一个压缩文件]
  • docker load -i 压缩文件名 【把压缩文件变成本地镜像】

5.3 dockerfile的概念[重]

  • Dockerfile是一个文本---任意一个镜像都是通过dockerfile来制作

  • 文件包含了一条条的指令

  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像

  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境

  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了

  • 对于运维人员:在部署时,可以实现应用的无缝跨平台移植

  •  

     

5.4 Dockerfile关键字

 

 

5.5 Dockerfile案例

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

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

相关文章

HET-1型多功能二维材料转移平台

HET-1型多功能二维材料转移平台 产品介绍 HET-1型二维转移平台适用于石墨烯、各类过渡金属化合物、黑磷等多种单层及其多层二维材料的精确定位转移及范德瓦尔斯异质结的准确制备,实现了低维材料转移的精确可视化操作。本套转移平台由转移台模块、样品台模块、显微观…

Oracle FETCH子句详解

目录 一、语法 二、oracle等同写法 三、Mysql等同写法 由于oracle不能使用limit,所以用fetch用来限制查询返回的行数。 一、语法 [ OFFSET offset ROWS] FETCH NEXT [ row_count | percent PERCENT ] ROWS [ ONLY | WITH TIES ] 说明: OFFSET…

移远通信首批加入“5G+eSIM计算终端产业合作计划”,助力大屏移动终端全时在线

7月29日,在全球数字娱乐产业盛会 ChinaJoy上,中国联通携手高通公司、GSMA发布了“5GeSIM 计算终端产业合作计划”。 作为全球领先的物联网整体解决方案供应商,移远通信首批加入该计划,副总经理刘明辉受邀参加5GeSIM 计算终端产业合…

常见距离计算的Python实现

常见的距离有曼哈顿距离、欧式距离、切比雪夫距离、闵可夫斯基距离、汉明距离、余弦距离等,用Python实现计算的方式有多种,可以直接构造公式计算,也可以利用内置线性代数函数计算,还可以利用scipy库计算。 1.曼哈顿距离 也叫城市…

java关键词组匹配算法

首先我们将对代码进行基础构思: 一、 创建TrieNode 类 Trie 树的节点类,用于构建 Trie 树。TrieNode 类有以下成员变量: children:一个 Map,用于存储当前节点的子节点,key 是字符,value 是对应…

剑指 Offer 53 - I. !!在排序数组中查找数字 I (考查二分法)

剑指 Offer 53 - I. 在排序数组中查找数字 I 统计一个数字在排序数组中出现的次数。 示例 1: 输入: nums [5,7,7,8,8,10], target 8 输出: 2 示例 2: 输入: nums [5,7,7,8,8,10], target 6 输出: 0 提示&#xff1a; 0 < nums.length < 105 -109 < nums[i] &l…

day49-Todo List(待办事项列表)

50 天学习 50 个项目 - HTMLCSS and JavaScript day49-Todo List&#xff08;待办事项列表&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" co…

Ajax_02学习笔记(源码 + 图书管理业务 + 以及 个人信息修改功能)

Ajax_02 01_Bootstrap框架-控制弹框的使用 代码 <!-- 引入bootstrap.css --> <link href"https://cdn.jsdelivr.net/npm/bootstrap5.2.2/dist/css/bootstrap.min.css" rel"stylesheet"><button type"button" class"btn btn…

nlohmann::json 中文乱码解决方案

// UTF8字符串转成GBK字符串 std::string U2G(const std::string& utf8) {int nwLen MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0);wchar_t* pwBuf new wchar_t[nwLen 1];//加1用于截断字符串 memset(pwBuf, 0, nwLen * 2 2);MultiByteToWideChar(CP_U…

hadoop 3.1.3集群搭建 ubuntu20

相关 hyper-v安装ubuntu-20-server hyper-v建立快照 hyper-v快速创建虚拟机-导入导出虚拟机 准备 虚拟机设置 采用hyper-v方式安装ubuntu-20虚拟机和koolshare hostnameiph01192.168.66.20h02192.168.66.21h03192.168.66.22 静态IP 所有机器都需要按需设置 sudo vim /e…

C语言技巧 ----------调试----------程序员必备技能

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; &#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382;…

【css】nth-child选择器实现表格的斑马纹效果

nth-child() 选择器可以实现为所有偶数&#xff08;或奇数&#xff09;的表格行添加css样式&#xff0c;even&#xff1a;偶数&#xff0c;odd&#xff1a;奇数。 代码&#xff1a; <style> table {border-collapse: collapse;width: 100%; }th, td {text-align: cente…

MySQL 判断字段是否包含数字或者纯数字

使用mysql原生函数FIND_IN_SET查询包含某个数字 select * from text where find_in_set(1,name) 使用regexp正则匹配纯数字 select * from text where (name REGEXP [^0-9.])0; 当 REGEXP ‘[^0-9.]’ 结果为 0 ,代表为纯数字 当 REGEXP ‘[^0-9.]’ 结果为1 ,代表不为纯数…

kube-state-metrics暴露k8s中的监控指标

kube-state-metrics 是一个用于从 Kubernetes 集群中生成各种资源对象状态指标的工具。 通过Deployment等配置完成安装 https://github.com/kubernetes/kube-state-metrics/tree/main/examples/standard 根据官方给定的配置添加至k8s上 注意需要RBAC授权 启动项 要使 kube…

在C语言中内嵌汇编语言

在C语言中内嵌的汇编指令包含大部分的ARM和Thumb指令&#xff0c;不过其使用与汇编文件中的指令有些不同&#xff0c;存在一些限制&#xff0c;主要有以下几个方面&#xff1a; &#xff08;1&#xff09;不能直接向PC寄存器赋值&#xff0c;程序跳转要使用B或者BL指令&#x…

Promise用法

学习了promise之后&#xff0c;有点懂但让我说又说不出来&#xff0c;参考别人的记录一下。 1.什么是promise&#xff1f; 2.promise解决了什么问题 3.es6 promise语法 &#xff08;1&#xff09;then链式操作语法 &#xff08;2&#xff09;catch的语法 &#xff08;3&#xf…

Git Bash 教程!【不是所有人都会用Git】

我不太会用github...... 写这篇文章希望能顺利...... 【写在前面】介绍一下git bash的复制粘贴的快捷键&#xff0c;以防后续不会&#xff1a; 开始&#xff1a; 首先下一个windows&#xff1a;git for windows(地址&#xff1a;Git - Downloading Package (git-scm.com)) &a…

P3957 [NOIP2017 普及组] 跳房子

[NOIP2017 普及组] 跳房子 题目背景 NOIP2017 普及组 T4 题目描述 跳房子&#xff0c;也叫跳飞机&#xff0c;是一种世界性的儿童游戏&#xff0c;也是中国民间传统的体育游戏之一。 跳房子的游戏规则如下&#xff1a; 在地面上确定一个起点&#xff0c;然后在起点右侧画…

基于遗传算法的试题组卷(二)

实例讲解 一、准备工作 1、问题实体 问题实体包含编号、类型&#xff08;类型即题型&#xff0c;分为五种&#xff1a;单选&#xff0c;多选&#xff0c;判断&#xff0c;填空&#xff0c;问答&#xff0c; 分别用1、2、3、4、5表示&#xff09;、分数、难度系数、知识点。一…

【MySQL】触发器 (十二)

🚗MySQL学习第十二站~ 🚩本文已收录至专栏:MySQL通关路 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 一.引入 触发器是与表有关的数据库对象,作用在insert/update/delete语句执行之前(BEFORE)或之后(AFTER),自动触发并执行触发器中定义的SQL语句集合。它可以协助应…