docker
1、docker概述
理解Docker
java - - - jar(环境) - - - 打包项目自带环境(镜像) – - - (Docker仓库:商店)- - -下载我们发布的镜像 - - -直接运行即可
隔离:docker的核心思想,打包装箱,每个箱子都是互相隔离的
docker的历史
百度百科:…
docker是基于go语言开发的开源项目
官网地址 Home - Docker
文档地址:方向和设置|Docker 文档 文档很详细
hub地址:https://hub.docker.com 类似与github
docker能干嘛
传统虚拟机方式
弊端:
- 内存空间占用大
- 资源占用十分多
- 冗余步骤多
- 启动很慢
容器化技术
容器化技术不是模拟的一个完整的操作系统
虚拟机和docker的不同
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装运行软件
- 容器内的应用使直接运行在宿主机的内核上,容器没有自己的内核,也没有虚拟锄硬件,轻便
- 每个容器间互相隔离,每个容器都有属于自己的文件系统,互不影响
DevOps(开发、运维)
2、docker安装
docker的基本组成
镜像(image):镜像(image)是类,容器是实例1,实例2…… ,通过镜像可以创建多个容器
容器(container): docker利用容器技术,独立运行或者一组应用,通过镜像来创建的 - - -简易的linux系统
仓库(repository):仓库就是存放镜像的地方 ,有公有仓库和私有仓库 比如 Docker hub(默认是国外的) 国内需要配置镜像加速
安装
参考帮助文档
卸载旧版本
1
2
3
4
5
6
7
8yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine使用存储库安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#安装软件包(提供实用程序)设置存储库
yum install -y yum-utils
#设置存储库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #默认是国外的
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #国内阿里云镜像地址
#将软件包信息提前在本地索引缓存,用来提高搜索安装软件的速度,建议执行这个命令可以提升yum安装的速度。
yum makecache fast
#安装最新版本的 Docker 引擎、容器和 Docker Compose,或转到下一步以安装特定版本:
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
#启动docker
systemctl start docker
#查看是否安装成功
docker version3.测试 hello-world
1
docker run hello-world
查看镜像
1 | docker images |
卸载docker
1 | #卸载 Docker 引擎、CLI、Containerd 和 Docker Compose 包: |
阿里云镜像加速
找到镜像加速地址、配置使用
1 | sudo mkdir -p /etc/docker |
hello-world执行流程
- docker run 先会现在本机中寻找镜像
- 如果本机中存在此镜像,就使用此镜像
- 如果未找到会去docker-hub上下载
底层原理
docker是一个Client-server 结构系统,以守护进程的方式运行在主机上,通过Socket从客户端访问
dockerServer接收到客户端(docker-client)的指令,就会执行这个命令
docker利用的是主机的内核
新建一个容器的时候,docker不需要向虚拟机一样重新加载一个操作系统内核,docker是利用宿主机的操作系统
3、docker的常用命令
帮助命令
1 | docker version #显示docKer的版本信息 |
帮助文档地址 Reference documentation | Docker Documentation
镜像命令
docker images
查看所有本地主机上的镜像
1 | [root@centosstudy ~]# docker images |
docker search 镜像名
搜索镜像
1 | [root@centosstudy ~]# docker search mysql |
docker pull 镜像名 [:tag]
下载镜像
1 | [root@centosstudy ~]# docker pull mysql |
docker rmi
删除镜像
1 | [root@centosstudy ~]# docker images |
容器命令
有了镜像才能创建容器
1 | docker pull centos |
创建容器并启动
1 | docker run [参数] image #创建容器并启动 ,如果有版本号指定其版本号 :版本 |
docker ps
列出正在运行的容器
1 | [root@centosstudy ~]# docker ps |
退出容器
1 | exit #容器退出 |
docker rm
删除容器
1 | docker rm 容器id #删除指定容器 |
启动和停止容器
1 | docker start 容器id |
常用其他命令
docker run -d 镜像名
容器后台启动
1 | [root@centosstudy ~]# docker run -d centos |
docker logs
查看日志
1 | docker logs [OPTIONS] CONTAINER_ID_OR_NAME 容器id或名字 |
docker top 容器id
查看容器中进程信息
1 | docker top CONTAINER_ID_OR_NAME [OPTIONS] |
docker inspect 容器id
获取有关 Docker 对象(如容器、镜像、网络等)的详细信息
1 | docker inspect [OPTIONS] OBJECT() |
docker exec -it container_id_or_name /bin/bash
以交互式终端方式进入正在当前运行的容器
1 | [root@centosstudy ~]# docker exec -it 116287d5e23a /bin/bash |
dcoker attach
连接到正在运行的 Docker 容器,并将当前终端连接到容器的标准输入、输出和错误流
1 | 语法 docker attach [OPTIONS] CONTAINER_ID_OR_NAME |
二者区别:
- docker exec 进入容器后开启一个新的终端
- docker attach 进入容器正在执行的终端,不会启动一个新的进程
docker cp 容器id:容器内路径 目的主机路径
从容器内拷贝到主机上
1 | [root@centosstudy opt]# docker exec -it 0fb15f692dcd /bin/bash #进入容器中 |
小结
1 | #常用命令小结 |
4、docker部署Nginx
搜索镜像
1
docker search nginx 建议去dockerhub上搜索
下载镜像
1
docker pull nginx
创建并启动容器
端口暴露给外部访问
1
2
3
4
5docker run -d --name nginx01 -p 3344:80 nginx
-d 后台运行
--name 指定名字
-p 映射端口 暴露端口给外部访问 端口映射本机内部测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24[root@centosstudy opt]# curl localhost:1111
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>进入容器
1
2
3
4
5
6
7
8
9[root@centosstudy opt]# docker exec -it nginx01 /bin/bash
root@b9a3b4960d34:/# clear
root@b9a3b4960d34:/# ls
bin docker-entrypoint.d home media proc sbin tmp
boot docker-entrypoint.sh lib mnt root srv usr
dev etc lib64 opt run sys var
root@b9a3b4960d34:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@b9a3b4960d34:/#
5、docker部署tomcat
1 | docker run -it --rm tomcat:9.0 |
6、docker可视化工具
常见的 Docker 可视化工具:
- Portainer: Portainer 是一个流行的 Docker 管理界面,提供图形界面来管理容器、镜像、卷等资源。它易于安装和使用,适合 Docker 初学者和专业人员。
- Kitematic: Kitematic 是一个由 Docker 官方提供的可视化工具,用于在桌面上管理 Docker 容器。它具有直观的用户界面,可帮助您轻松创建、启动和管理容器。
- Rancher: Rancher 是一个用于管理容器化应用程序的开源平台,它提供了丰富的用户界面,允许您在多个主机上部署和管理容器。
- Docker Desktop(Windows/macOS): Docker Desktop 是针对 Windows 和 macOS 用户的官方 Docker 可视化工具,它提供了集成的用户界面,让您可以轻松地管理和运行容器。
- Docker Dashboard(Docker CLI Web): Docker Dashboard 是一个基于 Web 的界面,可以通过浏览器访问,提供与 Docker CLI 类似的功能,但以可视化的方式呈现。
- DockerUI: DockerUI 是一个简单的 Docker 可视化工具,可帮助您查看和管理容器和镜像。
7、docker镜像
镜像是什么
Docker 镜像是一个轻量级、独立且可执行的软件包,它包含了运行应用程序所需的所有代码、运行时、系统工具、库和设置。镜像是用于创建 Docker 容器的基础,可以将应用程序和其依赖项打包成一个可移植的单元,以便在不同的环境中运行。
如何获得镜像:
- 从远程下载
- 拷贝别人的
- 自己制作
核心概念
- 分层结构: Docker 镜像是由一系列分层(Layers)组成的,每个分层包含了镜像的一部分文件系统变更。这种分层结构使镜像变得高效、可复用,并允许不同的镜像共享相同的基础分层。
- 不可变性: 一旦创建了 Docker 镜像,它就是不可变的。任何对镜像的更改都会产生新的镜像分层,而原始镜像本身保持不变。这确保了镜像的一致性和可靠性。
- 层叠和继承: Docker 镜像可以通过层叠和继承的方式创建。您可以基于现有的镜像添加新的分层,然后在顶层添加您的应用程序和配置。这种机制使镜像的创建和维护更加灵活。
- 版本控制: 镜像可以通过标签(Tags)来进行版本控制。例如,您可以创建多个版本的镜像,每个版本具有不同的标签,以便在应用程序的不同阶段或环境中使用。
- Docker Hub 和仓库: 镜像可以上传到 Docker Hub 或私有 Docker 仓库,以便与其他人共享和访问。Docker Hub 是一个公共的镜像仓库,包含了大量的官方和社区创建的镜像。
docker镜像加载的原理
- 分层结构: Docker 镜像是由一系列分层组成的,每个分层包含了文件系统的变更。这些分层按顺序叠加在一起,形成了一个完整的镜像。每个分层都包含了一个或多个文件或目录的变更,例如添加、删除、修改文件等。这种分层结构使得镜像可以被高效地构建、复用和共享。
- 联合文件系统(Union File System): Docker 使用联合文件系统技术将不同分层的文件系统叠加在一起,使它们看起来像是一个单一的文件系统。这允许容器只需加载变更的分层,而不是整个文件系统。常见的联合文件系统包括 AUFS、OverlayFS、Btrfs 等。
镜像加载过程
- 准备阶段: 当您使用
docker pull
命令或运行一个基于某个镜像的容器时,Docker 首先检查本地是否已经存在所需的镜像。如果不存在,它会从镜像仓库(如 Docker Hub)下载镜像及其分层。 - 分层叠加: 下载完镜像的分层后,Docker 会将这些分层按顺序叠加在一起,以构建一个完整的文件系统。每个分层只包含变更,这意味着底层的基础镜像是不可变的。
- 创建容器: 当您运行一个容器时,Docker 根据镜像的文件系统创建一个容器实例。每个容器都有自己的读写层(Writable Layer),这是一个可变的分层,允许容器在运行时对文件系统进行修改。
- 联合文件系统: 在容器运行时,Docker 将底层镜像的分层和容器的读写层(Writable Layer)联合在一起,创建出一个虚拟的联合文件系统。这使得容器的文件系统在逻辑上看起来像是一个完整的文件系统,但实际上是由多个分层组成。
分层原理
commit镜像
1 | docker cmmit 将容器成为一个新的副本 |
实战测试
1 | 启动tomcat |
==可以通过commit的方式保存当前容器的状态,获得一个新的镜像==
8、容器数据卷
什么是容器数据卷
Docker 容器数据卷(Container Volumes)是一种用于在容器和主机之间持久存储数据的机制。数据卷允许容器在运行时共享数据,并且数据在容器删除后仍然保留。这对于在容器中保存应用程序数据、配置文件、数据库等非常有用,因为容器本身是临时性的,不适合长期存储数据。-
作用:
解决数据持久化
将容器中的数据同步到本地
- 容器之间的数据可以共享
数据卷的使用
方式一
docker run -it -v 主机目录:容器目录 镜像名
指定路径: 使用 -v
或 --volume
选项来创建数据卷并将其挂载到容器中。例如:
1 | docker run -d -v /host/path:/container/path my_image |
这会将主机上的 /host/path
目录挂载到容器内的 /container/path
目录。
1 | [root@centosstudy opt]# docker run -it -v /opt/test:/home centos /bin/bash |

容器中的数据和主机中数据会进行一个双向绑定
方式二
匿名数据卷: 如果不指定主机路径,Docker 会自动生成一个匿名数据卷,并将其自动挂载到容器中。例如:
1 | docker run -d -v /container/path my_image |
方式三
具名数据卷:
1 | docker run -d -P --name nginx01 -v volumeName:/etc/nginx nginx |
具名和匿名
docker volume ls
查看所有数据卷
1 | #具名 |
没有指定目录的情况下默认在主机 /var/lib/docker/volumes/xxx/_data
下面
如何判断是具名还是匿名
1 | -v 容器内路径 #匿名挂载 |
1 | #说明/etc/nginx这个路径只能通过主机来操作,容器内部无法操作 |
实战mysql
1 | [root@centosstudy opt]# docker run -d \ 后台运行 |
9、DockerFile
Dockerfile 是一种文本文件,用于定义 Docker 镜像的构建过程。它包含一系列的指令和配置,用于描述如何从一个基础镜像构建出一个新的、自定义的镜像。通过编写 Dockerfile,您可以定义容器所需的环境、软件包、设置和配置,使得镜像的构建过程更加可重复、可自动化和可管理。
两个命令
docker build
基于 Dockerfile 构建自定义的 Docker 镜像
1 | docker build -f mydockerfile_centos -t mycentos:latest |
docker history 镜像id/名称
查看 Docker 镜像的历史记录、显示了镜像是如何构建的,每个层次的操作和命令。
示例
编写dockerfile文件
1 | FROM centos |
根据文件构建镜像
1 | docker build -f dockerfile1 -t opt/cent |
启动镜像
1 | [root@centosstudy opt]# docker images |
查看数据卷挂载路径
docker inspect 16e3ab910713
如果构建的时候没有挂载卷,启动的时候手动使用-v挂载
构建步骤
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像
官方centos dockerfile
1 | FROM scratch |
构建过程
基础知识
- 每个关键字都是大写
- 按从上到下的顺序执行
- 每一个指令都会创建一个新的一层,并提交
dockerfile是面向开发的
dockerImages: 通过dockerfile构建生成的镜像,最终发布和运行
docker容器:容器就是镜像运行提供服务的
常见指令
FROM: 指定基础镜像,新镜像将从该基础镜像构建。
1
FROM ubuntu:20.04
RUN: 在构建过程中运行命令,用于安装软件、配置环境等。
1
RUN apt-get update && apt-get install -y nginx
COPY 和 ADD: 将文件从主机复制到镜像中。
1
ADD http://example.com/file.tar.gz /tmp/
WORKDIR: 设置工作目录,指定容器内的工作路径。
1
WORKDIR /app
ENV: 设置环境变量。
1
ENV DEBUG=true
EXPOSE: 声明容器运行时监听的端口。暴露端口
1
EXPOSE 80
CMD 和 ENTRYPOINT: 定义容器启动时要执行的默认命令或入口点。
1
2ENTRYPOINT ["nginx", "-g", "daemon off;"] #可以追加命令
CMD ["bash"] # 只有最后一个命令你会生效VOLUME: 声明数据卷。
1
VOLUME /data
USER: 设置执行命令的用户。
1
USER appuser
ARG: 声明构建时的参数,可以在构建过程中传递值。
1
ARG version=latest
LABEL: 添加镜像元数据标签。
1
LABEL maintainer="john@example.com"
ONBUILD: 在父镜像被用作基础镜像时执行命令。
1
ONBUILD COPY . /app
HEALTHCHECK: 定义容器的健康检查。
1
HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost/ || exit 1
实战一:centos镜像
centos官方镜像
1 | FROM scratch #最基础的镜像 |
创建一个自己的centos
编写dockerfile文件
1 | FROM centos:7 |
使用docker build
构建
1 | docker build -f mydockerfile_centos -t mycentos:latest |
运行镜像
1 | [root@centosstudy dockerfile]# docker images |
CMD 和 ENTRYPOINT
CMD
1 | 文件 |
测试docker run cmdtest -l
ENTRYPOINT
1 | FROM centos:7 |
测试docker run entrypointtest -l
结论:
- CMD 方式在运行的时候会替换原来的命令
- ENTRYPOINT 方式在运行的时候是在原有的命令上进行追加
实战二:Tomcat镜像
2023/08/11
- 准备压缩包
- 编写dockerfile文件,官方命名
Dockerfile
,bulid的时候会自动寻找这个文件,就不需要通过-f指定
1 | FROM centos:7 |
- 构建镜像
1 | docker build -t diytomcat . |
4、运行镜像
1 | docker run -it --name tomc 157dd3e8860f |
发布自己的镜像
docker hub
- 在dockerhub上注册账号
- 确定账号可以登录
- 在服务器上提交的自己的镜像
1 | #登录 |
阿里云镜像仓库
…
#10、数据卷容器
数据共享
1.启动一个opt/centos容器,重命名为docker01
1 | [root@centosstudy opt]# docker run -it --name docker01 opt/centos |
2.启动一个opt/centos容器,重命名为docker02,并继承docker01(数据卷容器)
1 | [root@centosstudy _data]# docker run -it --name docker02 --volumes-from docker01 opt/centos |
结论:
数据卷容器的生命周期一直持续到没有容器使用为止
11、docker网络
12、springboot项目打包
新建一个springboot 项目
在根目录创建一个Dockerfile文件
1 | FROM java:8 |
- 将springboot项目打包
- 放入服务器一个文件夹下
- 执行构建命令
1 | docker build -t testname . |
- 运行镜像文件
1 | docker run -d -p 8080:8080 testname |
- 访问运行
13、docker-compose
什么是docker-compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许你通过一个单独的配置文件来定义多个容器、它们之间的关系以及运行参数。使用 Docker Compose,你可以轻松地创建、管理和启动由多个容器组成的复杂应用程序。
==多服务部署工具==
核心概念:
- 一个文件:docker-compose.yml
- 两个要素:
- 服务:一个个应用容器实例
- 工程:由一组容器组成的完整业务单元
安装
1 | sudo curl -L "https://github.com/docker/compose/releases/download/{desired_version}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose |
常用命令
docker-compose up: 启动应用程序的容器。如果配置文件中不存在容器,它会首先创建它们。如果容器已存在,它会重新启动它们。
docker-compose up -d: 以后台模式启动容器,不会在终端输出容器日志。
docker-compose down: 停止并移除容器、网络和卷等资源。这会执行与配置文件相反的操作。
docker-compose ps: 列出正在运行的容器,并显示它们的状态。
docker-compose logs: 查看容器的日志输出。默认会显示所有容器的日志。
docker-compose logs
: 查看特定服务(容器)的日志输出。 1
docker-compose logs myapp
docker-compose exec
1
docker-compose exec webapp bash
docker-compose build: 根据配置文件中的定义构建 Docker 镜像。
docker-compose pull: 从镜像仓库拉取最新的镜像版本,以确保使用最新版本。
docker-compose restart: 重新启动服务中的容器。
docker-compose stop: 停止正在运行的容器,但不移除它们。
docker-compose start: 启动之前停止的容器。
docker-compose config -q
巨坑!主机和docker中端口不同然后做了映射的话,如果用了mysql作为ip那么连的是容器中mysql的端口;如果用的是主机地址作为ip那么连的是主机的端口
docker-compose.yml
工程=多个服务(容器应用实例)
后续更新