容器化部署的好处 Docker
作为一种新兴的虚拟化方式,它可以更高效的利用系统资源,不需要进行硬件虚拟以及运行完整操作系统等额外开销。 传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker
容器应用,由于直接运行宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
最重要的是一致的运行环境 。Docker
的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。从而达到真正意义上的 一次构建,到处执行
。
构建镜像 Dockerfile 接着我们开始使用 Dockerfile
来定制我们的镜像,从而达到容器化的目的。Dockerfile 的本质就是将一系列修改、安装、构建、操作的命令整合到一起,去构建一个个性化的镜像 ,以达到一次构建,到处运行 。接下来我们就来构建自定义镜像。
在my-project-server
模块下创建docker
目录,在docker
目录下创建Dockerfile
。代码如下:
FROM openjdk:8-jre MAINTAINER Micromaple <micromaple@qq.com> RUN mkdir /app COPY my-project-server-1.0.0-SNAPSHOT.jar /app/app.jar ENTRYPOINT ['java' , '-Djava.security.egd=file:/dev/./urandom' , '-jar' , '/app/app.jar' , '--spring.profiles.active=prod,druid-prod' ] EXPOSE 8899
FROM
:指定基础镜像 ,项目是使用jdk8
开发的项目,所以我们指定的基础镜像为openjdk:8-jre
COPY
:将宿主机当前目录下的my-project-server-1.0.0-SNAPSHOT.jar
文件拷贝到app
目录下,并重命名为app.jar
开始构建 在虚拟机创建目录
mkdir -p /usr/local /docker/my-project/docker
将打包后的my-project-server-1.0.0-SNAPSHOT.jar
文件和Dockerfile
文件上传至该目录。 执行镜像构建命令
docker build -t my-project-server:v1 .
构建成功
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE my-project-server v1 ed30386b06d2 11 seconds ago 334MB openjdk 8-jre 26ac3f63d29f 9 months ago 273MB
搭建私服 搭建 Docker Registry 创建目录
mkdir -p /usr/local /docker/registry
在该目录下创建Docker Registry
的 docker-compose.yml
。内容如下:
cd /usr/local /docker/registry
version: '3.1' services: registry: image: registry restart: always container_name: registry ports: - 5000 :5000 volumes: - ./data:/var/lib/registry
启动容器
docker-compose up -d
搭建 Docker Registry WebUI 创建目录
mkdir -p /usr/local /docker/docker-registry-frontend
在该目录下创建Docker Registry
的 docker-compose.yml
。内容如下:
cd /usr/local /docker/docker-registry-frontend
version: '3.1' services: frontend: image: konradkleine/docker-registry-frontend:v2 ports: - 8080 :80 volumes: - ./certs/frontend.crt:/etc/apache2/server.crt:ro - ./certs/frontend.key:/etc/apache2/server.key:ro environment: - ENV_DOCKER_REGISTRY_HOST=192.168.110.158(Docker仓库的IP) - ENV_DOCKER_REGISTRY_PORT=5000
需要将ENV_DOCKER_REGISTRY_HOST
的值更改为自己搭建的 DockerRegistry
服务的IP。
启动容器
docker-compose up -d
浏览器访问http://192.168.110.158:8080/
,效果如下:
客户端配置 在需要上传 Docker
镜像的客户端需配置daemon.json
,完整路径在 /etc/docker/daemon.json
vi /etc/docker/daemon.json
需增加如下内容:
'insecure-registries' : [ 'Docker仓库的IP:5000' ]
完整daemon.json
内容:
{ 'registry-mirrors' : [ 'https://xxx.mirror.' ], 'insecure-registries' : [ '192.168.110.158:5000' ] }
registry-mirrors
:为镜像加速地址,这里为我自己申请的加速地址。大家可以自己申请一个,也可以在网上找一个。insecure-registries
:Docker仓库的IP。重新启动服务
systemctl daemon-reload systemctl restart docker
上传私服 搭建以及配置完成后,需要将我们之前构建的镜像上传至我们自己的Docker仓库。
查看镜像
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE my-project-server v1 6af7d633afb7 5 seconds ago 334MB openjdk 8-jre 26ac3f63d29f 9 months ago 273MB
镜像标记 使用 docker tag
将 my-project-server:v1
这个镜像标记为 192.168.110.158:5000/my-project-server:v1
。
192.168.110.158
为我的Docker仓库的IP。
格式为:docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
命令如下:
docker tag my-project-server:v1 192.168.110.158:5000/my-project-server:v1
标记后,查看镜像
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.110.158:5000/my-project-server v1 6af7d633afb7 3 minutes ago 334MB my-project-server v1 6af7d633afb7 3 minutes ago 334MB openjdk 8-jre 26ac3f63d29f 9 months ago 273MB
镜像上传 使用 docker push
上传镜像。
$ docker push 192.168.110.158:5000/my-project-server The push refers to repository [192.168.110.158:5000/my-project-server] 5b9e874b9f9c: Pushed e87c042d22f8: Pushed b4cfcb8385a8: Pushed 2b730cf18c09: Pushed edeaba958753: Pushed 8bf42db0de72: Pushed 31892cc314cb: Pushed 11936051f93b: Pushed v1: digest: sha256:5c8a0efff409649a389d0bc74dda94ca96e67e87c92673b4c7dad0078657af40 size: 2000
查看镜像 使用 curl
查看 192.168.110.158:5000/v2/_catalog
地址,可以看到上传成功的镜像
$ curl 192.168.110.158:5000/v2/_catalog {'repositories' :['my-project-server' ]}
这里我们可以成功的看到我们上传的镜像。
我们也可以在我们刚刚搭建的WebUI上可视化的查看我们的镜像。效果图如下:
验证 此时我们将本地镜像删除,尝试从私有仓库下载这个镜像
先删除已有镜像
docker rmi my-project-server:v1 192.168.110.158:5000/my-project-server:v1
下载镜像
docker pull 192.168.110.158:5000/my-project-server:v1
$ docker pull 192.168.110.158:5000/my-project-server:v1 v1: Pulling from my-project-server 0e29546d541c: Already exists 9b829c73b52b: Already exists cb5b7ae36172: Already exists 99ce012bef04: Already exists 22dc2a72d098: Already exists 9c69a57e10d9: Already exists 776f54050ab5: Pull complete 65a83a9a7871: Pull complete Digest: sha256:5c8a0efff409649a389d0bc74dda94ca96e67e87c92673b4c7dad0078657af40 Status: Downloaded newer image for 192.168.110.158:5000/my-project-server:v1 192.168.110.158:5000/my-project-server:v1 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.110.158:5000/my-project-server v1 6af7d633afb7 15 minutes ago 334MB openjdk 8-jre 26ac3f63d29f 9 months ago 273MB
我们可以看到可以正常拉取。
容器启动 镜像构建并上传至完成后,可以直接使用Docker Compose
来启动容器。实现一次构建到处运行。
创建目录
mkdir -p /usr/local /docker/my-project
在该目录下创建Docker Registry
的 docker-compose.yml
。内容如下:
cd /usr/local /docker/my-project
version: '3.1' services: my_project_server: image: 192.168.110.158 :5000/my-project-server:v1 container_name: my-project-server restart: always ports: - 8899 :8899 volumes: - ./logs:/logs environment: TZ: Asia/Shanghai
启动容器
docker-compose up -d
查看容器启动状态
docker ps -a
访问查询所有用户接口
http://ip:8899/sys-user/get/all