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/Shanghaibuild: .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.mzph.cn/news/175458.shtml

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

相关文章

自己动手写编译器:golex 和 flex 比较研究 2

上一节我们运行了 gcc 使用的词法解析器,使用它从.l 文件中生成对应的词法解析程序。同时我们用相同的词法规则对 golex 进行测试,发现 golex 同样能实现相同功能,当然这个过程我们也发现了 golex 代码中的不少 bug,本节我们继续对…

【Linux】23、内存超详细介绍

文章目录 零、资料一、内存映射1.1 TLB1.2 多级页表1.3 大页 二、虚拟内存空间分布2.1 用户空间的段2.2 内存分配和回收2.2.1 小对象2.2.2 释放 三、查看内存使用情况3.1 Buffer 和 Cache3.1.1 proc 文件系统3.1.2 案例3.1.2.1 场景 1:磁盘和文件写案例3.1.2.2 场景…

【数据结构】顺序表---C语言版

【数据结构】顺序表 前言:一、线性表二、顺序表1.顺序表的概念及结构:2.顺序表的分类:3.顺序表缺陷: 三、顺序表的代码实现:1.头文件:2.函数文件:3.测试文件: 四、顺序表的相关OJ题&…

怎么给数据库某个字段建立一个前缀索引

说明:SQL调优中重要的一个环节是建立索引,其中有一条是字段值过长字段应该建立前缀索引,即根据字段值的前几位建立索引,像数据库中的密码字段、UUID字段。 因为其随机性,其实根据前几位就可以锁定某一条记录了。前缀索…

(附源码)SSM+成都大学体育场馆预约系统 计算机毕设37087

摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存…

Vatee万腾的数字探险之旅:vatee科技创新的新纪元

在数字时代的潮流中,Vatee万腾以其独特的数字探险之旅引领着科技创新的新纪元。这不仅是一次技术的进步,更是一场数字领域的探险,让我们一同探索Vatee在科技创新中的前沿地带。 Vatee万腾的数字探险起源于对未知的渴望和对创新的不懈追求。在…

【PUSDN】WebStorm中报错Switch language version to React JSX

简述 WebStorm中报错Switch language version to React JSX 可能本页面的写法是其他语法。所以可以不用管。 测试项目:ant design vue pro 前情提示 系统: 一说 同步更新最新版、完整版请移步PUSDN Powered By PUSDN - 平行宇宙软件开发者网www.pusdn…

《opencv实用探索·三》opencv Mat与数组互转

1、利用Mat来存储数据&#xff0c;避免使用数组等操作 //创建一个两行一列的矩阵cv::Mat mean (cv::Mat_<float>(2, 1) << 0.77, 0.33);std::cout() << mean << std::endl;float a mean.at<float>(0, 0); //0.77float b mean.at<float&…

使用vscode中编写c语言——无法打开 源 文件 “stdlib.h“C/C++(1696)问题

出现这个问题原因如下&#xff1a; 1、没有下载编辑器或者是没有配置好该编辑器的环境变量。 可以通过如下方法检查是否安装并配置好编辑器&#xff1a;打开终端&#xff1a;按winR cmd&#xff0c;然后输入gcc-v&#xff0c;查看是否有mingw64编辑器&#xff0c;如下图是已经…

TUP通信——与多个客户端同时通信

一&#xff0c;概括&#xff1a;可以通过多线程思想每加一个客户端由线程池中的主线程交给一个子线程管理 二&#xff0c;案例 &#xff08;1&#xff09;&#xff0c;线程池 &#xff08;2&#xff09;&#xff0c;服务端 &#xff08;3&#xff09;&#xff0c;客户端

【Qt】QStackedWidget、QRadioButton、QPushButton及布局实现程序首页自动展示功能

效果 在程序启动后&#xff0c;有时不会进入到工作页面&#xff0c;会进入到产品展示页面。 动画如下&#xff1a; 首页展示 页面操作 当不点击时&#xff0c;一秒自动刷新一次&#xff1b;当点击时&#xff0c;会自动跳转到对应页面&#xff1b;点击上一页、下一页、及跳转页…

03、K-means聚类实现步骤与基于K-means聚类的图像压缩

03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;1&#xff09; K-means聚类实现步骤 开始学习机器学习啦&#xff0c;已经把吴恩达的课全部刷完了&#xff0c;现在开始熟悉一下复现代码。对这个手写数字实部比较感兴趣&#xff0c;作为入门的素材非常合适。…

理解Android无埋点技术

首先什么是无埋点呢&#xff0c;其实所谓无埋点就是开发者无需再对追踪点进行埋码&#xff0c;而是脱离代码&#xff0c;只需面对应用界面圈圈点点即可追加随时生效的事件数据点。 无埋点的好处 其实无埋点并不是完全不用写代码&#xff0c;而是尽可能的少写代码。开发者将SDK集…

零基础学编程轻松学编程,分享一款中文编程工具,编程构件简介

零基础学编程轻松学编程&#xff0c;分享一款中文编程工具&#xff0c;编程构件简介 中文编程开发语言工具编辑区界面截图如上图。 给大家分享一款中文编程工具 零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#…

数据库应用:Ubuntu 20.04 安装MongoDB

目录 一、理论 1.MongoDB 二、实验 1.Ubuntu 20.04 安装MongoDB 三、问题 1.Ubuntu Linux的apt 包管理器更新安装软件报错 2.Ubuntu20.04安装vim报错 3.Ubuntu20.04如何更换阿里源 4.Ubuntu22.04如何更换阿里源 一、理论 1.MongoDB &#xff08;1&#xff09;概念 …

6、Qt使用Log4Qt日志

一、知识点 1、Log4Qt有三部分 logger&#xff1a;负责捕获日志信息 layout&#xff1a;负责使用不同的样式输出日志 appender&#xff1a;负责输出信息到不同的目的地&#xff0c;比如数据库、文件、控制台等等 2、 日志级别如下&#xff0c;从上往下依次递增 ALL&#xff1a;…

css之svg 制作圆及旋转

1.代码 <template><div class"loading-box"><div class"circle-container"><svg width"75" height"75" class"move-left-to-right"><circle cx"37.5" cy"37.5" r"26&…

高端影像仪:打破微小产品测量局限

在现代工业生产中&#xff0c;影像仪以CCD数位影像为基石&#xff0c;将计算机屏幕测量技术与空间几何运算的能力融为一体&#xff0c;可以用于测量微小产品的各种尺寸和形状&#xff0c;为生产过程中的质量控制提供重要的参考依据。 影像仪产品内置高精度光学电动双倍镜头&am…

什么是动态住宅IP?它有什么用途?

随着网络的迅速发展&#xff0c;许多人对代理IP已经有了比较深刻的认识&#xff0c;并且广泛地运用到了各自的业务中&#xff0c;尤其在跨境的相关业务中表现尤其卓越。对于代理IP的类别&#xff0c;也需要根据自己的业务类型具体选择最合适的&#xff0c;那么今天IPFoxy就给大…

网页设计--第5次课后作业

1、快速学习JavaScript的基本知识第1-10章 JavaScript入门 - 绿叶学习网 2、使用所学的知识完成以下练习。需求如下3个&#xff1a; 1&#xff09;点亮灯泡 2&#xff09;将所有的div标签的标签体内容后面加上&#xff1a; very good 3&#xff09;使所有的复选框呈现被选…