Docker入门学习:基本概念、安装、命令、简单使用

news2024/11/30 12:42:32

前言

一、基本概念

1、Docker镜像

镜像就是一个文件,例如我们的应用镜像、环境镜像(例如nginx、mysql等),镜像是创建Docker容器的基础。
在这里插入图片描述

2、Docker容器

Docker容器类似于一个沙箱(例如做支付的时候的支付宝的沙箱),Docker通过容器来运行和隔离应用。容器是从镜像创建的应用实例,可以启动、停止、删除,这些容器彼此相互隔离,互不打扰,可以将每个容器都看作一个单独的Linux系统。

3、Docker仓库

类似于我们的代码仓库,它是集中存放镜像文件的地方。我们可以将自己的Docker镜像上传到我们的Docker仓库,同时也可以从Docker仓库下载我们需要的镜像。最大的公开仓库就是官方仓库https://hub.docker.com/
在这里插入图片描述

二、centos7安装Docker

Docker要求CentOS系统内核高于3.10,uname -r查看当前的内核版本
在这里插入图片描述
如果之前安装过Docker,可以执行下列命令清除,注意,切换到root执行

 yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

先查看当前的yum源,yum repolist,如下
在这里插入图片描述
设置yum源,并更新 yum 的包索引

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast

安装Dockeryum install docker-ce docker-ce-cli containerd.io,安装过程中需要输入3次“y”确认安装,安装成功如下所示
在这里插入图片描述
启动Dockersystemctl start docker,设置为开机启动systemctl enable docker,然后输入docker version检查是否启动成功,若给出版本号,则成功
在这里插入图片描述
然后我们运行一下经典的hello world,输入docker run hello-world,可以看到如下信息
在这里插入图片描述

三、常用的Docker命令

命令备注
docker images镜像列表
docker pull拉取镜像
docker search搜索镜像
docker push上传镜像
docker ps容器列表
docker create创建容器
docker run只在第一次运行时使用,将镜像放到容器中(docker cearte),以后再次启动容器只需要docker start,参数说明:-d后台运行容器,并返回容器ID、-i交互式运行、–memory限制容器可用内存、–memory-swap设置swap区可用内存,默认和–memory一样,必须≥memory、–name容器名字、–net容器运行网络、–ip指定容器ip、-P随机映射端口、-p本地端口:容器端口,将容器某个端口映射到本地端口上
docker start启动已存在的容器,需要知道容器ID或名称
docker restart重启容器
docker logs容器运行日志
docker stop停止容器,优雅停机
docker kill杀死容器
docker exec在使用-d参数运行容器时,容器启动后会进入后台,此时想要进入容器,可以通过这个指令进入,推荐大家使用dockerexec命令,因为使用它在退出容器终端,不会导致容器的停止
docker rm xxx移除容器
docker rename xxx重命名
上述命令 --help查看任意命令的参数、作用等

四、运行Nginx

1、拉取镜像

由于从docker的官方镜像仓库下载太慢,因此这里使用https://c.163yun.com/hub#/library/repository/version?repoId=3181网易的镜像中心,找到nginx
在这里插入图片描述
直接从右上角复制,执行shell命令docker pull hub.c.163.com/library/nginx:latest,然后查看镜像
在这里插入图片描述

2、启动容器

先通过docker run命令启动,docker run hub.c.163.com/library/nginx:latest,然后查看运行的容器
在这里插入图片描述
ctrl+c终止运行,然后再尝试后台运行docker run -d hub.c.163.com/library/nginx
在这里插入图片描述
然后用docker exec -it id bash命令进入容器内部,并通过which nginx命令查看nginx的位置
在这里插入图片描述

3、本机访问Nginx

我们从上面可以看到nginx在虚拟机上是80端口,那么我们本地怎么访问呢?也是用80端口吗?尝试一下在这里插入图片描述
显然是不行的,这是因为我们启动nginx的时候,并没有指定主机的端口,在第三节常用命令中,指定端口有两种方式,-P随机端口,-p指定端口,我们分别尝试一下,先停掉当前的nginx,通过docker stop id优雅方式停止,然后docker run -d -P hub.c.163.com/library/nginx,再查看运行的容器
在这里插入图片描述
发现给我们随机的端口是49153,我们访问一下,发现成功了
在这里插入图片描述
我们再尝试一下指定端口,毕竟随机的端口不容易记住,还是先停止容器,然后执行docker run -d -p 8080:80 hub.c.163.com/library/nginx,然后我们本机访问8080端口,也是成功的
在这里插入图片描述

五、Docker网络

Docker默认提供了三种网络模式,在生成容器时,如果不指定网络模式默认使用bridge桥接模式,我们先看下这三种网络模式docker network ls
在这里插入图片描述
先说none模式,这个看上去就是容器没有进行任何网络配置,即这个容器没有网卡、IP等信息,但是它是有自己的Network Namespace,因此这种网络类型不能联网,可以很好的保证容器的安全性;
然后是host模式,这种模式容器没有自己的Network Namespace,和宿主机共用一个,并且使用宿主机的IP和端口;
最后是默认的bridge(桥接)模式,我们先看下没有安装docker的机器上的网络设置,只有ens33、lo、和virbr0这三个配置在这里插入图片描述
然后,我们看看启动一个容器之后,本机的网络,发现多了一个docker0的配置
在这里插入图片描述
这个docker0就是默认的虚拟网桥,新建的容器会自动桥接到该接口下,附加在其上的任何网卡之间都能自动转发数据包,创建一对虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0接口(容器网卡),另一个接口放置在宿主机命名空间中,以 vethxxx 这样的名字命名,宿主机上的所有容器都连接到这个内部网络上,分配一个和网桥 docker0在同网段的IP地址给容器,并设置docker0的IP地址为容器的默认网关,如图所示
在这里插入图片描述
可以看一下启动的容器bb0d…的网络设置
在这里插入图片描述
然后再看下网桥的设置docker network inspect bridge

[
    {
        "Name": "bridge",
        "Id": "6b8a1209420f33468d60b9853eceb922724a517c5164738b1666edb2eaaade72",
        "Created": "2022-10-27T02:40:17.103940791-07:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "bb0d08a1a2a33354c5d616f1148e50dc9d4b88589148d71fcb2965640c12cb9f": {
                "Name": "frosty_swirles",
                "EndpointID": "ed0de88801c1eef44fcbb751f7d20107577036f61b62b2eedff4503b7725ad2e",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

可以看到,在网桥设置中,将我们的容器包含进去了,也就是说容器和网桥docker0建立了连接。

六、Dockerfile

Dockerfile是由一行行命令语句组成,一般分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令。

1、自定义Dockerfile构建镜像

我们在空目录新建一个Dockerfile文件,输入如下内容

FROM hub.c.163.com/library/nginx
RUN echo '这是雅俗共赏构建的nginx镜像' > /usr/local/share/index.html

FROM:定制的镜像是基于FROM的镜像,这里的nginx就是基础镜像
RUN:用于执行后面的命令行命令
然后开始构建镜像,在Dockerfile文件的存放目录下,执行构建命令:docker build -t nginx:ysgs .
nginx:ysgs(镜像名称:镜像标签),最后的.代表本次执行的上下文路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CZdFQSS6-1667118245269)(https://imgblog.csdnimg.cn/cbf5958d55ec43918264ac7d10b7e320.png)]
在这里插入图片描述至此,我们的镜像构建成功!

2、Dockerfile指令

COPY:复制指令,从上下文目录中复制文件或目录到容器的指定路径,COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
ADD:和COPY指令使用类似,功能也类似,同样需求下,官方推荐使用COPY
CMD:类似RUN指令,用于运行程序,但是二者的运行时间点不同,CMD在docker run时执行,RUN在docker build时执行CMD ["<可执行文件或命令>","<param1>","<param2>",...]
ENTRYPOINT:类似CMD命令,但是不会被docker run的命令行参数指定的指令覆盖,而且这些参数会被当做参数传给ENTRYPOINT指令指定的程序,但是如果docker run使用了–entrypoint选项,会覆盖指令,可以搭配CMD指令使用,一般是变参才会使用CMD,这里的CMD是给ENTRYPOINT传参

FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参 

如果不传参,docker run nginx:test,容器内默认运行nginx -c /etc/nginx/nginx.conf;如果传参docker run nginx:test -c /etc/nginx/new.conf,容器内运行nginx -c /etc/nginx/new.conf
ENV:设置环境变量,ENV <key> <value>
ARG:构建参数,和ENV作用一致,作用域不同,ARG只在dockerfile构建过程中有效,构建好的镜像不存在此环境变量
VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷,VOLUME ["<路径1>", "<路径2>"...]
EXPOSE:声名端口,EXPOSE <端口1> [<端口2>...]
WORKDIR:指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在,WORKDIR <工作目录路径>
USER:指定执行后续命令的用户和用户组,USER <用户名>[:<用户组>]
HEALTHCHECK:用于指定某个程序或者指令来监控 docker 容器服务的运行状态
ONBUILD:用于延迟构建命令的执行,本次构建其指定的指令不执行,当有其他Dockerfile使用之后,才执行,ONBUILD <其它指令>
LABEL:用于给镜像添加一些元数据,LABEL <key>=<value> <key>=<value> <key>=<value> ...,例如添加作者信息 LABEL author:"ysgs"

总结

至此,Docker的一些基本操作就已经完成了,这些只是入门级的知识,要想更加深入的掌握和运用Docker,还需要参照官网,学习更多的内容。

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

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

相关文章

【Java|golang】1668. 最大重复子字符串

给你一个字符串 sequence &#xff0c;如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串&#xff0c;那么单词 word 的 重复值为 k 。单词 word 的 最大重复值 是单词 word 在 sequence 中最大的重复值。如果 word 不是 sequence 的子串&#xff0c;那么重…

系统学习SpringFramework:SpringBean的注入方式

本篇内容包括&#xff1a;Spring 容器简介&#xff08;什么是容器、容器如何工作&#xff09;、SpringBean 注入方式&#xff08;SpringBean 注入方式分类、Autowiring 自动绑定&#xff09;以及 获取 Spring Bean 的工具类&#xff01; 一、Spring 容器 1、什么是容器 Sprin…

薪资17K,在字节外包工作是一种什么体验...

我17年毕业于一个普通二本学校&#xff0c;电子信息工程学院&#xff0c;是一个很不出名的小本科。大学期间专业知识也没有去认真的学习&#xff0c;所以毕业的时候就随便找了一份工作&#xff0c;在一个小公司做功能测试。 记得那时候税前薪资大概是7k左右&#xff0c;因为是…

SpringBoot:(四)底层注解详解

笔记来源&#xff1a;【尚硅谷】SpringBoot2零基础入门教程&#xff08;spring boot2干货满满&#xff09; 文章目录4.1 Configuration详解总结4.2 Component、Controller、Service、Repository、Bean4.3 Import导入组件4.4 Conditional条件装配4.5 ImportResource导入Spring配…

刷题记录(NC20313 [SDOI2008]仪仗队)

NC20313 [SDOI2008]仪仗队 题目链接 关键点&#xff1a; 1、首先分析题目&#xff0c;对于只能看到的点&#xff0c;设原点坐标为&#xff08;0&#xff0c;0&#xff09;&#xff0c;则除去横纵坐标上能看到的两点(0, 1)、(1, 0)&#xff0c;和对角线上的(1, 1)&#xff0c…

Redis相关知识

目录 一&#xff0c;Redis的命令操作 1.Redis简介 2.Redis安装&#xff08;按步骤执行以下步骤即可&#xff09; 3.redis命令 二&#xff0c;java代码操作Redis 1.java连接Redis 2.java操作Redis 三&#xff0c;Spring注解式缓存Redis 1.Spring整合Redis 2.redis注解式缓…

2023年,前端开发未来可期

☆ 对于很多质疑&#xff0c;很多不解&#xff0c;本文将从 △ 目前企业内前端开发职业的占比&#xff1b; △ 目前业内开发语言的受欢迎程度&#xff1b; △ 近期社区问答活跃度&#xff1b; 等维度来说明目前前端这个职业的所处位置。 ☆ 还有强硬的干货&#xff0c;通过深入…

Flask快速白嫖

一、快速搭建 有前面Flask的学习&#xff0c;相信大家对flask已经有一个不错的了解&#xff0c;今天教大家如何快速搭建一个web网页&#xff01;&#xff01;&#xff01;. 博主不是专门做软件的&#xff0c;但是需求里又有网站的需要&#xff0c;所以怎么办呢&#xff1f; 那…

python动态规划算法实例详解

文章目录python动态规划算法实例详解一、什么是动态规划&#xff1f;二、新视角&#xff1a;从斐波那契数列看动态规划三、实例扩展&#xff08;爬楼梯&#xff09;1. 题目描述2. 示例示例1示例23. 解析4. 代码实现四、结语&#x1f496;&#x1f496;&#x1f496;&#x1f49…

特性Attribute

浅浅了解一下&#xff0c;可影响程序集的运行 [Obsolete]:生成表提示&#xff0c;有true报错提示&#xff0c;无true是提醒提示 是什么&#xff1a;特性就是一个类(可是自定义类)&#xff0c;这个类直接/间接继承自Attribute类&#xff0c;一般类名以Attribute结尾&#xff0c…

ReentrantLock与ReentrantReadWirteLock 原理

ReentrantLock原理&#xff08;**&#xff09; 讲解除了FairLock部分是FairLock流程&#xff0c;其余均NonFairLock源码 &#xff08;FairLock部分会讲解两者不同&#xff09; 1. NonFairLock实现原理 加锁解锁流程 先从构造器开始看&#xff0c;默认为非公平锁实现 public …

Commvault+XSKY 推出基于 Object Lock 的防勒索病毒联合方案

从桶粒度到对象粒度随着对象存储的普及&#xff0c;对象存储已经成为最流行的备份目的&#xff08;backup target) 存储。XSKY星辰天合作为国内领先的对象存储厂商&#xff0c;Commvault 作为全球领先的数据保护厂商&#xff0c;双方一直有紧密的合作。特别在 2020 年&#xff…

装了我这 10 个 IDEA 神级插件后,同事也开始情不自禁的嘚瑟了

CSDN 的小伙伴&#xff0c;大家好&#xff0c;我是二哥呀。 昨天&#xff0c;有读者私信发我一篇 CSDN 上的文章&#xff08;就是这篇&#x1f602;&#xff09;&#xff0c;说里面提到的 Intellij IDEA 插件真心不错&#xff0c;基本上可以一站式开发了&#xff0c;希望能分享…

【学习笔记】《Python深度学习》第一章:什么是深度学习

文章目录1 人工智能、机器学习与深度学习1.1 人工智能1.2 机器学习1.3 从数据中学习表示1.4 深度学习之“深度”1.5 用三张图理解深度学习的工作原理2 机器学习简史2.1 概率建模2.2 早期神经网络2.3 核方法2.4 决策树、随机森林与梯度提升机2.5 回到神经网络2.6 深度学习的不同…

清华学姐三年的测试成长经历,到最后的喜提高薪offer

上个礼拜刚好转正了&#xff0c;三个月试用期&#xff0c;五月份换的工作。 现在这份工作&#xff0c;相比上一份确实好很多&#xff0c;比如工资直接涨了一倍&#xff0c;7到14&#xff0c;13薪&#xff0c;朝九晚六&#xff0c;从不加班&#xff0c;项目也简单&#xff0c;包…

计算机毕业设计(附源码)python疫情下校园食品安全信息管理

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

stm32毕业设计 单片机MP3音乐播放器

文章目录1 简介2 绪论2.1 课题背景与目的3 系统设计3.1 系统架构3.2 软件部分设计3.3 实现效果3.4 部分相关代码1 简介 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始…

【网络原理】UDP和TCP协议重点知识汇总

目录 1.UDP协议&#xff1a; 2.TCP协议&#xff1a; 1.UDP协议&#xff1a; UDP协议的特点&#xff1a;无连接、不可靠传输、面向数据报和全双工。UDP报文最大长度是2个字节&#xff0c;2个字节表示的范围就是0~65535&#xff0c;也就是64kb。所以如果需要使用UDP传输一个比…

Qt 自定义控件

学过的东西很久不用都已经忘记了&#xff0c;即使是很简单的事情 1、添加一个Qt 设计师界面类 如何将这个放到比较好看并且是居中的呢&#xff1f; 布局--》水平-》竖直 点击大的widget 不是这两个控件 2、在主窗口中添加一个widget 来加载上面我们已经拿到组合控件 3、将这个…

HTML入门零基础教程(三)

嗨&#xff0c;大家好&#xff0c;我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助&#xff0c;请支持一波。 希望未来可以一起学习交流。 目录 一、 VSCode工具生成骨架标签新增代码 1.文档类型声明标签 2.lang语言种类 3.charset字符集 二、HT…