Docker使用进阶篇

文章目录

  • 1 前言
  • 2 使用Docker安装常用镜像示例
    • 2.1 Docker安装RabbitMQ
    • 2.2 Docker安装Nacos
    • 2.3 Docker安装xxl-job(推荐该方式构建)
    • 2.4 Docker安装redis
    • 2.5 Docker安装mysql
  • 3 Docker自定义镜像
    • 3.1 Dockerfile的基本结构
    • 3.2 Dockerfile指令
    • 3.3 自定义JDK镜像
      • 3.3.1 制作Jdk8镜像
      • 3.3.2 制作Jdk17镜像以及maven镜像
      • 3.3.3 制作微服务镜像,使用Docker部署SpringBoot项目
  • 4 私有Docker仓库
    • 4.1 无UI的简化版镜像仓库
    • 4.2 有UI的镜像仓库
    • 4.3 推送镜像到私服
  • 5 如何快速从一台机器获取另一台机器的Docker镜像
    • 5.1 通过私服方式
    • 5.2 Docker镜像保存为文件,通过文件导入镜像
  • 6 常用镜像docker-compose打包部署

1 前言

上一篇介绍了Docker的基础概念,带你 入门Docker,这篇将介绍一些示例,加深对Docker的理解。

2 使用Docker安装常用镜像示例

在进行相关操作之前,记得运行Docker服务哈,另外,下面的方式有的没有做持久化到磁盘,也没有持久化到mysql,重启后会丢失数据,如果有需要,请参考下面的docker-compose配置

2.1 Docker安装RabbitMQ

实际生产中,建议购买专业版MQ,而不是自建,这个相对不可靠

参考官网:https://www.rabbitmq.com/docs/download

  • 查看Docker仓库里的RabbitMQ镜像
    docker search rabbitmq
    安装时,建议使用官方维护的docker镜像,这个stars一般也是最多的
    在这里插入图片描述

但是有时候,你想要的镜像可能搜索不到,需要去官网找镜像:https://hub.docker.com/_/rabbitmq
在这里插入图片描述

  • 下载镜像
    docker pull rabbitmq:3.13-management
    在这里插入图片描述

  • 启动MQ服务

    docker run --name rabbit-server -d  \
    -e RABBITMQ_DEFAULT_USER=test -e RABBITMQ_DEFAULT_PASS=123456 \
    -p 15672:15672 \
    -p 5672:5672 \
    rabbitmq:3.13-management
    

    其中,--name指定容器的名字,15672(UI页面通信口)、5672(client端通信口),有时候可能还会用到25672(server间内部通信口)、61613(stomp 消息传输)、1883(MQTT消息队列传输)
    注:如果在云服务上部署,且开启了防火墙,需要在安全组开通一下入方向的15672和5672端口,并且需要再Linux服务器开放端口,否则无法访问

    Linux服务器开放端口,分别执行以下命令:
    firewall-cmd --zone=public --add-port=15672/tcp --permanent
    firewall-cmd --zone=public --add-port=5672/tcp --permanent
    然后执行,重新加载防火墙配置
    firewall-cmd --reload

    在这里插入图片描述

  • 访问MQ管理界面
    服务启动后,使用 http://127.0.0.1:15672 访问,账号和密码就是刚才启动参数,RABBITMQ_DEFAULT_USERRABBITMQ_DEFAULT_PASS设置的值
    在这里插入图片描述

    登录成功,如下界面:
    在这里插入图片描述

2.2 Docker安装Nacos

  • 拉取镜像,这里使用v2.2.1版本
    docker pull nacos/nacos-server:v2.2.1

  • 启动nacos

    docker run --name nacos -d \
    -e MODE=standalone \
    -p 8848:8848 \
    -p 9848:9848 \
    -p 9849:9849 \
    -e NACOS_AUTH_TOKEN=SecretKey012345678901234567890123453456789999876549012345678901234567894234 \
    -e NACOS_AUTH_IDENTITY_KEY=SecretKey012345678901234567890123453456789999876549012345678901234567894234 \
    -e NACOS_AUTH_IDENTITY_VALUE=SecretKey012345678901234567890123453456789999876549012345678901234567894234 \
    nacos/nacos-server:v2.2.1
    

    这里的端口一样,需要配资云服务器安全组和防火墙开放端口:
    Linux服务器开放端口,分别执行以下命令:
    firewall-cmd --zone=public --add-port=8848/tcp --permanent
    firewall-cmd --zone=public --add-port=9848-9849/tcp --permanent
    然后执行,重新加载防火墙配置
    firewall-cmd --reload

    启动完成,通过 http://ip:8848/nacos 访问
    在这里插入图片描述

    注意,这里没有配置持久化,重启后nacos数据会丢失,下面会介绍nacos服务的最终版本

2.3 Docker安装xxl-job(推荐该方式构建)

xxl-job 对应的数据库文件在:https://github.com/xuxueli/xxl-job/blob/master/doc/db/tables_xxl_job.sql

创建xxl-job目录,下面创建logs目录以及conf目录 ,在conf目录下 新建配置文件 application.properties:

### web
server.port=9999
server.servlet.context-path=/xxl-job-admin### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.############# mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
#mybatis.type-aliases-package=com.xxl.job.admin.core.model### xxl-job, datasource
spring.datasource.url=jdbc:mysql://ip:3306/xxl_job?useUnicode=true&useSSL=false&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=666
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=1000### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.from=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory### xxl-job, access token
xxl.job.accessToken=### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100### xxl-job, log retention days
xxl.job.logretentiondays=30

注意,需要把数据库账号密码修改一下:
在这里插入图片描述

在conf目录,定义xxl-job.yml,内容如下:

# 定义compose语义版本
version: '3.8'
# 定义服务
services:xxl-job:image: xuxueli/xxl-job-admin:2.3.0container_name: xxl-jobrestart: alwaysenvironment:TZ: Asia/ShanghaiLANG: en_US.UTF-8PARAMS: '--spring.config.location=/application.properties'volumes:- "/opt/docker-server/xxl-job/logs:/data/applogs"- "/opt/docker-server/xxl-job/conf/application.properties:/application.properties"ports:- "9999:9999"networks:- conf_mynetnetworks:conf_mynet:external: true

注意下面标注的细节:
在这里插入图片描述

在xxl-job目录下,启动docker服务
docker-compose -f ./conf/xxl-job.yml up -d

访问页面:http://127.0.0.1:9999/xxl-job-admin/
在这里插入图片描述

2.4 Docker安装redis

  • 拉取镜像
    docker pull redis

  • 创建redis目录,然后创建conf以及data目录,然后在conf下创建redis配置文件redis.conf

    # bind 127.0.0.1 -::1
    bind 0.0.0.0 # 是否启用保护模式
    protected-mode no# redis端口
    port 16379# 密码设置(需要密码就取消下面的注释)
    requirepass 123456tcp-backlog 511# 用户多少秒没有操作就断开连接,设置为0为不断开
    timeout 0# 后端连接会经常断开,设置为60不断开
    tcp-keepalive 60# 是否以守护线程的方式运行
    daemonize nopidfile /var/run/redis_6379.pidloglevel noticelogfile ""databases 16always-show-logo noset-proc-title yesproc-title-template "{title} {listen-addr} {server-mode}"# 将数据持久化到dump.rdb的频率save 3600 1save 300 100save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump.rdbrdb-del-sync-files nodir ./replica-serve-stale-data yesreplica-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-diskless-load disabledrepl-disable-tcp-nodelay noreplica-priority 100acllog-max-len 128lazyfree-lazy-eviction no
    lazyfree-lazy-expire no
    lazyfree-lazy-server-del no
    replica-lazy-flush nolazyfree-lazy-user-del nolazyfree-lazy-user-flush nooom-score-adj nooom-score-adj-values 0 200 800disable-thp yes# 是否需要持久化存储
    appendonly yes
    appendfilename "appendonly.aof"
    appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mbaof-load-truncated yesaof-use-rdb-preamble yeslua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""list-max-ziplist-size -2list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128
    zset-max-ziplist-value 64hll-sparse-max-bytes 3000stream-node-max-bytes 4096
    stream-node-max-entries 100activerehashing yesclient-output-buffer-limit normal 0 0 0
    client-output-buffer-limit replica 256mb 64mb 60
    client-output-buffer-limit pubsub 32mb 8mb 60hz 10dynamic-hz yesrdb-save-incremental-fsync yesjemalloc-bg-thread yes
    
  • 进入刚才创建的redis目录,创建容器执行shell脚本redis.sh

    #!/bin/sh
    docker run -p 16379:16379 --name redis --restart=always \
    -v ./data:/data \
    -v ./conf/redis.conf:/etc/redis/redis.conf \
    -d redis redis-server /etc/redis/redis.conf
    

    赋予可执行权限:
    chmod +x redis.sh

  • 启动redis服务
    ./redis.sh
    在这里插入图片描述

2.5 Docker安装mysql

  • 查询镜像
    docker search mysql
    在这里插入图片描述

  • 下载MySQL镜像
    docker pull mysql

  • 运行镜像
    docker run -d --name=mysql -p 13306:13306 -e MYSQL_ROOT_PASSWORD=123456 mysql:latest

  • 拷贝配置文件到创建的目录下
    docker cp mysql:/etc/mysql /opt/mysql/conf

  • 删除原有容器
    docker stop mysql && docker rm -f mysql

  • 启动mysql挂载配置文件,数据持久化到宿主主机
    进入到刚才上面挂载目录/opt/mysql/conf/conf.d下,因为已经做了cp复制,直接到目录下新增my.cnf:

    [mysqld]
    port=13306
    user=mysql
    character-set-server=utf8
    default_authentication_plugin=mysql_native_password
    secure_file_priv=/var/lib/mysql
    expire_logs_days=7
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    max_connections=1000[client]
    default-character-set=utf8[mysql]
    
  • 创建一个sh脚本,把docker启动mysql的命令放到脚本里面
    一是方便启动,二是后续如果想找到当时启动mysql时候所设置的一些参数和信息,可以查看这个脚本里面是怎么写的,在/opt/mysql目录下,新增启动脚本vim mysql.sh

    #!/bin/sh
    docker run --name mysql8 \
    -p 13306:13306 \
    --privileged=true \
    --restart unless-stopped \
    -v /opt/mysql/conf/conf.d:/etc/mysql/conf.d \
    -v /opt/mysql/logs:/logs \
    -v /opt/mysql/data:/var/lib/mysql \
    -v /etc/localtime:/etc/localtime \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -d mysql:8.0.27
    

    其中,/opt/mysql/data 是宿主机的路径,/var/lib/mysql 是容器的路径,-e是指定环境变量

    这里的端口一样,需要配资云服务器安全组和防火墙开放端口:
    Linux服务器开放端口,分别执行以下命令:
    firewall-cmd --zone=public --add-port=13306/tcp --permanent
    然后执行,重新加载防火墙配置
    firewall-cmd --reload

    参数详细说明:

    -p 端口映射--name mysql8  自定义容器名称是mysql8--privileged=true 挂载文件权限设置--restart unless-stopped 设置 开机后是否自动重启容器,如果需要重启,设置为always-v /opt/mysql/conf:/etc/mysql \ 挂载配置文件【路径是上面创建的挂载路径】-v /opt/mysql/logs:/logs \  挂载日志【路径是上面创建的挂载路径】-v /opt/mysql/data:/var/lib/mysql \ 挂载数据文件 持久化到主机【路径是上面创建的挂载路径】-v /etc/localtime:/etc/localtime 容器时间与宿主机同步-e MYSQL_ROOT_PASSWORD=123456 设置密码-d mysql:8.0 后台启动mysql
    
  • 赋予可执行权限
    chmod +x mysql.sh

  • 再次启动mysql容器
    sh mysql.sh

  • 进入容器
    docker exec -it 6137a06acc14 bash 或者 docker exec -it mysql bash

  • 看容器里面的mysql在什么位置
    whereis mysql
    在这里插入图片描述

  • 登录MySQL
    mysql -u root -p

  • 修改密码
    ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

  • 授权远程登录访问
    Mysql8版本
    由于Mysql8版本修改了Password算法,这里需要更新密码算法,便于使用Navicat连接,正确的写法是先创建用户
    CREATE USER 'root'@'%' IDENTIFIED BY 'password';
    再给用户授权
    grant all privileges on *.* to 'root'@'%' ;
    FLUSH PRIVILEGES;
    MySQL 5.7 配置
    GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
    {usernama} 是远程访问登录的用户名,不建议用 root;
    {password} 是远程访问的登录密码;
    '%'代表的是所有IP,如果可以尽量设置指定 IP 或 IP 段
    FLUSH PRIVILEGES;
    在这里插入图片描述

注:容器内部,无法使用vim命令,可以通过下面的命令安装vim
apt update
apt-get install vim

3 Docker自定义镜像

有时候,没有找到适合自己的镜像该怎么办呢?可以自定义镜像,自己制作一个适合自己的Docker镜像。

使用Dockerfile用于构建Docker镜像,Dockerfile文件是由一行行命令语句组成,基于这些命令即可以构建一个镜像。

3.1 Dockerfile的基本结构

一般的,Dockerfile分为四部分:

  • 基础镜像信息
  • 维护者/作者信息(可选部分)
  • 镜像操作指令
  • 容器启动时执行指令

3.2 Dockerfile指令

  • FROM
    格式为 FROM 或 FROM :
    Dockerfile文件的第一条指令必须为 FROM 指令,表示从哪个基础镜像开始构建

  • MAINTAINER
    格式为 MAINTAINER ,可选的,指定维护者/作者信息

  • ENV
    格式为 ENV ,指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持

  • ADD
    格式为ADD ;
    复制指定的宿主机上的到容器中的(能够进行自动解压压缩包)

  • EXPOSE
    格式为 EXPOSE […]
    告诉 Docker 服务端容器暴露的端口号,供互联系统使用,在启动容器时需要通过 -p映射端口,Docker 宿主机会自动分配一个端口转发到指定的端口

  • RUN
    格式为 RUN
    RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像,当命令较长时可以使用 \ 来换行,如果需要将两条命令或者多条命令联合起来执行需要加上&&
    如:cd /usr/local/src && wget xxxxxxx

  • CMD
    指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令,如果指定了多条命令,只有最后一条会被执行
    如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令

  • WORKDIR:
    用来指定当前工作目录(或者称为当前目录)

  • USER:
    运行RUN指令的用户

  • VOLUME:
    用来创建一个在image之外的mount point

3.3 自定义JDK镜像

首先,提前从官网下载相关jar,我把jar放到了 /opt/docker-server/testDockerFile
在这里插入图片描述

3.3.1 制作Jdk8镜像

  • 编辑一个Dockerfile文件,内容如下:

    FROM centos:latest
    MAINTAINER smilehappiness
    ADD jdk-8u291-linux-x64.tar.gz /usr/local
    ENV JAVA_HOME /usr/local/jdk1.8.0_291
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV PATH $PATH:$JAVA_HOME/bin
    CMD java -version
    

    参数说明:
    FROM centos:latest继承基础镜像centos,MAINTAINER 指明作者,非必填
    ADD jdk-8u291-linux-x64.tar.gz /usr/local标识,把jdk压缩包解压到 /usr/local目录下
    ENV 设置java相关环境变量,最后一行CMD,标识执行一个命令,查看java版本
    在这里插入图片描述

  • 构建镜像
    docker build -t my_jdk1.8.0_291 .
    -t表示打标签tag,最后面的.表示 Dockerfile配置文件在当前目录下
    在这里插入图片描述

  • 运行镜像
    docker run -d my_jdk1.8.0_291
    在这里插入图片描述

3.3.2 制作Jdk17镜像以及maven镜像

  • 编辑一个Dockerfile文件,内容如下:

    FROM centos:latest
    MAINTAINER smilehappiness
    ADD apache-maven-3.5.4-bin.tar.gz /usr/local
    ADD jdk-17_linux-x64_bin.tar.gz /usr/local
    ENV MAVEN_HOME /usr/local/apache-maven-3.5.4
    ENV JAVA_HOME /usr/local/jdk-17.0.10
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
    CMD java -version && mvn -version
    
  • 构建镜像
    docker build -t my_jdk17 .
    -t表示打标签tag,最后面的.表示 Dockerfile配置文件在当前目录下
    在这里插入图片描述

  • 运行镜像
    docker run -d my_jdk17
    执行结果:

    [root@vm testDockerFile]# docker run my_jdk17
    java version "17.0.10" 2024-01-16 LTS
    Java(TM) SE Runtime Environment (build 17.0.10+11-LTS-240)
    Java HotSpot(TM) 64-Bit Server VM (build 17.0.10+11-LTS-240, mixed mode, sharing)
    Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T18:33:14Z)
    Maven home: /usr/local/apache-maven-3.5.4
    Java version: 17.0.10, vendor: Oracle Corporation, runtime: /usr/local/jdk-17.0.10
    Default locale: en_US, platform encoding: ANSI_X3.4-1968
    OS name: "linux", version: "4.18.0-193.el8.x86_64", arch: "amd64", family: "unix"
    

后续的微服务部署,可以直接继承这个镜像,运行环境jdk、maven都有了,是不是很方便~

3.3.3 制作微服务镜像,使用Docker部署SpringBoot项目

  • 步骤如下

    1、将开发的SpringBoot程序打成jar包或者war包
    2、将打好的jar包或war包上传到Linux某个目录下(一般是Jenkins配合使用,自动拉取git代码并打包),比如:/opt/docker
    3、定义Dockerfile文件,用于创建项目镜像
    
  • 定义Jar包程序Dockerfile文件

    FROM my_jdk17
    MAINTAINER smilehappiness
    ADD xxx-1.0.0.jar /opt
    RUN chmod +x /opt/xxx-1.0.0.jar
    CMD java -jar /opt/xxx-1.0.0.jar
    

构建和运行Jar包程序的镜像

  • 构建镜像
    docker build -t xxx-jar .

  • 运行容器
    docker run -d -p 镜像id ,如果是web页面需要暴漏端口,可以使用 docker run -d -p 8080:8080 镜像id,修改为自己的端口即可

4 私有Docker仓库

镜像仓库(Docker Registry)有公共的和私有的两种形式:

  • 公共仓库
    例如Docker官方的Docker Hub,国内也有一些云服务商提供类似于Docker Hub的公开服务,比如网易云镜像服务、DaoCloud镜像服务、阿里云镜像服务等

  • 私有Docker Registry
    企业中的镜像都是商业机密,肯定不希望开源,所以企业自己的镜像最好是采用私有Docker Registry来实现。

4.1 无UI的简化版镜像仓库

Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面
运行redistry
docker run -d --name private-docker -p 5000:5000 -v /opt/docker-server/registryData:/var/lib/registry registry

上面执行命令中挂载了一个宿主机 /opt/docker-server/registryData 到容器内的/var/lib/registry 目录,用来存储私有镜像库数据,访问http://你的IP地址:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像

4.2 有UI的镜像仓库

  • 配置Docker信任地址,私服采用的是http协议,默认不被Docker信任,所以需要做一个配置
    编辑配置文件:
    vim /etc/docker/daemon.json

    {"registry-mirrors": ["https://edxisp13.mirror.aliyuncs.com","https://registry.hub.docker.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"],"insecure-registries":["http://你的ip:5000"]
    }
    
  • 重加载 daemon
    systemctl daemon-reload

  • 重启docker
    service docker restart

  • 启动docker registry ui
    创建目录 mkdir /opt/docker-server/registry-ui
    进入该目录,新增配置文件docker-compose.yml

    version: '3.0'
    services:registry:image: registryvolumes:- ./registryData:/var/lib/registryregistry-ui:image: joxit/docker-registry-ui:1.5-staticports:- 5000:80environment:- REGISTRY_TITLE=smilehappiness private docker - REGISTRY_URL=http://registry:5000depends_on:- registry
    

    depends_on这个配置表明 joxit/docker-registry-ui:static 镜像 依赖于官网镜像 registry,所以这样就会先启动registry,然后启动 joxit/docker-registry-ui:static
    执行以下命令启动
    docker-compose up -d
    在这里插入图片描述

  • 浏览器访问
    http://ip:5000
    在这里插入图片描述
    joxit/docker-registry-ui:static已过时,使用joxit/docker-registry-ui:1.5-static版本,访问界面如下:
    在这里插入图片描述

    参考资料:https://blog.csdn.net/lemonzjk/article/details/135907750

4.3 推送镜像到私服

  • 本地镜像tag标记
     推送镜像到私有镜像服务必须先tag,其实就是将本地镜像重命名一下,他们的镜像 ID 都是一样的,本质上还是同一个镜像
    docker tag 镜像id或者镜像名称 127.0.0.1:5000/smilehappiness/jdk17:v1.0
    注:这里的ip需要更改为你自己的私服ip和端口
    在这里插入图片描述

  • 推送镜像
    docker push 127.0.0.1:5000/smilehappiness/jdk17:v1.0
    在这里插入图片描述
    在这里插入图片描述

  • 拉取镜像
    docker pull 127.0.0.1:5000/smilehappiness/jdk17:v1.0

5 如何快速从一台机器获取另一台机器的Docker镜像

制作好镜像后,有时需要将镜像复制到另一台服务器使用,那么有两种方式:

  • 一种是上传镜像到仓库中(本地仓库或远程公共仓库)
  • 一种是将镜像保存为文件然后传到其他服务器上,再从文件中载入镜像

5.1 通过私服方式

通常,会把应用打包成镜像,上传到私服里面,然后供其他人下载,这种方式比较常见

5.2 Docker镜像保存为文件,通过文件导入镜像

可以使用Docker saveDocker load命令来存储和载入镜像

  • 查看已有镜像
    docker images

  • 保存镜像到文件如果要将镜像保存为本地文件,使用docker save命令,格式如下:
    docker save -o 要保存的文件名 要保存的镜像
    其中,-o表示output,把镜像输出到压缩文件
    如:docker save -o myjdk17.tar.gz 127.0.0.1:5000/smilehappiness/jdk17

  • 完成后通过 ls 命令查看保存的文件在当前目录下
    在这里插入图片描述

  • 把保存的此文件上传到另一台服务器上,从文件载入镜像从压缩文件载入镜像使用docker load命令
    docker load --input 文件 或者 docker load < 文件名
    如:docker load --input myjdk17.tar.gz 或者 docker load < myjdk17.tar.gz

  • 导入后可以使用docker images命令查看
    在这里插入图片描述

6 常用镜像docker-compose打包部署

写博客
是为了记住自己容易忘记的东西,另外也是对自己工作的总结,希望尽自己的努力,做到更好,大家一起努力进步!

如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!

给自己的梦想添加一双翅膀,让它可以在天空中自由自在的飞翔!

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

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

相关文章

Flutter笔记:手动配置VSCode中Dart代码自动格式化

Flutter笔记 手动配置VSCode中Dart代码自动格式化 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csd…

数据结构学习——线性表、顺序表

1.线性表 线性表 &#xff08; linear list &#xff09; 是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一…

在WPS表格(Excel)中,每10行增加一个特定的值

注&#xff1a;如下为WPS表格操作演示 例如1&#xff0d;15的数值是1&#xff0c;16-30就变为2&#xff0c;31-45就变为3&#xff0c;类推&#xff01; 1、在B1单元格输入一个起始值&#xff0c;B2单元格输入公式IF(MOD(ROW(),15)0,B11,B1) 然后鼠标放到B2单元格右下角小点处&…

利用生成式AI重新构想ITSM的未来

对注入 AI 的生成式 ITSM 的需求&#xff0c;在 2023 年 Gartner AI 炒作周期中&#xff0c;生成式 AI 达到预期值达到顶峰后&#xff0c;三分之二的企业已经将生成式 AI 集成到其流程中。 你问为什么这种追求&#xff1f;在预定义算法的驱动下&#xff0c;IT 服务交付和管理中…

第七届机电、机器人与自动化国际会议(ICMRA 2024)即将召开!

第七届机电、机器人与自动化国际会议&#xff08;ICMRA 2024&#xff09;将于2024年9月20日-22日在中国武汉举行。ICMRA 2024为各国专家学者提供一个学术交流的平台&#xff0c;讨论机电、机器人和自动化领域的最新研究成果和未来的研究方向&#xff0c;旨在能够建立起国家间&a…

Ansible剧本playbook之--------Templates 模块、roles角色详细解读

目录 一、Templates 模块 1.1准备模板文件并设置引用的变量 1.2修改主机清单文件&#xff0c;使用主机变量定义一个变量名相同&#xff0c;而值不同的变量 1.3编写 playbook 1.4ansible主机远程查看修改参数 1.5验证 二、tags 模块 always应用 三、Roles 模块 3.1ro…

在国企分公司做信息宣传新闻投稿的经验分享

作为一名国企分公司的信息宣传工作者,我亲历了从传统投稿方式到数字化转型的全过程,这段经历既充满了挑战,也收获了成长。回首最初的日子,那些用邮箱投稿的时光,至今仍让我感慨万千。 初尝辛酸,邮箱投稿的艰难岁月 刚接手信息宣传工作时,我满腔热情,却很快被现实的冷水浇了个透…

RabbitMQ的五种模式

一、简单模式 简单模式&#xff08;Simple&#xff09;&#xff1a;一个生产者&#xff0c;一个消费者 package com.qiangesoft.rabbitmq.mode.simple;import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.annotation.Queue; import org.springframe…

事业单位向媒体投稿发文章上级领导交给了我投稿方法

作为一名事业单位的普通职员,负责信息宣传工作,我见证了从传统投稿方式到智能化转型的全过程,这段旅程既是一次挑战,也是一次宝贵的成长。回想起初涉此领域的日子,那些通过邮箱投稿的时光,至今仍然历历在目,其中的酸甜苦辣,构成了我职业生涯中一段难忘的经历。 邮箱投稿:费时费…

C++从入门到精通---模版

文章目录 泛型编程函数模版模版参数的匹配原则类模版类模版的定义格式类模版的实例化 总结 泛型编程 泛型编程是一种编程范式&#xff0c;旨在实现通用性和灵活性。它允许在编写代码时使用参数化类型&#xff0c;而不是具体的类型&#xff0c;从而使代码更加灵活和可重用。 在…

spring ioc 容器加载过程 refresh() 方法详解

IOC 加载过程 从 new ClassPathXmlApplicationContext开始 ApplicationContext context new ClassPathXmlApplicationContext("classpath:application.xml");ClassPathXmlApplicationContext类构造方法 public ClassPathXmlApplicationContext(String[] configLo…

Redis集群分片

什么是集群 集群是由多个复制集组成的,能提供在多个redis节点间共享数据的程序集 简而言之就是将原来的单master主机拆分为多个master主机,将整个数据集分配到各主机上 集群的作用 集群中可以存在多个master,而每个master可以挂载多个slave自带哨兵的故障转移机制,不需要再去…

Python解释器3.8.2版本安装详细教程

Python解释器提取链接链接&#xff1a; https://pan.baidu.com/s/1eDvwYmUJ4l7kIBXewtN4EA?pwd1111 提取码&#xff1a;1111 演示版本为3.6.8&#xff0c;链接安装包为3.8.2版&#xff0c;包中附加pytharm安装包。 1.双击提取好的python-exe安装文件&#xff0c;会…

外企接受大龄程序员吗?

本人知乎账号同公众号&#xff1a;老胡聊Java&#xff0c;欢迎留言并咨询 亲身体会外企经历所见所闻&#xff0c;外企能接受大龄程序员。 1 大概是10年的时候&#xff0c;进一家知名外企&#xff0c;和我一起进的一位manager&#xff0c;后来听下来&#xff0c;年龄35&#xf…

0508_IO3

练习1&#xff1a; 1&#xff1a;使用 dup2 实现错误日志功能 使用 write 和 read 实现文件的拷贝功能&#xff0c;注意&#xff0c;代码中所有函数后面&#xff0c;紧跟perror输出错误信息&#xff0c;要求这些错误信息重定向到错误日志 err.txt 中去 1 #include <stdio.h…

【matlab基础知识代码】(十二)逆矩阵与广义逆矩阵

>> Hhilb(4);H1inv(H),norm(H*H1-eye(4))H1 1.0e03 *0.0160 -0.1200 0.2400 -0.1400-0.1200 1.2000 -2.7000 1.68000.2400 -2.7000 6.4800 -4.2000-0.1400 1.6800 -4.2000 2.8000ans 2.8455e-13 矩阵维数较大&#xff0c;警告: 矩阵接近奇…

svg画扇形进度动画

有人问下面这种图好怎么画&#xff1f;svg 想了下&#xff0c;确实用svg可以&#xff0c;可以这么设计 外层是一个容器放置内容&#xff0c;并且设置overflow:hidden&#xff0c; 内层放一个半径大于容器宽高一半的svg&#xff0c;并定位居中&#xff0c;然后svg画扇形&#x…

线程的组成、执行特点、创建的两种方式

线程的组成&#xff1a; cpu时间片 运行内存&#xff1a;栈、堆 线程的逻辑代码 线程执行的特点&#xff1a; 抢占式执行&#xff0c;结果随机&#xff0c;效率高&#xff0c;可以防止单一线程长时间独占CPU 在单核cpu中&#xff0c;宏观上同时执行&#xff0c;微观上顺序…

C++青少年简明教程之一:基础知识

C青少年简明教程之一&#xff1a;基础知识 电脑程序设计&#xff08;Computer programming&#xff09;&#xff0c;或称程序设计&#xff08;programming&#xff09;&#xff0c;是给出解决特定问题程序的过程&#xff0c;程序设计往往以某种程序设计语言为工具&#xff0c;给…

【软件测试】用例篇 -- 详解

一、测试用例的基本要素 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素。&#xff08;注意&#xff1a;不需要执行结果&#xff0c;因为执行结果…