目录
- [一、Docker 简介](#一、Docker 简介)
- [二、Docker 的安装与配置](#二、Docker 的安装与配置)
- [三、Docker 的基本命令](#三、Docker 的基本命令)
- [四、Dockerfile 详解](#四、Dockerfile 详解)
- [五、Docker 容器的网络配置](#五、Docker 容器的网络配置)
- [六、Docker 容器的数据存储](#六、Docker 容器的数据存储)
- [七、Docker 入门案例](#七、Docker 入门案例)
- [八、Docker 的高级应用](#八、Docker 的高级应用)
一、Docker 简介
Docker 是一个开源的容器化平台,它可以让开发者将应用程序及其依赖项打包到一个可移植的容器中,从而实现快速部署、可扩展性和一致性。Docker 的出现极大地改变了软件开发和部署的方式,使得应用程序的开发、测试和部署更加高效和可靠。
(一)Docker 的历史
Docker 最初是由 Solomon Hykes 在 2013 年创建的一个开源项目,其灵感来源于集装箱运输的理念。就像集装箱可以将货物标准化并方便地在不同的运输工具之间转运一样,Docker 容器可以将应用程序及其依赖项打包成一个标准化的单元,从而方便地在不同的计算环境中部署和运行。
(二)Docker 的核心概念
- 镜像(Image)
- 镜像是一个只读的模板,它包含了运行一个特定应用程序所需的所有文件和依赖项。镜像可以被看作是一个轻量级的虚拟机,它只包含了应用程序运行所需的最小环境,而不包含操作系统内核。
- 镜像可以通过 Dockerfile 来构建,Dockerfile 是一个文本文件,它包含了一系列的指令,用于描述如何构建一个镜像。
- 容器(Container)
- 容器是镜像的运行实例,它是一个独立的运行环境,包含了应用程序及其所有的依赖项。容器可以在不同的主机上运行,并且可以在不同的环境中保持一致的行为。
- 容器之间是相互隔离的,它们之间不能直接访问对方的文件系统和资源。容器的隔离性使得应用程序可以在不同的环境中安全地运行,而不会相互干扰。
- 仓库(Repository)
- 仓库是用来存储和管理镜像的地方,它可以是一个本地仓库,也可以是一个远程仓库。远程仓库通常是由 Docker 官方或第三方提供的,用户可以从远程仓库中下载镜像,并将自己构建的镜像上传到远程仓库中。
- 仓库中的镜像可以通过标签(Tag)来进行版本管理,用户可以根据自己的需要选择不同版本的镜像来运行容器。
(三)Docker 的优势
- 快速部署
- Docker 容器可以在几秒钟内启动,而传统的虚拟机需要几分钟甚至更长时间才能启动。这使得应用程序的部署速度大大加快,从而提高了开发和部署的效率。
- 可移植性
- Docker 容器可以在不同的操作系统和云平台上运行,而不需要进行任何修改。这使得应用程序可以在不同的环境中轻松地迁移和部署,从而提高了应用程序的可移植性。
- 一致性
- Docker 容器可以保证应用程序在不同的环境中运行时具有一致的行为。这是因为容器包含了应用程序及其所有的依赖项,而不依赖于主机的操作系统和环境。
- 资源隔离
- Docker 容器之间是相互隔离的,它们之间不能直接访问对方的文件系统和资源。这使得应用程序可以在不同的环境中安全地运行,而不会相互干扰。
- 易于管理
- Docker 提供了一系列的命令和工具,使得容器的管理变得非常简单。用户可以轻松地启动、停止、删除容器,以及查看容器的状态和日志等。
二、Docker 的安装与配置
(一)安装 Docker
-
在 Linux 系统上安装 Docker
-
大多数 Linux 发行版都可以通过包管理器来安装 Docker。例如,在 Ubuntu 系统上,可以使用以下命令来安装 Docker:
sudo apt-get update sudo apt-get install docker.io
-
安装完成后,可以使用以下命令来启动 Docker 服务:
sudo service docker start
-
-
在 Windows 和 Mac 系统上安装 Docker
- Docker 提供了专门的安装程序,用于在 Windows 和 Mac 系统上安装 Docker。用户可以从 Docker 官方网站上下载安装程序,并按照安装向导进行安装。
(二)配置 Docker
-
配置 Docker 仓库
- Docker 默认使用 Docker Hub 作为远程仓库,用户可以从 Docker Hub 上下载镜像。但是,由于网络原因,有时候可能无法访问 Docker Hub。在这种情况下,用户可以配置自己的私有仓库或者使用国内的镜像源。
- 配置私有仓库的方法可以参考 Docker 官方文档。配置国内镜像源的方法如下:
-
在 Ubuntu 系统上,可以编辑
/etc/docker/daemon.json
文件,添加以下内容:{ "registry-mirrors": ["https://registry.docker-cn.com"] }
-
保存文件后,重新启动 Docker 服务:
sudo service docker restart
-
-
配置 Docker 网络
- Docker 容器之间可以通过网络进行通信,Docker 提供了几种不同的网络模式,用户可以根据自己的需要进行选择。
- 默认情况下,Docker 容器使用桥接网络模式,这种模式下,容器可以通过 IP 地址进行通信。但是,在某些情况下,可能需要使用其他网络模式,例如 host 模式、overlay 模式等。
- 配置 Docker 网络的方法可以参考 Docker 官方文档。
三、Docker 的基本命令
(一)镜像相关命令
-
docker pull
:从远程仓库中拉取镜像。-
例如,要拉取一个名为
nginx
的镜像,可以使用以下命令:docker pull nginx
-
-
docker images
:列出本地所有的镜像。- 执行该命令后,会显示本地所有镜像的列表,包括镜像的名称、标签、大小等信息。
-
docker rmi
:删除本地的一个或多个镜像。-
例如,要删除一个名为
nginx
的镜像,可以使用以下命令:docker rmi nginx
-
-
docker tag
:为镜像打标签。-
例如,要为一个名为
nginx
的镜像打一个名为my-nginx
的标签,可以使用以下命令:docker tag nginx my-nginx
-
(二)容器相关命令
-
docker run
:启动一个容器。-
例如,要启动一个名为
nginx
的容器,可以使用以下命令:docker run -d --name nginx nginx
-
上述命令中,
-d
表示以守护式(后台)模式运行容器,--name
表示为容器指定一个名称。
-
-
docker ps
:列出正在运行的容器。- 执行该命令后,会显示正在运行的容器的列表,包括容器的 ID、名称、镜像、状态等信息。
-
docker stop
:停止一个正在运行的容器。-
例如,要停止一个名为
nginx
的容器,可以使用以下命令:docker stop nginx
-
-
docker start
:启动一个已停止的容器。-
例如,要启动一个名为
nginx
的容器,可以使用以下命令:docker start nginx
-
-
docker restart
:重启一个正在运行的容器。-
例如,要重启一个名为
nginx
的容器,可以使用以下命令:docker restart nginx
-
-
docker rm
:删除一个已停止的容器。-
例如,要删除一个名为
nginx
的容器,可以使用以下命令:docker rm nginx
-
(三)其他命令
-
docker exec
:在运行中的容器中执行命令。-
例如,要在一个名为
nginx
的容器中执行一个ls
命令,可以使用以下命令:docker exec nginx ls
-
-
docker logs
:查看容器的日志。-
例如,要查看一个名为
nginx
的容器的日志,可以使用以下命令:docker logs nginx
-
-
docker inspect
:查看容器的详细信息。-
例如,要查看一个名为
nginx
的容器的详细信息,可以使用以下命令:docker inspect nginx
-
四、Dockerfile 详解
(一)Dockerfile 的基本结构
-
Dockerfile 是一个文本文件,它包含了一系列的指令,用于描述如何构建一个镜像。
-
Dockerfile 的基本结构如下:
# 注释 FROM 基础镜像 RUN 命令 COPY 源文件 目标文件 CMD 命令 ENTRYPOINT 命令
-
其中,
FROM
指令用于指定基础镜像,RUN
指令用于在构建镜像时执行命令,COPY
指令用于将文件从主机复制到镜像中,CMD
和ENTRYPOINT
指令用于指定容器启动时要执行的命令。
(二)常用指令详解
-
FROM
指令-
FROM
指令用于指定基础镜像,它是 Dockerfile 中的第一个指令。 -
例如,要基于一个名为
ubuntu
的镜像构建一个新的镜像,可以使用以下指令:FROM ubuntu
-
-
RUN
指令-
RUN
指令用于在构建镜像时执行命令,它可以执行任何 shell 命令或脚本。 -
例如,要在构建镜像时安装一个软件包,可以使用以下指令:
RUN apt-get update && apt-get install -y software-package
-
-
COPY
指令-
COPY
指令用于将文件从主机复制到镜像中,它可以复制单个文件或整个目录。 -
例如,要将主机上的一个文件复制到镜像中,可以使用以下指令:
COPY file.txt /destination/
-
-
CMD
指令-
CMD
指令用于指定容器启动时要执行的命令,它可以是一个 shell 命令或脚本。 -
例如,要在容器启动时执行一个
python
脚本,可以使用以下指令:CMD ["python", "script.py"]
-
-
ENTRYPOINT
指令-
ENTRYPOINT
指令用于指定容器启动时要执行的命令,它与CMD
指令的区别在于,ENTRYPOINT
指令指定的命令是容器的默认入口点,而CMD
指令指定的命令是作为参数传递给ENTRYPOINT
指令指定的命令的。 -
例如,要在容器启动时执行一个
python
脚本,可以使用以下指令:ENTRYPOINT ["python"] CMD ["script.py"]
-
(三)构建镜像
- 使用 Dockerfile 构建镜像的方法如下:
-
在包含 Dockerfile 的目录下,执行以下命令:
docker build -t 镜像名称.
-
其中,
-t
选项用于指定镜像的名称,.
表示当前目录,即 Dockerfile 所在的目录。
-
- 构建镜像时,Docker 会按照 Dockerfile 中的指令依次执行,每执行一条指令都会创建一个新的中间层,最终生成一个完整的镜像。
五、Docker 容器的网络配置
(一)Docker 网络模式
- Docker 提供了几种不同的网络模式,用户可以根据自己的需要进行选择。
- 常见的网络模式有:
- bridge 模式:这是 Docker 的默认网络模式,容器之间通过 IP 地址进行通信。
- host 模式:容器与主机共享网络栈,容器可以直接访问主机的网络资源。
- overlay 模式:用于在多个 Docker 主机之间创建一个虚拟网络,容器可以在这个虚拟网络中进行通信。
- macvlan 模式:为容器分配一个独立的 MAC 地址,使其可以直接连接到物理网络。
(二)网络配置方法
-
使用
docker run
命令启动容器时,可以通过-p
选项将主机的端口映射到容器的端口,从而实现容器与外部网络的通信。-
例如,要将主机的 8080 端口映射到容器的 80 端口,可以使用以下命令:
docker run -d -p 8080:80 nginx
-
-
可以使用
docker network create
命令创建一个自定义的网络,然后将容器连接到这个网络中,从而实现容器之间的通信。-
例如,要创建一个名为
my-network
的网络,可以使用以下命令:docker network create my-network
-
然后,使用
docker run
命令启动容器时,可以通过--network
选项将容器连接到这个网络中:docker run -d --network my-network nginx
-
六、Docker 容器的数据存储
(一)数据卷(Volume)
- 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过了 Union File System,可以提供一些用于持续存储或共享数据的功能。
- 使用数据卷的方法如下:
-
使用
docker run
命令启动容器时,可以通过-v
选项将主机的目录挂载到容器中,从而实现数据的持久化存储。docker run -d -v /host/directory:/container/directory nginx
-
上述命令中,
/host/directory
是主机上的目录,/container/directory
是容器中的目录。容器中的应用程序可以将数据写入到/container/directory
目录中,这些数据将被持久化存储在主机的/host/directory
目录中。
-
- 可以使用
docker volume create
命令创建一个数据卷,然后将容器连接到这个数据卷中,从而实现数据的持久化存储。-
例如,要创建一个名为
my-volume
的数据卷,可以使用以下命令:docker volume create my-volume
-
然后,使用
docker run
命令启动容器时,可以通过-v
选项将容器连接到这个数据卷中:docker run -d -v my-volume:/container/directory nginx
-
(二)数据卷容器
- 数据卷容器是一个专门用于提供数据卷的容器,其他容器可以通过挂载这个容器来实现数据的共享。
- 使用数据卷容器的方法如下:
-
首先,创建一个数据卷容器:
docker create -v /data --name data-container ubuntu
-
然后,使用
docker run
命令启动其他容器时,可以通过--volumes-from
选项将容器连接到这个数据卷容器中:docker run -d --volumes-from data-container nginx
-
七、Docker 入门案例
(一)创建一个简单的 Java Web 应用
-
使用 Java 开发工具(如 IntelliJ IDEA 或 Eclipse)创建一个简单的 Maven 或 Gradle 项目。
-
创建一个简单的 Servlet,例如:
javaimport javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class HelloWorldServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>Hello, Docker and Java!</h1>"); out.println("</body></html>"); } }
-
在项目的 web.xml 文件中配置 Servlet:
xml<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class>HelloWorldServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
-
编译项目并生成 war 文件。
(二)创建 Dockerfile
-
在项目的根目录下创建一个名为
Dockerfile
的文件,内容如下:FROM tomcat:8.0-jre8-alpine COPY target/*.war /usr/local/tomcat/webapps/
-
这个 Dockerfile 使用 Alpine 版本的 Tomcat 8.0 作为基础镜像,将项目生成的 war 文件复制到 Tomcat 的 webapps 目录下。
(三)构建和运行容器
-
在包含 Dockerfile 和 war 文件的目录下,执行以下命令构建镜像:
docker build -t my-java-web-app.
-
执行以下命令启动容器:
docker run -d -p 8080:8080 my-java-web-app
-
打开浏览器,访问
http://localhost:8080/项目名称/hello
,即可看到"Hello, Docker and Java!"的页面。
八、Docker 的高级应用
(一)Docker Compose
-
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用一个 YAML 文件来配置应用程序的服务,然后可以使用一个命令来启动、停止和管理整个应用程序。
-
例如,可以创建一个名为
docker-compose.yml
的文件,用于定义一个包含 Java 应用和数据库的多容器应用:yamlversion: '3' services: app: build:. ports: - "8080:8080" db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: myapp MYSQL_USER: myuser MYSQL_PASSWORD: mypassword
-
在包含
docker-compose.yml
文件的目录下,执行以下命令启动应用程序:docker-compose up
(二)容器编排
- 容器编排工具如 Kubernetes 和 Docker Swarm 可以用于管理大规模的 Docker 容器集群。
- 这些工具可以实现容器的自动部署、扩展、负载均衡和故障恢复等功能。