什么是Docker

Docker是指容器化技术,用于支持创建和使用 Linux容器。借助 Docker,我们可将容器当做轻巧、模块化的虚拟机使用。同时,还将获得高度的灵活性,从而实现对容器的高效创建、部署及复制,并能将其从一个环境顺利迁移至另一个环境。

Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。

容器工具(包括 Docker)可提供基于镜像的部署模式。这使得它能够轻松跨多种环境,与其依赖程序共享应用或服务组。Docker 还可在这一容器环境中自动部署应用(或者合并多种流程,以构建单个应用)。

使用Docker时的优势:

模块化:Docker 容器化方法非常注重在不停止整个应用的情况下,单独截取部分应用进行更新或修复的能力。

层和镜像版本控制:每个 Docker 镜像文件都包含多个层。这些层组合在一起,构成单个镜像。每当镜像发生改变时,就会创建一个新的镜像层。用户每次发出命令(例如 run 或 copy)时,都会创建一个新的镜像层。

Docker 重复使用这些层来构建新容器,借此帮助加快流程构建。镜像之间会共享中间变化,从而进一步提升速度、规模以及效率。版本控制是镜像层本身自带的能力。每次发生新的更改时,您大都会获得一个内置的更改日志,实现对容器镜像的全盘管控。

回滚:回滚也许是最值得一提的功能。每个镜像都拥有多个层。举例而言,如果您不喜欢迭代后的镜像版本,完全可以通过回滚,返回之前的版本。这一功能还支持敏捷开发方法,帮助持续实施集成和部署(CI/CD),使其在工具层面成为一种现实。

快速部署:启动和运行新硬件、实施部署并投入使用,这在过去一般需要数天时间。投入的心力和成本往往也让人不堪重负。基于 Docker 的容器可将部署时间缩短到几秒。通过为每个进程构建容器,可以快速将这些类似进程应用到新的应用程序中。而且,由于无需启动操作系统即可添加或移动容器,因此大幅缩短了部署时间。除此之外,得益于这种部署速度,可以轻松无虞、经济高效地创建和销毁容器创建的数据。

因此,Docker 技术是一种更加精细、可控、基于微服务的技术,可为企业提供更高的效率价值。

Docker 本身非常适合用于管理单个容器。但当我们开始使用越来越多的容器和容器化应用,并把它们划分成数百个部分,很可能会导致管理和编排变得非常困难。所以,我们需要对容器实施分组,以便跨所有容器提供网络、安全、遥测等服务。于是,Kubernetes 应运而生。

下面我来讲讲如何安装Docker,如何将一个SpringBoot项目以Docker形式部署。

Docker安装

安装必要工具

#移除旧docker
sudo yum -y remove docker

#
安装yum-utils
sudo yum install -y yum-utils

#
docker仓库
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
   
 #测试仓库安装
sudo yum-config-manager --enable docker-ce-test

#
更新yum包索引
sudo yum makecache fast

#
执行如下命令即可安装最新版本的Docker CE,这个安装也太久了吧
sudo yum install docker-ce docker-ce-cli containerd.io

sudo systemctl start docker

#
运行Docker是否安装正确
sudo docker run hello-world


如何用Docker部署一个SpringBoot项目_java

Docker 拉取 报错【error pulling image configuration】及镜像下载慢问题

原因:出现这个问题原因为网络问题,无法连接到 docker hub。 但国内有 daocloud加速,docker指定该源即可

echo "DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io\"" | sudo tee -a /etc/default/docker
DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io"
12

镜像下载慢问题vi /etc/docker/daemon.json

[root@192]# vi /etc/docker/daemon.json

添加以下内容

{
 "registry-mirrors": ["https://hccwwfjl.mirror.aliyuncs.com"]
}

重新启动Dockersystemctl restart docker

[root@192]# systemctl restart docker

Docker命令

搜索镜像,比如我搜索Java

[root@localhost default]# docker search java

如何用Docker部署一个SpringBoot项目_java_02

该表格包含五列,含义如下:

① NAME:镜像仓库名称。

② DESCRIPTION:镜像仓库描述。

③ STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于GitHub的Stars。

④ OFFICAL:表示是否为官方仓库,该列标记为[OK]的镜像均由各软件的官方项目组创建和维护。由结果可知,java这个镜像仓库是官方仓库,而其他的仓库都不是镜像仓库。

⑤ AUTOMATED:表示是否是自动构建的镜像仓库。

拉取镜像

[root@localhost /]# docker pull java

如何用Docker部署一个SpringBoot项目_java_03

[root@localhost /]# docker images

如何用Docker部署一个SpringBoot项目_java_04

[root@localhost /]# docker run java /bin/echo 'Hello Lvshen'

Hello Lvshen

删除镜像

例1:删除指定名称的镜像。

docker rmi hello-world

表示删除hello-world这个镜像。

例2:删除所有镜像。

docker rmi -f $(docker images)

启动一个Nginx容器

先下载(如果容器不存在),后启动

[root@localhost /]# docker run -d -p 91:80 nginx

如何用Docker部署一个SpringBoot项目_java_05

d                           # 后台运行-
p 宿主机端口:容器端口         # 开放容器端口到宿主机端口

如何用Docker部署一个SpringBoot项目_java_06

成功启动了一个Nginx

如何用Docker部署一个SpringBoot项目_java_07

列出Docker中运行的容器

[root@localhost /]# docker ps

如何用Docker部署一个SpringBoot项目_java_08

停止容器

docker stop d629e156b2de

#
强制停止
docker kill d629e156b2de

其中 784fd3b294d7 是容器ID,当然也可使用 docker stop容器名称 来停止指定容器。

启动已经停止的容器

docker start d629e156b2de

#重启
docker restart d629e156b2de

获取容器的PID

[root@localhost /]# docker ps
CONTAINER ID     IMAGE    COMMAND               CREATED             STATUS              PORTS               NAMES
37be3ade2e6c     nginx   "/docker-entrypoint.…"  14 seconds ago    Up 13 seconds    0.0.0.0:91->80/tcp  friendly_goldwasser
[root@localhost /]# docker inspect --format "{{.State.Pid}}" 37be3ade2e6c
10336

进入容器

nsenter --target 10336 --mount --uts --ipc --net --pid

如何用Docker部署一个SpringBoot项目_java_09

也可以

docker exec -it 37be3ade2e6c /bin/bash
tee index.html <<-'EOF'
Welcome to Lvshen docker class
EOF

Dockerfile

mkdir mynginx
cd mynginx
vi Dockerfile
FROM nginx 
RUN echo '<h1>Welcome to Lvshen's House</h1>' > /usr/share/nginx/html/index.html

当前目录构建镜像

[root@localhost mynginx]# docker build -t nginx:my .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
 ---> 08393e824c32
Step 2/2 : RUN echo '<h1>Lvshen的技术小屋</h1>' > /usr/share/nginx/html/index.html
 ---> Running in 3da16485101a
Removing intermediate container 3da16485101a
 ---> 42a8e4205a55
Successfully built 42a8e4205a55
Successfully tagged nginx:my

启动镜像

[root@localhost mynginx]# docker run -d -p 93:80 nginx:my

如何用Docker部署一个SpringBoot项目_java_10

Dockerfile构建一个SpringBoot镜像

接下来我们将microservice-discovery-eureka-ha-0.0.1-SNAPSHOT.jar部署成Docker镜像

如何用Docker部署一个SpringBoot项目_java_11

编辑Dockerfile文件

# 基于哪个镜像
FROM java:8
# 将本地文件夹挂载到当前容器
VOLUME /tmp
# 拷贝文件到容器,也可以直接写成ADD xxxxx.jar /app.jar
ADD microservice-discovery-eureka-ha-0.0.1-SNAPSHOT.jar app.jar 
RUN bash -c 'touch /app.jar'
# 声明需要暴露的端口
EXPOSE 8761
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

构建

docker build -t lvshen/microservice-discovery-eureka-ha:0.0.1 .

如何用Docker部署一个SpringBoot项目_java_12

启动

[root@localhost mydocker]# docker run -d -p 8761:8761 lvshen/microservice-discovery-eureka-ha:0.0.1

如何用Docker部署一个SpringBoot项目_java_13

登录docker hub

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: itmuch
Password: 
Login Succeeded

推送到Docker hub

docker push lvshen/microservice-discovery-eureka-ha:0.0.1

如何用Docker部署一个SpringBoot项目_java_14

如何用Docker部署一个SpringBoot项目_java_15当然,上面的方法只是最原始的方法,实际应用中可以配合Maven将项目构建成镜像,然后推送到Docker Hub或者私服中。