您现在的位置是:首页 >技术交流 >Docker的基本使用网站首页技术交流

Docker的基本使用

CS@zeny 2024-06-12 00:01:02
简介Docker的基本使用

使用docker

使用docker安装Nginx服务

  1. 查看docker镜像仓库中Nginx的可用版本。
docker search nginx

请添加图片描述

  1. 拉取最新版的Nginx镜像。
docker pull nginx:latest

请添加图片描述

  1. 查看本地镜像。
docker images

请添加图片描述

  1. 运行容器。
docker run --name nginx-test -p 8080:80 -d nginx

命令参数说明:

  • --name nginx-test:容器名称。
  • -p 8080:80: 端口进行映射,将本地8080端口映射到容器内部的80端口。
  • -d nginx: 设置容器在后台一直运行。

命令输出如下所示。

请添加图片描述

  1. 在浏览器地址栏输入http://<ECS公网IP地址>:8080访问Nginx服务。

    比如: http://xx.xxx.xx.xx:8080

请添加图片描述

  1. 停止运行

    要停止正在运行的Docker容器,你可以使用docker stop命令。以下是一些使用示例:

    1. 停止指定容器(使用容器ID或名称):

      docker stop <container_id_or_name>
      
    2. 批量停止多个容器(使用容器ID或名称列表):

      docker stop <container_id_or_name_1> <container_id_or_name_2> ...
      
    3. 停止所有正在运行的容器:

      docker stop $(docker ps -q)
      

      该命令将列出当前正在运行的所有容器,并使用-q标志仅输出每个容器的ID。这些ID将传递给docker stop命令,以停止所有正在运行的容器。

    注意,如果希望在停止容器时立即删除已停止的容器,则可以使用docker rm命令。例如:

    docker stop <container_id_or_name> && docker rm <container_id_or_name>
    

    这将先停止指定的容器,然后从 Docker 主机上删除它。

    请添加图片描述

    • 先查看正在运行的程序, 再根据名称或者容器id来指定停止哪个容器
    • docker stop nginx-test

使用docker安装Mysql服务

Mysql的版本是8.0.15

可以使用Docker命令行工具来下载和运行MySQL 8.0.15镜像。以下是一些基本步骤:

  1. 打开终端并输入以下命令以下载MySQL 8.0.15镜像:

    docker pull mysql:8.0.15
    

    请添加图片描述

    查看镜像: docker images

    请添加图片描述

    • docker images 命令用于列出本地主机上的 Docker 镜像。它会显示镜像的名称、标签、镜像 ID、创建时间和大小等信息。

    • 使用 docker images 命令可以查看已经下载到本地的所有镜像,以及它们的基本信息。这些镜像是使用 docker pull 命令从 Docker Hub 或其他私有仓库中获取的。在构建容器时需要使用这些镜像作为基础镜像或运行时环境。

  2. 下载完成后,运行以下命令以启动一个名为“my-mysql”的容器,并将MySQL的默认端口映射到主机上的端口3306:

    docker run --name my-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=<设置你的密码> -d mysql:8.0.15
    
    • docker run:表示在 Docker 中创建并启动一个容器。
    • --name my-mysql:为这个容器命名为 my-mysql。
    • -p 3306:3306:将容器内部的 3306 端口映射到主机上的 3306 端口,以便从外部可以访问到 MySQL 服务。
    • -e MYSQL_ROOT_PASSWORD=<设置你的密码>:指定 MySQL 的 root 用户的密码。使用 -e 选项可以将环境变量传递给容器。
    • -d:将容器设置为后台运行。
    • mysql:8.0.15:使用的镜像名称及其版本号。

    在这个命令中,我们使用了-d参数来将容器作为守护进程(就是在后台执行的进程)来运行。你需要将"<设置你的密码>"替换为自己的密码。

    docker run --name my-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mysql2022 -d mysql:8.0.15

    请添加图片描述

  3. 如果一切顺利,MySQL容器应该已经启动并在后台运行了。你可以使用以下命令来查看正在运行的容器:

    docker ps
    

    请添加图片描述

    可以看到“my-mysql”容器正在运行。

现在已经成功地部署了一个MySQL 8.0.15的Docker镜像,并且在主机上的端口3306上运行了MySQL服务。可以使用任何支持MySQL协议的客户端(如MySQL Workbench)连接到该服务。

tips: 如果是在云服务器上部署, 需要在防火墙上开放3306端口, 外部才能访问到该服务器上的数据库

比如阿里云的
请添加图片描述

试试用Navicat连接一下这个数据库, 看看能不能成功, 假设我已经绑定了域名xxx.XXXXXXX.top

那我可以通过这个域名直接来访问数据库 sql.zenytech.top:3306,尽量不要通过域名来访问数据库, 比如idea中的database管理工具不支持数据库地址的域名解析, 直接用ip地址就行. 不然可能导致项目的数据库连接不上.

请添加图片描述

若没有绑定域名可以直接写ip地址即可 (因为域名本质也是将域名转换为ip地址, 只不过域名可能更好记而已)

请添加图片描述

ok , 连接成功, 说明docker安装的数据库以及部署成功

要查看 Docker 中的容器名称,可以执行以下命令:

docker ps --format '{{.Names}}'

该命令将显示所有正在运行的容器的名称。如果要显示所有包括已停止的容器的名称,则可以使用 --all-a 选项:

docker ps -a --format '{{.Names}}'

这将显示所有容器的名称,无论其状态如何(启动或停止)。

如果你要重新启动已经存在的容器,可以使用 docker start 命令,该命令将会启动一个已经停止的容器。

例如,要启动名称为 my-mysql 的容器,可以运行以下命令:

docker start my-mysql

请注意,如果你在启动容器之前曾经使用过 -p 选项映射端口,则不需要再次指定。只需运行上面的命令即可重新启动容器。

如果你希望在启动容器时使用其他端口来进行映射,则需要使用 -p 选项来指定新的端口映射。例如,要将容器的 MySQL 端口映射到主机的端口 3307,可以运行以下命令:

docker start -p 3307:3306 my-mysql

这将重新启动 my-mysql 容器,并将其 MySQL 端口映射到主机的端口 3307 上。

动态查看容器信息

比如查看刚刚的mysql的信息

请添加图片描述

要查看 Docker 容器的动态信息,可以使用 docker stats 命令。docker stats 命令会实时显示 Docker 容器的 CPU、内存、网络和磁盘 I/O 等指标。

示例:

docker stats container_name

这个命令会动态刷新容器的指标信息,并且会一直运行,直到你手动停止它。如果想要退出命令行窗口,可以按下 ctrl + c 组合键来停止该命令。

另外,你也可以使用像 cadvisor 这样的第三方工具来监控 Docker 容器的性能指标,以获得更为详细和准确的数据。

使用docker安装java8

要在Docker容器中安装Java 8,可以按照以下步骤操作:

  1. 创建一个新的Dockerfile,例如:touch Dockerfile

    请添加图片描述

    FROM ubuntu:latest
    
    # 安装 Java 8
    RUN apt-get update && 
        apt-get install -y openjdk-8-jdk && 
        apt-get clean;
        
    # 设置JAVA_HOME环境变量
    ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
    

    请添加图片描述

  2. 使用docker build命令将Dockerfile构建为镜像。例如,假设你的Dockerfile文件名为Dockerfile,你可以在包含该文件的目录中运行以下命令:

    docker build -t my-java-image .
    

    请添加图片描述

  3. 等待Docker构建过程完成,然后使用以下命令在容器中启动Java应用程序:

    docker run --rm -it my-java-image java -version
    

    这应该会显示安装的Java 8版本信息,表示你已成功添加Java 8到Docker容器中。

    请添加图片描述

在Linux中,Docker镜像通常存储在文件系统中的/var/lib/docker目录下。具体来说,每个Docker镜像都会被打包成一个或多个称为“层(layers)” 的文件,并存储在名为image的子目录中。每个镜像的文件夹名称是该镜像对应的SHA256哈希值的前12个字符。

/var/lib/docker目录下还包含其他一些重要的子目录和文件,例如:

  1. containers:该目录存储运行中的Docker容器的相关信息。
  2. image:该目录存储所有的Docker镜像,其中每个镜像对应一个子目录。
  3. overlay2:该目录存储Docker使用的overlay2存储驱动的数据。

需要注意的是,/var/lib/docker目录下的内容需要以root用户身份才能访问和修改。因此,在操作Docker镜像时需要确保使用root权限或者在sudoers文件中添加相应的权限配置。

使用docker安装jdk8 并运行打包好的jar包

第一种: 直接构建好容器(即包含jar包和jdk环境, 一启动环境就运行)

使用dockerfile进行构建镜像

可以使用Dockerfile来构建一个包含JDK 8的Docker镜像,并在该镜像上运行你的Java应用程序。以下是一个简单的Dockerfile示例:

FROM openjdk:8-jdk-alpine
COPY target/your-application.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

解释一下上述Dockerfile:

  • FROM openjdk:8-jdk-alpine 表示我们将从OpenJDK仓库下载基于Alpine Linux的JDK 8镜像。
  • COPY target/your-application.jar /app.jar 将打包好的jar文件从本地路径(target/your-application.jar)复制到镜像的根目录(/app.jar)。
  • ENTRYPOINT ["java","-jar","/app.jar"] 运行容器时会执行这个命令,即运行我们刚刚复制到容器中的jar文件。

你可以使用以下命令来构建该Docker镜像:

docker build -t your-application-image .

其中,-t your-application-image 表示我们将构建的镜像命名为 your-application-image,最后的 . 表示在当前目录下查找 Dockerfile 文件。

接下来,使用以下命令来运行该镜像:

docker run -p 8080:8080 your-application-image

其中 -p 8080:8080 将容器的8080端口映射到主机的8080端口上。

比如:

docker build -t my-backend-image .
docker run -p 8102:8102 my-backend-image

请添加图片描述

第二种:先创建jdk8的容器, 再进入容器里面操作

创建容器

可以使用官方提供的JDK8镜像来创建一个Docker容器。以下是一个使用JDK8镜像的示例Dockerfile:

FROM openjdk:8-jdk-slim

在这个Dockerfile中,我们使用了 openjdk:8-jdk-slim 作为基础镜像,它已经包含了JDK8的环境。你可以将这个Dockerfile构建成镜像并运行容器,例如:

docker build -t my-jdk8-image .

请添加图片描述

这将创建一个名为 my-jdk8-image 的镜像,并运行一个交互式的容器。你可以在容器中执行一些基本的命令来验证JDK8是否已正确安装。

  • docker run -it --rm my-jdk8-image 没有指定端口号来开启容器; 使用 docker run 命令启动容器时加上 --rm 参数,会让容器在退出后自动删除,可以防止占用过多的存储空间。

  • 或者可以 docker run -it --rm --name my-jdk8container -p 8102:8102 my-jdk8-image 通过指定端口号来开启容器

  • 请添加图片描述

  • 若不需要退出后自动删除容器可以去掉--rm;即 docker run -it --name my-jdk8container -p 8102:8102 my-jdk8-image

  • 已经进入容器中, 可以查看它的java版本号: java -version

可以使用 docker rename 命令来重命名容器名称,命令格式如下:

docker rename <当前容器名称> <新容器名称>

例如,将容器名为 my-container 改为 new-container-name,可以执行以下命令:

docker rename my-container new-container-name

进入到创建好的docker容器中

你可以通过以下命令进入已经安装好的Docker容器中:

  1. 首先运行容器并进入:
docker run -it --name <container_name> <image_name> /bin/bash

其中 <container_name> 为你指定的容器名称,<image_name> 为你安装的Docker镜像名称。

如果已经运行了, 直接使用下面命令进入

使用 docker exec 命令进入到已经运行的容器内部。命令格式为:

docker exec -it <container_name_or_id> <command>

其中,-it 参数表示进入到交互式终端模式,<container_name_or_id> 参数表示容器的名称或 ID,<command> 参数表示要在容器内执行的命令。如果不指定 <command> 参数,则会默认进入容器的默认 shell。

举个例子,假设要进入名为 my-container 的容器内部,可以使用以下命令:

docker exec -it my-container bash

这将进入到 my-container 容器的交互式 bash 终端。

  1. 创建工作目录

    mkdir -p ./app/target
    

    使用 mkdir 命令来创建目录,使用 -p 选项可以递归地创建多层目录。

  2. 进入容器中的工作目录:

cd ./app/target/
  1. 将容器外的文件复制到容器中, 注意:要新开个命令行窗口, 从宿主机外面执行docker的cp命令

    • 将本地文件复制到正在运行的容器中,或从容器复制文件到本地。

    • 将本地文件复制到容器中:

    docker cp /path/to/local/file container_name:/path/to/container/destination
    
    • 将容器中的文件复制到本地:
    docker cp container_name:/path/to/container/source /path/to/local/destination
    

    其中 container_name 是容器的名称或 ID,/path/to/local/file 是本地文件的路径,/path/to/container/destination 是容器中目标路径的路径。同样,要将容器中的文件复制到本地,只需将源和目标路径交换即可。

比如将容器外的文件复制到容器中:

docker cp /root/mydockerfile/sql-builder-backend-0.0.1-SNAPSHOT.jar my-jdk8container:/app/target

在宿主机上执行复制命令

请添加图片描述

回到容器中

请添加图片描述

  1. 运行你的jar包(前提是jar包已经在容器中):
java -jar sql-builder-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

请添加图片描述

运行容器外的jar包

如果你要在容器中运行位于容器外的jar包,你可以将jar包挂载到容器中运行。这样可以不用把文件复制到容器中即可直接使用。具体步骤如下:

  1. 创建一个本地文件夹,用于存放jar包。假设本地文件夹路径为 /path/to/local/folder
  2. 在运行容器时,使用 -v 参数将本地文件夹挂载到容器中,假设容器内文件夹路径为 /app。可以使用以下命令运行容器:
docker run -it -v /path/to/local/folder:/app my-image:latest

或者指定容器的名称

docker run -it -v /path/to/local/folder:/app --name my-container my-image:latest

其中,-it 参数表示以交互模式运行容器,-v 参数表示挂载本地文件夹到容器中,--name表示容器的名称,my-image:latest 是镜像名称

  1. 进入容器中,切换到挂载的文件夹,并运行jar包。假设jar包名称为 my-app.jar,可以使用以下命令:
java -jar my-app.jar

这样,你就可以在容器中运行位于容器外的jar包了。

例如上述的例子:

  • 需要重新运行新的容器才能将外部的文件挂载到容器中
docker run -it -v /root/mydockerfile:/app/target/local my-jdk8-image:latest 

请添加图片描述

  • 忘记命名容器的话, 可以使用docker rename my-container new-container-name命令

    比如:

    docker rename 7fecb0c03b1e myjdk8v
    

    请添加图片描述

  • 执行jar文件

    java -jar my-app.jar
    

    请添加图片描述

文件挂载的方式就是和宿主机共享文件, 当宿主机对共享文件夹的文件进行修改时, 容器内对应的文件夹中的内容也会发生变化。同理,当容器对共享文件夹进行修改时,宿主机的共享文件夹里的内容也会发生修改。总的来说就是文件挂载可以将宿主机上的文件夹与容器内的文件夹进行共享,它们之间的变化是实时同步的,可以让容器内和宿主机之间进行文件共享和交互。

比如在宿主机上的共享文件夹上创建一个haha文件

请添加图片描述

在容器上的共享文件上创建一个contain_file文件

请添加图片描述

可以看出他们的文件之间的变化是实时同步的,可以让容器内和宿主机之间进行文件共享和交互。

拓展:在Docker中,宿主机和容器是两个不同的概念。宿主机是指安装和运行Docker的主机,而容器则是由Docker镜像创建的一个可运行的实例。容器是在宿主机上运行的,但它与宿主机是隔离的,拥有自己的文件系统、网络和进程空间。因此,容器中的文件和进程对于宿主机来说是不可见的,而宿主机上的文件和进程对于容器来说也是不可见的。但是通过文件挂载的方式,可以让宿主机和容器共享文件。

Docker容器和VMware虚拟机是两种不同的虚拟化技术。它们的主要区别在于虚拟化的粒度和资源占用。

VMware虚拟机是一种全虚拟化技术,它会模拟出一整套的硬件,包括CPU、内存、网络接口、磁盘等,每个虚拟机都有自己的操作系统。因此,VMware虚拟机可以实现不同操作系统之间的隔离和互通,但是由于每个虚拟机都需要独立的操作系统和硬件模拟,所以资源占用较高。

Docker容器是一种轻量级虚拟化技术,它利用Linux内核的cgroups和命名空间等机制,对进程进行隔离和限制资源使用。Docker容器与宿主机共享操作系统内核,因此不需要像虚拟机一样模拟硬件,资源占用较少。每个Docker容器只需要安装需要运行的应用程序和相关依赖即可,因此容器可以快速部署、启动和销毁。

Docker容器适合轻量级的应用场景,如单个应用程序的运行和开发环境的搭建;VMware虚拟机适合需要隔离多个操作系统或需要完全隔离的应用场景。

总的来说容器是对操作系统的虚拟化, 而虚拟机是对硬件的虚拟化。这是容器和虚拟机最主要的区别之一。虚拟机是通过在物理硬件上创建虚拟层来模拟多个计算机环境,每个环境都运行自己的操作系统,应用程序和其他软件。因此,虚拟机可以在同一物理服务器上运行多个不同的操作系统,例如在一台物理机上同时运行Windows和Linux虚拟机。相比之下,容器技术利用操作系统层面的虚拟化,可以在同一物理服务器上运行多个应用程序,每个应用程序运行在自己的容器内,但所有容器都共享同一个操作系统内核。这样可以大大减少资源占用和系统开销,提高应用程序的性能和效率。同时,容器的启动时间更短,资源消耗更少,更易于部署和管理。

附加

运行容器的命令

运行容器:

docker run -p 8102:8102 my-spring-boot-image
  • docker run:运行 Docker 镜像并创建一个 Docker 容器。
  • -p 8102:8102:将容器的 8102 端口映射到主机的 8102 端口上,即允许通过主机的 8102 端口访问容器中运行的应用程序。
  • my-spring-boot-image:要运行的 Docker 镜像名称。

以命名容器的方式启动:

docker run --name=sqlbuilder -p 8102:8102 my-spring-boot-image
  • run:运行一个新的 Docker 容器。
  • --name=sqlbuilder:将容器命名为 sqlbuilder
  • -p 8102:8102:将容器的 8102 端口映射到主机的 8102 端口上。
  • my-spring-boot-image:容器将使用 my-spring-boot-image 镜像作为其基础镜像。

上诉的命令是如果关闭了当前会话或重启了主机,则容器也会停止。如果想要让容器在后台一直运行,可以使用docker run -d命令来运行容器。,将容器后台运行,例如:

docker run --name sqlbuilder -p 8102:8102 -d my-spring-boot-image

这样,即使关闭会话,容器也会一直运行。直接使用上面的命令运行就行!

  • run:创建并启动一个 Docker 容器。
  • --name sqlbuilder:为容器指定一个名称,方便后续操作。
  • -p 8102:8102:将容器内部的 8102 端口映射到主机的 8102 端口。
  • -d:让容器在后台以守护进程的方式运行。
  • my-spring-boot-image:使用的镜像名称,即在该镜像基础上创建容器。

如果容器停止了,如果之前创建容器时没有指定以守护进程的方式运行,那么在使用 docker start 命令时也不能以守护进程的方式启动该容器。需要重新创建以守护进程的方式运行的容器。

docker start -a my_container

这个命令是用于启动一个名为 “sqlbuilder” 的 Docker 容器,并且让它在后台以守护进程的方式运行,同时通过 -a 参数实现将容器的输出信息实时打印到终端中。

具体参数含义如下:

  • start:启动一个已经存在的 Docker 容器。
  • -a:实时打印容器的输出信息。(可以省略这个选项)
  • sqlbuilder:要启动的容器的名称或 ID。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。