Docker技术入门教程

news2024/11/26 20:45:32

Docker技术入门教程

一、docker概念

一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验。
Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。
环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。docker,将每一个应用的配置文件进行封装,生成一个镜像,将镜像部署到容器中;如此以来便解决了环境问题引起的应用程序的各种问题。
在这里插入图片描述

Docker 概念
• Docker 是一个开源的应用容器引擎
• 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc)
• Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的
Linux 机器上。
• 容器是完全使用沙箱机制,相互隔离
• 容器性能开销极低。
• Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)。

在这里插入图片描述

二、安装Docker与使用

安装Docker

# 1、yum 包更新到最新 
yum update
# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都按 y 
yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v

Docker的架构

  • Docker 架构

在这里插入图片描述

配置 Docker 镜像加速器

在这里插入图片描述

默认情况下,将来从docker hub(https://hub.docker.com/)上下载
docker镜像,太慢。一般都会配置镜像加速器:
• USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)
• 阿里云
• 网易云
• 腾讯云

  • 这里是使用阿里云镜像加速器的示例:

注册账号或者使用支付宝 or淘宝账号登录阿里云官网:https://cn.aliyun.com/,登录后点击控制台,在产品与服务搜索栏输入“容器镜像服务”,点击进入;
在这里插入图片描述

  • 具体的配置文件设置,安装提示操作即可。

在这里插入图片描述

  • 配置好使用,cat /etc/docker/daemon.json查看配置信息如下:

在这里插入图片描述

Docker常用命令

  • 启动docker服务
    • systemctl start docker
  • 停止docker服务
    • systemctl stop docker
  • 重启docker服务
    • systemctl restart docker
  • 查看docker服务状态
    • systemctl status docker
  • 开机启动docker服务
    • systemctl enable docker

Docker 镜像相关命令

  • 查看镜像: 查看本地所有的镜像

    • docker images
      docker images –q # 查看所用镜像的id
      
  • 搜索镜像:从网络中查找需要的镜像

    • docker search 镜像名称
      
    • docker search redis:5.0
      
  • 拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本。
    如果不知道镜像版本,可以去docker hub 搜索对应镜像查看.

    • docker pull 镜像名称
      
    • docker pull redis:5.0
      
  • 删除镜像: 删除本地镜像

    • docker rmi 镜像id # 删除指定本地镜像
      docker rmi `docker images -q` # 删除所有本地镜像
      

在这里插入图片描述

Docker 容器相关命令

  • 查看容器

    • docker ps # 查看正在运行的容器
      docker ps –a # 查看所有容器
      
  • 创建并启动容器

    • docker run 参数
      
    • 例子:后台启动容器centos7,镜像是centos:版本7
      docker run -id --name=centos7 centos:7
      
    • 例子:启动一个交互式容器
      docker run -it --name=centos7 centos:7
      

参数说明:
• -i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
• -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
• -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
• -it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
• --name:为创建的容器命名

  • 进入容器

    • docker exec 参数 # 退出容器,容器不会关闭
      
    • docker exec -it c1  /bin/bash
      
  • 停止容器

    • docker stop 容器名称
      
  • 启动容器

    • docker start 容器名称
      
  • 删除容器:如果容器是运行状态则删除失败,需要停止容器才能删除

    • docker rm 容器名称
      
  • 查看容器信息

    • docker inspect 容器名称
      

三、Docker 容器的数据卷

数据卷概念

数据卷概念
思考:
• Docker 容器删除后,在容器中产生的数据还在吗?
• Docker 容器和外部机器可以直接交换文件吗?

在这里插入图片描述

思考:
• Docker 容器删除后,在容器中产生的数据也会随之销毁
• Docker 容器和外部机器可以直接交换文件吗?
• 容器之间想要进行数据交互?

在这里插入图片描述

数据卷
• 数据卷是宿主机中的一个目录或文件
• 当容器目录和数据卷目录绑定后,对方的修改会立即同步
• 一个数据卷可以被多个容器同时挂载
• 一个容器也可以被挂载多个数据卷

数据卷作用
• 容器数据持久化
• 外部机器和容器间接通信
• 容器之间数据交换

配置数据卷

创建启动容器时,使用 –v 参数 设置数据卷

docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
  • 例子:

    • # 将宿主机根路径下的data目录挂载给容器c1的/root/data_container,对应的镜像为centos:版本7
      docker run -it --name=c1 -v ~/data:/root/data_container centos:7
      
  • 注意事项:

  1. 目录必须是绝对路径
  2. 如果目录不存在,会自动创建
  3. 可以挂载多个数据卷

在这里插入图片描述

  • # 宿主机~/data1和~/data2两个目录挂载到容器c2上对应的/root/data1和/root/data2目录
    docker run -it --name=c2 -v ~/data1:/root/data1 -v ~/data2:/root/data2 centos:7
    
  • #再创建一个容器,取名为c3,将存在的数据卷~/data/也挂载给该容器的/root/data_container目录,这样就两个容器共用一个数据卷了
    docker run -it --name=c3 -v ~/data:/root/data_container centos:7
    

数据卷容器

  • 多容器进行数据交换
  1. 多个容器挂载同一个数据卷
  2. 数据卷容器

在这里插入图片描述

配置数据卷容器

  1. 创建启动c3数据卷容器,使用 –v 参数 设置数据卷
docker run –it --name=c3 –v /volume centos:7 /bin/bash
  1. 创建启动 c1 c2 容器,使用 –-volumes-from 参数 设置数据卷
docker run –it --name=c1 --volumes-from c3 centos:7 /bin/bash

docker run –it --name=c2 --volumes-from c3 centos:7 /bin/bash

数据卷小结

  1. 数据卷概念
    • 宿主机的一个目录或文件
  2. 数据卷作用
    • 容器数据持久化
    • 客户端和容器数据交换
    • 容器间数据交换
  3. 数据卷容器
    • 创建一个容器,挂载一个目录,让其他容器继承自该容器( --volume-from )。
    • 通过简单方式实现数据卷配置

四、Docker 应用部署小案例

MySQL部署

在这里插入图片描述

MySQL部署
• 容器内的网络服务和外部机器不能直接通信
• 外部机器和宿主机可以直接通信
• 宿主机和容器可以直接通信
• 当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机
器访问宿主机的该端口,从而间接访问容器的服务。
• 这种操作称为:端口映射


  1. 搜索mysql镜像
docker search mysql
  1. 拉取mysql镜像
docker pull mysql:5.6
  1. 创建容器,设置端口映射、目录映射
# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql
docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6
  • 参数说明:
    • -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
    • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
    • -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
    • -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
    • **-e MYSQL_ROOT_PASSWORD=123456:**初始化 root 用户的密码。
  1. 进入容器,操作mysql
docker exec –it c_mysql /bin/bash
  1. 使用外部机器连接容器中的mysql

在这里插入图片描述

部署Tomcat

  1. 搜索tomcat镜像
docker search tomcat
  1. 拉取tomcat镜像
docker pull tomcat
  1. 创建容器,设置端口映射、目录映射
# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat 
  • 参数说明:

    • **-p 8080:8080:**将容器的8080端口映射到主机的8080端口

      **-v $PWD:/usr/local/tomcat/webapps:**将主机中当前目录挂载到容器的webapps

  1. 使用外部机器访问tomcat

在这里插入图片描述

部署Nginx

  1. 搜索nginx镜像
docker search nginx
  1. 拉取nginx镜像
docker pull nginx
  1. 创建容器,设置端口映射、目录映射
# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
# 在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容
vim nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}


docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
  • 参数说明:
    • -p 80:80:将容器的 80端口映射到宿主机的 80 端口。
    • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录
    • -v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录
  1. 使用外部机器访问nginx

在这里插入图片描述

部署Redis

  1. 搜索redis镜像
docker search redis
  1. 拉取redis镜像
docker pull redis:5.0
  1. 创建容器,设置端口映射
docker run -id --name=c_redis -p 6379:6379 redis:5.0
  1. 使用外部机器连接redis
./redis-cli.exe -h 192.168.191.114 -p 6379

window端连接redis

在这里插入图片描述

在这里插入图片描述

五、Docker 镜像原理

操作系统组成部分:
• 进程调度子系统
• 进程通信子系统
• 内存管理子系统
• 设备管理子系统
• 文件管理子系统
• 网络通信子系统
• 作业控制子系统
Linux文件系统由bootfs和rootfs两部分组成
• bootfs:包含bootloader(引导加载程序)和 kernel(内核)
• rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件
• 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等
在这里插入图片描述

Docker 镜像原理

  • Docker镜像是由特殊的文件系统叠加而成

  • 最底端是 bootfs,并使用宿主机的bootfs

  • 第二层是 root文件系统rootfs,称为base image

  • 然后再往上可以叠加其他的镜像文件

  • 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。


Docker 镜像原理

思考:

  1. Docker 镜像本质是什么?
  • 是一个分层文件系统
  1. Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
  • Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层。
  1. Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
  • 由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB

在这里插入图片描述

六、Dockerfile

镜像制作

Docker 镜像如何制作?

1.容器转为镜像

  • docker commit 容器id 镜像名称**😗*版本号

    • docker commit 6bb5050ee286 my_tomcat:1.0
      
    • 在这里插入图片描述

    • 需要注意的是容器挂载的目录下的文件是不会被提交到容器生成的新镜像中的,例如:我们tomcat中的数据卷/root/tomcat/test/index.html是不会被提交到生产的容器镜像中的。

  • docker save -o 压缩文件名称 镜像名称**😗*版本号

    • docker save -o my_tomcat.tar my_tomcat:1.0
      
  • docker load –i 压缩文件名称

    • #为了方便测试,我们可以先把镜像中的my_tomcat删掉,然后再把压缩好的镜像加载进行测试
      # 查看所有镜像,并删除my_tomcat镜像
      docker images
      docker rmi my_tomcat镜像的id
      
    • #加载镜像
      docker load -i my_tomcat.tar
      
    • 在这里插入图片描述

2. dockerfile

Dockerfile 概念
• Dockerfile 是一个文本文件
• 包含了一条条的指令
• 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
• 对于开发人员:可以为开发团队提供一个完全一致的开发环境
• 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
• 对于运维人员:在部署时,可以实现应用的无缝移植

Dochub网址:https://hub.docker.com

在这里插入图片描述

案例,创建centos具体vim功能的dockerfile生成镜像

在这里插入图片描述

案例:实现步骤
① 定义父镜像:FROM centos:7
② 定义作者信息:MAINTAINER xxx xxx@xxx.cn
③ 执行安装vim命令: RUN yum install -y vim
④ 定义默认的工作目录:WORKDIR /usr
⑤ 定义容器启动执行的命令:CMD /bin/bash
⑥ 通过dockerfile构建镜像:docker bulid –f dockerfile文件路径 –t 镜像名称:版本

  • 创建一个dockerfile文件,vim centos7_dockerfile
FROM centos:7
MAINTAINER zhangsan  <zhangsan@cib.com>
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
  • 构建centos7镜像命令:

    • docker bulid -f /root/test_dockerfile/centos7_dockerfile -t zhangsan_centos7:1.0 .
      
    • 在这里插入图片描述

    • 查看镜像

    -在这里插入图片描述

    • 进入镜像查看是否具有vim功能

    • docker run -it --name=zhangsan_centos7 zhangsan_centos7:1.0
      

Dockerfile关键字

关键字作用备注
FROM指定父镜像指定dockerfile基于那个image构建
MAINTAINER作者信息用来标明这个dockerfile谁写的
LABEL标签用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看
RUN执行命令执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”]
CMD容器启动命令提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”]
ENTRYPOINT入口一般在制作一些执行就关闭的容器中会使用
COPY复制文件build的时候复制文件到image中
ADD添加文件build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务
ENV环境变量指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value
ARG构建参数构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数
VOLUME定义外部可以挂载的数据卷指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”]
EXPOSE暴露端口定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR工作目录指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径
USER指定执行用户指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户
HEALTHCHECK健康检查指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制
ONBUILD触发器当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大
STOPSIGNAL发送信号量到宿主机该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
SHELL指定执行脚本的shell指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell

案例,制作一个简单SpringBoot项目的demo镜像

  • 案例:需求
    定义dockerfile,发布springboot项目

  • 案例:实现步骤
    ① 定义父镜像:FROM java:8
    ② 定义作者信息:MAINTAINER demo demo@demo.cn
    ③ 将jar包添加到容器: ADD springboot.jar app.jar
    ④ 定义容器启动执行的命令:CMD java–jar app.jar
    ⑤ 通过dockerfile构建镜像:docker bulid –f dockerfile文件路径 –t 镜像名称:版本

快速创建一个SpringBoot的demo

快速创建项目

目的: 能基于SpringBoot快速开发一个Spring应用

需求: 搭建SpringBoot工程,定义HelloController.hello()方法,返回”Hello SpringBoot!”。

步骤:

  1. 创建Maven项目
  2. 导入SpringBoot起步依赖
  3. 编写引导类
  4. 定义HelloController类编写请求方法
  5. 启动测试

实现:

1、创建空Maven项目

2、导入SpringBoot起步依赖

<!--springboot工程需要继承的父工程-->
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.2.2.RELEASE</version>
</parent>

<dependencies>
  <!--web开发的起步依赖:场景启动器依赖-->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
</dependencies>

3、编写引导类

package com.xxx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * @SpringBootApplication: 定义引导类
 *      当引导类中的main方法运行时,Spring或SpringMVC的环境就搭建好了
 */
@SpringBootApplication
public class SpringBootHelloApplication {
    public static void main(String[] args) {
        // 启动引导类,搭建相关环境
        SpringApplication.run(SpringBootHelloApplication.class, args);
    }
}

4、定义HelloController

package com.xxx.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "Hello SpringBoot from docker!!";
    }
}

5、启动测试,访问浏览器: http://localhost:8080/hello

创建dockerfile镜像文件

vim Springboot_dockerfile

  • FROM java:8
    MAINTAINER demo  <demo@demo.com>
    ADD springboot_test.jar app.jar
    CMD java -jar
    
  • docker build -f ./springboot_dockerfile -t app:1.0 .
    

七、Docker 服务编排

微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。

  • 要从Dockerfile build image 或者去dockerhub拉取image
  • 要创建多个container
  • 要管理这些container(启动停止删除)

服务编排: 按照一定的业务规则批量管理容器

Docker Compose服务编排工具

Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:

  1. 利用 Dockerfile 定义运行环境镜像
  2. 使用 docker-compose.yml 定义组成应用的各服务
  3. 运行 docker-compose up 启动应用
    在这里插入图片描述

Docker Compose 安装使用

Docker Compose

一、安装Docker Compose

# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。 
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限 
chmod +x /usr/local/bin/docker-compose
# 查看版本信息 
docker-compose -version

二、卸载Docker Compose

# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose

三、 使用docker compose编排nginx+springboot项目

  1. 创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
  1. 编写 docker-compose.yml 文件
version: '3'
services:
  nginx:
   image: nginx
   ports:
    - 80:80
   links:
    - app
   volumes:
    - ./nginx/conf.d:/etc/nginx/conf.d
  app:
    image: app
    expose:
      - "8080"
  1. 创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
  1. 在./nginx/conf.d目录下 编写itheima.conf文件
server {
    listen 80;
    access_log off;

    location / {
        proxy_pass http://app:8080;
    }
   
}
  1. 在~/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up
  1. 测试访问
http://192.168.119.114/hello

Docker 私有仓库

一、私有仓库搭建

# 1、拉取私有仓库镜像 
docker pull registry
# 2、启动私有仓库容器 
docker run -id --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
# 4、修改daemon.json   
vim /etc/docker/daemon.json    
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip 
{"insecure-registries":["私有仓库服务器ip:5000"]} 
# 5、重启docker 服务 
systemctl restart docker
docker start registry

二、将镜像上传至私有仓库

# 1、标记镜像为私有仓库的镜像     
docker tag centos:7 私有仓库服务器IP:5000/centos:7
 
# 2、上传标记的镜像     
docker push 私有仓库服务器IP:5000/centos:7

三、 从私有仓库拉取镜像

#拉取镜像 
docker pull 私有仓库服务器ip:5000/centos:7

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

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

相关文章

Digital thread中文术语标准化|Digital thread何时是“数字主螺纹”的意思?

文章仅供个人学习使用&#xff0c;请勿传播&#xff01; 原文来源&#xff1a; 段海波 数字孪生体实验室 2021-12-30 18:22 https://mp.weixin.qq.com/s/-bgMkSewxOsjhTiagUnfsw 作者一直以来主张区分数字孪生系统和数字孪生体&#xff0c;进而构建系统化的数字孪生概念和术语体…

时序预测 | MATLAB实现基于BiLSTM双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于BiLSTM双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于BiLSTM双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 Matlab实现BiLST…

个人对哈希数据结构学习总结 -- 理论篇

个人对哈希数据结构学习总结 -- 理论篇 引言哈希表设计思考哈希冲突Hash Functions冲突解决开放地址法(Open Addressing)分离链表法(Separate Chaining)Two-way Chaining Dynamic Hash Tableschained Hashingextendible hashinglinear hashing说明 spiral storage 使用场景小结…

深入了解 Postman Test 校验的使用方法

Postman 是一个广泛使用的 API 开发工具&#xff0c;它允许开发人员测试 API 的各个方面&#xff0c;包括请求、响应、身份验证等等&#xff0c;其中最常用的功能之一就是 Test 校验。那今天就一起来看看 Postman 的 Test 校验该如何使用。 Test 校验是什么&#xff1f; Test…

Java中的继承

目标&#xff1a; 1&#xff0c;认识继承 Java中提供了一个关键字extends&#xff0c;用这个关键字&#xff0c;可以让一个类和另一个类建立起父子关系。 继承的特点&#xff1a; 子类可以继承父类的非私有成员&#xff08;成员变量&#xff0c;成员方法&#xff09;&#x…

LeetCode_04Java_88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组…

第三章 图论 No.11二分图,匈牙利算法与点覆盖

文章目录 二分染色&#xff1a;257. 关押罪犯增广路径372. 棋盘覆盖 最小点覆盖376. 机器任务 最大独立集378. 骑士放置 最小路径点覆盖 二分染色&#xff1a;257. 关押罪犯 257. 关押罪犯 - AcWing题库 最大最小问题&#xff0c;一眼二分 答案的范围在 [ 1 , 1 e 9 ] [1, 1…

数据驱动与关键字驱动

初次接触自动化测试时&#xff0c;对数据驱动和关键字驱动不甚理解&#xff0c;觉得有点故弄玄须&#xff0c;不就是参数和函数其嘛&#xff01;其实其也体现了测试所不同与开发的一些特点&#xff08;主要指系统测试&#xff09;&#xff0c;以及和对技术发展的脉络的展现。 …

MyBatisPlus通用枚举

数据库表中加一个字段sex&#xff08;为int类型&#xff09; 新加一个枚举的包&#xff0c;然后创建类的时候选择枚举类 Getter public enum SexEnum {MALE(1, "男"),FEMALE(2, "女");EnumValue//将注解标识的属性的值存储到数据库中private Integer sex;…

JZ36二叉搜索树与双向链表

题目地址&#xff1a;二叉搜索树与双向链表_牛客题霸_牛客网 题目回顾&#xff1a; 解题思路&#xff1a; 由题目可知&#xff0c;这里的二叉搜索树转成双向链表的符合左根右的逻辑顺序&#xff0c;且是一个递增序列。 创建两个指针&#xff0c;一个指向head&#xff0c;一个…

手把手教你,Selenium 遇见伪元素该如何处理?

问题发生 在很多前端页面中&#xff0c;大家会见到很多&#xff1a;:before、::after 元素&#xff0c;比如【百度流量研究院】&#xff1a; 比如【百度疫情大数据平台】&#xff1a; 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B…

NLP文本分类

NLP文本分类 落地实战五大利器&#xff01;_kaiyuan_sjtu的博客-CSDN博客https://zhuanlan.zhihu.com/p/432619164 https://github.com/alibaba/EasyNLP/blob/master/README.cn.md

MySQL 索引 详解(保姆级教程)

一、索引概述 索引是帮助 MySQL 高效获取数据的数据结构&#xff08;有序&#xff09;。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c;这样就可以在这些数据结构上…

面试热题(合并两个有序列表)

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 合并链表这类型题也是比较经典的题了&#xff0c;因为链表是由指针相互指向而确定位置&#xff0c;所以我们只需要改变某些节点的指针便可以做到对链表进行排序 今天这个方法…

【人工智能124种任务大集合】-集齐了自然语言处理(NLP),计算机视觉(CV),语音识别,多模态等任务

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能124种任务大集合&#xff0c;任务集合主要包括4大类&#xff1a;自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#xff08;CV&#xff09;、语音识别、多模态任务。 我这里整理了124种应用场景任…

代码审计-ASP.NET项目-未授权访问漏洞

代码审计必备知识点&#xff1a; 1、代码审计开始前准备&#xff1a; 环境搭建使用&#xff0c;工具插件安装使用&#xff0c;掌握各种漏洞原理及利用,代码开发类知识点。 2、代码审计前信息收集&#xff1a; 审计目标的程序名&#xff0c;版本&#xff0c;当前环境(系统,中间件…

词法分析器的设计与实现

1、实验目的及要求 1.1、实验目的 加深对词法分析器的工作过程的理解&#xff1b;加强对词法分析方法的掌握&#xff1b;能够采用一种编程语言实现简单的词法分析程序&#xff1b;能够使用自己编写的分析程序对简单的程序段进行词法分析。 1.2、实验要求 1&#xff09;对单词…

深入理解JVM之.intern()的用法

intern只在常量池里记录首次出现的实例引用 来看一段代码 public class RuntimeConstantPoolOOM {public static void main(String[] args) {String str1 new StringBuilder("计算机").append("软件").toString();System.out.println(str1.intern() st…

学习左耳听风栏目90天——第六天 6/90(学习左耳朵耗子的工匠精神,对技术的热爱)【如何拥有技术领导力】

学习左耳听风栏目90天——第六天 6/90&#xff08;学习左耳朵耗子的工匠精神&#xff0c;对技术的热爱&#xff09;【如何拥有技术领导力】

2022年下半年信息安全工程师下午真题及答案解析

试题一 (20分) 已知某公司网络环境结构主要由三个部分组成&#xff0c;分别是DMZ区、内网办公区和生产区&#xff0c;其拓扑结构如图1-1所示。信息安全部的王工正在按照等级保护2.0的要求对部分业务系统开展安全配置。图1-1当中&#xff0c;网站服务器的IP地址是192.168.70.14…