首页 > 其他分享 >Docker基础

Docker基础

时间:2023-11-02 14:12:17浏览次数:35  
标签:容器 network 基础 目录 nginx 镜像 Docker docker

Docker基础

Docker常见命令

Docker最常见的命令就是操作镜像、容器的命令,详见官方文档: https://docs.docker.com/

案列:查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器

拉取镜像

docker pull nginx

查看镜像

docker images

保存镜像为tar包

docker save -o nginx.tar nginx:latest

  • -o 指定输出地址

删除镜像

docker rmi nginx:latest

加载镜像tar包

docker load -i nginx.tar

  • -i 要加载的tar包
  • -q 不打印信息

创建容器

docker run -d --name nginx -p 80:80 nginx

  • -d 后台运行
  • --name 容器名称
  • -p 端口映射
  • nginx 镜像名称

查看容器

docker ps

  • -a 查询所有容器,包含未启动的。不加-a只显示启动的容器

启动容器

docker start nginx

关闭容器

docker stop nginx

查看容器日志

docker logs -f nginx

  • -f 跟踪日志输出

进入容器

docker exec -it nginx bash

  • -it 开启一个交互模式的终端

删除容器

docker rm nginx
必须要停止容器运行才能删除

命令别名

用于给很长的命令起个别名方便使用

  • 修改bashrc文件
vim ~/.bashrc

  • 修改完之后需要source一下,让文件生效
source ~/.bashrc
  • 结果

数据卷挂载

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

以nginx为例,我们知道nginx中有两个关键的目录:

  • html:放置一些静态资源
  • conf:放置配置文件

如果我们要让nginx代理我们的静态资源,最好是放到html目录;如果我们要修改nginx的配置,最好是找到conf下的nginx.conf文件。

但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:

  • 我们创建了两个数据卷:conf、html
  • Nginx容器内部的conf目录和html目录分别与两个数据卷关联。
  • 而数据卷conf和html分别指向了宿主机的/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录

这样以来,容器内的conf和html目录就 与宿主机的conf和html目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。

/var/lib/docker/volumes 这个目录就是默认的存放所有容器数据卷的目录,其下再根据数据卷名称创建新目录,格式为/数据卷名/_data。

为什么不让容器目录直接指向宿主机目录呢?

  • 因为直接指向宿主机目录就与宿主机强耦合了,如果切换了环境,宿主机目录就可能发生改变了。由于容器一旦创建,目录挂载就无法修改,这样容器就无法正常工作了。

  • 但是容器指向数据卷,一个逻辑名称,而数据卷再指向宿主机目录,就不存在强耦合。如果宿主机目录发生改变,只要改变数据卷与宿主机目录之间的映射关系即可。

不过,我们通过由于数据卷目录比较深,不好寻找,通常我们也允许让容器直接与宿主机目录挂载而不使用数据卷

数据卷命令

命令 说明 地址
docker volume create 创建数据卷 docker volume create
docker volume ls 查看所有数据卷 docker volume ls
docker volume rm 删除指定数据卷 docker volume rm
docker volume inspect 查看某个数据卷的详情 docker volume inspect
docker volume prune 清除数据卷 docker volume prune

注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。
注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。
注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。

创建容器并指定数据卷

# 创建容器并指定数据卷,注意通过 -v 参数来指定数据卷,数据卷名称:容器内目录
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

查看数据卷

docker volume ls

查看数据卷详情

# html:数据卷名称
docker volume inspect html

本地目录挂载

数据卷挂载 的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:

# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件

注意:本地目录或文件必须以 / 或 ./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。

Dockerfile语法

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档:https://docs.docker.com/engine/reference/builder/

指令 说明 示例
FROM 指定基础镜像 FROM centos:7
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./xx.jar /tmp/app.jar
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

测试

  1. 创建DockerFile文件,下载好jdk镜像,设置时区,准备一个SpringBoot项目启动jar包。

    # 基础镜像
    FROM openjdk:11.0-jre-buster
    # 设定时区
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    # 拷贝jar包
    COPY docker-demo.jar /app.jar
    # 入口
    ENTRYPOINT ["java", "-jar", "/app.jar"]
    
  2. 执行命令,构建镜像

    # 进入你DockerFile文件目录下构建
    docker build -t docker-demo:1.0 .
    
    • docker build : 就是构建一个docker镜像
    • -t docker-demo:1.0 :-t参数是指定镜像的名称(repository和tag)
    • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录
  3. 创建容器并运行

    # 查看镜像
    docker images
    # 创建容器
    docker run -d --name 容器名称 -p 8080:8080 镜像名称:版本号
    

网络

容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。所以,我们必须借助于docker的网络功能来解决这个问题,官方文档:https://docs.docker.com/engine/reference/commandline/network/

命令 说明 文档地址
docker network create 创建一个网络 docker network create
docker network ls 查看所有网络 docker network ls
docker network rm 删除指定网络 docker network rm
docker network prune 清除未使用的网络 docker network prune
docker network connect 使指定容器连接加入某网络 docker network connect
docker network disconnect 使指定容器连接离开某网络 docker network disconnect
docker network inspect 查看网络详细信息 docker network inspect

测试

  1. 创建一个网络

    # 创建网络
    docker network create 网络名称
    # 查看
    docker network ls
    
  2. 将容器添加到网络

    # 第一种方法:已创建好的容器直接加入
    docker network connect 网络名称 容器名称
    # 第二种方法:生成容器时指定网络
    docker run -d --name 容器名称 -p 8080:8080 --network 网络名称 docker-demo
    
  3. 测试

    # 随便进入哪个容器,然后ping别的容器
    docker exec -it 容器名称 bash
    # ping
    ping 容器名称
    

DockerCompose

复杂的项目中会有各种各样的其它中间件,需要部署的东西远不止3个。如果还像之前那样手动的逐一部署,就太麻烦了。而Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。https://docs.docker.com/compose/compose-file/compose-file-v3/

docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。

标签:容器,network,基础,目录,nginx,镜像,Docker,docker
From: https://www.cnblogs.com/zjh0420/p/17797678.html

相关文章

  • linux基础设置
    前言看到了很多的linux方面的教程,但是都只是看着博客并且跟着操作,思考的方面还是不够多,容易遗忘,所以写一个关于初始化过程的一个记录贴。在进一步学习Linux之前,建议大家也可以对自己的VPS做一些安全防护。这里会介绍一些通用的、简单的但却十分有效的安全措施。环境uname-a#......
  • java语言基础
    在计算机编程中,标识符是用来代表变量、函数、类、模块等命名实体的名称。标识符可以包含字母、数字和下划线,并且必须遵循一些特定的规则和约定。以下是一些通用的标识符规则:只能以字母(包括大写和小写)、下划线(_)或者某些特殊字符(在某些编程语言中)开头。其余部分可以是字母......
  • python的Selenium基础
    前言:今日写hackergame2023时需要使用pythonselenium库故特此来学习1.1什么是SeleniumSelenium是python的一个库,作为一套web网站的程序自动化操作解决方案,可以帮我们自动干很多事情。比如像人一样再浏览器里操纵web界面,比如点击界面,在文本框中输入文字等操作。而且还能从web......
  • Java语言基础知识点梳理与总结
    Java语言基础知识点梳理与总结Java是一种广泛应用于软件开发的编程语言,具有丰富的特性和功能。在学习Java语言时,了解以下基础知识点对于建立坚实的编程基础非常重要。本博客将介绍Java语言中的标识符、运算符、流程控制、循环结构、分支结构、数组、方法、类与对象等主要知识点。......
  • 一文学习mysql基础知识
    1.常见的数据库产品    1)oracle   --甲骨文    2)DB2      --IBM    3)SQLsever--微软    4)MySql    --AB->SUN->甲骨文2.名词解释    字段   --表中的列    记录   --表中的行3.登录远程数据库    1)打开一个终端窗......
  • Util应用框架基础(一) - 依赖注入
    本节介绍Util应用框架依赖注入的使用和配置扩展.文章分为多个小节,如果对设计原理不感兴趣,只需阅读基础用法部分即可.概述当你想调用某个服务的方法完成特定功能时,首先需要得到这个服务的实例.最简单的办法是直接new一个服务实例,不过这样就把服务的实现牢牢绑死了,当你需......
  • 使用docker 部署testlink
    docker部署testlink1、拉取db镜像:dockerpullbitnami/mariadb 2、拉取testlink镜像:dockerpullbitnami/testlink3、容器网络:docker networkcreatetestlink4、查看网络:dockernetworkls 4.1、删除网络 dockernetworkrm<networkname>5、创建数据库卷......
  • SQL注入基础总结
    SQL注入基础总结目录SQL注入基础总结概述注入姿势普通查询注入报错注入盲注更新注入堆叠注入二次注入宽字节注入二次编码注入DNSLOG外带注入MySQL的读写利用前提读取文件写入文件常见绕过结尾注释符过滤"and、or"过滤字符串过滤空格过滤比较符号"=、<、>"过滤引号过滤逗号过滤......
  • RL 基础 | Policy Iteration 的收敛性证明
    (其实是专业课作业......
  • JAVA语言基础
    Java是一种高级编程语言,最初由SunMicrosystems(后被Oracle收购)于1995年发布。它被广泛用于开发各种类型的应用程序,从桌面应用程序到移动应用程序和大型企业级应用程序。以下是Java语言的一些基础知识:1.跨平台性:Java以"WriteOnce,RunAnywhere"(一次编写,到处运行)为特点。这是因为......