什么是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 拉取 报错【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
该表格包含五列,含义如下:
① NAME:镜像仓库名称。
② DESCRIPTION:镜像仓库描述。
③ STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于GitHub的Stars。
④ OFFICAL:表示是否为官方仓库,该列标记为[OK]的镜像均由各软件的官方项目组创建和维护。由结果可知,java这个镜像仓库是官方仓库,而其他的仓库都不是镜像仓库。
⑤ AUTOMATED:表示是否是自动构建的镜像仓库。
拉取镜像
[root@localhost /]# docker pull java
[root@localhost /]# docker images
[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
d # 后台运行-
p 宿主机端口:容器端口 # 开放容器端口到宿主机端口
成功启动了一个Nginx
列出Docker中运行的容器
[root@localhost /]# docker ps
停止容器
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 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
Dockerfile构建一个SpringBoot镜像
接下来我们将microservice-discovery-eureka-ha-0.0.1-SNAPSHOT.jar
部署成Docker镜像
编辑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 .
启动
[root@localhost mydocker]# docker run -d -p 8761:8761 lvshen/microservice-discovery-eureka-ha:0.0.1
登录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
当然,上面的方法只是最原始的方法,实际应用中可以配合Maven将项目构建成镜像,然后推送到Docker Hub或者私服中。