docker基础快速入门:基础命令、网络、docker compose工具

docker基础命令快速入门

目录

  1. docker基本命令
  2. docker 网络
  3. docker compose

Docker介绍

Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。

Docker的三个概念

镜像

Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的配置参数。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像可以用来创建Docker容器,用户可以使用设备上已有的镜像来安装多个相同的Docker容器。

docker镜像是一个多层的文件系统,最底层是引导文件系统,即bootfs(Boot file system)。第二层是rootfs,是一种或者多种操作系统(例如:Debian或者Ubuntu)。再上层是只读的其他文件系统(镜像层),最上层是读写的文件系统,运行的程序是在这层执行。

docker镜像层级

容器

容器是Docker 镜像的一个运行实例,可以理解为一个轻量级的虚拟机。容器包含了运行应用程序所需的所有组件,包括操作系统、应用程序、依赖库等。

仓库

集中存放镜像文件的地方。用户创建完镜像后,可以将其上传到公共仓库或者私有仓库,需要在另一台主机上使用该镜像时,只需要从仓库上下载即可。

用java代码打比方

镜像就是类,容器就是类的实例,仓库就是包。要使用一个容器,就去对应的包(仓库)里找到类(镜像),创建实例(容器)。

运行我们的第一个容器

(下载)启动一个ubuntu系统,并启动shell交互

docker run -i -t ubuntu /bin/bash
# 查看系统版本
uname -a
# 退出,并停止容器
exit
# 退出,不停止容器
CTRL+P+Q

守护方式启动一个支持shell交互的ubuntu系统

docker run --name daemon_dave -i -t -d ubuntu /bin/bash

附着到一个容器

# docker attach [docker container name or id]
docker attach daemon_dave

查看容器

# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a

重启和关闭容器

# docker start [docker container name or id]
docker start daemon_dave

# docker stop [docker container name or id]
docker stop daemon_dave

查看容器日志

# docker logs [docker container name or id]
docker logs daemon_dave

查看容器内进程

# docker top [docker container name or id]
docker top daemon_dave

统计信息

docker stats
# docker stats [docker container name or id list]
docker stats daemon_dave deamon_dave

在容器内部运行进程

docker exec -t -i daemon_dave /bin/bash

获取容器信息

# docker inspect [docker container name or id list]
docker inspect daemon_dave
# 指定标志查看
docker inspect  --format='{{ . State.Running }}' daemon_dave

删除容器

# docker rm [docker container name or id]
docker rm daemon_dave

Docker镜像

查看镜像列表

docker images

拉去镜像

docker pull ubuntu

查找镜像

docker search ubuntu

Docker构建镜像

使用docker commit命令(不讲解)

使用dockerfiledocker build命令(推荐)

编写dockerfile文件

# Version: 0.0.1
FROM ubuntu
MAINTAINER Ziegler "550360139@qq.com"
RUN apt-get update && apt-get install -y nginx
RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html
EXPOSE 80

编译docker镜像

docker build -t="mydocker" .
# 忽略缓存构建
docker build --no-cache -t="mydocker" .

查看指定镜像

docker images mydocker

镜像历史

docker history mydocker

用新镜像启动容器

docker run -d -p 80:80 --name static_web mydocker nginx -g "daemon off;"
# 查看端口
> docker port static_web
80/tcp -> 0.0.0.0:80

查看最近的容器

docker ps -l

删除镜像

docker rmi static_web
# 删除所有镜像
docker rmi 'docker images -a -q'

docker network

  • 注意:docker容器是一个虚拟机,它有自己的网络,固不能直接访问。

创建app网络

docker network create app

查看app网络

> docker network inspect myweb
[
    {
        "Name": "app",
        "Id": "977f98e232619890bf096d7dc05cafb5e864c2923343d32bfbf2b24807c653b6",
        "Created": "2023-09-21T12:27:31.975736849Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.27.0.0/16",
                    "Gateway": "172.27.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

上面的app网络没有任何容器

app网络下启动一个redis容器

docker run -d --net=app --name db redis 

再次查看app网络

> docker network inspect app
[
    {
        "Name": "app",
        "Id": "977f98e232619890bf096d7dc05cafb5e864c2923343d32bfbf2b24807c653b6",
        "Created": "2023-09-21T12:27:31.975736849Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.27.0.0/16",
                    "Gateway": "172.27.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0c5cd9ccb641d3e6fd0a36d8afb20892186d4a24024db5dd6e73ad1bc758ef4c": {
                "Name": "db",
                "EndpointID": "90b79286dd7a415bfc4f7d957fcf98bbd826667d019c6ab5192c731bcb42b5a3",
                "MacAddress": "02:42:ac:1b:00:02",
                "IPv4Address": "172.27.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

包含一个名字为db的容器,容器的IP:172.27.0.2

创建另外一个容器,通过app网路连接redis

docker run -it --net=app --rm redis redis-cli -h db
> docker run -it --net=app --rm redis redis-cli -h db
db:6379> keys *
(empty array)
db:6379> set greet "hello world"
OK
db:6379> keys *
1) "greet"
db:6379>

再次检测app网络

> docker network inspect app
[
    {
        "Name": "app",
        "Id": "977f98e232619890bf096d7dc05cafb5e864c2923343d32bfbf2b24807c653b6",
        "Created": "2023-09-21T12:27:31.975736849Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.27.0.0/16",
                    "Gateway": "172.27.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0c5cd9ccb641d3e6fd0a36d8afb20892186d4a24024db5dd6e73ad1bc758ef4c": {
                "Name": "db",
                "EndpointID": "90b79286dd7a415bfc4f7d957fcf98bbd826667d019c6ab5192c731bcb42b5a3",
                "MacAddress": "02:42:ac:1b:00:02",
                "IPv4Address": "172.27.0.2/16",
                "IPv6Address": ""
            },
            "9da11d04a018d7bbdba840c14c13e03c2d4fe528e228b040cf1c9c6112be0af8": {
                "Name": "peaceful_knuth",
                "EndpointID": "02ffb2e2cfe5c4af104583e5bbb46b45e064683a2a36dfd26f5f97db923494e5",
                "MacAddress": "02:42:ac:1b:00:03",
                "IPv4Address": "172.27.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

上面app网络包含2个容器,一个是名称为dbredis容器,另外一个是用redis-cli连接db的容器。

将已存在的容器连接Docker网络

在启动一个redisbash容器

> docker run -it --rm --name rc redis bash
root@62b018e3b79e:/data# redis-cli -h db
Could not connect to Redis at db:6379: Name or service not known
not connected>

连接失败

检查app网络

C:\Users\Administrator>docker network inspect app
[
    {
        "Name": "app",
        "Id": "977f98e232619890bf096d7dc05cafb5e864c2923343d32bfbf2b24807c653b6",
        "Created": "2023-09-21T12:27:31.975736849Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.27.0.0/16",
                    "Gateway": "172.27.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0c5cd9ccb641d3e6fd0a36d8afb20892186d4a24024db5dd6e73ad1bc758ef4c": {
                "Name": "db",
                "EndpointID": "90b79286dd7a415bfc4f7d957fcf98bbd826667d019c6ab5192c731bcb42b5a3",
                "MacAddress": "02:42:ac:1b:00:02",
                "IPv4Address": "172.27.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

rc容器添加到app网络

docker network connect app rc

再看app网络

C:\Users\Administrator>docker network inspect app
[
    {
        "Name": "app",
        "Id": "977f98e232619890bf096d7dc05cafb5e864c2923343d32bfbf2b24807c653b6",
        "Created": "2023-09-21T12:27:31.975736849Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.27.0.0/16",
                    "Gateway": "172.27.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0c5cd9ccb641d3e6fd0a36d8afb20892186d4a24024db5dd6e73ad1bc758ef4c": {
                "Name": "db",
                "EndpointID": "90b79286dd7a415bfc4f7d957fcf98bbd826667d019c6ab5192c731bcb42b5a3",
                "MacAddress": "02:42:ac:1b:00:02",
                "IPv4Address": "172.27.0.2/16",
                "IPv6Address": ""
            },
            "6a10947555ddeba0415334b031f18bceac0d00877ea300a6ae35dc1e1a9f6445": {
                "Name": "rc",
                "EndpointID": "edb6cdd445160b1f1bacd8878bb1c3f02b1b6247a47fa002843fc2f03591d167",
                "MacAddress": "02:42:ac:1b:00:03",
                "IPv4Address": "172.27.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

再rc容器再次连接db的redis,成功

I:\my-docker\mongo.git\trunk\7.0>docker run -it --rm --name rc redis bash
root@6a10947555dd:/data# redis-cli -h db
Could not connect to Redis at db:6379: Name or service not known
not connected> redis-cli -h db
(error) ERR unknown command 'redis-cli', with args beginning with: '-h' 'db'
db:6379> exit
root@6a10947555dd:/data# redis-cli -h db
db:6379>

断开rc容器与app网络的连接

docker network disconnect app rc

rc容器redis-cli无法与dbredis交互

移除网络

docker network rm app

罗列所有网络

docker network ls

docker compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具

编写docker-compose.yaml,启动上面的nginxdockerfile

services:
  myweb:
    environment:
      - TZ=Asia/Shanghai
    build: .
    command: nginx -g "daemon off;"
    ports:
      - "80:80"

TZ=Asia/Shanghai设置容器时区,查看容器时间date -R

目录结构

./
 - Dockerfile
 - docker-compose.yaml

docker compose命令

# 在存在docker-compose.yaml的目录执行下面指令
# 启动
docker compose up
# 后台启动
docker compose up -d
# 查看
docker compose ps
# 查看日志
docker compose logs
# 停止服务
docker compose stop
# 删除服务
docker compose rm
# 停止并删除服务
docker compose down
# 查看进程
docker compose top
# 查看镜像
docker compose images
# 重启
docker compose restart
# 编译
docker compose build
# 执行命令
# docker compose exec [OPTIONS] SERVICE COMMAND [ARGS...]
docker compose exec myweb bash
# 一次性执行
docker compose run myweb bash

清理docker缓存

docker system prune -a --force
# 查看
docker system df

总结:

  1. 熟练使用docker基础命令和网络命令
  2. 学习编写dockerfile,可以直接使用dockerfile编译部署项目,就可以不保存上传镜像。
  3. 简单项目,尽量使用docker compose工具,更加方便的部署多个容器以及容器间的互联,一键启动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/193855.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

销售漏斗是什么?

销售漏斗是一个重要的销售管理工具,它可以帮助销售人员更好地管理和跟踪潜在客户。销售漏斗模型通常被广泛应用于B2B销售中,它可以将销售过程细分为多个阶段,例如潜在客户、初步沟通、方案报价、谈判和签约等。 销售漏斗有以下作用&#xff…

【无头双向链表和链表练习题2】

文章目录 以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前输入两个链表,找出它们的第一个公共结点。给定一个链表,判断链表中是否有环无头双向链表的模拟实现ArrayList(顺序表)和LinkedL…

Linux git

1.Git 初识 不知道你⼯作或学习时,有没有遇到这样的情况:我们在编写各种⽂档时,为了防止文档丢失,更改失误,失误后能恢复到原来的版本,不得不复制出⼀个副本,⽐如: “报告-v1”? …

手摸手Element-ui路由VueRoute

后端WebAPI准备 https://router.vuejs.org/zh/guide/ https://v3.router.vuejs.org/zh/installation.html <template><el-table:data"tableData"style"width: 100%":row-class-name"tableRowClassName"><!-- <el-table-colum…

C#使用WebSocket进行链接

C#使用WebSocket进行网络链接&#xff0c;和服务端搭建一个长连接进行通信。 有两种方式&#xff1a;串口方式&#xff08;SerialPort&#xff09;和网口方式&#xff08;Socket 包括&#xff1a;TcpClient和UdpClient&#xff09; 准备&#xff1a; 1.C#使用WebSocket的一种…

PostgreSQL + SQL Server = WiltonDB

WiltonDB 是一个基于 PostgreSQL 的开源数据库&#xff0c;通过 Babelfish 插件支持 Microsoft SQL Server 协议以及 T-SQL 语句。 Babelfish 是亚马逊提供的一个开源项目&#xff0c;使得 PostgreSQL 数据库同时具有 Microsoft SQL Server 数据查询和处理的能力。Babelfish 可…

客户关系管理系统功能清单

客户关系管理系统功能清单 一、客户信息管理 1. 客户基本信息&#xff1a;包括客户名称、地址、电话、电子邮件等。 2. 客户关系信息&#xff1a;包括客户的购买历史、服务记录、支持案例等。 3. 客户分类信息&#xff1a;根据客户的重要程度、购买行为、偏好等因素&#xff…

Unity中Shader的BRDF解析(二)

文章目录 前言一、回顾一下上一篇的结尾在这里插入图片描述 二、我们来解析一下 UNITY_PBS_USE_BRDF1&#xff08;高配&#xff09;1、迪士尼BRDF原则2、迪士尼的漫反射函数3、参数&#xff1a;perceptualRoughness&#xff08;感性的粗糙度&#xff09;4、参数&#xff1a;hal…

【论文阅读笔记】InstructDiffusion: A Generalist Modeling Interface for Vision Tasks

【论文阅读笔记】StyleAvatar3D: Leveraging Image-Text Diffusion Models for High-Fidelity 3D Avatar Generation 论文阅读笔记论文信息引言动机挑战 方法结果 关键发现相关工作1. 视觉语言基础模型2. 视觉通用模型 方法/模型视觉任务的统一说明训练数据构建网络结构 实验设…

高端制造业中的通用性超精密3D光学测量仪器

超精密光学3D测量仪器具有高精度、自动化程度高、实时反馈和范围广等优势。它能够实现微米级别的精确测量&#xff0c;能够精确测量产品的尺寸、形状和表面粗糙度等&#xff0c;具有广泛的应用价值和重要意义。 超精密光学3D测量仪器配备多种传感器、控制器和计算机系统&#…

【华为OD】统一考试B\C卷真题 100%通过:开源项目热榜 C/C++实现

目录 题目描述&#xff1a; 示例1 示例2 题目描述&#xff1a; 某个开源社区希望将最近热度比较高的开源项目出一个榜单&#xff0c;推荐给社区里面的开发者。对于每个开源项目&#xff0c;开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数…

什么是数据增强,为什么会让模型更健壮?

在做一些图像分类训练任务时&#xff0c;我们经常会遇到一个很尴尬的情况&#xff0c;那就是&#xff1a; 明明训练数据集中有很多可爱猫咪的照片&#xff0c;但是当我们给训练好的模型输入一张戴着头盔的猫咪进行测试时&#xff0c;模型就不认识了&#xff0c;或者说识别精度…

14、矩阵键盘

矩阵键盘介绍 在键盘中按键数量越多时&#xff0c;为了减少I/O口的占用&#xff0c;通常将按键排列成矩阵形式 采用逐行或逐列的“扫描”&#xff0c;就可以读出任何位置按键的状态 扫描的概念 数码管扫描&#xff08;输出扫描&#xff09; 原理&#xff1a;显示第1位—&g…

【iOS-UIImagePickerController访问相机和相册】

【iOS-UIImagePickerController访问相机和相册】 一. UIImagePickerController的介绍1 . UIImagePickerController的作用2 . UIImagePickerController的功能 二 . UIImagePickerController的测试程序 一. UIImagePickerController的介绍 1 . UIImagePickerController的作用 U…

Unity 关于Input类的使用

Input类在我们游戏开发中需要获取外设设备&#xff08;比如键盘、鼠标、游戏手柄等&#xff09;进行交互时&#xff0c;基本都会用到。 它主要有以下一些常用的方法。 1、GetKey(KeyCode key)&#xff0c;检测按键是否被按下&#xff1b; 2、GetKeyDown(KeyCode key)&#x…

sqli-labs(4)

17. 观察页面发现是一个用来更改用户密码的页面&#xff0c;页面中出现了用户Dhakkan user输入Dhakkan passs输入1发现成功找注入点 先在user尝试&#xff0c;发现不管输入什么都失败在pass中尝试注入 在pass中输入1‘ 报错注入 1 and extractvalue(1,concat(0x5c,database(…

openpnp - 给底部相机加防尘罩

文章目录 openpnp - 给底部相机加防尘罩概述笔记END openpnp - 给底部相机加防尘罩 概述 设备标定完, 看着底部相机, 有点担心掉进去东西, 万一从吸嘴掉下去的料(或者清理设备台面时, 不小心掉进去东西)将顶部相机搞短路怎么办. 就想加个防尘罩, 如果有东西掉进去, 可以掉到机…

【python】python基础速通系列2-python程序中的积木块

【组成Python的几个单位】 变量:指向值的名称。或者说变量是一个名称,这个名称指向一个具体的指。比如n=17,就说这个叫做n的变量的值是17。表达式:是值,变量和运算符的组合。如果把变量理解为名词,那么表达式就是把名词连起来的动词形容词。比如:n+25。语句:代码的基本…

还在为写论文焦虑?免费AI写作大师来帮你三步搞定

先来看1分钟的视频&#xff0c;对于要写论文的你来说&#xff0c;绝对有所值&#xff01; 还在为写论文焦虑&#xff1f;免费AI写作大师来帮你三步搞定 第一步&#xff1a;输入关键信息 第二步&#xff1a;生成大纲 稍等片刻后&#xff0c;专业大纲生成&#xff08;由于举例&am…

CANdelaStudio 使用教程6 编辑DTC

文章目录 DTC的导入导出定义 19 服务的DTC编辑快照数据 DTC的导入导出 DTC导出的文件是 Excel 文件&#xff0c;可以先将这个池子的DTC导出去修改&#xff0c;再导入进来&#xff0c;完成DTC的修改 定义 19 服务的DTC 编辑快照数据
最新文章