Docker目录
- 1️⃣概念
- 2️⃣使用容器的好处
- 2️⃣docker和普通软件启动方式的区别
- 2️⃣docker和传统虚拟机的区别
- 1️⃣下载安装
- 2️⃣安装步骤
- 1️⃣必须要掌握的核心概念
- 1️⃣命令
- 2️⃣例子
- 2️⃣练习题目
- 2️⃣进入一下python环境(简洁)
- 1️⃣解释一下 redis
- 1️⃣docker底层隔离机制
- 2️⃣命名空间
- 2️⃣容器在底层是如果做隔离的,如何进行资源限制的?
- 2️⃣假如我们不使用容器进程,我们想限制一个Linux系统里的进程使用多少cpu
- 1️⃣命令的延申
- 1️⃣docker的状态
- 1️⃣镜像的导入和导出
1️⃣概念
docker:
1.是什么?
就是一个软件
跑容器的软件
2.有什么作用,解决了什么问题?
将任何软件都可以放到容器里去运行
更加节约企业的服务器资源,降低基础设施成本
软件的快速部署和缩放—》改变了软件部署和安装的方式
docker 是一个非常著名的容器软件
容器(container):一个轻量级的虚拟机 —>拥有程序在容器里运行
使用容器的好处:
消耗的内存,cpu等资源相对虚拟机而言要少,成本要更加低,管理起来更加方便和快捷
1.降低运行软件的成本
2.提升了效率 ------> 简称:降本增效
物理机----》虚拟机---》容器
颗粒度越来越小 ---》成本越来越低
官方网站:Docker: Accelerated Container Application Development
kubernetes —>k8s是容器集群管理软件—》底层是管理容器—>docker,coreOS(rocket)
containerd 是docker开源的底层的容器技术
最新版的k8s: 默认情况下不支持 docker了,使用开源的 containerd
2️⃣使用容器的好处
使用容器的好处:
1.成本低廉
2.管理方便成本低
颗粒度更加小的虚拟化技术–》容器技术–》可以控制资源很多企业里的物理机的资源使用率比较低,一个业务一群机器,导致大量的资源浪费,成本过高
docker技术可以控制资源的使用率,可以让物理机很饱和的运行–》减少机器的数量,同时业务也能正常的运行
使用docker可以降低基础设施成本
降本增效
2️⃣docker和普通软件启动方式的区别
docker启动镜像的方式---->颠覆了我们传统的软件安装方式—>非常新颖的软件部署和安装的方式
源代码或者安装程序---->手工去运行—>安装到某平台服务器的某个位置–>然后去启动
2️⃣docker和传统虚拟机的区别
特征 | 虚拟机 | 容器 |
---|---|---|
隔离级别 | 操作系统级 | 进程级 |
隔离策略 | Hypervisor | CGroups |
导系统资源 | 5~15% | 0~5% |
启动时间 | 分钟级 | 秒级 |
镜像存储 | GB-TB | KB-MB |
集群规模 | 上百 | 上万 |
高可用策略 | 备份、容灾、迁移 | 弹性、负载、动态 |
docker的优势:
- 启动速度快
- 消耗资源小
- 资源可以控制—》cpu和内存,磁盘速度,io等
- 共用宿主机的内核,基础镜像,消耗的内存少
- 扩展方便
docker的缺点:
- app的隔离这块,没有虚拟机彻底
- 虚拟机的安全性要高一点
层次不一样:
- 虚拟机多一层封装
1️⃣下载安装
2️⃣安装步骤
'1.卸载原来安装过的docker,如果没有安装可以不需要卸载'
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
'2.安装yum相关的工具,下载docker-ce.repo文件'
[root@cali ~]#
[root@cali ~] yum install -y yum-utils -y
[root@cali ~]yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
下载docker-ce.repo文件存放在/etc/yum.repos.d
仓库文件: 就是告诉我们的服务器去哪里下载软件的文件,里面有下载软件的网址 repository --》类似于一个藏宝图的作用
[root@cali yum.repos.d] pwd
/etc/yum.repos.d
[root@cali yum.repos.d] ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo docker-ce.repo
CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo CentOS-x86_64-kernel.repo nginx.repo
[root@cali yum.repos.d]#
'3.安装docker-ce软件'
container engine 容器引擎
docker是一个容器管理的软件
docker-ce 是服务器端软件 server
docker-ce-cli 是客户端软件 client
docker-compose-plugin 是compose插件,用来批量启动很多容器,在单台机器上
containerd.io 底层用来启动容器的
docker-compose-plugin 对docker-ce-cli的支持的插件
[root@cali yum.repos.d]yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
[root@localhost yum.repos.d] docker version 查看docker版本
Client: Docker Engine - Community
Version: 23.0.1
API version: 1.42
Go version: go1.19.5
Git commit: a5ee5b1
Built: Thu Feb 9 19:51:00 2023
OS/Arch: linux/amd64
Context: default
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[root@localhost yum.repos.d]#
'4.启动docker服务'
[root@cali yum.repos.d] systemctl start docker
[root@cali yum.repos.d] ps aux|grep docker
root 1892 1.4 1.5 1095108 58972 ? Ssl 11:39 0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root 2029 0.0 0.0 112824 976 pts/0 S+ 11:40 0:00 grep --color=auto docker
[root@cali yum.repos.d]#
'5.设置docker服务开机启动'
[root@cali yum.repos.d] systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@cali yum.repos.d]#
'6.关闭防火墙和selinux'
[root@scdocker yum.repos.d] service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@scdocker yum.repos.d] systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@scdocker yum.repos.d]#
[root@scdocker yum.repos.d] setenforce 0
[root@scdocker yum.repos.d] vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled #修改为disabled
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
'7.重启docker服务'
[root@scdocker yum.repos.d] service docker restart
Redirecting to /bin/systemctl restart docker.service
[root@scdocker yum.repos.d]#
[root@localhost yum.repos.d] cat docker-ce.repo ---->类似于藏宝图
[root@localhost yum.repos.d] systemctl start docker ----》启动docker
[root@localhost yum.repos.d] systemctl enable docker ---->设置开机启动
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
了解:卸载docker
# 1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2.删除资源
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
# /var/lib/docker docker的默认工作路径
1️⃣必须要掌握的核心概念
docker里的3个非常重要的概念:
1.镜像 (image)—>包含了一个微型操作系统
+业务核心代码
+其他依赖软件的软件单元
image=micro OS + app code + 其他库
2.仓库 repository: 网上存放镜像
的地方,docker官方提供了,阿里云也提供
镜像的集市
镜像是别人做出来上传到仓库里的
3.容器 container :运行镜像的地方,在操作系统里本质上就是启动一个进程来运行镜像,将镜像里的软件在一个隔离的环境里运行
docker images —>查看本机有哪些容器
docker ps —>查看正在运行的容器
docker ps -a —>查看停止的容器
docker run —> 运行容器 ,-p是发布容器出去
docker search go —>可以查找镜像
docker pull 软件名 —>把软件的镜像拉取下来
docker stop 容器名 —>停止容器 这个容器名是自己起的那个
修改dns服务器: /etc/resolv.conf
下边加一个 114.114.114.114
1️⃣命令
查看我有有哪些镜像: docker images
'拉取nginx镜像'
[root@localhost docker]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@localhost docker]#
'看我目前拉起了几个镜像'
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 9c7a54a9a43c 3 months ago 13.3kB
nginx latest 605c77e624dd 19 months ago 141MB
[root@localhost docker]#
'运行容器'
[root@localhost docker]# docker run --name sc-nginx-1 -p 8080:80 -d --cpu-shares 10 --cpus 1 --cpuset-cpus 0 -m 10000000 nginx
2815f0849edc9e049badf5c99e07cfcf0c1e11f954fcbd2f8eeacffa90896e5e
[root@localhost docker]# ^C
[root@localhost docker]#
'查看正在运行的容器有哪些'
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2815f0849edc nginx "/docker-entrypoint.…" 36 seconds ago Up 34 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp sc-nginx-1
[root@localhost docker]# ^C
[root@localhost docker] docker ps
'看容器的详细信息'
[root@localhost docker] docker inspect sc-nginx-1
'看最下边那条'
[root@localhost docker] iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:80
Chain DOCKER (2 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.2:80
[root@localhost docker]#
docker-proxy —>是docker提供的一个进程,监听对外发布的端口号—>监听发布的端口
[root@localhost docker] netstat -anplut
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 17974/docker-proxy
docker的网络宿主机:
2️⃣例子
启动mysql
1.下载镜像
#查找镜像:
[root@localhost docker] docker search mysql
[root@localhost docker] docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.43 92034fe9a41f 31 hours ago 581MB
hello-world latest 9c7a54a9a43c 3 months ago 13.3kB
nginx latest 605c77e624dd 19 months ago 141MB
[root@localhost docker]#
2.启动mysql
[root@localhost docker]docker run --name sc-mysql-1 -e MYSQL_ROOT_PASSWORD=sc123456 -d -p 3306:3306 mysql:5.7.43
bb066982b4234ce34166c9db007e2ba1de2e781c326ff1811d26f33830dce0f5
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb066982b423 mysql:5.7.43 "docker-entrypoint.s…" 26 seconds ago Up 25 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp sc-mysql-1
2815f0849edc nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:8080->80/tcp, :::8080->80/tcp sc-nginx-1
[root@localhost docker]# ^C
[root@localhost docker]#
1s = 1000ms
docker容器可以被限制使用宿主机的cou,内存,网络,磁盘IO资源
#查看docke容器正在使用的cpu的状态
[root@localhost docker]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
bb066982b423 sc-mysql-1 0.06% 215.7MiB / 3.682GiB 5.72% 656B / 0B 0B / 583MB 27
2815f0849edc sc-nginx-1 0.00% 5.32MiB / 9.535MiB 55.80% 2.27kB / 2.06kB 98.3kB / 17.4kB 9
进入mysqk容器内部:
[root@localhost docker]# docker exec -it sc-mysql-1 bash
bash-4.2#
# -u是指定用户名 -p是密码 不需要空格
bash-4.2# mysql -uroot -psc123456
docker exec
是进入容器内部执行命令 —>execute
-it
是开启一个终端,进行交互式操作
sc-mysql-1
是容器的名字
bash
是进入容器后执行的命令
dockerfile : 是制作镜像的配置文件 —》配方文件
'停掉mysql'
[root@localhost docker] docker stop sc-mysql-1
sc-mysql-1
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2815f0849edc nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:8080->80/tcp, :::8080->80/tcp sc-nginx-1
[root@localhost docker]#
'启动容器'
[root@localhost docker]# docker start sc-mysql-1
sc-mysql-1
[root@localhost docker]#
'删除容器'
docker rm 容器的id(那一串)
2️⃣练习题目
1.想办法启动一个go语言环境的容器
- docker pull golang
- docker run -itd -p 8081:8080 -v /etc/docker/go:/go --name localhost-go golang
- 在 /etc/docker/go 下边创建一个 main.go 文件
- -v /etc/docker/go:/go 就是在本机左边创建main.go 右边:是在 docker里边的/go下边创建
- docker exec -it localhost-go bash
2.启动一个python语言环境的容器
- docker pull python
- docker run -itd -p 8082:8082 -v /etc/docker/python:/python --name localhost-python python
- 在 /etc/docker/python 下边创建一个 python.py 文件
- -v /etc/docker/python:/python 就是在本机左边创建main.py右边:是在 docker里边的/python下边创建
- docker exec -it localhost-python bash
3.查看容器是否启动
[root@localhost docker]# docker images
4.查看镜像是否存在
[root@localhost docker]# docker ps
5.查看启动的容器的详细信息
[root@localhost docker]# docker inspect localhost-go
6.停止go语言容器
[root@localhost docker]# docker stop localhost-go
7.再次启动go语言容器
[root@localhost docker]# docker start localhost-go
8.进入go语言的容器内部
[root@localhost docker]# docker exec -it localhost-go bash
root@a4d503918e59:/go#
解决的问题:
1.镜像的下载
2.启动容器
[root@localhost docker] docker pull golang
Using default tag: latest
latest: Pulling from library/golang
0e29546d541c: Pull complete
9b829c73b52b: Pull complete
cb5b7ae36172: Pull complete
6494e4811622: Pull complete
6e1d20a8313e: Pull complete
593823f101dc: Pull complete
1b4aae56cdbe: Pull complete
Digest: sha256:c72fa9afc50b3303e8044cf28fb358b48032a548e1825819420fd40155a131cb
Status: Downloaded newer image for golang:latest
docker.io/library/golang:latest
[root@localhost docker]# ^C
[root@localhost docker]#
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.43 92034fe9a41f 32 hours ago 581MB
hello-world latest 9c7a54a9a43c 3 months ago 13.3kB
nginx latest 605c77e624dd 19 months ago 141MB
golang latest 276895edf967 19 months ago 941MB
[root@localhost docker]# vim main.go
[root@localhost docker]# chmod +x main.go
[root@localhost docker]#
#创建容器
[root@localhost docker]# docker run -itd -p 8081:8080 -v /etc/docker/go:/go --name localhost-go golang
#进入到容器内部
docker exec -it localhost-go bash
#ls一下,再go run 运行一下
root@a4d503918e59:/go# ls
main.go
root@a4d503918e59:/go# go run main.go
Hello,World!
root@a4d503918e59:/go#
#查看正在运行的挂载程序
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a4d503918e59 golang "bash" 7 minutes ago Up 11 seconds 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp localhost-go
bb066982b423 mysql:5.7.43 "docker-entrypoint.s…" About an hour ago Up 37 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp sc-mysql-1
2815f0849edc nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:8080->80/tcp, :::8080->80/tcp sc-nginx-1
[root@localhost docker]#
2️⃣进入一下python环境(简洁)
以交互式方式打开一个终端:
–rm 是退出的时候 删除这个容器
1️⃣解释一下 redis
docker pull redis
是一个 key , value的数据库软件
'运行,并发布出去'
[root@localhost ~] docker run -d --name sc-redis-1 -p 6379:6379 redis
#查看镜像是否启动
[root@localhost ~]# docker ps
#查看详细信息
[root@localhost ~]# docker inspect sc-redis-1
1️⃣docker底层隔离机制
2️⃣命名空间
命名空间:
name space ----》一块地盘
是在内存中存放数据的地方,例如:存放变量,函数,库等
隔离的技术:命名空间
我们每启一个容器,背后就对应着一个进程的启动
6个命名空间
2️⃣容器在底层是如果做隔离的,如何进行资源限制的?
资源限制: Control Groups 技术 简称---->Cgroup
操作系统内核有个软件: LXC linx container技术
docker只是调用了LXC库。实现了容器的应用
–cpu-shares 10
–cups
2️⃣假如我们不使用容器进程,我们想限制一个Linux系统里的进程使用多少cpu
使用 cgroup 技术 ---->内核里边的
1️⃣命令的延申
docker
启动MySQL 容量限制cpu使用率为50% 内存为2G,如何看是否启用了限制?
docker run -d -p 3307:3306 --name sc-mysql-2 -e MYSQL_ROOT_PASSWORD='sc123456' mysql:5.7.43
docker run的流程 👇
1.检查启动容器使用的镜像是否存在,如果不存在就先去pull镜像到本机,如果存在就创建容器
docker pull 去拉mysql:5.7.43
2.docker create ------>创建容器
3.docker start ------>启动容器
# 删除镜像
[root@localhost ~]# docker rmi busybox
Untagged: busybox:latest
Untagged: busybox@sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
Deleted: sha256:beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a
Deleted: sha256:01fd6df81c8ec7dd24bbbd72342671f41813f992999a3471b9d9cbc44ad88374
👆如果正在使用,就先停止那个容器,然后rm删除容器,再rmi删除镜像
所以说,不需要 pull 创建之类的
👇
直接 用run
1️⃣docker的状态
exited
created ---->创建好了
up
[root@localhost ~] docker run -d -p 3308:3306 --name sc-mysql-3 --cpu-shares 500 --cpus 2 --cpuset-cpus 0,1 -m 2000000000 --device-write-bps /dev/sda:20MB -e MYSQL_ROOT_PASSWORD='sc123456' mysql:5.7.43
docker run -d:
这是 Docker 命令,用于创建并运行一个容器。-d 表示以后台(守护进程)模式运行容器。-p 3308:3306:
这是端口映射选项,将容器的 3306 端口映射到宿主机的 3308 端口。这样可以通过访问宿主机的 3308 端口来访问容器内运行的 MySQL 服务。--name sc-mysql-3:
这是为容器指定一个名称,方便后续对容器进行管理和操作。--cpu-shares 500:
这是 CPU 分配的选项,设置容器的 CPU 分配份额。这里设置为 500,表示该容器与其他容器相比,会优先获得更多的 CPU 资源。--cpus 2:
这是 CPU 数量的选项,设置容器可以使用的 CPU 核心数量。这里设置为 2,表示该容器可以使用两个 CPU 核心。--cpuset-cpus 0,1:
这是 CPU 亲和性的选项,设置容器可以使用的特定 CPU 核心。这里设置为 0,1,表示该容器可以使用的 CPU 核心限定在 0 号和 1 号核心。-m 2000000000:
这是内存限制的选项,限制容器可以使用的内存大小。这里设置为 2000000000,表示容器的内存限制为 2GB。--device-write-bps /dev/sda:20MB:
这是设备写入速率限制的选项,限制容器对 /dev/sda 设备的写入速率。这里设置为 20MB/s,表示容器对该设备的写入速率限制为每秒 20MB。-e MYSQL_ROOT_PASSWORD='sc123456':
这是环境变量的选项,设置容器中 MySQL 的 root 用户的密码为 sc123456。mysql:5.7.43:
这是指定要在容器中运行的镜像。这里使用的是 MySQL 5.7.43 版本的官方镜像。
综合起来,以上命令的含义是创建并运行一个名为 sc-mysql-3 的后台模式容器,将容器的 3306 端口映射到宿主机的 3308 端口,分配给容器 500 的 CPU 分配份额,使用 2 个 CPU 核心,限定容器只能使用 0 号和 1 号核心,限制容器的内存为 2GB,限制容器对 /dev/sda 设备的写入速率为每秒 20MB,设置 MySQL root 用户的密码为 sc123456,并使用 MySQL 5.7.43 版本的镜像运行容器。
1️⃣镜像的导入和导出
save -o 是导出,静态导出
[root@localhost ~] docker save -o cadvisor.tar + 镜像名字
load是导入 -i
[root@localhost docker] docker load -i cadvisor.tar