Docker镜像的制作,上传,拉取和部署操作(利用阿里云)

由于学习过程中发现push镜像的时候一直超时,所以直接把阿里云的Docker仓库申请一个(管理中心–>创建镜像仓库–>我的是华东2绑定github账户即可),搞定!以后push就用这个仓库,pull的时候使用加速器,注意切换根据使用场景进行切换,dockerhub丢弃……记录了一下操作流程:

1.创建命名空间hhu(以当前学校为单位,只能小写,每个账号只能创建5个),创建菜鸟Docker镜像仓库docker1(绑定github中某个仓库,个人可以随意,这个仓库镜像就像是一个app,可以不断的更新它的版本),那么所有测试镜像可以推送到这里,以后作专门的其他镜像可以再申请其他的镜像仓库(比如作Tomcat时,单独申请一个镜像仓库tomcat,作redis时再申请一个redis的仓库,依次类推)。完成;

2.镜像制作,这一步下面单独拎出来详细记录;

3.镜像推送:制作完事后,需要将镜像push到镜像测试仓库中docker1中。基本信息如下–

1.公网地址:registry.cn-shanghai.aliyuncs.com/hhu/docker1

2. 内网地址(ECS可选):registry-internal.cn-shanghai.aliyuncs.com/hhu/docker1

3.代码仓库(即绑定的github上的仓库):https://github.com/Jacksonary/Docker

我的第一个Docker镜像名字为:jacksonary/myfirstapp,根据网络情况选择公网推送,主要过程如下:

# 1.从加速器切换到仓库地址登录 docker login --username=jacksonary@163.com registry.cn-shanghai.aliyuncs.com

# 2.根据镜像名字或者ID为它创建一个标签,缺省为latest docker tag jacksonary/myfirstapp registry.cn-shanghai.aliyuncs.com/hhu/docker1[:镜像版本号]

# 3.推送镜像 docker push registry.cn-shanghai.aliyuncs.com/hhu/docker1[:镜像版本号]

随后可以在阿里云仓库中查看推送的镜像,如下:

在获取上述的镜像文件时,需要将指定镜像版本号,所以在推送镜像时还是建议追加必须的镜像版本号以作区分,如果我需要拉取上述的镜像可以通过如下操作:

# 因为版本缺省默认是latest的,所以获取时可以缺省,或者追加:latest(建议) docker pull registry.cn-shanghai.aliyuncs.com/hhu/docker1

一、Docker镜像的制作

一般是一个项目放一个文件夹,比如官网上有一个项目叫flask-app,那么所有的文件都在项目目录下,我们需要在项目根目录下添加一个叫做”Dockerfile”的文本文件,并且将它的txt后缀去除,然后利用普通的文本编辑器进行Docker环境的编写即可,比如下面这个Dockerfile:

# 1.指定基本镜像为Linux(alipine Docker镜像是只有5M的轻量级Linux系统)
FROM alpine:3.5

# 在alipine下安装python和pip,这个app是用Python写的,所以需要安装Python环境,通常是复制文件和安装依赖
RUN apk add --update py2-pip

# 安装app所需的Python所必须的
COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt

# 复制应用必须的文件到镜像中
COPY app.py /usr/src/app/
COPY templates/index.html /usr/src/app/templates/

# 设置需要暴露的端口号
EXPOSE 5000

# 设置应用通过cmd启动Python应用程序
CMD ["python", "/usr/src/app/app.py"]

然后创建Docker镜像,PowerShell进入项目根目录(即Dockerfile所在目录),执行

docker build -t jacksonary/myfirstapp .

这里需要注意的是当我们使用“Dockerfile”为Docker的配置文件名时,直接这么写,但是如果使用其他的配置文件名必须额外指定,比如指”jdk-9-alpine.Dockerfile”为Docker的配置文件,应该用-f指定配置文件这么写:

docker build -t jacksonary/myfirstapp -f jdk-9-alpine.Dockerfile .

其中-t表示为当前创建的镜像打一个标签为“jacksonary/myfirstapp”,/前半部分必须是你Docker的用户名ID(如果你使用的是Dockerhub仓库,因为Dockerhub默认是你的用户名,如果使用阿里云的话,我可以随意取),/后半部分是该应用的名字,合起来作为这个镜像的tag,后面的URL路径不能丢了,点号表示的是当前路径,执行完成后会自动发布到当前HV的虚拟机中,利用docker images可以查看多了一个“jacksonary/myfirstapp”的镜像,完成。

【总结】关于Dockerfile文件配置需:

1. Dockerfile文件必须以FROM开头,后面跟基础容器和版本,指明当前镜像的父容器,父容器通常是以“用户名/镜像名:版本号”的形式存在(Dockerhub中是这一样的)

2.RUN指令用于创建当前的Docker镜像,每次调用该指令的时候,Docker都会创建新的镜像层,这样便于回滚到之前的镜像版本,它的语法是在RUN后面接shell指令(比如RUN mkdir /user/local/foo),它会自动执行/bin/sh的shell,当然也可以指定比如:RUN /bin/bash -c 'mkdir /user/local/foo'

3.COPY指令可以将本地的文件复制到容器中

4.CMD指令定义的命令将会在镜像启动时执行,和RUN指令不同的是它不会创建新的镜像层,只是简单的执行指令,在每个镜像的Dockerfile文件中可以只有一个CMD指令,也可以有多个待执行的指令(这种情况最好是将CMD以脚本的方式运行),CDM执行指令的时候需要我们指定在哪里运行这些指令,而RUN则无需指定,比如下面的CMD指令

CMD ["python", "./app.py"]

CMD ["/bin/bash", "echo", "Hello World"]

5.EXPOSE指令用于指定镜像程序将会在哪个端口提供服务,这些信息可以通过docker inspect <container-id>指令检索出来,但是EXPOSE指令实际上并没有向主机暴露端口,而是在需要在docker run 发布时以-p标志的方式暴露,上述的是小写的p需要指定主机到到虚拟到主机端口之间的映射,而大写的P是将镜像中的端口暴露到主机的随机端口,具体暴露到哪个端口可以通过docker ps查看,比如:

上图可以看到就是将镜像的8080端口暴露给主机的32768端口,此时可以通过localhost:32768进行查看。

6.PUSH指令可以将镜像发布到Docker Cloud这类平台

7.ENV指令用于配置环境变量,如:

# 配置Java的环境变量,这是Linux中标准的JAVA环境变量
ENV JAVA_HOME=/opt/jdk-9
ENV PATH=$PATH:$JAVA_HOME/bin

二、部署运行该镜像

在创建完镜像后,可以来跑一跑,这里先提供我自己根据教程作的镜像:docker pull registry.cn-shanghai.aliyuncs.com/hhu/docker1,可以拉取下来在Docker中跑:

docker pull registry.cn-shanghai.aliyuncs.com/hhu/docker1

docker run -p 8888:5000 --name myfirstapp registry.cn-shanghai.aliyuncs.com/hhu/docker1

其中 -p (这个指令很重要)表示将虚拟机上的暴露的5000端口映射到本机8888端口,并且将该镜像命名为myfirstapp,此时通过访问http://localhost:8888即可查看关于猫的git图,每次刷新会随机获取不同的猫图。

三、镜像推送

在文首已有,整个制作Docker镜像的文件地址:https://github.com/Jacksonary/Docker/tree/master/flask-app

四、简单JAVA应用的部署

就是简单的java工程,这里利用maven打包,来吧,先到我们的工作目录下,执行

mvn archetype:generate -DgroupId=edu.hhu.java -DartifactId=helloworld -DinteractiveMode=false

创建简单的mavenJava工程,我知道大部分人都可以这样执行成功,但是也有小部分人执行这个命令无法创建工程(我就是其中的一个��),提示

there is no POM in this directory

一脸懵逼的给他一个空的pom,它又提示pom中没有数据,好吧,换种方式来搞,我们先这样告诉他我们要创建工程了:

mvn archetype:generate

然后它会提示我们要不要内置的骨架,选择7:maven-archetype-quickstart即可,然后根据提示输入groupID和artifactId等信息,最后会问你是否打包,直接打包(然后jar包就会出现在target目录下),好了这一步完事了,看一下这个工程能不能用:

java -cp target/helloworld-1.0-SNAPSHOT.jar edu.hhu.java.App

其中-cp指明了执行这个class文件所需要的所有类的包路径-即系统类加载器的路径,默认骨架会给出“Hello World”来问候你,好了,java工程创建完成。

第二步写Docker的配置文件Dockerfile:

FROM openjdk:latest

COPY target/helloworld-1.0-SNAPSHOT.jar /usr/src/helloworld-1.0-SNAPSHOT.jar

CMD java -cp /usr/src/helloworld-1.0-SNAPSHOT.jar edu.hhu.java.App

第三部创建镜像并执行

docker build -t jacksonary/helloworld .

docker run jacksonary/helloworld

四、Docker中复杂多容器的应用(Docker-compose)

在实际开发中,往往需要多种业务,不再是Ubuntu中打印一句话,比如在WEB中和数据库的交互,这样的应用就是典型的由多个容器组成,不需要用shell去启动这些容器,所有的容器将会以一种“服务组”的方式定义在一个配置文件中,和Dockerfile类似的,写在项目根目录中,然后可以利用

docker-compose up -d

docker-compose脚本可以用来启动、停止、重启应用和所有的应用中的服务,docker-compose的完整的命令如下:

指令 内容

build


Build or rebuild services


help


Get help on a command


kill


Kill containers


logs


View output from containers


port


Print the public port for a port binding


ps


List containers


pull


Pulls service images


restart


Restart services


rm


Remove stopped containers


run


Run a one-off command


scale


Set number of containers for a service


start


Start services


stop


Stop services


up


Create and start containers

这些定义在一起的Docker组件服务入口是docker-compse配置文件,他通常以yml文件的形式存在,比如下面的docker-compse.yml(注意在每个属性配置时冒号后面必须加空格符,除了端口映射):

version: '3.3'
services:
 db:
 container_name: db
 image: mysql:8
 environment:
  MYSQL_DATABASE: employees
  MYSQL_USER: mysql
  MYSQL_PASSWORD: mysql
  MYSQL_ROOT_PASSWORD: supersecret
 ports:
  - 3307:3306
 web:
 image: arungupta/docker-javaee:dockerconeu17
 ports:
  - 8081:8080
  - 9991:9990
 depends_on:
  - db

在上面的组合文件中:

1. 定义了两个服务:db和web

2. image属性为每个服务字指定了镜像文件

3. mysql:8镜像将会启动MySql服务

4. environment属性定义了MySQL服务环境变量进行初始化:MYSQL_DATABASE 在镜像启动时常见一个指定名字的数据库,MYSQL_USER和MYSQL_PASSWORD组合创建一个新的用户并设定密码,这个用户将会被授予MYSQL_DATABASE创建的那个数据库的超级权限,MYSQL_ROOT_PASSWORD是强制性的设定MySQL超级用户密码

5. ports实现端口的转发,前面的是主机,后面的是虚拟机

6. depends_on属性表明了两个服务之间的依赖,这个案例中,WildFly(一种应用服务器)依赖于MySQL,所以MySQL将在WildFly之前启动

在有了上述的组合配置文件后,PW进入该文件的所在目录下,即可利用docker-compose up -d以隔离模式启动这两个服务,docker ps可以查看端口之间的映射情况,也可以发现是启动了两个容器,docker-compose logs可以查看服务的日志,此时我们就可以通过http://localhost:8081/resources/employees访问所有人员信息,停止这一组服务:

docker-compose down

以上这篇Docker镜像的制作,上传,拉取和部署操作(利用阿里云)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • docker Dockerfile文件制作自己的镜像的方法

    1.创建空目录 $ cd /home/xm6f/dev $ mkdir myapp $ cd myapp/ 2.vim Dockerfile,内容如下: ## 一个基础的 python 运行环境 FROM python ## 设置工作目录 WORKDIR /app ## 将当前系统文件夹内容复制到容器的 app 目录 ADD . /app ## 安装必要的依赖包 RUN pip install -r softwares.txt ## 开放端口,供容器外访问 EXPOSE 80 EXPOSE 30

  • 第一次构建、运行、发布、获取docker镜像的步骤详解

    1.前言 过去,如果您要开始编写Python应用程序,第一步就是把Python的运行环境安装到您的机器上,而且安装的环境还要和线上的一致,比较麻烦. 使用Docker,您可以从docker的官方registry或者其他仓库,获取一个可移植的Python运行环境镜像,无需安装.然后,你可以基于这个镜像开发你的应用程序,这样可以确保您的应用程序,依赖项和运行时都一起运行. 2.构建一个python镜像 2.1.为了构建您自己的镜像,首先需要创建一个名称为Dockerfile的文件,用于定义创建镜像并

  • Docker 配置阿里云容器服务操作

    配置阿里云Docker容器服务 登录 阿里云镜像服务控制台 首先要有一个自己的阿里云账号 1.点击名称空间,建议用自己名字/公司名字 比如叫 aliyun-stg 创建完成名字空间 2.点击镜像仓库,创建镜像,填写细信息 仓库可以使用Redis mysql 等名字进行管理 创建仓库 3.观察创建好后的信息 registry.cn-beijing.aliyuncs.com/aliyun-stg/flask 阿里docker域名 registry.cn-beijing.aliyuncs.com 我自

  • 详解使用阿里云镜像仓库构建国外Docker镜像

    使用阿里云镜像仓库下载国外镜像 在日常使用 Docker 或 K8S 的过程中,经常会需要到国外的网站中下载镜像,但是有些网站在国内是无法访问的.对于这个问题可以使用阿里云提供的镜像仓库进行下载,然后 pull 到本地并修改 tag 来实现. 例如在使用 K8S 部署 Istio 时,需要下载 gcr.io/istio-testing/install-cni:1.5-dev 镜像,可以根据如下步骤在阿里云中进行构建和下载: 一.配置 Github 首先登录 Github 中创建一个用于构建镜像的

  • Docker镜像的制作,上传,拉取和部署操作(利用阿里云)

    由于学习过程中发现push镜像的时候一直超时,所以直接把阿里云的Docker仓库申请一个(管理中心–>创建镜像仓库–>我的是华东2绑定github账户即可),搞定!以后push就用这个仓库,pull的时候使用加速器,注意切换根据使用场景进行切换,dockerhub丢弃--记录了一下操作流程: 1.创建命名空间hhu(以当前学校为单位,只能小写,每个账号只能创建5个),创建菜鸟Docker镜像仓库docker1(绑定github中某个仓库,个人可以随意,这个仓库镜像就像是一个app,可以不断的更

  • 一篇文章弄懂Docker镜像的制作、上传、拉取和部署

    目录 一.镜像(images) 1. 什么是镜像? 2. 镜像的组成和用途 (1)Dockerfile (2)scratch (3)一个完整的操作系统需要: 3. 为什么要自己制作镜像? 二.镜像制作的步骤(10步法) 第1步:编辑Dockerfile 第2步:编辑requirements.txt文件 第3步:编辑app.py文件,我们的程序文件 第4步:生成镜像文件 第5步:检查镜像是否成功 第6步:使用镜像,启动容器 第7步:访问容器的web服务 第8步:启动redis容器 第9步:再次启动

  • 动态上传jar包热部署的实战详解

    目录 定义简单的接口 该接口的一个简单的实现 反射方式热部署 注解方式热部署 测试 近期开发系统过程中遇到的一个需求,系统给定一个接口,用户可以自定义开发该接口的实现,并将实现打成jar包,上传到系统中.系统完成热部署,并切换该接口的实现. 定义简单的接口 这里以一个简单的计算器功能为例,接口定义比较简单,直接上代码. public interface Calculator {     int calculate(int a, int b);     int add(int a, int b);

  • 基于JQuery实现图片上传预览与删除操作

    本文实例为大家分享了JQuery实现图片上传预览与删除的具体代码,经测试目前满足谷歌.火狐.360.IE6,7,8,9,10,11等浏览器,供大家参考,具体内容如下 1. preview.2.0.html <!DOCTYPE html> <html> <head> <title>上传图片预览</title> <meta http-equiv="content-type" content="text/html;

  • Spring Boot实现图片上传/加水印一把梭操作实例代码

    概述 很多网站的图片为了版权考虑都加有水印,尤其是那些图片类网站.自己正好最近和图片打交道比较多,因此就探索了一番基于 Spring Boot这把利器来实现从 图片上传 → 图片加水印 的一把梭操作! 本文内容脑图如下: 本文内容脑图 搭建 Spring Boot基础工程 过程不再赘述了,这里给出 pom中的关键依赖: <dependencies> <dependency> <groupId>org.springframework.boot</groupId>

  • 深入理解docker镜像的分层(小白必看)

    大家好,今天分享docker镜像的分层理解 我们拉取Redis 镜像 [root@localhost ~]# docker pull redis Using default tag: latest latest: Pulling from library/redis a2abf6c4d29d: Pull complete c7a4e4382001: Pull complete 4044b9ba67c9: Pull complete c8388a79482f: Pull complete 413c

  • SpringBoot 二维码生成base64并上传OSS的实现示例

    目录 基础环境 代码实现 1.添加依赖 2.工具类 3.测试生成 4.base64 转换为图片在线工具 5.base64图片上传oss 基础环境 SpringBoot.Maven 代码实现 1.添加依赖 <!--二维码生成 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.3<

  • yii2.0整合阿里云oss上传单个文件的示例

    上一篇文章已经介绍了如何整合阿里云oss,这一篇主要介绍上传文件到阿里云oss. 主要思路:首先文件要上传到服务器,然后把服务器里边的文件传到阿里云oss,成功以后就把文件信息写入数据库,失败了就删除服务器的文件. 主要步骤: 0 介绍几个oss的概念. accessKeyId     ==>> 可以理解为访问阿里云oss的账号 accessKeySecret ==>> 可以理解为访问阿里云oss的密码 bucket          ==>> 可以理解为文件在保存的根

  • Docker 拉取镜像及标签操作 pull | tag

    重翻Fabric项目的源码,发现Docker部分内容,有很多不尽理解的地方,看着看着,就看到使用docker pull拉取Fabric镜像及使用docker tag为镜像重命名,稍作思虑,发现虽然使用过,却未求甚解,得过且过,如今已经忘了如何运用-- 1. docker pull 从镜像源拉取镜像,一般来说是从Docker Hub拉取镜像(image) docker pull [OPTIONS] NAME[:TAG|@DIGEST] 选项,简写 默认 描述 –all-tags , -a 从镜像库

  • Docker镜像上传到阿里云的步骤详解

    1 安装Docker运行环境 参考文档:https://docs.docker.com或者http://www.jb51.net/article/94198.htm 2 注册阿里云账户 阿里云官方网站链接:https://dev.aliyun.com/search.html 例如: 账户:msjtest 密码:123456 3 登陆账户 4 管理Docker Hub镜像站点:配置Docker加速器 链接:https://cr.console.aliyun.com/?spm=5176.197173

随机推荐