企业级容器技术Docker
容器技术是虚拟化、云计算、大数据之后的一门新兴的并且是炙手可热的新技术, 容器技术提高了硬件资源利用率、 方便了企业的业务快速横向扩容(可以达到秒级快速扩容)、 实现了业务宕机自愈功能(配合K8S可以实现,但OpenStack无此功能),因此未来数年会是一个容器愈发流行的时代 ,这是 一个对于 IT 行业来说非常有影响和价值的技术,而对于IT行业的从业者来说, 熟练掌握容器技术无疑是一个很有前景的
1 Docker 介绍和基础操作
移植性比较好----拥有独自的仓库,但要内核新
可移植性,标准化,隔离性)
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)等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。
容器和虚拟机比较
- 传统虚拟机要虚拟出一个主机硬件,并且运行一个完整的操作系统,然后在这个系统上安装和运行软件。
- 容器上的应用直接运行在宿主机的内核上,容器并没有自己的内核,也不需要虚拟硬件,相当轻量化。
- 容器之间是相互隔离,每个容器内都有一个属于自己的独立文件系统,独立的进程空间,网络空间,用户空间。所以在同一个宿主机上的多个容器之间彼此不会相互影响。
表现比较
- 资源利用率高:开销更小,不需要启动单独的虚拟机OS内核占用硬件资源,可以将服务器性能压缩到极致,虚拟机会有5-20%的损耗,容器运行基本无损耗
- 启动速度更快,可以在数秒内完成启动
- 占用空间更小,容器占用的磁盘空间以MB为单位,而虚拟机以GB
- 集成性更好,和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/
- Docker主机(Host):一个物理机和虚拟机,用于运行Docker服务进程和容器,也称宿主机,node节点
- Docker服务端(Server):Docker守护进程,运行docker容器
- Docker客户端(Client):客户端使用Docker命令或其他工具调用docker API
- Docker镜像(Images):镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
- Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库harbor
- Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程
无状态:相对比较稳定,访问无变化,nginx 静态 index.html
有状态:MySQL 访问有变化
*1.1.5 Namespace
逻辑上的名称空间
隔离类型
User Namespace
隔离类型 | 功能 | 系统调用参数 | 内核版本 |
---|---|---|---|
User Namespace(user) | 提供用户隔离能力,包括用户和组 | CLONE_NEWUSER | 3.8 |
Net Namespace(network) | 提供网络隔离能力,包括网络设备,网络栈,端口等 | CLONE_NEWNET | 2.6.29 |
PID Namespace(Process Identification) | 提供进程隔离能力 | CLONE_NEWPID | 2.6.24 |
UTS Namespace(UNIXTimesharing System) | 提供内核,主机名和域名隔离能力 | CLONE_NEWUTS | 2.6.19 |
MNT Namespace(mount) | 提供磁盘挂载点和文件系统的隔离能力 | CLONE_NEWNS | 2.4.19 |
UTS Namespace(UNIXTimesharing System) | 提供内核,主机名和域名隔离能力 | CLONE_NEWUTS | 2.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)