• 【Docker】二、docker镜像的制作运行发布


    上一篇 【Docker】一、云时代容器Docker的基本操作

    一、安装常用镜像实例

    1、Docker 安装 MySQL

    • 下载MySQL镜像:
    docker pull docker.io/mysql:latest  (安装的是mysql 8.0docker run -d -p 3306:3306 -e MYSQL_DATABASE=workdb -e MYSQL_ROOT_PASSWORD=123456  mysql:latest
    
    • 1
    • 2

    其中-e是指定环境变量

    • 进入容器:
    docker exec -it 3e8bf7392b4e /bin/bash
    
    • 1
    看容器里面的mysql在什么位置:whereis mysql
    
    • 1
    • 登录MySQL:
    mysql -u root -p
    
    • 1
    • 修改密码:
    ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
    
    • 1
    • 授权远程登录访问:
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    GRANT ALL PRIVILEGES ON *.* TO ' root'@'%';
    FLUSH PRIVILEGES;
    
    • 1
    • 2
    • 3

    容器是瞬态的。重启了容器,数据就没了;

    • 数据持久化
    docker run -d -p 3306:3306 -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
    
    • 1
    • /opt/mysql/data 是宿主机的路径
      /var/lib/mysql 是容器的路径

    2、Docker的Tomcat容器部署web项目

    docker run -d -p 8080:8080 docker.io/tomcat
    docker cp /root/test.html bf8a58328e18:/usr/local/tomcat/webapps/ROOT
    
    • 1
    • 2
    • 数据持久化
    docker run -d -p 8080:8080 -v /opt/tomcat/data:/usr/local/tomcat/webapps docker.io/tomcat
    
    • 1

    二、Docker容器的修改

    1、保存修改后的容器

    docker   commit   容器id   xxx(镜像名:tagxxx)
    比如:docker commit 90343fa54080 my_tomcat
    docker commit 90343fa54080 my_tomcat:latest
    
    • 1
    • 2
    • 3

    把一个运行着的容器,由于里面改了一些东西,希望把该容器保存起来,可以使用上面这种做法,得到一个新镜像,下次用该新镜像运行;
    (镜像是一个模板);

    2、Docker镜像保存为文件与从文件导入镜像

    制作好镜像后,有时需要将镜像复制到另一台服务器使用,那么有两种方式:
    一种是上传镜像到仓库中(本地仓库或远程公共仓库)
    一种是将镜像保存为文件然后传到其他服务器上,再从文件中载入镜像;
    可以使用Docker save和Docker load命令来存储和载入镜像。

    三、Docker搭建私有仓库

    1、私有仓库搭建

    1.1、可配置加速器加速下载

    /etc/docker/daemon.json
    
    {
    "registry-mirrors": ["https://registry.docker-cn.com"]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.2、获取镜像加速器地址

    在这里插入图片描述

    1.3、下载registry镜像:

    docker pull registry
    docker pull  docker.io/registry
    这两个一样
    
    • 1
    • 2
    • 3

    1.4、启动镜像:

    docker run -d -p 5000:5000 registry

    在这里插入代码片
    
    • 1

    1.5、然后可以通过restful接口查看仓库中的镜像(当前仓库是空的)

    http://127.0.0.1:5000/v2/_catalog 
    
    • 1

    2、私服仓库推送镜像

    docker tag [imageId] 127.0.0.1:5000/cat/redis:latest
    
    • 1
    1、docker tag 6408fdc94212 127.0.0.1:5000/cat/tomcat:latest
    2、docker push 127.0.0.1:5000/cat/tomcat:latest
    
    • 1
    • 2
    • 执行命令效果
    [root@server docker]# docker tag 6408fdc94212 127.0.0.1:5000/cat/tomcat:latest
    [root@server docker]# 
    [root@server docker]# docker push 127.0.0.1:5000/cat/tomcat:latest 
    The push refers to a repository [127.0.0.1:5000/cat/tomcat]
    cd5b7e2631fa: Pushed 
    9f99f85da76a: Pushed 
    2c17ac16afc6: Pushed 
    2ee490fbc316: Pushed 
    b18043518924: Pushed 
    9a11244a7e74: Pushed 
    5f3a5adb8e97: Pushed 
    73bfa217d66f: Pushed 
    91ecdd7165d3: Pushed 
    e4b20fcc48f4: Pushed 
    latest: digest: sha256:8e75a9065fd732f2d06fccba994b246d77360b6e9870ac02b60b5b7d1fc6007d size: 2422
    [root@server docker]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 查询镜像:
      http://127.0.0.1:5000/v2/_catalog
    • 查询刚才上传的镜像的版本
      http://127.0.0.1:5000/v2/cat/tomcat/tags/list

    启动容器的时候,也可以通过 --name指定容器的名字
    docker run -d --name mytomcat -p 8080:8080 my_tomcat‘

    3、保存镜像为文件

    如果要将镜像保存为本地文件,使用docker save命令;

    docker save -o 要保存的文件名 要保存的镜像
    
    • 1
    查看已有镜像:docker images
    
    • 1
    保存镜像为文件: docker save -o redis.tar.gz docker.io/redis
    
    • 1

    完成后通过 ls 命令查看保存的文件在当前目录下;
    把保存的此文件上传到另一台服务器上;
    从文件载入镜像

    从压缩文件载入镜像使用docker load命令;
    docker load --input 文件
    
    或者
    docker load < 文件名 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    导入后可以使用docker images命令查看;

    四、Docker自定义镜像

    1、Dockerfile文件

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

    2、Dockerfile的基本结构

    一般的,Dockerfile分为四部分:

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

    比如下面就是一个Dockefile文件样例:

    FROM centos:latest
    MAINTAINER docker_user
    ENV JAVA_HOME /usr/local/java
    ADD apache-tomcat-8.0.32.tar.gz /usr/local/
    RUN mv apache-tomcat-8.0.32 tomcat8
    EXPOSE 8080
    RUN chmod u+x /usr/local/tomcat8/bin/*.sh
    CMD /usr/local/tomcat8/bin/catalina.sh start
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3、Dockerfile指令

    • ROM
      格式为 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

    4、自定义JDK镜像

    • 定义Dockerfile文件:
    FROM centos:latest
    MAINTAINER cat
    ADD jdk-8u191-linux-x64.tar.gz /usr/local/java
    ENV JAVA_HOME /usr/local/java/jdk1.8.0_191
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV PATH $PATH:$JAVA_HOME/bin
    CMD java -version
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    构建镜像:docker build -t my_jdk1.8.0_191 .
    运行镜像:docker run -d ac84bde53958 (镜像id)

    5、自定义Tomcat镜像

    • 定义Dockerfile文件:
    FROM my_jdk1.8.0_191
    MAINTAINER cat
    ADD apache-tomcat-9.0.29.tar.gz /usr/local/
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.29
    ENV PATH $PATH:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    EXPOSE 8080
    CMD /usr/local/apache-tomcat-9.0.29/bin/catalina.sh run
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    构建镜像:docker build -t my-tomcat-9.0.29 .
    运行镜像:docker run -d -p 8080:8080 7db5d55cd5c4

    五、Docker部署微服务

    1、Docker部署SpringBoot项目

    • 1、将开发的springboot程序打成jar包或者war包;
    • 2、将打好的jar包或war包上传到Linux某个目录下,比如:/root/docker
    • 3、定义Dockerfile文件,用于创建项目镜像;

    2、定义Jar包程序Dockerfile文件

    FROM my_jdk1.8.0_191
    MAINTAINER cat
    ADD springboot-web-1.0.0.jar /opt
    RUN chmod +x /opt/springboot-web-1.0.0.jar
    CMD java -jar /opt/springboot-web-1.0.0.jar
    
    • 1
    • 2
    • 3
    • 4
    • 5

    构建和运行Jar包程序的镜像
    构建镜像:docker build -t springboot-web-jar .
    运行容器:docker run -d -p 8080:8080 ac84bde53958

    • Jar包程序依赖容器环境准备
    运行MySQL容器:docker run -p 3306:3306 -e MYSQL_DATABASE=workdb -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
    
    • 1

    运行Docker化的Jar包程序,通过windows的浏览器访问,验证SpringBoot项目是否可以正常访问;

    3、Docker部署War包SpringBoot程序

    • 定义War包程序Dockerfile文件
    FROM my-tomcat-9.0.29
    MAINTAINER cat
    ADD springboot-web-1.0.0.war /usr/local/apache-tomcat-9.0.29/webapps
    EXPOSE 8080
    CMD /usr/local/apache-tomcat-9.0.29/bin/catalina.sh run
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    • 构建镜像:docker build -t springboot-web-war .
    • 启动镜像:docker run -d -p 8080:8080 b9f7c20c50c7
    • 启动查看日志:docker logs -f eb3de34a01a8(容器ID)

    4、Maven源码构建Docker镜像部署微服务

    前面我部署一个SpringBoot的微服务程序,是采用如下步骤进行的:
    1、将开发的springboot程序打成jar包或者war包;(idea里面操作的)
    2、将打好的jar包或war包上传到Linux某个目录下,比如:/root/docker
    3、定义Dockerfile文件,用于创建项目镜像;
    4、启动创建好的项目镜像把程序运行起来;

    更多的情况,我们是直接在运维环境里,上传源码,直接maven打包jar或者war,然后再进一步构建成镜像,不过这个操作过程本质上与手动打包是类似的;
    1、在Linux下配置maven运行环境;
    2、将项目源代码上传到Linux某个目录下;(或从git上拉取源代码)
    3、通过maven命令打包:mvn clean package -Dmaven.test.skip=true
    4、编辑Dockerfile文件,生成项目镜像;
    5、构建项目镜像;
    6、运行项目镜像,启动项目程序;
    war包的Dockerfile文件:

    FROM docker.io/tomcat
    MAINTAINER cat
    ADD target/springboot-web-1.0.0.war /usr/local/tomcat/webapps
    EXPOSE 8080
    CMD /usr/local/tomcat/bin/catalina.sh run
    构建镜像:docker build -t springboot-web-jar .
    运行容器:docker run -d -p 8080:8080 ac84bde5348
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5、IntelliJ IDEA下的Docker

    • 1、安装idea下的docker插件
    • 2、配置一下 /etc/docker/daemon.json的host ;
    [root@server 35-springboot-web]# cat /etc/docker/daemon.json  
    {
    "hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"],
    "registry-mirrors": ["https://registry.docker-cn.com"],
    "insecure-registries": ["12.24.67.78:5000"]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 3、idea下配置 tcp://12.24.67.78.93:2375
      在这里插入图片描述
    • 4、在项目下写一个Dockerfile文件;
    FROM jdk1.8.0_11
    MAINTAINER cat
    ADD target/springboot-web-1.0.0.jar /opt
    RUN chmod +x /opt/springboot-web-1.0.0.jar
    CMD java -jar /opt/springboot-web-1.0.0.jar
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5、运行或者build该Dockerfile文件;
    在这里插入图片描述
    也可以上传镜像到远程私有仓库(如下图):
    在这里插入图片描述

    六、私有Docker仓库镜像下载

    1、 在拉取仓库镜像的机器上配置加速器和仓库地址:

    在这里插入图片描述

    [root@rabbit128 ~]# cat /etc/docker/daemon.json  
    {
    "registry-mirrors": ["https://registry.docker-cn.com"],
    "insecure-registries": ["127.0.0.1:5000"]
    }
    [root@rabbit128 ~]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、修改上面的配置后需要重启一下Docker;

    3、推送一个镜像到私有仓库:

    1、docker tag dcf9ec9265e0 127.0.0.1:5000/redis
    2、docker push 127.0.0.1:5000/redis:latest
    
    • 1
    • 2

    4、然后才能从仓库拉取

    推送:docker push 114.116.213.93:5000//tomcat:latest
    推送:docker push 127.0.0.1:5000/tomcat:latest
    拉取:docker pull 127.0.0.1:5000/redis:latest
    拉取:docker pull 114.116.213.93:5000/redis:latest
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    BeautifulSoup4库
    用面向对象的方式操作 JSON 甚至还能做四则运算 JSON 库
    会自动化就能拿20K?想多了,你这顶多算是会点皮毛···
    关于我用iVX沉浸式体验了一把0代码项目创建(2)
    亚马逊、速卖通、Lazada、Shopee、eBay、wish、沃尔玛、阿里国际、美客多等跨境电商平台,测评自养号该如何利用产品上新期抓住流量?
    IDEA2020安装教程
    Base64编码相关知识总结
    计算机毕业设计Java的创意项目众筹平台的设计与开发(源码+系统+mysql数据库+lw文档)
    Agda学习笔记1
    华为云云耀云服务器L实例评测|RabbitMQ的Docker版本安装 + 延迟插件安装 & QQ邮箱和阿里云短信验证码的主题模式发送
  • 原文地址:https://blog.csdn.net/weixin_43333483/article/details/125880392