Docker 是什么
Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包成一个标准化的单元,这个单元可以在任何支持Docker的环境中运行。
- 轻量级和可移植性:Docker容器相比于传统的虚拟机更加轻量,因为它们不需要额外的操作系统载入,这减少了资源消耗。同时,由于Docker使用容器技术,应用程序和服务可以在不同的环境中以相同的方式运行,这提高了应用的可移植性。
- 隔离性和安全性:每个Docker容器都在自己的隔离环境中运行,这提供了一层安全性,防止了潜在的系统漏洞和冲突。容器之间以及容器与宿主机之间的交互都是可控的,这有助于保护数据和流程的安全。
- 快速和高效:Docker容器可以在几秒钟内启动,这使得开发、测试和部署应用变得更加快速和高效。此外,由于容器的轻量级特性,它们可以在同一台机器上运行更多的实例,从而优化了资源的使用。
- 版本控制和镜像:Docker使用镜像来构建容器,这些镜像可以被版本化并存储在仓库中。这意味着可以追踪镜像的历史版本,并且可以轻松地在不同的环境中部署相同版本的应用。
- 持续集成和部署:Docker与现代软件开发实践如持续集成和持续部署(CI/CD)相结合得很好。通过自动化的构建、测试和部署流程,可以确保软件的快速迭代和稳定发布。
Docker的出现并不是一个全新的概念,而是基于已有的Linux容器技术的改进和简化。它解决了传统虚拟化技术的一些问题,如重量级和不够灵活等。
Docker 常用命令
docker run:创建并启动一个新容器。
示例:运行一个名为 "ubuntu" 的镜像,并在容器中执行 "echo 'Hello, World!'" 命令。
java
docker run ubuntu echo 'Hello, World!'
docker ps:列出当前运行的容器。
示例:列出所有正在运行的容器。
java
docker ps
docker stop:停止一个或多个容器。
示例:停止名为 "mycontainer" 的容器。
java
docker stop mycontainer
docker rm:删除一个或多个容器。
示例:删除名为 "mycontainer" 的容器。
java
docker rm mycontainer
docker images:列出本地存储库中的镜像。
示例:列出本地存储库中的所有镜像。
java
docker images
docker rmi:删除一个或多个镜像。
示例:删除名为 "myimage" 的镜像。
java
docker rmi myimage
docker pull:从远程仓库拉取镜像或仓库到本地。
示例:从 Docker Hub 拉取名为 "ubuntu" 的镜像。
java
docker pull ubuntu
docker push:将本地镜像或仓库推送到远程仓库。
示例:将名为 "myimage" 的镜像推送到 Docker Hub。
java
docker push myimage
docker build:构建 Docker 镜像。
示例:使用名为 "Dockerfile" 的文件构建镜像,并将镜像命名为 "myimage"。
java
docker build -t myimage .
docker logs:输出容器日志信息。
示例:查看名为 "mycontainer" 的容器的日志。
java
docker logs mycontainer
docker exec:在运行的容器中执行命令。
示例:在名为 "mycontainer" 的容器中执行 "ls" 命令。
java
docker exec mycontainer ls
docker inspect:返回容器或镜像的详细信息。
示例:查看名为 "mycontainer" 的容器的详细信息。
java
docker inspect mycontainer
Dockerfile是什么,怎么写
Dockerfile 是一个文本文件,用于描述如何构建一个 Docker 镜像。它包含了一系列的指令和参数,用于定义基础镜像、安装依赖、复制文件等操作。
下面是一个简单的 Dockerfile 示例:
java
# 使用官方的 Java 基础镜像作为基础
FROM openjdk:8-jdk-alpine
# 设置工作目录
WORKDIR /app
# 将当前目录下的所有文件复制到容器中的 /app 目录下
COPY . /app
# 编译 Java 代码
RUN javac Main.java
# 暴露容器的端口,使其可以被外部访问
EXPOSE 8080
# 定义容器启动时执行的命令
CMD ["java", "Main"]
这个 Dockerfile 的作用是:
- 使用官方的 Java 基础镜像作为基础;
- 设置工作目录为
/app
; - 将当前目录下的所有文件复制到容器中的
/app
目录下; - 编译 Java 代码,这里假设有一个名为
Main.java
的文件; - 暴露容器的端口 8080,使其可以被外部访问;
- 定义容器启动时执行的命令,这里运行一个名为
Main
的 Java 类