Docker入门

Docker入门

一:容器介绍

1. logo

在这里插入图片描述
容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用"装"起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去,这其实是 PaaS 最理想的状态。

2. 云计算服务类型

基础设施即服务IaaS

平台即服务(PaaS)

软件即服务(SaaS)

3. 容器本质

容器的本质是进程,容器就是未来云计算系统中的进程。

4. 容器和虚拟机对比在这里插入图片描述容器是应用程序层的抽象,将代码和依赖项打包在一起。多个容器可以在同一台计算机上运行,并与其他容器共享OS内核,每个容器在用户空间中作为隔离的进程运行。容器占用的空间少于VM,可以处理更多的应用程序,并且需要的VM和操作系统更少。

特性虚拟机容器
启动分钟级秒级
硬盘启动一般为GB一般为MB
性能弱于接近原生
系统支持量一般几十个单机支持上千个容器

5. docker基本概念

Docker系统有两个程序:docker服务端和docker客户端

Docker服务端:

​ 是一个服务进程,管理着所有的容器。

Docker客户端:

​ 是docker服务端的远程控制器,可以用来控制docker的服务端进程。

6. docker的优势

交付物标准化

Docker是软件工程领域的"标准化"交付组件,最恰到好处的类比是"集装箱"。

集装箱将零散、不易搬运的大量物品封装成一个整体,集装箱更重要的意义在于它提供了一种通用的封装货物的标准,卡车、火车、货轮、桥吊等运输或搬运工具采用此标准,隧道、桥梁等也采用此标准。以集装箱为中心的标准化设计大大提高了物流体系的运行效率。

传统的软件交付物包括:应用程序、依赖软件安装包、配置说明文档、安装文档、上线文档等非标准化组件。

Docker的标准化交付物称为"镜像",它包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。

一次构建,多次交付

类似于集装箱的"一次装箱,多次运输",Docker镜像可以做到"一次构建,多次交付"。当涉及到应用程序多副本部署或者应用程序迁移时,更能体现Docker的价值。

应用隔离

集装箱可以有效做到货物之间的隔离,使化学物品和食品可以堆砌在一起运输。Docker可以隔离不同应用程序之间的相互影响,但是比虚拟机开销更小。

总之,容器技术部署速度快,开发、测试更敏捷;提高系统利用率,降低资源成本。

namespace 命名空间 名字空间

cgroups 资源限制

rootfs 文件系统

7.Docker三大核心组件

Docker 镜像 - Docker images

Docker 仓库 - Docker registeries

Docker 容器 - Docker containers

Docker仓库

用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。

公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。

库:registry

公有库:

Docker-hub Daocloud ali 网易蜂巢

私有库:

公司内部使用(自己部署)

分类:

操作系统名称 centos ubuntu

应用名称 nginx tomcat mysql

Tag:

​ 表示镜像版本

Docker 镜像

​ Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。

​ 每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。下层那个镜像是上层镜像的父镜像。

镜像名称:

仓库名称+镜像分类+tag名称(镜像版本)

完整镜像名称:

​ docker.io/nginx:v1

​ docker.io/nginx:latest

​ daocloud.io/centos:6

镜像ID:

​ 64位的id号

基础镜像:

​ 一个没有任何父镜像的镜像,谓之基础镜像。

注意:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wwuAN43z-1624452437655)(C:\Users\Y\AppData\Roaming\Typora\typora-user-images\image-20210616195245993.png)]
Registry中镜像是通过Repository来组织的,而每个Repository又包含了若干个Image。Registry包含一个或多个Repository

Docker 容器

Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。

二:容器安装部署

使用aliyun docker yum源安装新版docker 1.19 = 1.20

docker-ce

docker-ee

删除已安装的Docker

(注意:这个是可选项,如果系统中存在那么我们就删除)

[root@xingdian ~]# yum remove docker \
        docker-client \
        docker-client-latest \
        docker-common \
        docker-latest \
        docker-latest-logrotate \
        docker-logrotate \
        docker-selinux \
        docker-engine-selinux \
        docker-engine
配置阿里云Docker Yum源
[root@xingdian ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 git
[root@xingdian ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装指定版本
查看Docker版本:
[root@xingdian ~]# yum list docker-ce --showduplicates
安装较旧版本(比如Docker 17.03.2) :
需要指定完整的rpm包的包名,并且加上--setopt=obsoletes=0 参数:
[root@xingdian ~]# yum install -y --setopt=obsoletes=0 \
   docker-ce-17.03.2.ce-1.el7.centos.x86_64 \
   docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
安装Docker新版本(比如Docker 2010.2)[root@xingdian ~]# yum install docker-ce-20.10.2.ce -y
   或者
[root@xingdian ~]# yum install docker-ce -y
启动Docker服务
[root@xingdian ~]# systemctl enable docker
[root@xingdian ~]# systemctl start docker
查看docker版本状态
[root@xingdian ~]# docker -v
Docker version 19.03.12, build 48a66213fe
查看docker运行状态:
[root@xingdian ~]# docker info
Client:
Debug Mode: false
Server:
 Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
 Images: 3
 Server Version: 19.03.12
 Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
 seccomp
Profile: default
 Kernel Version: 3.10.0-1062.12.1.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 7.637GiB
 Name: xingdian ID:DW7V:VN63:7P5F:X36D:UPXA:WSXK:NVXU:FG4E:UIKY:ISIZ:AVW3:3RXT
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
 127.0.0.0/8
 Live Restore Enabled: false

三:国内镜像仓库的使用

国内镜像站

https://www.daocloud.io

国外镜像站

https://hub.docker.com
在这里插入图片描述在这里插入图片描述

镜像加速器

在这里插入图片描述
使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此 DaoCloud 推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问 Docker Hub 的速度,目前已经拥有了广泛的用户群体,并得到了 Docker 官方的大力推荐。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-twOeiLUZ-1624452437666)(C:\Users\Y\AppData\Roaming\Typora\typora-user-images\image-20210616210014114.png)]

配置 Docker 镜像站
Linux:
[root@xingdian ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io            //配置镜像加速器
docker version >= 1.12
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
Success.
You need to restart docker to take effect: sudo systemctl restart docker
[root@xingdian ~]# systemctl restart docker
登陆登出Docker Hub
login   Register or log in to a Docker registry
登录到自己的Docker register,需有Docker Hub的注册账号
[root@xingdian ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: 17343051369
Password: 
Login Succeeded
logout  Log out from a Docker registry
退出登录
   \# docker logout
   Remove login credentials for https://index.docker.io/v1/

四:深入理解容器

1. Docker的镜像和容器的区别

Docker镜像

假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的。这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态。

一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。

要列出本地所有有效的镜像,可以使用命令

[root@xingdian ~]# docker images   //查询镜像

Docker容器

Docker容器可以使用命令创建:

[root@xingdian ~]# docker run + 镜像名

它会在所有的镜像层之上增加一个可写层。这个可写层有运行在CPU上的进程,而且有两个不同的状态:运行态(Running)和退出态 (Exited)。这就是Docker容器。当我们使用docker run启动容器,Docker容器就进入运行态,当我们停止Docker容器时,它就进入退出态。当我们有一个正在运行的Docker容器时,从运行态到停止态,我们对它所做的一切变更都会永久地写到容器的文件系统中。要切记,对容器的变更是写入到容器的文件系统的,而不是写入到Docker镜像中的。我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身。如果对容器的底层镜像进行修改,那么当前正在运行的容器是不受影响的,不会发生自动更新现象。

64字符的十六进制的字符串来定义容器ID,它是容器的唯一标识符。容器之间的交互是依靠容器ID识别的,由于容器ID的字符太长,我们通常只需键入容器ID的前4个字符即可。当然,我们还可以使用容器名。

2. 容器名称

–name= Assign a name to the container

–为容器分配一个名字,如果没有指定,会自动分配一个随机名称

–docker run子命令的参数

容器命名方式:

1)使用UUID长命名(“f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778”)

2)使用UUID短命令(“f78375b1c487”)

3)使用Name(“xingdian”)

注意:

1.这个UUID标识是由Docker deamon生成的。

2.如果你在执行docker run时没有指定–name,那么deamon会自动生成一个随机字符串UUID。

3.但是对于一个容器来说有个name会非常方便,当你需要连接其它容器时或者类似需要区分其它容器时,使用容器名称可以简化操作。无论容器运行在前台或者后台,这个名字都是有效的。

4.如果在使用Docker时有自动化的需求,你可以将containerID输出到指定的文件中(PIDfile)类似于某些应用程序将自身ID输出到文件中,方便后续脚本操作。

–cidfile="": Write the container ID to the file

3. 镜像名称

镜像是Docker最核心的技术之一,也是应用发布的标准格式。无论你是用docker pull image,或者是在Dockerfile里面写FROM image,下载镜像应该是Docker操作里面最频繁的动作之一了。

下面是在本地机器运行docker images的输出结果:
在这里插入图片描述
常说的"ubuntu"镜像其实不是一个镜像名称,而是代表了一个名为ubuntu的Repository,同时在这个Repository下面有一系列打了tag的Image,Image的标记是一个GUID,为了方便也可以通过Repository:tag来引用。

那么Registry又是什么呢?Registry存储镜像数据,并且提供拉取和上传镜像的功能。

Registry中镜像是通过Repository来组织的,而每个Repository又包含了若干个Image。

• Registry包含一个或多个Repository

• Repository包含一个或多个Image

• Image用GUID表示,有一个或多个Tag与之关联

注意:

当一个镜像的名称不足以分辨这个镜像所代表的含义时,你可以通过tag将版本信息添加到run命令中,以执行特定版本的镜像。

[root@xingdian ~]# docker run ubuntu:14.04

4. 名字空间

namespace 空间隔离

cgroup 资源限制

rootfs 文件系统

名字空间是 Linux 内核一个强大的特性。每个容器都有自己单独的名字空间,运行在其中的应用都像是在独立的操作系统中运行一样。名字空间保证了容器之间彼此互不影响。

pid 名字空间

不同用户的进程就是通过 pid 名字空间隔离开的,且不同名字空间中可以有相同 pid。

net 名字空间

有了pid名字空间, 每个名字空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 名字空间实现的,每个 net 名字空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。

mnt名字空间

类似 chroot,将一个进程放到一个特定的目录执行。mnt 名字空间允许不同名字空间的进程看到的文件结构不同,这样每个名字空间 中的进程所看到的文件目录就被隔离开了。

uts 名字空间

UTS(“UNIX Time-sharing System”) 名字空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非主机上的一个进程。

user 名字空间

每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。

五:Docker使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YXDQ74ra-1624452437669)(C:\Users\Y\Desktop\QQ图片20210616155838.png)]在这里插入图片描述

Docker基本命令
docker pull  下载镜像
docker images 查看镜像
docker run 直接运行自动检查本地是否存在该镜像,如果有直接使用,没有先下载在使用
docker.io,tag[latest]仓库地址
docker rmi 删除镜像
docker rm  删除容器
docker ps 查看正在运行的容器
docker ps -a 查看所有容器
docker images -q 查看所有镜像ID
docker ps -a -q  查看所有容器ID
docker ps -q  查看正在运行容器ID
docker rm $(docker ps -a -q)  删除所有容器
docker exec -it 进入容器
--privileged  开启特权模式
[root@xingdian ~]# echo 3 > /proc/sys/vm/drop_caches  //清空内存里的缓存
镜像操作
##### 查看centos所有的镜像:
[root@xingdian ~]# docker search centos
凡是镜像大于100的显示出来,小于100的不显示
[root@xingdian ~]# docker search centos --stars=100
[root@xingdian ~]# docker search centos --filter=stars=100
OFFICIAL [OK]代表官方的
AUTOMATED [OK]代表完整的镜像
拉取镜像:
[root@xingdian ~]# docker pull centos     //下载centos镜像
[root@xingdian ~]# docker pull daocloud.io/library/centos:7.8.2003   //拉取镜像指定版本
查看本地镜像:
[root@xingdian ~]# docker image list
[root@xingdian ~]# docker images
[root@xingdian ~]# docker image ls
查看镜像详情:
[root@xingdian ~]# docker image inspect 镜像id
删除镜像:
 删除一个或多个,多个之间用空格隔开,可以使用镜像名称或id
[root@xingdian ~]# docker rmi daocloud.io/library/mysql
强制删除:--force
如果镜像正在被使用中可以使用--force强制删除  
[root@xingdian ~]# docker rmi docker.io/ubuntu:latest --force
删除所有镜像:
[root@xingdian ~]# docker rmi $(docker images -q)  
\#-q查出所有id号
只查看所有镜像的id:
[root@xingdian ~]# docker images -q 
容器操作
1.启动容器并指定名为server并放后台运行
[root@xingdian ~]# docker run --name server -it -d centos:latest /bin/bash    //启动centos
0e1eddc1f737395e76785bd14505623da6aa44e7794a77dd1294317b6eaabe44
[root@xingdian ~]# docker exec  -it  server2 /bin/bash          //进入centos查看是否创建成功
[root@0e1eddc1f737 /]# 
2.使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
第一种
[root@blackmed ~]# docker run -p 80:80 -v /data:/data -d nginx:latest
第二种
[root@blackmed ~]# docker run --name web -itd -v /web:/usr/share/nginx/html/ -p 999:80 nginx:latest
ec406647d6f3712bd489bf9612f8139247a528cbe14cc337305ff0d494b0b56b

3.使用镜像nginx:latest以交互模式启动容器,容器内执行/bin/bash命令。
[root@blackmed ~]# docker run -it nginx:latest /bin/bash
参数:
 -v:文件映射,格式为:主机目录:容器目录
 -d: 后台运行容器,并返回容器ID;
 -i: 以交互模式运行容器,通常与 -t 同时使用;
 -p: 端口映射,格式为:主机(宿主)端口:容器端口
 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
 --name="nginx-lb": 为容器指定一个名称;
 --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
 --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
 -h "mars": 指定容器的hostname; 
 -e username="ritchie": 设置环境变量;
 --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2": 绑定容器到指定CPU运行;
--privileged 以特权模式运行
4.查看容器
只查看运行状态的容器:
[root@xingdian ~]# docker ps
[root@xingdian ~]# docker ps -a
-a 查看所有容器
只查看所有容器id:
[root@xingdian ~]# docker ps -a -q
列出最近一次启动的容器
[root@xingdian ~]# docker ps -l
5.查看容器详细信息
[root@xingdian ~]# docker inspect 1fbf6
[
  {
   "Id": "1fbf6d9c50217c0f630fec1f98c6647e38e2371af94f2860d34674eeffd42f84",
    "Created": "2020-08-12T15:52:39.064893415Z",
    "Path": "/docker-entrypoint.sh",
   "Args": [
      "nginx",
      "-g",
      "daemon off;"
    ],
    "State": {
      "Status": "running",
      "Running": true,
      "Paused": false,
      "Restarting": false,
容器信息很多,这里只粘贴了一部分
6.启动容器
[root@xingdian ~]# docker start name
7.关闭容器
[root@xingdian ~]# docker stop name
退出不关闭:
快捷键:ctrl +p+q
8.删除容器
[root@xingdian ~]# docker rm 容器id或名称
要删除一个运行中的容器,添加 -f 参数
根据格式删除所有容器:
[root@xingdian ~]# docker rm $(docker ps -a -q)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ever Since!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值