09月28, 2019

docker 快速入手及push 镜像到dockerhub

写在前面

自微服务火起来之后,相关生态系统不断完善,成百上千的服务架构落地与实施面临的复杂性越来越大,如何实现服务的快速持续构建部署、相关环境配置隔离、服务器资源最小占用率等等一系列问题,已经成为开发过程中不得不关注的点,在这一大背景下docker孕育而生。

docker 是什么

docker是一个用于开发、交付和运行应用程序的开放平台,它可以将应用程序和基础架构分开,借助Docker,可以像管理应用程序相同的方式来管理基础架构。通过利用Docker的方法来快速交付、测试和部署代码,可以大大减少编写代码到在生产环境中运行代码之间的时间差。(引用官方)

总而言之,docker 能够实现是同一个硬件服务器上运行多个服务,而且可以动态扩展或拆除服务中的基础架构配置。详细的可以去docker的官网进行了解https://docs.docker.com/engine/docker-overview/

docker 核心概念

docker的两大核心:

  • 镜像(images)::一个只读的文件系统,创建容器的基础,可以打包除操作系统外的应用程序
  • 容器(container):镜像创建的应用实例,可以看做是一个简易版的Linux系统(包括root用户权限、进程空间、用户空间和网络空间等)
  • 仓库(repository):存放镜像的远程仓库,和github那种性质差不多

docker 安装

安装过程不再赘述。

docker 实战

下面我们使用docker 制作一个springboot 项目镜像,并将其push到dockerhub(仓库),大体流程:

  • 新建一个springboot 项目
  • 编写Dockerfile
  • 创建镜像并运行
  • push镜像到远程仓库

1、新建项目&Dockerile

创建项目就略过了,这里主要说下Dockerfile文件,有些小伙伴看到这个文件有点怯意,其实这个的语法感觉像shell +python的混合脚本(说白了编程只不过是if else for 罢了)。

  • 创建springboot项目:

     项目名:docker-demo.jar
    
  • 编写Dockerfile:
#引入基础镜像 openjdk
FROM adoptopenjdk/openjdk8:latest
#运行命令 类似shell
RUN mkdir /opt/app
#copy jar包到指定目录下
COPY docker-demo.jar /opt/app
# 暴露监听端口
EXPOSE 8081
#启动程序
CMD ["java","-jar","/opt/app/docker-demo.jar"]

简单说下:镜像其实是不同层级之间可以相互引用,所谓的“基础镜像”是指在底层的镜像,比如 jdk、tomcat、resin之类的。

2、创建镜像&运行

首先我们将docker-demo.jar 和 Dockerfile 上传到服务器

创建镜像:

docker build -t docker-demo .

简单说下:-t 是定义镜像名,注意这里的镜像名一般和仓库中的名是一致的(后边再说),. 是指在当前目录下,docker会自动在当前目录寻找并执行Dockerfile。

第一次执行Dockerfile会从远程仓库拉取openjdk镜像,这个过程有点慢,我截图中是因为之前已经拉取,所以显示Already exists,最后看到Successfully tagged docker-demo:latest说明创建成功了。

执行docker images可以看到已经有了两个镜像(一个openjdk的基础镜像,一个docker-demoj)

执行docker run -it -p 8081:8081 docker-demo命令启动镜像,这里的-i 意思是以交互模式运行一个容器-t意思是为容器重新分配一个伪输入终端-p指定端口映射,格式为:主机(宿主)端口:容器端口

然后我们ifconfig发现多了个docker0的玩卡,用docker0的内网ip(172.XX.XX.1)请求下服务curl 'http://172.XX.XX.1:8081/docker/test' alt

3、上传镜像

首先要在dockerhub注册一个用户,并新建一个Repository(再次强调:注意命名要和之前构建的镜像名一致),一般镜像命令格式为username/imagename,比如keepting/docker-demo,所以用docker build构建镜像需要使用这种格式的镜像名。

  • 首先需要在服务器登录dockerhub: docker login ,输入用户名密码。

  • 之后执行 docker push keepting/docker-demo:latest ,这个时间比较长。

总结

通过本文大概了解了docker是干啥的以及它的核心组件,并且通过一个入门小案例,我们大概了解了一般springboot 项目从编写Dockerfile到构建镜像、再到部署一系列过程。其实docker还提供了了许多便利之处,有兴趣的可以多多了解下。

本文链接:http://blog.keepting.cn/blog//post/docker_001.html

-- EOF --

Comments