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

news2024/11/27 8:27:09

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.coloradmin.cn/o/1259679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java飞翔的小鸟

一、项目分析 创建一个窗口和画板,把画板放到窗口上,在画板上绘画图片 (2)让小鸟在画面中动起来,可以上下飞 (3)让地面和管道动起来 (4)碰撞检测 (5&#xf…

2023信息技术应用创新论坛|云轴科技ZStack分享云原生超融合在智慧交通的应用

11月25日,2023信息技术应用创新论坛在常州开幕。江苏省工业和信息化厅副厅长池宇、中国电子工业标准化技术协会理事长胡燕、常州市常务副市长李林等领导出席论坛并致辞。中国工程院院士郑纬民出席并作主题报告。来自产学研用金等各界的千余名代表参加本次论坛。 在“…

UE5 - 虚幻引擎各模块流程图

来自虚幻官方的一些资料,分享一下; 一些模块的流程图,比如动画模块: 或角色相关流程: 由于图片比较大,上传到了网络,可自取: 链接:https://pan.baidu.com/s/1BQ2KiuP08c…

MATLAB的rvctools工具箱熟悉运动学【机械臂机器人示例】

1、rvctools下载安装 rvctools下载地址:rvctools下载 截图如下,点击红色箭头指示的“Download Shared Folder” 即可下载 下载之后进行解压,解压到D:\MATLAB\toolbox这个工具箱目录,这个安装路径根据自己的情况来选择&#xff0c…

【华为OD】统一考试C卷真题 100%通过: 传递悄悄话 二叉树遍历 C/C++实现

目录 题目描述: 示例1 解题思路: 代码实现: 题目描述: 给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时,根节点所在位置的人有一个悄悄…

中通快递查询入口,根据物流更新量筛选出需要的单号记录

批量中通快递单号的物流信息,根据物流更新量将需要的单号记录筛选出来。 所需工具: 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主…

代码随想录算法训练营第六十天|84. 柱状图中最大的矩形

84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights [2,1,5,6,2,3] 输出:10 解释…

PT里如何针对某个模块设置false path

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 如题,这个问题实际上讲的是get_cells的用法,我们要抓取某个模块内的全部cell,在ICC2里可以get_flat_cells xx/xx/module_name*,但…

Linux 基本语句_12_信号

用途: 信号可以直接进行用户进程与内核进程之间的交互 特性: 对于一个进程,其可以注册或者不注册信号,不注册的信号,进程接受后会按默认功能处理,对于注册后的信号,进程会按自定义处理 自定义…

Mysql之局域网内不同ip互登陆mysql

1 navicat修改mysql表中user> host改为% 2 重新加载mysql服务 3登陆mysql -h 192.168.x.xxx(计算机ip) -P 3306 -uroot -p123456(密码)

AI大模型相关产品的数据飞轮如何建设?

1、背景 数据飞轮,是今年大模型带火的一个典型词汇,通过客户在应用程序中输入的提示词这样的数据反馈,使大模型快速迭代。简单说:好的产品 -> 更多的用户数据 -> 更好的模型质量 -> 更好的产品就进入了一个正向循环。一…

单片机学习10——独立按键

独立按键输入检测&#xff1a; #include<reg52.h>sbit LED1P1^0; sbit KEY1P3^4;void main() {KEY11;while(1){if(KEY10) //KEY1按下{LED10; //LED1被点亮}else{LED11;}} } 按键 #include<reg52.h>#define uchar unsigned char #define uint unsigned intsbit …

linux下的工具---vim

一、了解vim 1、vim是linux的开发工具 2、vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅可以在终端运行…

苍穹外卖项目笔记(5)——Redis

1 入门 1.1 Redis 简介 Redis 是一个基于内存的 key-value 结构数据库&#xff0c;官网链接&#xff08;中文&#xff09;&#xff1a;https://www.redis.net.cn 特点&#xff1a; 基于内存存储&#xff0c;读写性能高适合存储热点数据&#xff08;热点商品、资讯、新闻&am…

数据结构与算法编程题31

判断给定二叉树是否是完全二叉树 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct BiTNode {ElemType data;BiTNode* lchild, …

160 相交链表

解题思路&#xff1a; \qquad 若两个链表a, b相交&#xff0c;则它们之间的区别就仅在于相交节点之前的部分&#xff08;其实任意两个链表最终都会相交&#xff0c;最坏相交于NULL节点&#xff09;。一开始的思路&#xff1a; \qquad\qquad\qquad 1、找到两个链表较长的那个&…

Linux基础项目开发1:量产工具——程序框架(一)

前言&#xff1a; 前面已经将Linux应用开发基础知识学习完了&#xff0c;现在让我们来做个小项目练练手&#xff0c;对之前的一些知识点进行一个更加具体详细的认识与了解&#xff0c;我们要进行的项目名称为&#xff1a;电子产品量产测试与烧写工具&#xff0c;这是一套软件&a…

车内总线通信技术简述

1. 前言 本文主要分享一些汽车总线通信技术&#xff08;CAN、CANFD、LIN、Flex Ray、MOST、LVDS、TTP/C、Ethernet&#xff09;&#xff0c;希望对大家能有所帮助。 2. 多种汽车总线通信技术 2.1 CAN CAN&#xff08;Controller Area Network&#xff09;全称为“控制器局域…

priority_queue模拟实现

目录 仿函数 模拟实现 结果 大根堆 小根堆 完整代码 priority_queue.h test.c 仿函数 仿函数的通俗定义&#xff1a;仿函数&#xff08;functor&#xff09;又称为函数对象&#xff08;function object&#xff09;是一个能行使函数功能 的类。仿函数的语法几乎和我们…

【力扣】56. 合并区间

【力扣】56. 合并区间 文章目录 【力扣】56. 合并区间1. 题目介绍2. 解法2.1 方法一&#xff1a;标志位2.2 方法二&#xff1a;排序 遍历 3. Danger参考 1. 题目介绍 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合…