Docker

发布于:2025-09-01 ⋅ 阅读:(23) ⋅ 点赞:(0)

docker:一个快速构建,运行,管理应用的工具

centos安装docker参考:安装Docker - 飞书云文档

1.Docker部署Mysql

我们利用Docker来安装一个MySQL软件,对比一下之前传统的安装方式

如果是利用传统方式部署MySQL,大概的步骤有:

        搜索并下载MySQL安装包

        上传至Linux环境

        编译和配置环境

        安装

而使用Docker安装,仅仅需要一步即可,在虚拟机中输入命令(默认用户root 密码为123)

docker run -d \ --name mysql \ -p 3306:3306 \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=123 \ mysql

当我们执行命令后,Docker做的第一件事情,是去自动搜索并下载了MySQL,然后会自动运行MySQL。而且,这种安装方式你完全不用考虑运行的操作系统环境,它不仅仅在CentOS系统是这样,在Ubuntu系统、macOS系统、甚至是装了WSL的Windows下,都可以使用这条命令来安装MySQL。

而使用Docker,完全不用考虑操作系统的不同。就是因为Docker会自动搜索并下载MySQL。注意:这里下载的不是安装包,而是镜像(image)。镜像中不仅包含了MySQL本身,还包含了其运行所需要的环境、配置、系统级函数库。

因此它在运行时就有自己独立的环境,就可以跨系统运行,也不需要手动再次配置环境了。这套独立运行的隔离环境我们称为容器(container

镜像可以下载一次,多次启动。每一个启动的镜像都在一个隔离环境(容器)中运行。

测试链接Docker的Mysql成功

为管理和储存镜像,Docker官方维护了一个公共仓库(镜像仓库)hub.docker.com

2.Docker命令

Mysql部署命令解析

  • docker run -d :创建并运行一个容器,-d则是让容器以后台进程运行

  • --name mysql : 给容器起个名字叫mysql,必须唯一

  • -p 3306:3306 : 设置端口映射。

    • 容器是隔离环境,外界不可访问。但是可以宿主机端口映射容器内到端口,当访问宿主机指定端口时,就是在访问容器内的端口了。

    • 容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。

    • 格式: -p 宿主机端口:容器内端口,示例中就是将宿主机的3306映射到容器内的3306端口

  • -e  : 配置容器内进程运行时的一些参数,环境变量

    • 格式:-e KEY=VALUE,KEY和VALUE都由容器内进程决定,可以在镜像运行时的配置也不是随意的,要参考镜像的帮助文档,这些在DockerHub网站或者软件的官方网站中都能找到。

    • 案例中,TZ=Asia/Shanghai是设置时区;MYSQL_ROOT_PASSWORD=123是设置MySQL默认密码

  • mysql : 设置镜像名称,Docker会根据这个名字搜索并下载镜像

    • 格式:REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是版本号

    • 在未指定TAG的情况下,默认是最新版本,也就是mysql:latest

常见命令。一般在镜像仓库查找相关镜像,拉取镜像到本地,再根据镜像参考文档来创建容器。

默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:

# Docker开机自启

systemctl enable docker

# Docker容器开机自启

docker update --restart=always [容器名/容器id]

3.挂载

Docker数据卷挂载

数据卷是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。实现了宿主机与容器目录的间接映射,方便我们操作容器内文件

进行数据卷挂载后,在宿主机内目录文件进行修改后,容器内目录文件也会修改。

数据卷的挂载只能在docker run容器创建时进行。

为什么不让容器目录直接指向宿主机目录呢

  • 因为直接指向宿主机目录就与宿主机强耦合了,如果切换了环境,宿主机目录就可能发生改变了。由于容器一旦创建,目录挂载就无法修改,这样容器就无法正常工作了。

  • 但是容器指向数据卷,一个逻辑名称,而数据卷再指向宿主机目录,就不存在强耦合。如果宿主机目录发生改变,只要改变数据卷与宿主机目录之间的映射关系即可。

本地挂载

匿名卷:容器创建时自动声明的一个本地目录,需要挂载数据卷,但是数据卷未定义。这就是匿名卷

本地挂载

4.自定义镜像

镜像就是包含了应用程序,程序运行的系统函数库,运行配置等文件的文件包。构建镜像就是把这些文件打包的过程。

添加安装包,依赖,配置等,每一次操作其实都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以镜像就是一堆文件的集合

但需要注意的是,镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。

基础镜像:应用依赖的系统函数库,环境,配置,文件等

入口:镜像运行入口,一般是程序启动脚本和参数

Dockerfile

利用固定指令来描述镜像结构和构建过程。

# 基础镜像

FROM openjdk:11.0-jre-buster

# 设定时区

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 拷贝jar包

COPY docker-demo.jar /app.jar

# 入口

ENTRYPOINT ["java", "-jar", "/app.jar"]

运行Dockerfile

# 开始构建 docker build -t docker-demo:1.0 .

命令说明:

  • docker build : 就是构建一个docker镜像

  • -t docker-demo:1.0-t参数是指定镜像的名称(repositorytag

  • . : 最后的点是指构建时Dockerfile所在路径,.代表当前目录,也可以直接指定Dockerfile目录:

5.容器网络互连

默认情况下,所有的容器都是一bridge方式连接到Docker的一个虚拟网桥上

Docker安装时会自动生成一个网桥,Docker创建的容器会自动连接这个网桥被分配一个ip。但是这个分配的ip地址是自动分配的,会发生变化。

自定义网络

自定义网络可以创建一个新的网桥,而且加入该网络的容器可以通过容器名相互访问,ip变化不影响互联。

可以在创建容器时加入命令 --network 来指定网桥

6.DockerCompose

DockerCompose通过一个单独的docker-compose.yml文件来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器快速部署

下面是一个项目的DockerCompose定义


网站公告

今日签到

点亮在社区的每一天
去签到