简介
  • 随着docker服务虚拟化技术和Kubernetes(K8S)等容器管理平台的出现,微服务迈上了一个新台阶,我们可以做到服务一次构建,多出运行,不用再为基础环境的差异导致的问题而困扰。将我们的服务制作成docker镜像,镜像内包含这些服务依赖的所有基础组件与环境,包括操作系统、JDK等等,将极大的简化我们的部署成本,加上一些服务编排技术和服务动态扩缩容技术,可以让我们的服务具有更好的伸缩性和易用性。

本文将介绍其docker的基本原理,以及如何在实际工作中将我们的应用制作成镜像,并使用,主要内容有

  • docker功能介绍
  • docker安装步骤与配置说明
  • dockerhub官方镜像仓库的使用
  • springboot应用如何构建docker镜像
  • 如何发布镜像到dockerhub
  • 如何构建docker仓库私服,及私服的使用流程
  • docker镜像的使用

原文:传送门

参考文章

1、docker功能介绍
  • docker是一种服务虚拟化技术,类似于WMWare虚拟机提供的功能,但是它更轻量。
  • docker可以管理容器的运行环境、网络、CPU、磁盘、服务的生命周期等等
  • docker主要使用镜像来构建容器服务,这种镜像需要指定服务运行的服务器操作系统和其他基础运行环境、组件,并且包含了这个服务运行的所有的资源。
  • 镜像之间是有依赖关系的,可以依赖一些基础镜像构建新的镜像。
  • 只要镜像构建成功,并能正常工作后,无论发布到任何环境中,都同样能正常工作。
  • 我们可以将我们的服务制作成镜像,然后发布到镜像仓库
  • 利用一些镜像管理平台可以对运行的服务进行编排等等操作
  • docker使用流程图如下

    CICD图例

2、docker安装步骤与配置说明
2.1 CentOS 7或更高版本安装docker服务
  • docker对CentOs7以下的linux系统支持不友好,不建议使用,并且要求系统为64位、系统内核版本为 3.10 以上。
  • 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。
    本文介绍 Docker CE 的安装使用。
    移除旧的版本:
$ yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

安装一些必要的系统工具:
yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存:
yum makecache fast
安装 Docker-ce:
yum -y install docker-ce
启动 Docker 后台服务
service start docker
拉取dockerhub提供的helloworld镜像
docker pull helloworld
构建并允许helloworld容器
docker run hello-world

2.2 window安装docker
  • win7、win8 等需要利用 docker toolbox 来安装,国内可以使用阿里云的镜像来下载,下载地址:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/
  • 安装完后桌面会出现
    • Oracle VM VirtualBox 图标,通过它可以访问docker服务所在的linux虚拟机;
    • Docker Quickstart Terminal 图标,通过它可以启动、访问docker服务;
    • Kitematic (Alpha) 图标,可以下载一些docker镜像;
  • 安装后需要注意的是,使用docker本地仓库和镜像服务时,需要使用docker服务的IP地址,可以通过命令docker-machine env查看docker创建的虚拟机的IP地址,后面所有docker服务暴露出来的端口都将绑定到这个ip上,切记不是localhost。
  • 安装完成后,docker默认会在环境变量中添加dockerHost等信息,当你的应用程序在使用docker构建镜像的时候便会使用这些信息,安装完docker后,最好重启一下IDE,确保这些环境变量能生效
2.3 镜像操作流程说明
  • docker镜像使用流程如下
    1. 查找镜像docker search xxx xxx为镜像名,该命令会到dockerhub上查找包含这个名字的所有镜像,当然也可以通过进入dockerhub官网上去查找镜像
    2. 拉取镜像到本地仓库 docker pull xxx,这个步骤可选
    3. 构建容器并运行 docker run xxx,这个过程可以设置容器运行的参数
    4. 其他操作
      • 查看系统中的容器 docker ps(运行中的), docker ps -a (所有的)
      • 查看容器运行日志 docker logs xxx xxx为容器名或者容器ID
      • 进入镜像内操作 docker run -it xxx /bin/bash xxx为镜像名
      • 进入容器内部操作 docker exec -it xxx /bin/bash xxx为容器名或者容器ID
3、dockerhub的使用
  • 使用官网镜像
    • 搜索镜像,并查看镜像使用说明与镜像版本的选择
    • 利用shell或者cmd,拉取镜像,
  • 创建自己的镜像仓库
    • dockerhub官网注册账号并登录
    • 创建一个镜像仓库
    • 本地构建镜像
    • 本地登录dockerhub账号
    • 为本地镜像打tag
    • 推送镜像到dockerhub
4、springboot应用如何构建docker镜像
4.1 项目目录结构
┍--- src/main/java
┊
├----- StartServer.java
┊
├-- src/java/test
┊
├-- src/main/resources
┊
├----- application.yml	#配置一下web容器端口号
┊
├-- Dockerfile		#构建镜像需要的配置信息
┊
┕-- pom.xml			
4.2 引入项目依赖
  • pom.xml文件内容
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.danyuanblog.docker.demo</groupId>
	<artifactId>helloworld</artifactId>
	<version>v1.0-20191022</version>
	<name>helloworld</name>
	<url>http://www.danyuanblog.com</url>
	<!-- 父构件坐标信息 -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.3.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<docker.image.prefix>localhost:5000/danyuan/helloworld</docker.image.prefix>
	</properties>

	<dependencies>
		<!-- 引入spring boot web模块 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- 引入spring boot测试模块 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<plugin>
				<groupId>com.spotify</groupId>
				<artifactId>dockerfile-maven-plugin</artifactId>
				<version>1.4.9</version>
				<configuration>
					<repository>${docker.image.prefix}/${project.artifactId}</repository>
					<tag>${project.version}</tag>
					<buildArgs>
						<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
					</buildArgs>
				</configuration>
			</plugin>
		</plugins>
	</build>
	
</project>
4.2 配置信息
  • application.yml
server: 
  port: 8188
4.3 编写代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class StartServer {

    @RequestMapping("/")
    public String home() {
        return "Hello Docker World";
    }

    public static void main(String[] args) {
        SpringApplication.run(StartServer.class, args);
    }

}
4.4 编写dockerfile信息
FROM openjdk:8-jdk-alpine

RUN mkdir -p /home/workspace/webapp
RUN mkdir -p /home/workspace/logs
WORKDIR /home/workspace

ARG JAR_FILE

COPY ./target/${JAR_FILE} /home/workspace/webapp/app.jar

VOLUME /tmp
VOLUME /home/workspace/logs

EXPOSE 8188

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/home/workspace/webapp/app.jar"]
4.5 通过maven命令构建镜像
  • 配置dockerhub登陆账号密码,打开maven的setting.xml文件添加如下内容
  <servers>
	<server>
      <id>localhost:5000</id> <!-- dockerhub仓库ID,这里我配置为我的docker私服地址 -->
      <username>xxx</username> <!-- 配置成你的账户名 -->
	  <password>xxxxxx</password> <!-- 配置成你的账户登录密码 -->
    </server>
  </servers>
  • 构建镜像
    `mvn package dockerfile:build’
  • 推送镜像到dockerhub
    mvn verify dockerfile:push
  • 或者直接使用
    mvn deploy 这个命令将直接构建好镜像、再推送到dockerhub,然后再执行部署操作
4.6 指定远程linux服务器构建docker镜像,默认为本机DOCKER_HOST指定的主机

安装windows版的docker后,默认会创建一个64位Linux虚拟机,上面有安装一个docker服务,所有windows上的docker操作都会被代理到该虚拟机上进行执行。
安装完docker后,默认会把DOCKER_HOST等信息配置到系统环境变量里,如果你使用的IDE在docker安装之前启动的,需要重启一下IDE才能生效,不然无法通过Maven插件dockerfile构建镜像,因为默认的DOCKER_HOST值为localhost:2376
通过VM方式创建的docker默认DOCKER_HOST为192.168.99.100:2376,可以通过命令:docker-marchine,实际地址可以通过命令docker-machine env vm进行查看,结果如下所示:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.56.102:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/vm"
export DOCKER_MACHINE_NAME="vm"
5、如何发布镜像到dockerhub
#!/bin/sh
echo "开始制作镜像..."
image_tag=`date +%Y%m%d` #_%H%M
echo "当前时间:$image_tag"
docker build -t danyuanblog/helloworld:v${image_tag} .
echo "制作镜像成功!"
 
echo "登录"
docker login
echo "镜像版本提交"
docker push danyuanblog/helloworld:v${image_tag}
 
echo "镜像最新版本提交"
docker tag danyuanblog/helloworld:v${image_tag} danyuanblog/helloworld:latest
docker push danyuanblog/helloworld:latest
6、如何构建docker仓库私服,私服的使用流程
  • 我们希望有一个Docker仓库,能同时托管私有镜像,还能代理访问公共的镜像仓库。
    正好我们在使用Nexus作为Maven的仓库,同时nexus3提供了Docker, yum, apt, npm, ruby gems, pypi 等诸多类型的仓库功能。
  • 经过技术调研,Nexus3完全可以达到我们的预期。
  • Nexus3 提供了的3种类型的Docker仓库,前两者都可以创建多个仓库,最后一个则可以将他们全部聚合到一个URL来访问。
  • docker (hosted): 自托管
  • docker (proxy): 代理
  • docker (group): 聚合
  • 配置Docker仓库
  • 安装Nexus3

  •   docker search nexus3
      docker pull docker.io/sonatype/nexus3
      mkdir -p /data/nexus3/data
      docker run -id --privileged=true --name=nexus3 --restart=always -p 8081:8081 -p 5000:5000 -v /data/nexus3/data:/var/nexus-data 
    

进入私服管理后台地址:http://localhost:5000, 根据提示进入容器内部打开存储默认密码的文件,找到admin的默认密码,利用该密码登录admin账号后进行修改成自己的密码即可,重新登录admin账号进入界面如下所示:
在这里插入图片描述

  • 进入nexus仓库web控制台,创建一个hosted类型的docker仓库,用来管理自己制作的私有镜像,配置好仓库的基本信息和访问控制等配置即可,如下所示:
    在这里插入图片描述

其中docker-release仓库用来发布我们公司内项目的镜像,docker-hub是官方仓库的镜像仓库,docker-public是一个聚合仓库,用来聚合前面两个仓库,统一提供服务。
docker-release配置示例:
在这里插入图片描述

  • 我们创建镜像名时前缀就是我们私服的地址
  • 使用示例:
#登录账号
docker login --username=danyuanblog localhost:5000 
#推送镜像到仓库
docker push localhost:5000/danyuanblog/helloworld:[镜像版本号]
#拉取镜像
docker pull localhost:5000/danyuanblog/helloworld:[镜像版本号]

注意:docker客户端默认不允许拉取http协议的docker私服,上面的操作默认都不允许,需要配置/etc/docker/daemon.json文件才行。windows系统需要进入VM虚拟机中进行修改,该虚拟机是一个linux64位系统,默认账号docker可以进行ssh连接,密码tcuser,如果需要修改信息需要使用命令sudo -i切换到root账号才行。

daemon.json内容如下:

{
    "insecure-registries": [
        "localhost:5000"
    ]
}

配置完后重启docker服务即可生效

上传到私服成功的镜像如下图所示:
在这里插入图片描述

7、docker镜像的使用
  • 我们使用镜像的时候,只需要创建容器并运行即可
  • 如果多个服务有依赖关系,则需要使用使用到服务编排功能,dockerswarm或一些开源平台、云平台有提供类似的功能,这里就不深究了
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐