简介
- 随着docker服务虚拟化技术和Kubernetes(K8S)等容器管理平台的出现,微服务迈上了一个新台阶,我们可以做到服务一次构建,多出运行,不用再为基础环境的差异导致的问题而困扰。将我们的服务制作成docker镜像,镜像内包含这些服务依赖的所有基础组件与环境,包括操作系统、JDK等等,将极大的简化我们的部署成本,加上一些服务编排技术和服务动态扩缩容技术,可以让我们的服务具有更好的伸缩性和易用性。
本文将介绍其docker的基本原理,以及如何在实际工作中将我们的应用制作成镜像,并使用,主要内容有
- docker功能介绍
- docker安装步骤与配置说明
- dockerhub官方镜像仓库的使用
- springboot应用如何构建docker镜像
- 如何发布镜像到dockerhub
- 如何构建docker仓库私服,及私服的使用流程
- docker镜像的使用
原文:传送门
参考文章
1、docker功能介绍
- docker是一种服务虚拟化技术,类似于WMWare虚拟机提供的功能,但是它更轻量。
- docker可以管理容器的运行环境、网络、CPU、磁盘、服务的生命周期等等
- docker主要使用镜像来构建容器服务,这种镜像需要指定服务运行的服务器操作系统和其他基础运行环境、组件,并且包含了这个服务运行的所有的资源。
- 镜像之间是有依赖关系的,可以依赖一些基础镜像构建新的镜像。
- 只要镜像构建成功,并能正常工作后,无论发布到任何环境中,都同样能正常工作。
- 我们可以将我们的服务制作成镜像,然后发布到镜像仓库
- 利用一些镜像管理平台可以对运行的服务进行编排等等操作
-
docker使用流程图如下
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镜像使用流程如下
- 查找镜像
docker search xxx
xxx为镜像名,该命令会到dockerhub上查找包含这个名字的所有镜像,当然也可以通过进入dockerhub官网上去查找镜像 - 拉取镜像到本地仓库
docker pull xxx
,这个步骤可选 - 构建容器并运行
docker run xxx
,这个过程可以设置容器运行的参数 - 其他操作
- 查看系统中的容器
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或一些开源平台、云平台有提供类似的功能,这里就不深究了