Docker基本管理和网络模式

187 阅读10分钟

一 . Docker概述

image-20220621142913953

1.1 Docker是什么?

  • 是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源
  • 是在Linux容器运行应用的开源工具
  • 是一种轻量级的"虚拟机"
  • Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级、可移植的、自给自足的容器。

Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱* *

鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序

1.2 Docker的设计宗旨:

Build, Ship and Run Any App, Anywhere, 即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统

1.3 Docker与虚拟机的区别:

  • 容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
  • 虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多
特性Docker容器虚拟机
启动速度秒级分钟级
计算能力损耗几乎无损耗 50%作用
性能接近原生弱于
系统支持量(单机)上千个几十个
隔离性资源隔离/限制完成隔离

img

img

每个虚拟机都有自己的独立内核,而容器中是共享内核的

如上图所示,由于容器所需的资源要少得多(例如,它们不需要一个完整的 OS),所以它们易于部署且可快速启动。这使你能够具有更高的密度,也就是说,这允许你在同一硬件单元上运行更多服务,从而降低了成本。

在同一内核上运行的副作用是,你获得的隔离比 VM 要少。

镜像的主要目标是使环境 (依赖项) 在不同的部署中保持不变。 也就是说,可以在计算机上调试它,然后将其部署到保证具有相同环境的另一台计算机上。

借助容器镜像,可打包应用或服务并采用可靠且可重现的方式对其进行部署。可以说 Docker 不只是一种技术,还是一种原理和过程

在使用Docker之前,我们经常会听到,“这个问题在开发环境是正常的!”。而在使用 Docker 后,你不会听到开发人员说:“为什么它能在我的计算机上使用却不能用在生产中?”。开发人员只需说“它在 Docker 上运行”,因为打包的 Docker 应用程序可在任何支持的 Docker 环境上执行,而且它在所有部署目标(例如,开发、QA、暂存和生产)上都按预期运行。

容器在内核中支持2种重要技术: docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现硬件资源限制,通过写时复制技术(copy-on-write)实现了高效的文件(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)

image-20220621095342753

1.4 容器化越来越受欢迎,因为容器是:

 ●灵活:即使是最复杂的应用也可以集装箱化。
 ●轻量级:容器利用并共享主机内核。
 ●可互换:可以即时部署更新和升级。
 ●便携式:可以在本地构建,部署到云,并在任何地方运行。
 ●可扩展:可以增加并自动分发容器副本。
 ●可堆叠:可以垂直和即时堆叠服务。
  • 容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量
  • 虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多

1.5 Docker核心概念

镜像 Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。 Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像是基个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。

容器 Docker的容器是从镜像创建的运行实例,它可以被启动停止删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。 可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。

仓库 Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取Docker 的镜像、容器、日志等内容全部都默认存储在/var/lib/docker

二. yum安装Docker

2.1 环境准备

 目前 Docker 只能支持64位系统
 ​
 systemctl stop firewalld
 setenforce 0

2.2 安装依赖包

 yum install -y yum-utils device-mapper-persistent-data lvm2
 ​
 -----------------------------------------------------------
 yum-utils:提供了 yum-config-manager工具
 device mapper:是Linux内核中支持逻辑卷管理的通用设备映!
 制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
 device mapper存储驱动程序需要 device-mapper-persistent-data和lvm2

image-20220621154529924

2.3 设置阿里云镜像源

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

image-20220621154737264

2.4 安装 Docker-CE并设置为开机自动启动

 yum install -y docker-ce-cli containerd.io
 ​
 systemctl start docker.service
 systemctl enable docker.service
 ​
 -----------------------------------------------------------
 安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器,
 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端运行在一台机器上
 -----------------------------------------------------------

三. Docker镜像操作

Docker version-查看Docker版本

Docker info-显示当前Docker相关信息

3.1 搜索镜像和仓库名

 格式:docker search 关键字
 docker search nginx
 ​

image-20220621173919296

3.2 拉取镜像、查看本地已有镜像信息

 #获取镜像
 格式:docker pull 仓库名称[:标签]
 ​
 #如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签,一个镜像可以存在多个标签,也可以理解为版本,但是镜像id号都是唯一的。
 docker pull nginx
 ​
 #查看本地已有镜像及信息
 docker images
 ​
 REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
 nginx        latest    ae2feff98a0c   9 days ago   133MB
 ​
 -----------------------------------------------------------
 REPOSITORY:镜像属于的仓库;
 TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
 IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
 CREATED:镜像创建时间;
 VIRTUAL SIZE:镜像大小;
 ​

直接拉取镜像并查看本地镜像

image-20220621221602666

拉取 指定仓库指定版本镜像

image-20220621222426560

3.3 阿里云镜像加速

在网络不好的时候可以使用镜像加速

 (1)#浏览器访问 https://help.aliyun.com/document_detail/60750.html 获取镜像加速器配置
 ​
 (2)#当您下载安装的Docker Version不低于1.10时,建议通过daemon config进行配置。使用配置文件/etc/docker/daemon.json(没有时新建该文件)。
 sudo mkdir -p /etc/docker
 sudo tee /etc/docker/daemon.json <<-'EOF'
 {
   "registry-mirrors": ["https://ctlf28sz.mirror.aliyuncs.com"]
 }
 EOF
 ​
 (3)#加载配置并重启docker
 sudo systemctl daemon-reload
 sudo systemctl restart docker
 ​
 ​

浏览器访问阿里云

image-20220621224440840

按照提示获取镜像加速器地址

image-20220621224755544

image-20220621225246307

编辑/etc/docker/daemon.json文件

image-20220621225427423

加载配置并重启docker

image-20220621225834203

3.4 docker相关文件保存位置

 [root@localhost ~]# cd /var/lib/docker/
 [root@localhost docker]# ls
 buildkit    image    overlay2  runtimes  tmp    volumes
 containers  network  plugins   swarm     trust
 ​
 ------------------------------------------------------------
 文件作用详解
 image:存放镜像文件
 overlay2:用于存放镜像底层文件的目录
 containers:用于存放容器的相关信息
 ​
 ##如果想要查看查看下载的镜像的文件信息,查看/var/lib/docker/image/overlay2/repostories.jason,此目录以Jason格式记录了每个镜像的相关信息,但是此文件是经过加密显示的,只能查看到部分内容

3.5 根据镜像的唯一标识 ID 号,获取镜像详细信息

 #(1)通过 docker images 命令查看镜像的id号
 [root@localhost docker]# docker images
 REPOSITORY      TAG       IMAGE ID       CREATED       SIZE
 nginx           latest    0e901e68141f   3 weeks ago   142MB
 soscscs/myapp   v1        d4a5e0eaa84f   4 years ago   15.5MB
 ​
 #(2)使用`docker inspect 镜像id号`来查看镜像的详细信息

image-20220621233054714

3.6 本地的镜像修改新的标签

 #(1)为本地的镜像修改新的标签
 格式:docker tag 镜像名:[标签] 镜像名:[新标签]
 docker tag nginx:latest nginx:web
 docker images | grep nginx
 ​
 #(2)此命令也可以修改仓库名
 格式:docker tag 镜像名:[标签] 仓库名/镜像名:[新标签]
 ​
 docker tag nginx:latest soscsc/nginx:web
 docker images | grep nginx

为本地的镜像修改新的标签

image-20220621234222152

添加或修改仓库名

image-20220621235833444

当本地有很多镜像的时候,我们可以是使用docker images | grep 镜像名或者其他信息 来查看

3.7 删除镜像

 格式:
 docker rmi 仓库名称:标签              
 #当一个镜像有多个标签时,只是删除其中指定的标签
 ​
 或者
 docker rmi 镜像ID号 [-f]                       
 #会彻底删除该镜像,注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
 ​
 #如果镜像id有多个标签得加上-f

3.8 将镜像保存成为本地文件

在docker中,镜像是加密的,如果我们想要把安装包传送给其他的服务或者下载另行使用,需要使用以下命令

 #取出镜像:将镜像保存成为本地文件
 格式:docker save -o 存储文件名 存储的镜像
 docker save -o myapp.tar nginx:latest           
 ​
 #存储镜像命名为nginx存在当前目录下
 ls -lh

image-20220622003439493

3.9 载入镜像:将镜像文件导入到镜像库中

 #载入镜像:将镜像文件导入到镜像库中
 格式:
 docker load < 存出的文件
 或者
 docker load -i 存出的文件
 ​
 例:
 docker load < nginx

这里模拟一下使用一台无联网但是同网段的安装了docker的主机进行镜像文件的载入

3.9.10 上传镜像

  • 默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。hub.docker.com
  • 可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
  • 在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。
 docker tag nginx:latest nginx:web       #添加新的标签
 docker login                          #登录公共仓库
 ​
 #输入用户名和密码
 Username:  
 password:
 ​
 docker push wl/nginx:web               #上传镜像

image-20220622010342357

image-20220622010625343

更改镜像标签,上传至自己的仓库

image-20220622011258900

尝试上传失败,镜像需要添加仓库名

image-20220622012402386

上传成功

image-20220622012643676

这时在网页端的docker hub也可以看到了

image-20220622012854019

image-20220622013102077

四. docker容器操作

4.1 容器创建——docker create

容器创建:就是将镜像加载到容器的过程。

 #新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
 -----------------------------------------------------------------
 格式:docker create [选项] 镜像
 ​
 常用选项:
 -i:让容器的输入保持打开,必选项
 -t:让 Docker 分配一个伪终端
 -it:合起来实现容器交互的作用,运行一个交互式会话shell
 -----------------------------------------------------------------
 docker create -it nginx:latest /bin/bash或bash

image-20220623161605283

4.1.1创建容器时WARNING: IPv4 forwarding is disabled,怎么解决?

 #创建容器时,提示WARNING: IPv4 forwarding is disabled
 ​
 [root@localhost ~]# docker create -it nginx:latest bash
 WARNING: IPv4 forwarding is disabled. Networking will not work.
 6055b6fca60cb9d984d13bf21c38912f3774b41361334d8e8b78fbb01022c68c
 ​
 ------------------------------------------------------------------
 #解决方法
 [root@localhost ~]# vim /etc/sysctl.conf
 #在配置文件最后添加以下内容即可
 net.ipv4.ip_forward=1
 ​
 [root@localhost ~]# sysctl -p       
 net.ipv4.ip_forward = 1
 [root@localhost ~]# systemctl restart docker.service    

问题

image-20220623155459493

解决方法

image-20220623160600370

加载配置并重启docker

image-20220623160714438

4.2 查看所有容器的状态——docker ps -a

 docker ps -a [q]            
 #-a 选项可以显示所有的容器,不加-a显示运行容器状态
 #-q 查看id号
 -----------------------------------------------------------------
 docker ps -a字段解释
 CONTAINER ID 容器的ID号
 IMAGE:加载的镜像
 COMMAND:运行的程序
 CREATED:创建时间
 STATUS:当前的状态
 PORTS:端口映射
 NAMES:名称

image-20220623161605283

4.3 启动容器——docker start

 格式:docker start 容器的ID/名称
 docker start nginx:latest
 docker ps -a

image-20220623163214192

4.4 创建并启动容器——docker run

创建并启动容器

  • 可以直接执行docker run命令,等同于先执行docker create命令,再执行docker start命令。
  • 注意:容器是一个与其中运行的shell命令共存亡的终端,命令运行容器运行,命令结束容器退出。
  • docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker容器中pid=1的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。

当利用 docker run 来创建容器时, Docker 在后台标准运行过程是: (1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载; (2)利用镜像创建并启动一个容器; (3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层; (4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中; (5)分配一个地址池中的 IP 地址给容器; (6)执行用户指定的应用程序,执行完毕后容器被终止运行。

 常用选项
 -i: 以交互模式运行容器,通常与 -t 同时使用;
 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;(启动的时候传入命令)
 -d: 后台运行容器,并返回容器ID;
 -P: 随机端口映射,容器内部端口随机映射到主机的端口
 -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
 --name:指定容器名,不指定为随机
 -----------------------------------------------------------------
 #示例1
 docker run -itd nginx:latest /bin/bash   
 ​
 #示例2  执行后退出
 docker run nginx:latest bash或sh -c ls 
 #如果bash用不了尝试使用sh
 ​
 #示例3  执行后不退出,以守护进程方式执行持续性任务
 docker run -d nginx:latest /usr/local/sh -c "while true;do echo hello;done"

示例1

image-20220623223024246

示例2

image-20220623225030460

4.5 终止容器运行——docker stop

 格式:docker stop 容器的ID/名称
 ​
 docker stop f24ef5f42e95 
 docker ps -a
 ​

image-20220623164535885

4.6 容器的进入——docker exec

进入容器的容器状态必须是up状态

和shell 是两种运行模式

  • docker run -it会创建前台进程,但是会在输入exit后终止进程。
  • docker attach会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止容器进程
  • docker exec -it 会连接到容器,可以像sSH一样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行。
 需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。
 -----------------------------------------------------------------
 格式:docker exec -it 容器ID/名称 /bin/bash 
 -i 选项表示让容器的输入保持打开;
 -t 选项表示让 Docker 分配一个伪终端。
 -----------------------------------------------------------------
 #1.想永久性进入容器,退出后还是运行状态,用docker exec
 docker ps -a  #进入容器前,确保容器正在运行,
 docker exec -it 436672bd2c60 sh  #进入容器目录,此容器不支持bash,使用sh
 ls          #查看文件容器内的目录
 exit                #退出容器后,容器仍在运行
 docker ps -a         #查看容器状态
 ​
 ​
 #2.不进入容器,查看容器内容
 docker exec -it 436672bd2c60 cat /mnt/ky18.txt
 ​

image-20220623192651856

4.7 删除容器——docker rm

 格式:docker rm [-f] 容器ID/名称
 docker stop clever_grothendieck
 docker rm clever_grothendieck               #删除已经终止状态的容器
 ​
 docker rm -f magical_proskuriakova          #强制删除正在运行的容器
 ​
 docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash 
 #批量停止容器
 ​
 docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
 或
 docker rm -f `docker ps -aq`
 #批量删除所有容器
 ​
 docker images | awk 'NR>=2{print "docker rmi "$3}' | bash   
 或
 docker rmi $(docker images -q) -f
 #批量删除镜像

使用docker rm -fdocker rm删除容器

image-20220623170637983

4.8 查看容器日志——docker logs

 docker logs 容器ID/名称
 #查看容器pid=1的进程的日志

image-20220704174317452

image-20220704174438541

查看日志

image-20220704183444722

4.8 容器与宿主机之间的数据拷贝——docker cp

 #容器复制到主机
 docker cp 容器ID/名称:路径   主机路径
 ​
 ​
 #主机复制到容器
 docker 主机路径  容器ID/名称:路径
 ​

4.9 容器文件的导出与导入

 用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
 ​
 #导出格式:docker export 容器ID/名称 > 文件名
 docker export 2592d3fad0fb > centos7tar
 ​
 #导入格式:cat 文件名 | docker import – 镜像名称:标签
 cat centos7tar | docker import - centos7:test           #导入后会生成镜像,但不会创建容器

总结

镜像管理命令

 docker search [仓库/镜像名]      #搜索镜像
 docker pull [仓库/镜像名]        #获取镜像
 docker images                  #查看本地镜像
 docker inspect [镜像ID]         #查看镜像的详细信息
 docker rmi [镜像ID/镜像名称:标签] -f        #删除镜像
 docker save -o 镜像文件.tar 镜像名称:标签    #生成镜像文件
 docker load -i[或<] 镜像文件               #加载镜像文件     
 docker push 仓库名/镜像名:标签              #推送镜像到仓库
 docker tag 库名:标签 新库名/新标签           #修改库名及标签

总结容器管理命令

 docker create -i [--name=容器名称]镜像名      #创建容器
 docker create -it [--name=容器名称] 镜像名<命令>  
 docker start <容器ID/名称>                   #开启容器
 docker ps -a                                #查看所有容器状态
 docker stop <容器ID/名称>                    #关闭容器
 docker rm <容器ID/名称> [-f]                 #删除容器
 docker rm $(docker ps -aq)                  #批量删
 docker rmi $(docker images -q) -f           #批量删
 docker run [--name] -id                     #创建并运行
 docker exec -it <容器ID/名称> bash|sh         #进入容器
 docker logs 容器ID/名称                       #查看容器日志
 docker cp 容器ID/名称:路径                     #将容器内文件复制到宿主机
 docker export 容器ID/名称 > 导出文件            #容器的导出
 cat 导出文件 | docker import - 镜像名称:标签    #容器导入

\