企业级容器技术Docker

1 Docker 介绍和基础操作

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

移植性比较好----拥有独自的仓库,但要内核新

可移植性,标准化,隔离性)

1.1.2 Docker 是什么

Docker 是基于 Linux 内核实现,最早采用 LXC 技术 ,LXC 是 Linux 原生支持的容器技术 ,可以提供轻量级的虚拟化 。虚拟化技术 KVM(KernelKernel-based Virtual Machine Machine) 基于 模块实现, 后来Docker 改为自己研发并开源的 runc 技术运行容器,彻底抛弃了LXC。

Docker 架构C/S ,比虚拟机交付速度更快,资源消耗更低,使用远程API来管理和创建容器,其可以轻松的创建一个轻量级的、可移植的、自给自足的容器。

docker三大理念:build(构建),ship(运输),run(运行),Docker遵从apache 2.0协议,并通过(namespace及cgroup等)来提供容器的资源隔离与安全保障等。

Docker 的主要目标

Build, Ship and Run Any App, Anywhere,即通过对应用组件的封装(Packaging)、分发部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。

容器和虚拟机比较

在这里插入图片描述

  • 传统虚拟机要虚拟出一个主机硬件,并且运行一个完整的操作系统,然后在这个系统上安装和运行软件。
  • 容器上的应用直接运行在宿主机的内核上,容器并没有自己的内核,也不需要虚拟硬件,相当轻量化。
  • 容器之间是相互隔离,每个容器内都有一个属于自己的独立文件系统,独立的进程空间,网络空间,用户空间。所以在同一个宿主机上的多个容器之间彼此不会相互影响。

表现比较
在这里插入图片描述

  1. 资源利用率高:开销更小,不需要启动单独的虚拟机OS内核占用硬件资源,可以将服务器性能压缩到极致,虚拟机会有5-20%的损耗,容器运行基本无损耗
  2. 启动速度更快,可以在数秒内完成启动
  3. 占用空间更小,容器占用的磁盘空间以MB为单位,而虚拟机以GB
  4. 集成性更好,和CI/CD(持续集成,持续部署)相关技术结核性更好,实现打包镜像发布测试可以一键运行,做到自动化并快使用的部署管理。

比如: 一台96G内存的物理服务器,为了运行java程序的虚拟机一般需要分配8G内存/4核的资源,只能运行13台左右虚拟机,但是改为在docker容器上运行Java程序,每个容器只需要分配4G内存即可,同样的物理服务器就可以运行25个左右容器,运行数量相当于提高一倍,可以大幅节省IT支出,通常情况下至少可节约一半以上的物理设备

1.1.4 Docker 的组成

docker 官网: http://www.docker.com

帮助文档链接: https://docs.docker.com/

docker 镜像: https://hub.docker.com/

docker 中文网站: http://www.docker.org.cn/

在这里插入图片描述

  1. Docker主机(Host):一个物理机和虚拟机,用于运行Docker服务进程和容器,也称宿主机,node节点
  2. Docker服务端(Server):Docker守护进程,运行docker容器
  3. Docker客户端(Client):客户端使用Docker命令或其他工具调用docker API
  4. Docker镜像(Images):镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
  5. Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库harbor
  6. Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程
无状态:相对比较稳定,访问无变化,nginx 静态 index.html 
有状态:MySQL 访问有变化



在这里插入图片描述

*1.1.5 Namespace

逻辑上的名称空间

隔离类型

User Namespace

隔离类型功能系统调用参数内核版本
User Namespace(user)提供用户隔离能力,包括用户和组CLONE_NEWUSER3.8
Net Namespace(network)提供网络隔离能力,包括网络设备,网络栈,端口等CLONE_NEWNET2.6.29
PID Namespace(Process Identification)提供进程隔离能力CLONE_NEWPID2.6.24
UTS Namespace(UNIXTimesharing System)提供内核,主机名和域名隔离能力CLONE_NEWUTS2.6.19
MNT Namespace(mount)提供磁盘挂载点和文件系统的隔离能力CLONE_NEWNS2.4.19
UTS Namespace(UNIXTimesharing System)提供内核,主机名和域名隔离能力CLONE_NEWUTS2.6.19

1.1.6 Control groups

限制管理资源

Linux Cgroups的全称是Linux Control Groups,是Linux内核的一个功能.

如果不对一个容器做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码bug程序会一直申请内存,直到把宿主机内存占完,为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如CPU、内存等

Cgroups 最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,资源的计量以及资源的控制(比如:将进程挂起和恢复等操作)。

Cgroups在内核层默认已经开启,从CentOS 和 Ubuntu 不同版本对比,显然内核较新的支持的功能更多。

1.1.7 容器管理工具

1.1.7.2 docker

Docker 先启动一个容器也需要一个外部模板,也称为镜像,docke的镜像可以保存在一个公共的地方共享使用,只要把镜像下载下来就可以使用,最主要的是可以在镜像基础之上做自定义配置并且可以再把其提交为一个镜像,一个镜像可以被启动为多个容器。

Docker的镜像是分层的,镜像底层为库文件且只读层即不能写入也不能删除数据,从镜像加载启动为一个容器后会生成一个可写层,其写入的数据会复制到宿主机上对应容器的目录,但是容器内的数据在删除容器后也会被随之删除。

1.1.7.4 Podman

什么是Podman?
Podman即Pod Manager tool,从名称上可以看出和kubernets的pod的密切联系,不过就其功能来说,简而言之: alias docker = podman ,是CentOS 8 新集成的功能,或许不久的未来会代替docker

Podman是一个 为 Kubernetes 而生的开源的容器管理工具,原来是 CRI-O(即容器运行时接口CRI 和开放容器计划OCI) 项目的一部分,后来被分离成一个单独的项目叫 libpod。其可在大多数Linux平台上使用,它是一种无守护程序的容器引擎,用于在Linux系统上开发,管理和运行任何符合OpenContainer Initiative(OCI)标准的容器和容器镜像。

Podman 和docker不同之处

  • docker 需要在系统上运行一个守护进程(docker daemon),这会产生一定的开销,而podman 不需要

  • 因为docke有docker daemon,所以docker启动的容器支持 --restart 策略,但是podman不支持

  • docker需要使用root用户来创建容器。 这可能会产生安全风险,尤其是当用户知道docker run命令的–privileged选项时。podman既可以由root用户运行,也可以由非特权用户运行

  • docker在Linux上作为守护进程运行扼杀了容器社区的创新。 如果要更改容器的工作方式,则需要更改docker守护程序并将这些更改推送到上游。 没有守护进程,容器基础结构更加模块化,更容易进行更改。 podman的无守护进程架构更加灵活和安全

1.1.8容器的优势

移植性比较好

标准:runtime —runc

快速部署 高效虚拟化 节省开支
简化配置 环境统一 快速迁移和扩展
更好的实现面向服务的架构

缺点

  • 多个容器共用宿主机的内核,各应用之间的隔离不如虚拟机彻底
  • 由于和宿主机之间的进程也是隔离的,需要进入容器查看和调试容器内进程等资源,变得比较困难和繁琐
  • 如果容器内进程需要查看和调试,需要在每个容器内都需要安装相应的工具,这也造成存储空间的重复浪费

容器编排工具

在这里插入图片描述

centos7
--------------------------------------------------------
vim /etc/yum.repos.d/docker.repo
[docker-ce]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7.0/x86_64/stable/
gpgcheck=0

yum list | grep docker





KVM --单机
open stack -- 多机 vmware vcenter 多机
docker 单机
k8s 多机

yum -y install 
vim docker-ce.repo

-------------------------------------
ubuntu
-----------------------------------
apt list docker.io
apt install docker.io


yum -y install docker-ce

最新版的
--------------------------

ubuntu

服务器端
-d




docker info ---查看更多的信息

Cgroup 

客户端

apt install docker.io      ------最新版

root@ubuntu2004:~# systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-07-02 12:02:27 CST; 29min ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 4494 (dockerd)
      Tasks: 9
     Memory: 30.4M
     CGroup: /system.slice/docker.service
             └─4494 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock



centos

yum list --showduplicates   docker.ce         ---展示版本

yum install doceker docker-ce-version
yum install docker-ce-3:20.10.10-3.el8 docker-ce-cli-1:20.10.10-3.el8 
docker version
systemctl enable --now docker.service


指定版本

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
apt-get update


二进制安装

-----------------------------------------------------
centos 7
wget https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-20.10.10.tgz

[root@centos ~]# tar xf docker-20.10.10.tgz 
[root@centos ~]# ls
anaconda-ks.cfg  docker-20.10.10.tgz  initial-setup-ks.cfg       reset.sh     下载  图片  桌面  视频
docker           docker-ce.repo       offline_install_docker.sh  reset_v6.sh  公共  文档  模板  音乐
[root@centos ~]# cd docker
[root@centos docker]# ls
containerd  containerd-shim  containerd-shim-runc-v2  ctr  docker  dockerd  docker-init  docker-proxy  runc
[root@centos docker]# ll
total 200804
-rwxr-xr-x. 1 ehuo ehuo 33908392 Oct 25  2021 containerd
-rwxr-xr-x. 1 ehuo ehuo  6508544 Oct 25  2021 containerd-shim
-rwxr-xr-x. 1 ehuo ehuo  8609792 Oct 25  2021 containerd-shim-runc-v2
-rwxr-xr-x. 1 ehuo ehuo 21131264 Oct 25  2021 ctr
-rwxr-xr-x. 1 ehuo ehuo 52885064 Oct 25  2021 docker
-rwxr-xr-x. 1 ehuo ehuo 64763136 Oct 25  2021 dockerd
-rwxr-xr-x. 1 ehuo ehuo   708616 Oct 25  2021 docker-init
-rwxr-xr-x. 1 ehuo ehuo  2784353 Oct 25  2021 docker-proxy
-rwxr-xr-x. 1 ehuo ehuo 14308904 Oct 25  2021 runc
[root@centos docker]# cp * /usr/bin/
[root@centos docker]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos docker]# cd
[root@centos ~]# 
-------------------------------------------------------------------
#创建service文件 可以参考yum安装的文件
cat > /lib/systemd/system/docker.service <<-EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP \$MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF


--------------------------------------------------------------------
systemctl daemon-reload -----后台执行
systecmtl status docker.service  #查看状态
systcmctl enable --now docker.service   #开机自启



一键二进制安装

DOCKER_VERSION=20.10.10
URL=https://mirrors.aliyun.com

prepare () {
    if [ ! -e docker-${DOCKER_VERSION}.tgz ];then
        wget ${URL}/docker-ce/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz
    fi
    [ $? -ne 0  ] && { echo "文件下载失败"; exit; }
}

install_docker () {
    tar xf docker-${DOCKER_VERSION}.tgz -C /usr/local/
    cp /usr/local/docker/* /usr/bin/
    cat > /lib/systemd/system/docker.service <<-EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP \$MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF
    systemctl daemon-reload
}



start_docker (){
    systemctl enable --now docker
    docker version
}
prepare
install_docker
start_docker

static-stable x8-64  二进制包

-e 判断存在

fi
[$?  -ne 0]  && {echo "文件失败";exit;}

docker command

---------------------------------------
docker image xxxx   # 管理镜像

------------------------------------------
docker network   #管理网络





1.3 镜像管理

1.3.1 镜像结构和原理

镜像即创建容器的模版,含有启动容器所需要的文件系统及所需要的内容,因此镜像主要用于方便和快速的创建并启动容器

容器、镜像和父镜像关系;
在这里插入图片描述

一个典型的 Linux文件系统由 bootfs 和 rootfs 两部分组成

bootfs(boot file system) 主要包含bootloader和kernel,bootloader主要用于引导加载 kernel,Linux刚启动时会加载bootfs文件系统,当boot加载完成后,kernel 被加载到内存中后接管系统的控制权,bootfs会被 umount 掉

rootfs (root file system) 包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件,不同的 linux 发行版(如 ubuntu 和 CentOS ) 主要在 rootfs 这一层会有所区别。

Linux 完整的系统组成结构
/boot(grub+kernel) + /(lib.etc.bin.....) + app

镜像=/

contrainer=  /() -根文件系统  + app =jdk+java(jdk +)

👌contrainer= image(ro) + writable(rw----临时性数据)

👍镜像相当于模板 只读的

容器来源于镜像

----------------------------
alpine
docker pull alpine:latest

--------------------------------
放docker镜像,内部的仓库--harbor
harbor ---  nexus   
docker pull xxxx  ------  =download  

-----------------------------------
Ubuntu的镜像
docker pull ubuntu:focal-20220531

---------------------------------------
docker pull rockylinux:8.5.20220308



搜索镜像

image

docker search name -----搜索镜像


1.3.4 docker 镜像加速配置

docker 镜像官方的下载站点是: https://hub.docker.com/
在这里插入图片描述

从国内下载官方的镜像站点有时候会很慢,因此可以更改docker配置文件添加一个加速器,可以通过加速器达到加速下载镜像的目的

国内有许多公司都提供了docker 加速镜像,比如: 阿里云,腾讯云,网易云,以下以阿里云为例

1.3.4.1 阿里云获取加速地址

在这里插入图片描述

浏览器打开http://cr.console.aliyun.com,注册或登录阿里云账号,点击左侧的镜像加速器,将会得到一个专属的加速地址,而且下面有使用配置说明:

配置镜像加速器
--------------------------------------
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://n46bpyro.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker




1.3.5 查看本地镜像

docker images 可以查看下载至本地的镜像

格式
-----------------------------------------------------]
docker images [OPTIONS] [REPOSITORY[:TAG]]
docker image ls [OPTIONS] [REPOSITORY[:TAG]]
#常用选项: 
-q, --quiet   Only show numeric IDs
-a, --all Show all images (default hides intermediate images)
  --digests    Show digests
  --no-trunc   Don't truncate output
-f, --filter filter  Filter output based on conditions provided
  --format string  Pretty-print images using a Go template
  
  
-----------------------------------------------------------------
REPOSITORY    #镜像所属的仓库名称
TAG     #镜像版本号(标识符),默认为latest
IMAGE ID    #镜像唯一ID标识,如果ID相同,说明是同一个镜像有多个名称
CREATED    #镜像在仓库中被创建时间
VIRTUAL SIZE   #镜像的大小

1.3.6 镜像导出

利用docker save命令可以将从本地镜像导出为一个打包 tar文件,然后复制到其他服务器进行导入使用

格式
---------------------------------------------
ocker save [OPTIONS] IMAGE [IMAGE...]
选项: 
-o, --output string  Write to a file, instead of STDOUT
#说明:
Docker save 使用IMAGE ID导出,在导入后的镜像没有REPOSITORY和TAG,显示为<none>

docker save -o image1 xxx.tar
gzip xxx.tar
scp xxx.tar destIP:



desthost
docker load -i xxx.tar.gz  -----导入  自动解压

镜像共享

导出成一个文件,
docker save --------   a tar
docker history ubuntu:TAG
docker history REPOSITORY:TAG
+

docker save alpine -o alpine.tar     ------标准输出

docker load -i alpine.tar.gz         -----导入  自动解压


¥¥¥全部导入 把一个机器的镜像全部导入到其他的机器上

docker save `docker images | awk 'NR>=2{print $1":"$2}'`-o all.tar
docker load -i all.tar

法2:

docker save `docker images ls --format "{{.Repository}}:{{.Tag}}"` -o all.tar
scp all.tar dest

目标机器:
docker load -i all.tar

1.3.8 删除镜像

docker rmi 命令可以删除本地镜像

--------------------------------- -------------------------------
格式
docker rmi [OPTIONS] IMAGE [IMAGE...]
docker image rm [OPTIONS] IMAGE [IMAGE...]
#选项:
-f, --force   Force removal of the image
  --no-prune  Do not delete untagged parents
  
  
-------------------------------------------------------------------
docker rmi imageTAG
---------------------------------------------------------------------
删除正在使用的镜像
强制删除正在使用的镜像,也会删除对应的容器
docker rmi -f  image

------------------------------------------------------------------
删除所有的镜像
docker rmi -f `docker images -qa`


------------------------------------------------------------------

  

1.3.9 镜像打标签

docker tag 可以给镜像打标签,类似于起别名,但通常要遵守一定的命名规范,才可以上传到指定的仓库

遵守的格式

root@ubuntu2004:~# docker images
REPOSITORY   TAG              IMAGE ID       CREATED        SIZE
ubuntu       focal-20220531   20fffa419e3a   3 weeks ago    72.8MB
rockylinux   8.5.20220308     c830f8e8f82b   3 months ago   205MB
nginx        latest           605c77e624dd   6 months ago   141MB


docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
#TARGET_IMAGE[:TAG]格式一般形式

仓库主机FQDN或IP[:端口]/项目名(或用户名)/image名字:版本

docker tag ubuntu:focal-20220531 harbor.ehuo.org:80/k8s/ubuntu:2004

目的:推送到目的的仓库
docker push harbor.ehuo.org:80/k8s/ubuntu:2004

cd /var/lib/docker

cd /var/lib/docker/overlay2   -----镜像的路径

du -sh overlay2/*        


docker rmi   ------delete images

docker rmi images-name

在使用中强制删除
docker rmi -f Amage-ID

全部清除images
docker rmi -f `docker images -qa`


镜像打标签

docker tag ubuntu:focal-20000 仓库主机FQDN或IP【:端口 项目名】

在这里插入图片描述

docker tag ubuntu:focal-2022 harbor.ehuo.org:80/k8s/ubuntu:2004


总结: 企业使用镜像及常见操作: 搜索、下载、导出、导入、删除

命令总结:

docker search centos
docker pull alpine
docker images
docker save  > /opt/centos.tar    #centos  #导出镜像
docker load -i /opt/cenos.tar     # 导入本地镜像
docker rmi  imagesID/imageNAME  #删除指定ID的镜像

1.4 容器的基本操作命令

containerd 是docker 所依赖的 强制依赖

在这里插入图片描述

风格两种

container  或者 直接子command
docker rmi = docker image rm

1.4.1 启动容器

docker run 可以启动容器,进入到容器,并随机生成容器ID和名称

docker run 启动 容器,,,相当于启动进程

docker run =docker pull +docker start (如果没有就pull+启动它)

docker ps -a -------查看docker启动和未启动的进程

docker run nginx         --------前台执行
没有映射到宿主机的端口
仅仅隐藏在宿主机的后面

docker0  ------网桥
veth2c7ead  与之对应的网卡

yum -y install bridge-utils

brctl show        ---------查看网桥


[root@rocky8 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:69:f8:da brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.48/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:4c:e8:4b:52 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever


----------------------------------------------------------------------
网桥:
[root@rocky8 ~]#yum -y install bridge-utils
[root@rocky8 ~]# brctl show 
bridge name	bridge id		STP enabled	interfaces
docker0		8000.02424ce84b52	no		

-------------------------------------------------------------------------


开启了一个容器,自动生成一个网卡
--------------------------------------------
自动生成一个地址 docker.0 延后的地址
------------------------------------------

7: veth1cc5c39@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 02:a6:98:2c:e5:d7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::a6:98ff:fe2c:e5d7/64 scope link 
       valid_lft forever preferred_lft forever


root@ubuntu2004:~# curl 172.17.0.2 -I
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Sat, 02 Jul 2022 14:33:54 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 28 Dec 2021 15:28:38 GMT
Connection: keep-alive
ETag: "61cb2d26-267"
Accept-Ranges: bytes



启动容器用法

docker run [选项] [镜像名] [shell命令] [参数]
#选项: 
-i, --interactive  Keep STDIN open even if not attached,通常和-t一起使用
-t, --tty      分配pseudo-TTY,通常和-i一起使用,注意对应的容器必须运行shell才支持进入
-d, --detach     Run container in background and print container ID,台后运行,默认前台
--name string    Assign a name to the container
--h, --hostname string Container host name
--rm         Automatically remove the container when it exits
-p, --publish list  Publish a container's port(s) to the host
-P, --publish-all  Publish all exposed ports to random ports
--dns list      Set custom DNS servers
--entrypoint string Overwrite the default ENTRYPOINT of the image
--restart policy 
--privileged     Give extended privileges to container
-e, --env=[] Set environment variables
--env-file=[]    Read in a line delimited file of environment variables
---------------------------------------------------------
传统的文件系统
mount /dev/src  /mnt  ;  mount /dec/ser2   /mnt;
会顶掉第一个
---------------------------------------------------------
分层的 :overlay2;存储驱动,允许增加

overlay2    ---不会顶掉,


-----------------------------------------------------------------------
放在后台启动
docker run -d --name web2 --restart=always nginx
开机自启

root@ubuntu2004:~# docker run -d --name web01 nginx
d86dc90149b2b1ac02f64d7243269ad5775748cfb473b0b1eb14ed967c72ae38
root@ubuntu2004:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
d86dc90149b2   nginx     "/docker-entrypoint.…"   2 seconds ago   Up 2 seconds   80/tcp    web01
-----------------------------------------------------------------------

docker容器原则还是依赖于宿主机的 文件还在宿主机

root@ubuntu2004:~# docker images
REPOSITORY   TAG              IMAGE ID       CREATED        SIZE
ubuntu       focal-20220531   20fffa419e3a   3 weeks ago    72.8MB
rockylinux   8.5.20220308     c830f8e8f82b   3 months ago   205MB
nginx        latest           605c77e624dd   6 months ago   141MB
alpine       latest           c059bfaa849c   7 months ago   5.59MB
root@ubuntu2004:~# docker run ubuntu:focal-20220531 touch /ehuo.log
root@ubuntu2004:~# find /var/ -name 'ehuo.log'
/var/lib/docker/overlay2/15c9ef1b0dd54f31c2d8f96ff25dd598f235f53ae08dae33c8087f3e0286ddb6/diff/ehuo.log
root@ubuntu2004:~# 


-------------------------------------------------------------------------
容器开机随着主机自启

[root@rocky8 ~]# docker images
REPOSITORY   TAG              IMAGE ID       CREATED        SIZE
ubuntu       focal-20220531   20fffa419e3a   3 weeks ago    72.8MB
alpine       latest           e66264b98777   5 weeks ago    5.53MB
nginx        latest           605c77e624dd   6 months ago   141MB
[root@rocky8 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
31bd4ad612c1   nginx     "/docker-entrypoint.…"   20 minutes ago   Exited (0) 13 seconds ago             hungry_carver
[root@rocky8 ~]# docker run -d --name web01  --restart=always nginx
4d29061804a9864eec47fc7ad0438c1216c6e9a190bf78f7822c48418042bd8a
[root@rocky8 ~]# docker pa
docker: 'pa' is not a docker command.
See 'docker --help'
[root@rocky8 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
4d29061804a9   nginx     "/docker-entrypoint.…"   9 seconds ago   Up 9 seconds   80/tcp    web01
[root@rocky8 ~]# reboot

-------------------------------------------------------------------------









删除容器
docker rm  id

docker run -it alpine sh

crtl +P +Q  ---------退出容器

docker exec -it id sh     ---------进入容器
有ip地址




docker run it -d -p 4000:4000 docs/docker.github.io:latest

4000:4000 -----映射宿主机的端口

iptables -VnL -t nat

在这里插入图片描述

-------------------------------------------------------------------
交互执行容器
docker run -it alpine sh
root@ubuntu2004:~# docker run -it alpine sh
/ # pwd
/
/ # ls
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
/ # exit
root@ubuntu2004:~# 


-------------------------------------------------------------------

删除容器
docker rm  id  
文件会自动删除,不适合存储文件;


删除所有的容器(正在运行和不在运行的)
docker rm -f `docker ps -qa`

查看容器的的信息
docker ps -a

--------------------------------------------------------------------
删除所有的镜像
docker rmi -f `docker images -qa`
--------------------------------------------------------------------
注意: 容器启动后,如果容器内没有前台运行的进程,将自动退出停止

从容器内退出,且容器不停止
同时按三个键,ctrl+p+q ---------退出容器

范例: 创建容器后直接进入并退出
退出两种方式:
exit 容器也停止
按ctrl+p+q 容器不停止


docker exec -it id sh     ---------进入容器
有ip地址


–privileged 选项
大约在0.6版,–privileged 选项被引入docker。使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。

--------------------------------------------------------------------
--name #重定义name    
-it  #交互运行
docker run -it --name ubuntu ubuntu:focal-20220531 sh

docker run -it  --privileged --name ubuntu ubuntu:focal-20220531 sh
#有了宿主机的执行权限

docker  run -it -d -p 4000:4000 docs/docker.github.io:latest

范例: 运行docker官方文档容器
docker  run -it -d -p 4000:4000 docs/docker.github.io:latest


root@ubuntu2004:~# docker run -it -d -p 4000:4000 docs/docker.github.io:latest
Unable to find image 'docs/docker.github.io:latest' locally
latest: Pulling from docs/docker.github.io
cbdbe7a5bc2a: Pull complete 
10c113fb0c77: Pull complete 
9ba64393807b: Pull complete 
262f9908119d: Pull complete 
c4a057508f96: Pull complete 
1442a42d69f2: Pull complete 
afa00dd93f09: Pull complete 
caa91f40ad1d: Pull complete 
Digest: sha256:16ed8366dece4a7659110a2e7baf41c48294e2e8750a8146b86ba9c43368a3a2
Status: Downloaded newer image for docs/docker.github.io:latest
64fd44497bdfe2be56641ff8100d5be5a6c5fbd9ba58736744d5a8ad2c85fa7e
root@ubuntu2004:~# docker images
REPOSITORY              TAG              IMAGE ID       CREATED        SIZE
ubuntu                  focal-20220531   20fffa419e3a   3 weeks ago    72.8MB
rockylinux              8.5.20220308     c830f8e8f82b   3 months ago   205MB
nginx                   latest           605c77e624dd   6 months ago   141MB
alpine                  latest           c059bfaa849c   7 months ago   5.59MB
docs/docker.github.io   latest           32ed84d97e30   2 years ago    1GB

root@ubuntu2004:~# iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    8   416 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 6 packets, 312 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           
    0     0 MASQUERADE  tcp  --  *      *       172.17.0.2           172.17.0.2           tcp dpt:4000

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0           
    6   312 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:4000 to:172.17.0.2:4000



#用浏览器访问http://localhost:4000/可以看到下面docker文档资料

在这里插入图片描述

1.4.2 查看容器信息

docker ps

docker ps -a\   --------查看隐藏的信息


----------------------------------------------------------------------------

详细的信息
docker inspect NAME

docker run -d --name web01 nginx
docker top web01
docker exec -it web01 sh        -------进入web


proxy  --------用于网络通信

----------------------------------------------------------------------------
查看容器资源使用情况


root@rocky8 ~]# docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS             PORTS     NAMES
be63b2f3f5f6   ubuntu:focal-20220531   "bash"                   44 minutes ago   Up 44 minutes                frosty_lamarr
4d29061804a9   nginx                   "/docker-entrypoint.…"   16 hours ago     Up About an hour   80/tcp    web01
[root@rocky8 ~]# docker stats be63b2f3f5f6

CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT    MEM %     NET I/O          BLOCK I/O        PIDS
be63b2f3f5f6   frosty_lamarr   0.00%     57.6MiB / 1.905GiB   2.95%     24.5MB / 138kB   39.5MB / 5.3MB   1


----------------------------------------------------------------------------

docker inspect 可以查看docker各种对象的详细信息,包括:镜像,容器,网络等
详细的信息
docker inspect NAME



----------------------------------------------------------------------------

daemon
docker run -d nginx   -----后台运行

----------------------------------------------------------------------------

xargs  #将前面的信息作为参数传入到后面

全部删除容器
docker ps -qa | xargs docker rm -f xxx


docker container prune   
#删除停止的容器
docker container prune [OPTIONS]
Options:
   --filter filter  Provide filter values (e.g. 'until=<timestamp>')
 -f, --force      Do not prompt for confirmation
 

1.4.4 容器的启动和停止

----------------------------------------------------------------------------
格式
docker start|stop|restart|pause|unpause 容器ID

批量正常启动或关闭所有容器
docker start $(docker ps -a -q) 
docker stop $(docker ps -a -q)


docker top container ID 


docker pasue  XXXXX

kill -19 暂停
D #不可中断的睡眠

1.4.6进入正在容器

exec -----推荐使用

在运行中的容器启动新进程,可以执行单次命令,以及进入容器

测试环境使用此方式,使用exit退出,但容器还在运行,此为推荐方式

ocker exec [OPTIONS] CONTAINER COMMAND [ARG...]
常用选项: 
-d, --detach        Detached mode: run command in the background
-e, --env list       Set environment variables
-i, --interactive     Keep STDIN open even if not attached
-t, --tty         Allocate a pseudo-TTY

#常见用法
docker exec -it 容器ID sh|bash

#进入容器,执行命令,exit退出但容器不停止

1.4.7 暴露所有容器端口

容器启动后,默认处于预定义的NAT网络中,所以外部网络的主机无法直接访问容器中网络服务docker run -P 可以将事先容器预定义的所有端口映射宿主机的网卡的随机端口,默认从32768开始使用随机端口 时,当停止容器后再启动可能会导致端口发生变化

P , --publish-all= true | false默认为false
#示例:
docker run -P docker.io/nginx  #映射容器所有暴露端口至随机本地端口

docker port 可以查看容器的端口映射关系

端口映射的本质就是利用NAT技术实现的




docker run -d --name web2 -p :80 nginx
-p        ----------将80端口映射成宿主机的80端口

81:80        81:宿主机的,80 docker

docker inspect containerID    #详细信息
外部目前查看不了nginx  做端口暴露
#删除容器
[root@rocky8 ~]# docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED             STATUS             PORTS     NAMES
be63b2f3f5f6   ubuntu:focal-20220531   "bash"                   About an hour ago   Up About an hour             frosty_lamarr
4d29061804a9   nginx                   "/docker-entrypoint.…"   17 hours ago        Up 2 hours         80/tcp    web01
[root@rocky8 ~]# docker rm -f 4d29061804
4d29061804
[root@rocky8 ~]# docker ps
CONTAINER ID   IMAGE                   COMMAND   CREATED       STATUS       PORTS     NAMES
be63b2f3f5f6   ubuntu:focal-20220531   "bash"    2 hours ago   Up 2 hours             frosty_lamarr

[root@rocky8 ~]# docker run -d --name web02 -p 81:80 nginx
7193249d7a4ad3a3975dcfd5dccfe8891968e3e6a304575f4dc07083e8769d3c

[root@rocky8 ~]# docker exec -it web02 sh #进入容器里面修改


在这里插入图片描述

数据库的拉取
docker pull+ run=docker run
[root@centos ~]# docker run -p 3306:3306 --name mysql -d  mysql:8.0.29-oracle

启动之前要指定参数
[root@centos ~]# docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=123456 --name mysql -d mysql:8.0.29-oracle
b1f34263b8f2f794ab18e744cc2af36c9a06ca5d870b8d02f273b869cc33c3aa


远程连接
root@rocky8 ~]# mysql -uwordpress -p123456 -h10.0.0.17
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| wordpress          |
+--------------------+
2 rows in set (0.00 sec)


1.4.8 指定端口映射

docker run -p 可以将容器的预定义的指定端口映射到宿主机的相应端口

注意: 多个容器映射到宿主机的端口不能冲突,但容器内使用的端口可以相同

方式1: 容器80端口映射宿主机本地随机端口
docker run  -p 80 --name nginx-test-port1 nginx

方式2: 容器80端口映射到宿主机本地端口81
docker run  -p 81:80 --name nginx-test-port2 nginx

方式3:宿主机本地IP:宿主机本地端口:容器端口
docker run -p 10.0.0.100:82:80 --name nginx-test-port3  docker.io/nginx

方式4: 宿主机本地IP:宿主机本地随机端口:容器端口,默认从32768开始
docker run -p 10.0.0.100::80 --name nginx-test-port4 docker.io/nginx

方式5: 宿主机本机ip:宿主机本地端口:容器端口/协议,默认为tcp协议
docker run  -p 10.0.0.100:83:80/udp --name nginx-test-port5 docker.io/nginx

方式6: 一次性映射多个端口+协议
docker run  -p 8080:80/tcp -p 8443:443/tcp -p 53:53/udp --name nginx-test-port6 nginx

``sh
数据库的拉取
docker pull+ run=docker run
[root@centos ~]# docker run -p 3306:3306 --name mysql -d mysql:8.0.29-oracle

启动之前要指定参数
[root@centos ~]# docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=123456 --name mysql -d mysql:8.0.29-oracle
b1f34263b8f2f794ab18e744cc2af36c9a06ca5d870b8d02f273b869cc33c3aa

远程连接
root@rocky8 ~]# mysql -uwordpress -p123456 -h10.0.0.17
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| wordpress |
±-------------------+
2 rows in set (0.00 sec)






### 1.4.8 指定端口映射

**docker run -p 可以将容器的预定义的指定端口映射到宿主机的相应端口**

**注意: 多个容器映射到宿主机的端口不能冲突,但容器内使用的端口可以相同**

```sh
方式1: 容器80端口映射宿主机本地随机端口
docker run  -p 80 --name nginx-test-port1 nginx

方式2: 容器80端口映射到宿主机本地端口81
docker run  -p 81:80 --name nginx-test-port2 nginx

方式3:宿主机本地IP:宿主机本地端口:容器端口
docker run -p 10.0.0.100:82:80 --name nginx-test-port3  docker.io/nginx

方式4: 宿主机本地IP:宿主机本地随机端口:容器端口,默认从32768开始
docker run -p 10.0.0.100::80 --name nginx-test-port4 docker.io/nginx

方式5: 宿主机本机ip:宿主机本地端口:容器端口/协议,默认为tcp协议
docker run  -p 10.0.0.100:83:80/udp --name nginx-test-port5 docker.io/nginx

方式6: 一次性映射多个端口+协议
docker run  -p 8080:80/tcp -p 8443:443/tcp -p 53:53/udp --name nginx-test-port6 nginx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ehuo_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值