- 随着docker服务虚拟化技术和Kubernetes(K8S)等容器管理平台的出现,微服务迈上了一个新台阶,我们可以做到服务一次构建,多出运行,不用再为基础环境的差异导致的问题而困扰。将我们的服务制作成docker镜像,镜像内包含这些服务依赖的所有基础组件与环境,包括操作系统、JDK等等,将极大的简化我们的部署成本,加上一些服务编排技术和服务动态扩缩容技术,可以让我们的服务具有更好的伸缩性和易用性。
本文将介绍其docker的基本原理,以及如何在实际工作中将我们的应用制作成镜像,并使用,主要内容有
- docker功能介绍
- docker安装步骤与配置说明
- dockerhub官方镜像仓库的使用
- springboot应用如何构建docker镜像
- 如何发布镜像到dockerhub
- 如何构建docker仓库私服,及私服的使用流程
- docker镜像的使用
原文:传送门
- docker是一种服务虚拟化技术,类似于WMWare虚拟机提供的功能,但是它更轻量。
- docker可以管理容器的运行环境、网络、CPU、磁盘、服务的生命周期等等
- 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
docker-machine env
查看docker创建的虚拟机的IP地址,后面所有docker服务暴露出来的端口都将绑定到这个ip上,切记不是localhost。docker search xxx
xxx为镜像名,该命令会到dockerhub上查找包含这个名字的所有镜像,当然也可以通过进入dockerhub官网上去查找镜像docker pull xxx
,这个步骤可选docker run xxx
,这个过程可以设置容器运行的参数docker ps
(运行中的), docker ps -a
(所有的)docker logs xxx
xxx为容器名或者容器IDdocker run -it xxx /bin/bash
xxx为镜像名docker exec -it xxx /bin/bash
xxx为容器名或者容器ID┍--- src/main/java
┊
├----- StartServer.java
┊
├-- src/java/test
┊
├-- src/main/resources
┊
├----- application.yml #配置一下web容器端口号
┊
├-- Dockerfile #构建镜像需要的配置信息
┊
┕-- pom.xml
<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.0modelVersion>
<groupId>com.danyuanblog.docker.demogroupId>
<artifactId>helloworldartifactId>
<version>v1.0-20191022version>
<name>helloworldname>
<url>http://www.danyuanblog.comurl>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.3.RELEASEversion>
<relativePath />
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
<docker.image.prefix>localhost:5000/danyuan/helloworlddocker.image.prefix>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
<plugin>
<groupId>com.spotifygroupId>
<artifactId>dockerfile-maven-pluginartifactId>
<version>1.4.9version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}repository>
<tag>${project.version}tag>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jarJAR_FILE>
buildArgs>
configuration>
plugin>
plugins>
build>
project>
server:
port: 8188
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);
}
}
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"]
<servers>
<server>
<id>localhost:5000id>
<username>xxxusername>
<password>xxxxxxpassword>
server>
servers>
mvn verify dockerfile:push
mvn deploy
这个命令将直接构建好镜像、再推送到dockerhub,然后再执行部署操作安装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"
#!/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
- 我们希望有一个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账号进入界面如下所示:
其中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服务即可生效