Docker的安装和基本用法

news2024/11/13 15:59:32

 💥 该系列属于【SpringBoot基础】专栏,如您需查看其他SpringBoot相关文章,请您点击左边的连接

目录

一、在linux虚拟机上安装Docker

1. 卸载旧版本Docker

2. 配置Docker的yum库

3. 安装Docker

4. 启动和校验

二、Docker基本用法

1. Docker Hub

2. 基本命令

3. 命令别名

4. 数据卷挂载

5. 本地目录挂载

6. 自定义镜像

7. 网络


一、在linux虚拟机上安装Docker

1. 卸载旧版本Docker

如果系统中已经存在旧的Docker,则先卸载,没有则跳过:

yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine

2. 配置Docker的yum库

yum install -y yum-utils

安装成功后,执行命令,配置Docker的yum源:

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

如果出现Could not retrieve mirrorlist http://mirrorlist.centos.org问题,可参考该文档解决:安装Docker教程及yum 报错:Could not retrieve mirrorlist http://mirrorlist.centos.org的解决方案_安装docker出现mirrorlist.centos.org-CSDN博客

3. 安装Docker

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

4. 启动和校验

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

二、Docker基本用法

1. Docker Hub


Docker官方提供了一个专门管理、存储镜像的网站,并对外开放了镜像上传、下载的权利。Docker官方提供了一些基础镜像,然后各大软件公司又在基础镜像基础上,制作了自家软件的镜像,全部都存放在这个网站。这个网站就成了Docker镜像交流的社区:

Docker Hub Container Image Library | App Containerization

基本上我们常用的各种软件都能在这个网站上找到,我们甚至可以自己制作镜像上传上去。

2. 基本命令

(摘自黑马程序员) 

命令说明
docker pull拉取镜像
docker push推送镜像到DockerRegistry
docker images查看本地镜像
docker rmi删除本地镜像
docker run创建并运行容器(不能重复创建)
docker stop停止指定容器
docker start启动指定容器
docker restart重新启动容器
docker rm删除指定容器
docker ps查看容器
docker logs查看容器运行日志
docker exec进入容器
docker save保存镜像到本地压缩文件
docker load加载本地压缩文件到镜像
docker inspect查看容器详细信息

(1)案例引入

案例:

  • 查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器

需求:

  • 在DockerHub中搜索Nginx镜像,查看镜像的名称
  • 拉取Nginx镜像
  • 查看本地镜像列表
  • 创建并运行Nginx容器
  • 查看容器
  • 停止容器
  • 再次启动容器
  • 进入Nginx容器
  • 删除容器

(2)拉取Nginx镜像并查看镜像列表

docker pull nginx
docker images

运行结果:

(3)将Nginx镜像保存到本地

docker save -o nginx.tar nginx:latest

运行结果: 

(4)删除Nginx镜像

docker rmi nginx:latest

运行结果:  

(5)加载Nginx.tar并生成Nginx镜像

docker load -i nginx.tar

运行结果:   

查看所有镜像:

(6)创建并运行Nginx容器

docker run -d --name nginx -p 80:80 nginx

运行结果:

(7)查看运行中的容器

docker ps

运行结果: 

(8)停止运行中Nginx的容器

docker stop nginx

运行结果: 

(9)查看所有容器(包括运行和停止的所有容器)

docker ps -a

运行结果:  

 

(10)启动停止的Nginx的容器

docker start nginx

运行结果:

(11)查看容器的日志

docker logs nginx

持续查看日志:

docker logs -f nginx

(12)进入容器内部(mysql容器为例)

docker exec -it mysql bash

访问mysql:

mysql -uroot -p

运行结果:

(13)删除Nginx容器

删除前要停止运行,也就是说进行中的容器是不能删除的:

docker stop nginx

随后,可以删除容器:

docker rm nginx

3. 命令别名

给常用Docker命令起别名,方便我们访问。首先修改/root/.bashrc文件:

vi /root/.bashrc

进入修改: 

# 修改/root/.bashrc文件
vi /root/.bashrc


# 内容如下:
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'
# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

然后,执行命令使别名生效

source /root/.bashrc

4. 数据卷挂载

(1)数据卷

数据卷(volume)是一个虚拟目录,是容器内目录宿主机(虚拟机)目录之间映射的桥梁。容器内的目录文件和宿主机的目录文件将实现双向绑定

以Nginx为例,我们知道Nginx中有两个关键的目录:

  • html:放置一些静态资源

  • conf:放置配置文件

如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。

(2)相关命令

数据卷的相关命令有:

命令

说明

文档地址

docker volume create

创建数据卷

docker volume create

docker volume ls

查看所有数据卷

docs.docker.com

docker volume rm

删除指定数据卷

docs.docker.com

docker volume inspect

查看某个数据卷的详情

docs.docker.com

docker volume prune

清除数据卷

docker volume prune

(3)案例引入

案例:

  • 利用Nginx容器部署静态资源

需求:

  • 创建Nginx容器,修改nginx容器内的html目录下的index.html文件内容
  • 将静态资源部署到nginx的html目录

(4)代码和运行结果 

# 1.首先创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

# 2.然后查看数据卷
docker volume ls

# 3.查看数据卷详情
docker volume inspect html

# 4.查看/var/lib/docker/volumes/html/_data目录
ll /var/lib/docker/volumes/html/_data

# 5.进入该目录,并随意修改index.html内容
cd /var/lib/docker/volumes/html/_data
vi index.html

# 6.打开页面,查看效果

# 7.进入容器内部,查看/usr/share/nginx/html目录内的文件是否变化
docker exec -it nginx bash

在虚拟机上找到该目录,可以点击修改

点击index.html进行修改

然后打开nginx欢迎页面

可以看到欢迎页面也成功修改,因此可以通过数据卷的方式轻松修改容器内的文件,而无须进入容器内部通过vi进行修改。

把静态资源拖入虚拟机的目录下

修改网址,可以看到成功加载静态文件

(5)数据卷小结

5. 本地目录挂载

(1)用法

数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:

# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件

本地目录或文件必须以 /./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。

-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
-v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录

(2)案例引入

案例:

  • mysql容器的数据挂载

需求:

  • 查看mysql容器,判断是否有数据卷挂载
  • 基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)

查看mysql的挂载信息:

docker inspect mysql

数据卷的名字是自动生成的,名字是随机的,所以也叫做匿名卷

进入这个数据卷:

cd /var/lib/docker/volumes/9770d7273c27484a6d94a1df4b29264f56fbcab8c728b66c2c5ede411633e694/_data

 

 然而这种匿名卷名字非常长,要做迁移也非常不便。因此可以挂载到自定义的本地目录

首先创建本地目录

mkdir /root/mysql
mkdir /root/mysql/data
mkdir /root/mysql/conf
mkdir /root/mysql/init

创建成功: 

 可以替换自己的conf和init:

  然后在创建容器的时候实现数据目录、配置文件、初始化脚本的挂载

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=wangjx17 \
  -v /root/mysql/data:/var/lib/mysql \
  -v /root/mysql/conf:/etc/mysql/conf.d \
  -v /root/mysql/init:/docker-entrypoint-initdb.d \
  mysql:8.0.26

此时的data目录下,已经有新的数据库了:

6. 自定义镜像

(1)镜像结构

打包镜像分成这么几步:

  • 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)

  • 安装并配置JDK

  • 拷贝jar包

  • 配置启动脚本

上述步骤中的每一次操作其实都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以镜像就是一堆文件的集合

但需要注意的是,镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer)。

例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方就制作了这样的只包含Linux运行环境的镜像。我们在制作java镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像。然后再搭建其它层即可,这样逐层搭建,最终整个Java项目的镜像结构如图所示:

(2)Dockerfile

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。

而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档:

https://docs.docker.com/engine/reference/builder/

其中的语法比较多,比较常用的有:

指令

说明

示例

FROM

指定基础镜像

FROM centos:6

ENV

设置环境变量,可在后面指令使用

ENV key value

COPY

拷贝本地文件到镜像的指定目录

COPY ./xx.jar /tmp/app.jar

RUN

执行Linux的shell命令,一般是安装过程的命令

RUN yum install gcc

EXPOSE

指定容器运行时监听的端口,是给镜像使用者看的

EXPOSE 8080

ENTRYPOINT

镜像中应用的启动命令,容器运行时调用

ENTRYPOINT java -jar xx.jar

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

(3)构建镜像

资料准备:

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"]

把demo目录移到虚拟机的root目录下:

把jdk.tar也移到root目录下:

加tar包加载成镜像:

docker load -i jdk.tar

通过docker images可以查看所有镜像

构建镜像:

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

再次通过docker images查看所有镜像

运行docker-demo容器:

docker run -d --name dd -p 8080:8080 docker-demo

然后docker ps查看运行中的容器

查看日志:

docker logs -f dd

访问虚拟机部署的该后端

(4)小结

① 镜像的结构是怎样的?

  • 镜像中包含了应用程序所需要的运行环境、函数库、配置、以及应用本身等各种文件,这些文件分层打包而成

② Dockerfile是做什么的?

  • Dockerfile就是利用固定的指令来描述镜像的结构和构建过程,这样Docker才可以依次来构建镜像

③ 构建镜像的命令是什么?

  • docker build -t 镜像名 Dockerfile 目录

7. 网络

(1)案例引入

docker inspect mysql
docker inspect dd

可以在network中查看mysql的IP地址为172.17.0.2,dd的IP地址为172.17.0.3,mysql和dd容器在同一个网段中,可以相互访问,下面来验证:

若mysql的容器停止,其他容器运行,那么172.17.0.2的IP将有可能分配给其他容器,因此需要使用自定义网络

(2)自定义网络

常见命令有:

命令

说明

文档地址

docker network create

创建一个网络

docker network create

docker network ls

查看所有网络

docs.docker.com

docker network rm

删除指定网络

docs.docker.com

docker network prune

清除未使用的网络

docs.docker.com

docker network connect

使指定容器连接加入某网络

docs.docker.com

docker network disconnect

使指定容器连接离开某网络

docker network disconnect

docker network inspect

查看网络详细信息

docker network inspect

创建一个网络:

docker network create mynet

然后查看所有网络:

docker network ls

查看新创建的网络的网段:

ip addr

可以看出来多了个172.18.*.*的网段 

让mysql容器加入该mynet网络:

 docker network connect mynet mysql

再次查看mysql的网络:

docker inspect mysql

可以看出来IP地址新增加了一个172.18.0.2

让dd容器在创建的时候加入该网络,首先移除dd容器,然后再运行该容器:

docker rm -f dd
docker run -d --name dd -p 8080:8080 --network mynet docker-demo

运行结果为: 

 再次查看dd的网络:

docker inspect dd

可以看出来IP地址只有一个172.18.0.3

进入dd容器ping mysql:

docker exec -it dd bash
ping mysql

运行结果为:

一旦两个容器加入了一个自定义网络,就可以通过容器名互相访问。

 

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

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

相关文章

Unity项目优化记录

背景:测试反馈项目组游戏存在内存泄露,来找到中台这边协调排查。好家伙,跑了两次看了内存快照,再看资源组织和管理方式,存在的问题确实比较多。 1、修复内存泄露:结算界面由于资源引用丢失导致整个面板不会…

无人机水面影像几何校正拼接镶嵌

一批水面数据3千张,原图如下所示: 使用“无人机水面影像拼接算法”进行几何校正和匀色镶嵌处理,输出结果如下所示: 镶嵌一张图: 局部放大图: 数据代处理联系方式:

重定向printf、或者USARTX_printf()(hal库)

目录 重定向printf USARTX_printf() 打开工程模板 复制工程模板 配置 重定向printf 在usart.h添加 #include "stdio.h" 在usart.c添加 /* USER CODE BEGIN 1 */ int fputc(int ch,FILE *f) {HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY)…

使用html-docx-js + fileSaver实现前端导出word

因为html-docx-js是16年的老库了,它代码里面用到的with语法现在严格模式不允许,用npm直接引入会报错,所以我们需要用其它方式引入 首先要将html-docx-js的代码放到项目中 html-docx-js/dist/html-docx.js at master evidenceprime/html-do…

java 日期

Date SimpleDateFormat Date d new Date();System.out.println(d);//输出当前时间long it d.getTime();//返回自1970年1月1日00:00:00到date的时间Date d2 new Date(it);//将毫秒值转换为时间System.out.println(d2);d2.setTime(it1000);//将d2转换为输入参数对应的时间Sys…

vue 后台管理 之 状态管理 vuex 的使用

幸福是一种能力 文章目录 一、数据驱动视图二、VueX 数据公共池 一、数据驱动视图 我们都知道 vue 之所以好用,是因为官方帮我们做了数据驱动视图初始化时将数据和视图进行绑定,通过 watcher 来监听数据的变化,当数据变化时,会触…

数据结构(邓俊辉)学习笔记】优先级队列 07——堆排序

1.算法 作为完全二叉堆的一个应用,这节来介绍堆排序算法。 是的,谈到优先级队列,我们很自然地就会联想到排序。因为就其功能而言,包括完全二叉堆在内的任何一种优先级队列都天生地具有选取功能,也就是选取其中的最大…

【微服务】SpringCloud 1-9章

1 从Boot和Cloud版本选型开始说起 1.1 Springboot版本选择 1.1.1 git源码地址 https://github.com/spring-projects/spring-boot/releases/ 1.1.2 官网看Boot版本 1.1.3 SpringBoot3.0崛起 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-N…

SpringSecurity实现登录功能实战!!!

实现思路 登录 ①自定义登录接口 调用ProviderManager的方法进行认证 如果认证通过生成jwt 把用户信息存入redis中 ②自定义UserDetailsService 在这个实现类中去查询数据库 注意配置passwordEncoder为BCryptPasswordEncoder 退出登录,删除redis中的数…

vuex 辅助函数用法:mapGetters,mapMutations,mapActions

1 mapGetters:用法 <template> //普通用法 <p> {{ $store.getters.getCounter }} </p> //辅助函数用法 <p> {{ getCounter }} </p> </template> import { mapGetters } from vuex export default{ name:"homeView&q…

损失函数-回归模型|分类模型

损失函数 Loss Function 回归模型均方误差&#xff08;MSE: Mean Squared Error&#xff09;均方根误差&#xff08;RMSE&#xff1a;Root Mean Squared Error&#xff09;平均绝对误差&#xff08;MAE: Mean Absolute Error&#xff09;Huber损失 分类模型交叉熵损失&#xff…

MT6705 同步整流

MT6705B 是用于反激式变换器的高性能45V同步整流。MT6705B兼容各种反激转换器类型。支持 DCM、CCM 和准谐振模式。MT6705集成了一个40V功率MOSFET&#xff0c;可以取代肖特基二极管&#xff0c;提高效率。V SW <V TH-ON 时&#xff0c;内部 MOSFET 导通。V SW >V TH-OFF …

Qt/C++地图标注点的添加删除移动旋转/指定不同图标和动图/拿到单击信号

一、前言说明 标注点在地图开发中是最常见的应用场景之一&#xff0c;比如在地图上需要显示设备的位置&#xff0c;基本上都是添加标注点&#xff0c;指定图片和尺寸已经经纬度坐标位置。这个功能在每种地图内核中都提供的&#xff0c;这个并没有任何难点&#xff0c;在这个功…

类和对象 - 构造函数

文章目录 一、语言的向前兼容二、默认成员函数三、构造函数3.1 概念3.2 自己定义的构造函数3.2.1 有参和无参的构造函数3.2.1 有缺省参数的构造函数 3.3 默认构造函数3.3.1 几种默认构造函数3.3.2 默认构造函数的特点 3.4 编译器生成的默认构造函数3.4.1 函数初始化规则 四、构…

Android:动态更新app启动图标和应用名

一、需求背景 每逢重要佳节&#xff0c;很多应用启动图标会自动更新为对应佳节的图标&#xff0c;应用无需更新。 二、效果图 更新后的启动图标和应用名称 三、实现流程 Android app只能替换内置的icon&#xff0c;因此需要提前将logo图标放入App资源文件件里 实际项目App更新…

vue 路由用法 router-view

通过router-view 点击子路由显示子路由关于我们的内容&#xff0c;点击关于信息显示关于信息内容。

【Golang】火焰图空白部分是什么?

起因 被同事灵魂拷问&#xff1a;图中这块空白是什么东西&#xff1f; 豆包回答说是数据采样不完整&#xff0c;特定函数或代码段未被调用之类的原因&#xff0c;感觉都不太合理。 之前看过一篇文章说&#xff1a;Heap Profiling的采样是无时无刻不在发生的&#xff0c;执行…

【数据结构】——十大排序详解分析及对比

【数据结构】——十大排序详解分析及对比 文章目录 【数据结构】——十大排序详解分析及对比前言1. 排序的概念及其运用1.1 排序的概念1.2 排序的应用 2. 插入排序2.1 直接插入排序2.2 希尔排序 3. 选择排序3.1 选择排序3.2 堆排序 4 交换排序4.1 冒泡排序4.2 快速排序4.2.1 霍…

SOMEIP_ETS_047: echoUTF16FIXED_with_odd_number

测试目的&#xff1a; 验证设备&#xff08;DUT&#xff09;是否能够正确处理一个在终止符之后多出一个字节的echoUTF16FIXED字符串&#xff0c;并能够去除这个多余的字节。 描述 本测试用例旨在检查DUT在接收到一个不符合UTF16FIXED字符串规范&#xff08;即在终止符之后多…

Snipaste 的一款替代工具 PixPin,支持 gif 截图、长截图和 OCR 文字识别,功能不是一点点强!

Snipaste 的一款替代工具 PixPin&#xff0c;支持 gif 截图、长截图和 OCR 文字识别&#xff0c;功能不是一点点强&#xff01; PixPin 的名字来源于“Pixel Pin”&#xff0c;简单来说是一个截图、贴图的工具&#xff0c;但是 PixPin 以截图和贴图两大功能为核心做了大量的优…