目录
一.Docker简介
1.Docker简介
(1).什么是Docker?
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
logo解释:
标志是一头鲸鱼携带着一堆容器。它正在向您发送这些信息的途中。Docker直译过来是码头工人,然而Docker给人的第一感觉是容器,容器技术英译为Linux Container, Container的直译有集装箱,容器两个意思。
(2).什么是"集装箱技术"
们都知道码头里的集装箱是运载货物用的,它是一种按规格标准化的钢制箱子。集装箱的特色,在于其格式划一,并可以层层重叠, 集装箱与集装箱之间互不影响于是乎,IT领域借鉴了这一理念,大家就在想,有没有可能大家 只需要关注程序本身?
我们都知道码头里的集装箱是运载货物用的,它是一种按规格标准化的钢制箱子。集装箱的特色, 「在于其格式划一,并可以层层重叠, 集装箱与集装箱之间互不影响」
(3).Docker概述
Docker是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化。
总结:说白了,Docker其实就是可以打包程序和运行环境,把环境和程序一起发布的容器。
2.为什么要用Docker
(1).Docker容器虚拟化好处
开发者需要能方便高效构建应用,并且任何时间任何地点都可以获取。
(2).Docker在开发和运维中的优势
对开发和运维( DevOps)人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任意环境、任意时间让应用正常地运行。而Docker恰恰是可以实现这一终极目标的瑞士军刀。
优势:
- 更快速的交付和部署
- 更高效的资源利用
- 更轻松的迁移和扩展
- 更简单的更新管理
(3).Docker与虚拟机对比
作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势。
特性 | 容器 | 虚拟机 |
启动速度 | 秒级 | 分钟级 |
磁盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 完全隔离 | 完全隔离 |
3.虚拟化与Docker
(1).虚拟化技术
虚拟化技术是一个通用的概念,在不同领域有不同的理解。在计算领域,一般指的是计算虚拟化或通常说的服务器虚拟化。
简单的说,「虚拟化」,顾名思义,就是「虚拟」的,是「假」的,是形而上的,是观念上、逻辑上的划分。
举例说明
假设你现在手头上有一套房子,并且你要把它给租出去,租金的市场价是2000元/月。那么有没有办法把它租得更贵,获得6000元的租金呢?你想到了两个办法:
- 找一个不差钱的傻X租户,让他每月交6000元。
- 把房子租给4个单身狗,租金为1500元/人/月。
虚拟化分类:
- 完全虚拟化
- 硬件辅助虚拟化
- 部分虚拟化
- 超虚拟机化
- 操作系统虚拟化
(2).简单理解:
可以理解为一栋楼是物理机、一栋楼里的各个房子是虚拟机、一个房子的几个小屋子是Docker
4.Docker核心概念
(1).Docker技术的三大核心概念:
- 镜像(Image)
- 容器 (Container)
- 仓库 (Repository)
(2).Docker镜像
Docker 镜像 (Image) 类似于虚拟机镜像,可以将它理解为个面向 Docker引擎的模板,包含了文件系统。
镜像从何而来
- 从Docker Hub下载 maven-> 中央仓库
- 通过Docker file自己创建出来
(3).Docker容器
Docker容器(Container)类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。
注意:
容器和镜像一样,也是若干层的叠加,唯一区别是所有只读层的最上面一层,是一层可读可写层,可以记住这个简单的公式:容器 = 容器镜像 + 可读可写层
(4).Docker仓库
Docker仓库(Repository)类似于代码仓库,是Docker集中存放镜像文件的场所。目前,最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供稳定的国内访问。
注意:
Docker利用仓库管理镜像的设计理念与Maven非常相似。
二.Docker核心命令
1.安装Docker
(1).关闭防火墙
systemctl stop firewalld
(2).关闭selinux
vim /etc/selinux/config
SELINUX=disabled
(3).安装Docker引擎
yum install -y docker
(4).启动Docker
systemctl start docker
(5).设置Docker自启动
systemctl enable docker
(6).测试Docker是否安装成功
docker run hello-world
2.安装DockerCompose
因为老Docker已经 停止服务了
(1).卸载
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
(2).关闭防火墙
systemctl stop firewalld
(3).关闭selinux
vim /etc/selinux/config
SELINUX=disabled
(4).设置安装仓库
#安装yum的工具包
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
#更新本地镜像源
# 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
#将软件包信息提前在本地索引缓存,用来提高搜索安装软件的速度,建议执行这个命令可以提升yum安装的速度。
yum makecache fast
(5).安装Docker引擎
yum install -y docker
(6).启动Docker
systemctl start docker
(7).设置Docker自启动
systemctl enable docker
(8).测试Docker是否安装成功
docker run hello-world
(9).修复
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.nju.edu.cn",
"https://hub.littlediary.cn",
"https://hub.xdark.top",
"https://dockerpull.org",
"https://hub.crdz.gq",
"https://docker.1panel.live",
"https://docker.unsee.tech"
]
}
systemctl daemon-reload
systemctl restart docker
3.Docker核心命令-镜像命令
Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。
镜像下载
镜像是Docker运行容器的前提。
语法格式:
docker pull 镜像名字:[tag]
注意:
如果不指定tag,则下载Docker Hub公共注册服务器中仓库的最新版本。
查看镜像
列出本地主机上已有的镜像。
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
参数:
- 来自于哪个仓库,比如 ubuntu仓库。镜像的标签信息,比如14.04。
- 镜像的ID号(唯一)。
- 创建时间。
- 镜像大小。
镜像的ID信息十分重要,它唯一标识了镜像。
镜像搜索
搜索远端仓库中共享的镜像,默认搜索Docker Hub官方仓库中的镜像。
docker search [镜像名字]
参数:
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级 (表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。
删除镜像
使用镜像的标签删除镜像
docker rmi 源名字
docker rmi image id
id写前两位就可以了
4.Docker核心命令-容器命令
当我们有了镜像,才可以创建容器, 创建一个centos容器来学习
(1).创建容器
Docker的容器十分轻量级,用户可以随时创建或者删除容器。
语法格式:
docker create -it 镜像名字
注意:
使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。
(2).列出容器
docker ps
参数:
- -a: 显示未启动容器
- -q:返回容器id号
(3).新建并启动容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态( stopped)的容器重新启动。所需要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。
语法格式:
docker run 镜像名字 /bin/echo 'hello world'
Docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
- 利用镜像创建并启动一个容器。
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
- 从地址池配置一个IP地址给容器。
- 执行用户指定的应用程序。
- 执行完毕后容器被终止。
下面命令则启动一个bash端,运行用户交互
docker run -t -i 镜像名字 /bin/bash
参数:
其中,-t选项让Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。
exit命令退出。
(4).守护态运行
多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。用户可以通过添加-d参数来实现。
语法格式:
docker run -d 镜像名字 /bin/sh -c "while true; do echo hello world ;sleep 1 ;done"
容器启动后会返回一个唯一的ID,也可以通过docker ps命令来查看容器信息:
docker ps
(5)获取容器输出信息
docker logs 容器id
(6).终止容器
语法格式:
docker stop 容器id
处于终止状态的容器,可以通过docker start命令来重新启动:
docker start 容器id
此外,docker restart命令会将一个运行态的容器终止,然后再重新启动
docker restart 容器id
(7).进入容器
在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息。某些时候如果需要进入容器进行操作,有多种方法,包括使用docker attach命令、docker exec命令,以及nsenter工具等。
attach命令
语法格式
docker attach 容器id
exec命令
Docke自1.3版本起,提供了一个更加方便的工具exec,可以直接在容器内运行命令。例如进入到刚创建的容器中,并启动一个bash:
docker exec -it 容器id /bin/bash
简单总结:
attach的话我exit以后这个镜像自动stop,exec的话我exit依然还在
(8).删除容器
语法格式
docker rm 容器id
参数:
- -f, --force=false强行终止并删除一个运行中的容器。
- -l, --link=false删除容器的连接,但保留容器。
- -V,--volumes=false删除容器挂载的数据卷。
(9).退出
#如果docker容器在启动的时候没有加 -d 参数
exit # 会直接停止同期并退出
Ctrt + p + q # 容器不停止 并退出
5.Docker核心命令-其他命令
(1).查看日志
语法格式
docker logs 容器id
参数:
-f, --follow 跟踪实时日志
--since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
--tail string 从日志末尾显示多少行日志, 默认是all
-t, --timestamps 显示时间戳
--until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
(2).查看容器里面的进程
语法格式:
docker top 容器id
(3).从容器拷贝文件到主机上
docker cp 容器id:容器内路径 目录路径
三.Docker实战
1.安装JDK
(1).查看JDK镜像
docker search openjdk:17
(2).下载JDK镜像
docker pull openjdk:17
(3).运行JDK镜像
docker run openjdk:17 java -version
2.安装Tomcat
(1).查看Tomcat镜像
docker search docker.io/tomee
(2).下载Tomcat镜像
docker pull docker.io/tomee
(3).启动Tomcat镜像
[root@docker ~]# docker run -d --name mytomcat -p 9090:8080 docker.io/tomee
3.安装MySQL
(1).查看MySQL镜像
docker search mysql:5.7
(2).下载MySQL镜像
docker pull mysql:5.7
(3).启动MySQL镜像
docker run --name mysql -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
参数:
-p 我们以后使用3307 端口来访问mysql 为了防止黑客攻击
-e 配置环境变量
MYSQL_ROOT_PASSWORD 设置容器内mysql root 密码
4.为什么使用数据卷
(1).什么是容器数据卷
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)
(2).问题引入:
- Docker容器删除后,在容器中产生的数据还在吗?
- Docker容器和外部机器可以直接交换文件吗?
- 容器之间能进行数据交互?
(3).数据卷概念
- 数据卷是宿主机中的一个目录或文件。
- 当容器目录和数据卷目录绑定后,对方修改会立即同步。
- 一个数据卷可以同时被多个容器同时挂载。
- 一个容器也可以被挂载多个数据卷。
(4).数据卷使用
- 容器数据持久化。
- 外部机器和容器间接通信。
- 容器之间数据交换。
5.配置数据卷
(1).命令
docker run -v 宿主机目录(文件):容器内目录(文件)
webapps
注意事项
1. 目录必须是绝对路径
2. 如果目录不存在则会自动创建
3. 可以挂载多个数据卷
示例:
给Tomcat服务器挂载/opt/webapps路径。
docker run -d --name mytomcat -p 8080:8080 -v
/opt/webapps:/usr/local/tomcat/webapps tomcat
6.容器数据卷Volume
(1).Volume基本使用
参数: create # 创建数据卷 inspect #查看数据卷元数据 ls #查看数据卷列表 prune #删除所有未使用的卷 rm #删除数据卷
(2).自定义一个
docker volume create edc-tomcat-vol
其实这个volume create和直接docker create区别不大的 只不过这个是先创建再用那个是先用,发现没有再创建
(3).查看所有容器卷
docker volume ls
(4).查看置顶容器卷详情信息
docker volume inspect edc-tomcat-vol
(5).删除数据卷
docker volume rm edc-tomcat-vol
(6).使用指定卷容器
docker run -d -it --name=edc-tomcat -p 8080:8080 -v edc-tomcat-vol:/usr/local/tomcat/webapps tomcat
注意:
-v代表挂载数据卷,这里使用自定数据卷edc-tomcat-vol,并且将数据卷挂载到/usr/local/tomcat/webapps 。如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。
7.MySQL持久化
(1).搜索镜像
docker search mysql:5.7
(2).下载镜像
docker pull mysql:5.7
(3).运行镜像:
docker run -d -p 3306:3306 \
-v /opt/mysql/conf:/etc/mysql/conf.d \
-v /opt/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 --name my-mysql mysql:5.7
(4).具名和匿名挂载
语法格式:
-V 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主内路径:容器内路径 #指定路径挂载
扩展:
ro readonly # 只读
rw readwrite # 可读可写
参数:
通过 -v 容器内路径 ro rw 改变目录读写权限
示例:
docker run -d -P --name tomcat -v my-nginx:/etc/nginx:ro tomcat
docker run -d -P --name tomcat -v my-nginx:/etc/nginx:rw tomcat