docker基础知识点及使用
1. docker是用来做什么的
Docker是一个开源的平台,用于开发、运维和部署应用程序。它通过容器化技术,将应用程序及其所有依赖项打包在一起,确保在任何环境中都能一致地运行。
- 用例1:开发环境一致性
例子:假设你的团队有多个开发成员,他们各自的开发环境(如操作系统、库版本等)都不相同。这可能导致“在我机器上可以运行”的问题。使用Docker,每个开发者可以在相同的容器镜像中开发应用程序,保证了所有人使用的环境一致性。
- 用例2:微服务架构
例子:在构建微服务架构时,一个电商应用可以被分成多个微服务,比如用户服务、商品服务和订单服务等。每个微服务都可以在一个单独的Docker容器中运行,开发和部署非常灵活。比如,你可以同时更新订单服务而不影响用户服务。
- 用例3:持续集成/持续交付(CI/CD)
例子:在一个CI/CD流程中,你可以使用Docker来创建构建环境和测试环境。每次推送代码时,持续集成系统(如Jenkins、GitLab CI等)可以拉取最新的Docker镜像,运行测试,从而自动化代码的构建和验证。例如,你的测试用例可以在指定的Docker镜像中运行,以确保代码在任何环境中都可以正常工作。
- 用例4:快速部署
例子:在生产环境中部署应用程序时,使用Docker可以显著缩短部署时间。例如,一个Web应用程序可以在Docker容器中运行,当你需要更新应用时,只需构建一个新的镜像,停止旧的容器,再启动新的容器。这种方式使得回滚也非常简单,只需重新启动之前的容器即可。
- 用例5:隔离和安全性
例子:假如你需要在同一台服务器上运行多个版本的同一个应用,使用Docker容器可以实现这一点。比如,你的团队正在开发一个Python应用。你可以用Docker来运行Python 2.x 和 Python 3.x 的不同版本,同时进行测试和开发,而不会导致依赖冲突。
2. docker中的几个重要概念
(1)镜像
镜像是一个静态的、只读的模板,包含了创建容器所需的一切内容。这包括:
- 应用程序代码
- 运行时环境(如Python、Node.js等)
- 依赖库
- 应用的配置文件
它可以被多次使用和分发,你可以从镜像创建多个容器。
镜像的特点
可重用性:镜像可以创建多个容器,每个容器都是一份独立的运行环境。
只读性:镜像本身是不会改变的。你可以根据它创建容器,容器在运行时的改动不会反作用于镜像。
(2)容器
容器是镜像的一个运行实例。想象它像是从镜像制作出来的一个具体、可操作的实体。容器是动态的,有自己的状态,可以读写数据。
通过容器,可以运行实际的应用程序,对外提供服务,与外界进行交互。
容器的特点:
隔离性:每个容器都是隔离的,彼此之间不会干扰。
可变性:容器是可以运行、停止、删除和修改的。你可以对容器进行操作(如存储数据、进行计算等),但这些操作只会影响该容器。
总结关系:
镜像是蓝图:它的构建是静态的,定义了如何创建容器。
容器是实例:它是动态的、可以运行的实例,执行具体的任务,拥有自己的状态和数据。
(3)Dockfile
Dockerfile 是一个文本文件,包含了一系列的指令,用来定义如何构建 Docker 镜像。每个 Dockerfile 都是一个规范化的过程,描述了如何在容器化环境中自动化地构建和配置应用程序。
FROM openjdk:8
ADD demo-1.0-SNAPSHOT.jar /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
以下为代码的解释:
FROM openjdk:8
指定基础镜像为 OpenJDK 8。这个镜像内包含了 Java 运行环境,适合用于运行 Java 应用程序。
ADD demo-1.0-SNAPSHOT.jar /app.jar
将本地的 demo-1.0-SNAPSHOT.jar 文件添加到容器的根目录下,并重命名为 /app.jar。ADD 指令不仅可以复制文件,还可以解压 tar 文件或从 URL 下载文件。
RUN bash -c 'touch /app.jar'
这一行的使命是更新 /app.jar 文件的时间戳,使文件看起来是新创建的。一般情况下,这一步不是必要的,除非您有特定需要。可以考虑去掉。
ENTRYPOINT ["java", "-jar", "/app.jar"]
指定容器启动时执行的命令。这里是用 java -jar 运行 /app.jar 文件。这行代码确保容器在启动时运行 Java 应用。
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
这行代码设置容器的时区为上海时区。cp 命令将时区文件复制到 /etc/localtime,同时通过 echo 文件设置时区。
3. docker常用操作
#【查看当前正在运行的容器】
docker ps
#【查看所有容器,包括运行中的和未启动的】
docker ps -a
4. 构建并运行 Docker 镜像
以下是如何使用这个 Dockerfile 的步骤:
(1)确保 Dockerfile 和要添加到镜像中的文件(比如 JAR 文件)在同一目录内。例如:
(2)构建 Docker 镜像
在包含 Dockerfile 和 JAR 文件的目录中,运行以下命令构建 Docker 镜像。假设镜像名称为 demo:
docker build -t demo .
该命令会读取当前目录中的 Dockerfile,并构建镜像。
打包一个名为demo的镜像到本地镜像仓库中
-t:添加一个标签,如果什么都不写就是lasted标签
demo:自定义一个镜像名字,注意允许有大写字母
.(点):指定构建上下文为当前目录 /path/to/demo
。这意味着 Dockerfile
和 demo-1.0-SNAPSHOT.jar
文件都可以在这个上下文中被找到。
【报错】
【解决】
\# 拉取一下openjdk:8 镜像
docker pull openjdk:8
(3) 运行 Docker 容器
构建成功后,可以用下面的命令启动容器:
docker run -d -p 8888:8888 --name demo-app demo
然后就可以在浏览器访问了
左侧的数字(主机端口)是要访问的端口。
右侧的数字(容器端口)是在容器中运行应用的端口。
在上述命令中:
-d 表示以分离模式(后台)运行容器。
-p 8888:8888 将容器的 8888 端口映射到主机的 8888 端口(假设 Spring Boot 应用在该端口上监听)。
docker run -d -p 8888:8888 --name demo-app demo
然后就可以在浏览器访问了
左侧的数字(主机端口)是要访问的端口。
右侧的数字(容器端口)是在容器中运行应用的端口。
在上述命令中:
-d
表示以分离模式(后台)运行容器。
-p 8888:8888
将容器的 8888 端口映射到主机的 8888 端口(假设 Spring Boot 应用在该端口上监听)。
--name demo-app
为容器指定一个名字,方便后续管理。