Docker学习

ops/2024/9/24 9:07:42/

文章目录

  • 1. 快速入门
    • 1.1 配置Docker的yum库
    • 1.2 安装docker
    • 1.3 启动和校验
    • 1.4 安装MySQL
    • 1.5 常用命令
  • 2. Docker基础
    • 2.1 常见命令
    • 2.2 数据卷
    • 2.3 本地目录挂载
    • 2.4 自定义镜像
      • 2.4.1 镜像结构
      • 2.4.2 Dockerfile
      • 2.4.3 构建镜像
    • 2.5 网络
  • 3. 项目部署
    • 3.1 DockerCompose
      • 3.1.2 基本语法
      • 3.1.2 基本命令

参考文档链接: https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcucLZbrn2d

1. 快速入门

当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)
镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:DockerHub。
在这里插入图片描述

1.1 配置Docker的yum库

  • 安装yum工具

    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    
  • 使用阿里云更新yum源

    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    
  • 清除yum

    yum clean all
    
  • 更新缓存

    yum makecache
    

docker_30">1.2 安装docker

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

1.3 启动和校验

# 启动Docker
systemctl start docker# 停止Dockersystemctl stop docker# 重启
systemctl restart docker# 设置开机自启
systemctl enable docker# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

1.4 安装MySQL

  • 使用下面的命令来安装MySQL:

     docker run -d \--name mysql-test \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql:8.0.36
    
    • docker run:创建并运行一个容器,-d 是让容器在后台运行
    • –name mysql:给容器起个名字,必须唯一
    • -p 3306:3306:设置端口映射 宿主机端口:容器端口
    • -e KEY=VALUE:设置环境变量
    • mysql:指定运行的镜像的名字 [repository]:[tag] 镜像名:镜像版本
  • 此时,通过命令查看mysql容器

    docker ps
    

1.5 常用命令

运行已创建的容器

docker start mysql

停止正在运行的容器

docker stop mysql

删除容器

docker rm mysql

查看所有容器(包括已经停止的容器

docker ps -a

2. Docker基础

2.1 常见命令

Docker最常见的命令就是操作镜像、容器的命令,详见官方文档:https://docs.docker.com/
在这里插入图片描述
在这里插入图片描述

# 第1步,去DockerHub查看nginx镜像仓库及相关信息# 第2步,拉取Nginx镜像
docker pull nginx# 第3步,查看镜像
docker images
# 结果如下:
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    605c77e624dd   16 months ago   141MB
mysql        latest    3218b38490ce   17 months ago   516MB# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx# 第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第6步,访问网页,地址:http://虚拟机地址# 第7步,停止容器
docker stop nginx# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第9步,再次启动nginx容器
docker start nginx# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 查看日志 -f持续跟踪
docker logs -f nginx # 第11步,查看容器详细信息
docker inspect nginx# 第12步,进入容器,查看容器内目录
docker exec -it nginx bash
# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p# 第13步,删除容器
docker rm nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx

2.2 数据卷

数据卷(volume)是一个虚拟目录,是容器内目录宿主机目录之间映射的桥梁
在这里插入图片描述

命令说明
docker volume create创建数据卷
docker volume ls查看所有数据卷
docker volume rm删除指定数据卷
docker volume inspect查看某个数据卷的详情
docker volume prune清除数据卷

在这里插入图片描述
在执行docker run命令时,使用 -v数据卷:容器内目录 可以完成数据卷挂载当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷

  • 创建数据卷
    docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
    
     docker volume ls
    
  • 查看数据卷详情
    docker volume inspect html
    

2.3 本地目录挂载

在这里插入图片描述

  • 查看容器信息

    docker inspect mysql-test
    

    在这里插入图片描述

  • 在执行docker run命令时,使用**-v 本地目录:容器内目录** 可以完成本地目录挂载

  • 本地目录必须以“/”或"./"开头,如果直接以名称开头,会被识别为数据卷而非本地目录

    • -v mysql:/var/lib/mysql 会被识别为一个数据卷叫mysql
    • -v ./mysql:/var/lib/mysql会被识别为当前目录下的mysql目录

参考过程:https://b11et3un53m.feishu.cn/wiki/R4Sdwvo8Si4kilkSKfscgQX0niB

2.4 自定义镜像

镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

2.4.1 镜像结构

在这里插入图片描述
在这里插入图片描述

2.4.2 Dockerfile

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:
在这里插入图片描述

其对应的语法可以参考官方文档:https://docs.docker.com/engine/reference/builder/

例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下:

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:

# 基础镜像
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"]

2.4.3 构建镜像

当编写好了Dockerfile,可以利用下面命令来构建镜像:

docker build -t docker-demo:1.0 .
  • docker build : 就是构建一个docker镜像
  • -t docker-demo:1.0 :-t参数是指定镜像的名称(repository和tag)
  • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:

2.5 网络

默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:
在这里插入图片描述
容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。

通过自定义网络会建立新的网桥,加入自定义网络的容器才可以通过容器名互相访问
Docker的网络操作命令如下:
官方文档:
https://docs.docker.com/engine/reference/commandline/network/

命令说明
docker network create创建一个网络
docker network ls查看所有网络
docker network rm删除指定网络
docker network prune清除未使用的网络
docker network connect使指定容器连接加入某网络
docker network disconnect使指定容器连接离开某网络
docker network inspect查看网络详细信息
  • 自定义网络

    # 1.首先通过命令创建一个网络
    docker network create hmall# 2.然后查看网络
    docker network ls
    # 结果:
    NETWORK ID     NAME      DRIVER    SCOPE
    639bc44d0a87   bridge    bridge    local
    403f16ec62a2   hmall     bridge    local
    0dc0f72a0fbb   host      host      local
    cd8d3e8df47b   none      null      local
    # 其中,除了hmall以外,其它都是默认的网络# 3.让dd和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
    # 这样该网络内的其它容器可以用别名互相访问!
    # 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器
    docker network connect hmall mysql --alias db
    # 3.2.db容器,也就是我们的java项目
    docker network connect hmall dd# 4.进入dd容器,尝试利用别名访问db
    # 4.1.进入容器
    docker exec -it dd bash
    # 4.2.用db别名访问
    ping db
    # 结果
    PING db (172.18.0.2) 56(84) bytes of data.
    64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
    64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms
    # 4.3.用容器名访问
    ping mysql
    # 结果:
    PING mysql (172.18.0.2) 56(84) bytes of data.
    64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
    64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms
    

3. 项目部署

3.1 DockerCompose

3.1.2 基本语法

Docker Compose通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署
在这里插入图片描述
在这里插入图片描述

如果用docker-compose.yml文件来定义,就是这样:

version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"networks:- new
networks:new:name: hmall

3.1.2 基本命令

基本语法如下:

docker compose [OPTIONS] [COMMAND]

其中,OPTIONS和COMMAND都是可选参数,比较常见的有:
在这里插入图片描述


http://www.ppmy.cn/ops/115216.html

相关文章

python中网络爬虫框架

Python 中有许多强大的网络爬虫框架,它们帮助开发者轻松地抓取和处理网页数据。最常用的 Python 网络爬虫框架有以下几个: 1. Scrapy Scrapy 是 Python 中最受欢迎的网络爬虫框架之一,专为大规模网络爬取和数据提取任务而设计。它功能强大、…

Java后端中的文件上传与下载:大文件处理的优化与安全考虑

Java后端中的文件上传与下载:大文件处理的优化与安全考虑 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java后端中的文件上传与下载,特别是大文件处理…

Golang Beego+Vue打造的高校科研工作管理系统,让信息发布更及时,项目管理更透明

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

聊聊AUTOSAR:基于Vector MICROSAR的TC8测试开发方案

技术背景 车载以太网技术作为汽车智能化和网联化的重要组成部分,正逐步成为现代汽车网络架构的核心,已广泛应用于汽车诊断(如OBD)、ECU软件更新、智能座舱系统、高清摄像头环视泊车系统等多个领域。 在这个过程中,ET…

RNN股票预测(Pytorch版)

任务:基于zgpa_train.csv数据,建立RNN模型,预测股价 1.完成数据预处理,将序列数据转化为可用于RNN输入的数据 2.对新数据zgpa_test.csv进行预测,可视化结果 3.存储预测结果,并观察局部预测结果 备注:模型结构&#xff…

ant vue3 datePicker默认显示英文

改前: 改后: 处理方法: 在App.vue页加上以下导入即可 import dayjs from dayjs; import dayjs/locale/zh-cn dayjs.locale(zh-cn); 如图:

Python3 爬虫教程 - Web 网页基础

Web网页基础 1,网页的组成HTMLcssJavaScript2,网页的结构 3,节点树及节点间的关系4,选择器开头代表选择 id,其后紧跟 id 的名称。如:div 节点的 id 为 container,那么就可以表示为 #container 1…

Linux学习笔记13---GPIO 中断实验

中断系统是一个处理器重要的组成部分,中断系统极大的提高了 CPU 的执行效率,本章会将 I.MX6U 的一个 IO 作为输入中断,借此来讲解如何对 I.MX6U 的中断系统进行编程。 GIC 控制器简介 1、GIC 控制器总览 I.MX6U(Cortex-A)的中断控制器…