Docker入门教程:本地打包docker镜像

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

什么是Docker

Dockers是基于Go语言开发的虚拟容器技术。以前我们部署应用通常是将源代码打包成一个jar包运行这样就会受到运行环境、配置环境的限制而且程序也不能跨服务器运行。Docker基于Linux容器技术将Java源代码、运行环境像MySQL、redis、jdk等通通打包成一个镜像实现“一次镜像处处运行”。极大的提高的应用的移植性以及部署的效率。

 简单来说docker是一个解决了运行环境和配置问题的软件容器方便做持续集成并有助于整体发布的容器虚拟化技术。

容器与虚拟机的区别

  • 传统虚拟机技术是虚拟出一套硬件后在其上运行的一个完整的操作系统在该系统上在运行所需应用进程。而Docker不需要捆绑一整套的操作系统它只需要软件工作所需的库资源和设置。

  • Docker容器是在操作系统层面上实现虚拟化直接复用本地主机的操作系统而传统虚拟机则是在硬件层面实现虚拟化Docker依赖于Linux内核环境其实本质上是在已经运行的Linux下制造一个隔离的文件环境。

优点

  •  更轻量基于容器的虚拟化仅包含业务运行所需的runtime环境。
  •  更高效无操作系统虚拟化开销。
  •  更灵活容器隔离devoops理念。

Docker的组成

         docker中有三个基本概念

  • 镜像image一个只读的模板可以用来创建Docker容器。类似于Student类

  • 容器Container容器是镜像创建的运行实例。容器是镜像运行时的实体为镜像提供了一个标准的和隔离的运行环境。它可以被启动、停止、删除每个容器之间都是隔离的。类似于stu实例对象

  • 仓库repository存放镜像文件的地方。比如maven仓库是存放jar包的地方。

类比于--》Student stu = new Student();

docker安装

Linux上安装

# 首先安装 Docker
yum -y install docker

# 然后启动 Docker 服务
service docker start

# 测试安装是否成功
docker -v
    
# 配置阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://******.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Windows上安装下载Docker Desktop配置WSL 

docker run 的执行流程及原理

执行流程

docker是一个client-server结构的系统docker的守护进程运行在主机上。dockerServer接收到docker-client的命令就会执行这个命令。

容器基本操作

docker 中的容器就是一个轻量级的虚拟机是镜像运行起来的一个状态本文就先来看看容器的基本操作。

镜像就像是一个安装程序而容器则是程序运行时的一个状态。

  • 查看容器
#查看正在运行容器
docker ps

#查看所有容器
docker ps -a

#查看最新创建的容器
docker ps -l
  • 创建容器
#创建容器
docker create 镜像
	--创建一个 nginx 容器docker create nginx
	--指定容器的name为nginxdocker create --name=nginx nginx
#创建并启动一个容器
docker run 镜像
	--docker run --name nginx1 -d -p 8080:80 nginx
	--name 含义和上文一样表示创建的容器的名字-d 表示容器在后台运行-p 表示将容器的 80 端口映射到宿主机的 8080 端口
  • 启动关闭容器
#启动容器
docker start id|name
#重启容器
docker restart id|name
#关闭容器
docker stop id|name
  • 删除容器
#单个删除
docker rm id|name
#批量删除
docker rm $(docker ps -a -q)
  • 查看容器信息、日记
#容器详情
docker inspect id|name

#查看容器进程
docker top 

#查看你容器日记
docker logs id|name
		-f 实时日记
		-t : 显示时间
		-tail 控制输出行数
  • 容器导入导出
#导出一个已经创建的容器导到一个文件
docker export -o 文件名.tar 容器id
#将文件导入为镜像
docker import 文件名.tar 镜像名:镜像标签

        docker export -o image-test.tar 1ffcd3e4a201

镜像的基本操作

        镜像是容器运行的基础容器是镜像运行后的形态。镜像是一个包含程序运行必要以来环境和代码的只读文件它采用分层的文件系统将每一层的改变以读写层的形式增加到原来的只读文件上。

  • 查看所有镜像
docker images

  1. TAG: TAG用于区分同一仓库中的不同镜像默认为latest。

  2. IMAGE ID: IMAGE ID是镜像的一个唯一标识符。

  3. CREATED: CREATED表示镜像的创建时间。

  4. SIZE: SIZE表示镜像的大小。

  5. REPOSITORY:仓库名称仓库一般用来存放同一类型的镜像。仓库的名称由其创建者指定。如果没有指定则为 <none>

  •  搜索镜像
docker search name
  • 下载镜像
docker pull name:版本

  版本可以在Docker hub上查看 

  • 删除镜像
docker rmi id|name

Dockerfile

Dockerfile是用来构建docker镜像的构建文件。

其实Dockerfile就是一个普通的文本文件其中包含了一条条的指令每一条指令都会构建一层。

 dockerfile指令

FROM 		#基础镜像一切从这里开始构建
MAINTAINER	#镜像是谁写的姓名+邮箱
RUN			#镜像构建时需要运行的命令
ADD			#步骤tomcat镜像这个tomcat压缩包添加内容
WORKDIR		#镜像工作目录
VOLUME		#挂载的目录
EXPOSE		#暴露端口配置
CMD			#指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT	#指定这个容器启动的时候要运行的命令可以追加命令
ONBUILD		#当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令触发指令
COPY		#类似ADD,将我们的文件拷贝至镜像中
ENV			#构建的时候设置环境变量

  1. FROM nginx 表示该镜像的构建以已有的 nginx 镜像为基础在该镜像的基础上构建。

  2. MAINTAINER 指令用来声明创建镜像的作者信息以及邮箱信息这个命令不是必须的。

  3. RUN 指令用来修改镜像算是使用比较频繁的一个指令了该指令可以用来安装程序、安装库以及配置应用程序等一个 RUN 指令执行会在当前镜像的基础上创建一个新的镜像层接下来的指令将在这个新的镜像层上执行RUN 语句有两种不同的形式shell 格式和 exec 格式。本案例采用的 shell 格式shell 格式就像 linux 命令一样exec 格式则是一个 JSON 数组将命令放到数组中即可。在使用 RUN 命令时适当的时候可以将多个 RUN 命令合并成一个这样可以避免在创建镜像时创建过多的层。

  4. COPY 语句则是将镜像上下文中的 hello.html 文件拷贝到镜像中。

命令解释

  1. -t 参数用来指定镜像的命名空间仓库名以及 TAG 等信息。

  2. 最后面的 . 是指镜像构建上下文。

本地打包docker镜像

下载安装Docker Desktop配置完成后即可在windows CMD上操作docker命令

编写一个简单的springboot项目提供一个helloworld接口

@RestController
public class HelloWorld {


    @GetMapping("/hello")
    public String helloImages() {
        return "hello images!";
    }

}

使用maven插件打包--install--在target包下可以看得到生成的jar包。

 

 编写Dockerfile文件

# 基础镜像使用java
FROM java:8

#作者
MAINTAINER CJC

#将jar包添加到容器中并更名为: hello-docker-image.jar
ADD docker-image-test-0.0.1-SNAPSHOT.jar hello-docker-image.jar

#运行jar包
RUN bash -c 'touch hello-docker-image.jar'
ENTRYPOINT ["java","-jar","hello-docker-image.jar"]

#暴露端口
EXPOSE 8080

 将jar包和dockerfile文件置于同一目录下执行命令构建镜像

docker build -t Name:TagName .

> build -t hello-docker-image:V1.0 .

-t参数指定构建成后镜像的仓库、标签等,
Name 给镜像取的名字
TagName 给镜像取的标签
最后的 .  表示 Dockerfile 文件在当前目录下 

 查看镜像docker images

 创建并启动容器docker run -d -p 8080:8080 6e7772b68332

 docker desktop上可以看到容器正在运行

docker数据卷操作

一般情况下当我们需要将数据从宿主机拷贝到容器中使用的都是docker的拷贝命令。数据卷可以避免这种麻烦的操作。

数据卷可以实现容器和宿主机之间的数据共享简单来说数据卷就是在宿主机和容器之间搭建的一个映射的工作区两者可以同步修改。

docker run -itd --name nginx -v /Users/sang/blog/docker/docker/:/usr/share/nginx/html/ -p 80:80 bc26f1ed35cf

 这样便是将宿主机中的 /Users/sang/blog/docker/docker/ 目录挂载到容器的 /usr/share/nginx/html/ 目录下。接下来读者只需要在 /Users/sang/blog/docker/docker/ 目录下添加 html 文件或者修改 html 文件都能在 nginx 访问中立马看到效果。

查看所有的数据卷

docker volume ls

查看数据卷详情

docker volume inspect

删除数据卷

docker volume rm
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Docker