一、前导

名称空间:
名称空间:UTS ,Mount,IPC、PID、User、Network
UTS:主机名和域名
IPC:信号量、消息队列和共享内存
PID:进程编号
Network:网络设备、协议栈、端口等
Mount:挂载点(文件系统)
User:用户和用户组
控制组Cgroup:
Cgroup 是 Linux kernel 的一项功能:它是在一个系统中运行的层级制进程组,你可对其进行资源分配(如 CPU 时间、系统内存、网络带宽或者这些资源的组合)。通过使用 cgroup,系统管理员在分配、排序、拒绝、管理和监控系统资源等方面,可以进行精细化控制。硬件资源可以在应用程序和用户间智能分配

容器就是通过namespace和cgroup两个由内核提供的功能来实现

二、docker基础概念

仓库名:
仓库名+标签:用来定位唯一的镜像文件
如:nginx:latest
nginx:stable
镜像:静态
容器:动态的,运行时镜像
环境依赖:
运行容器依赖环境:64bit,Kernel3.10以及更新版本
配置文件:
配置文件:/etc/docker/daemon.json,docker安装后默认没有daemon.json这个配置文件,需要进行手动创建,里面几乎涵盖了所有 docker 命令行启动可以配置的参数,Docker启动时 默认会来这里读取配置文件
镜像加速站点:
阿里云为每个阿里云账户提供了一个加速地址:https://cr.console.aliyun.com/,通过这个地址进去可以看到自己加速站点以及配置方法
{
“registry-mirrors”:[“https://9zh8kwqg.mirror.aliyuncs.com“]
}
docker环境安装:
1.在阿里云找到docker-ce的yum源,安装
docker-ce源:https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.20341b112PWT5u
2.直接yum安装docker-ce
yum install -y -docker-ce

三、docker基本命令

3.1 获取镜像

docker pull busybox:latest
docker images pull nginx:alpine
image.png
image.png

3.2 查看本地镜像

docker images ls
docker images
image.png

3.3 镜像移除

docker image rm [NAME]
image.png

3.4 创建、查看、运行容器

docker create 只创建不运行
docker start 开启容器
docker restart 重启容器
docker ps 查看容器
[root@docker-node01 ~]# docker create -it —name test1 -h node1 busybox
[root@docker-node01 ~]# docker start test1
[root@docker-node01 ~]# docker ps -a
image.png
[root@docker-node01 ~]# docker run —name test2 -it busybox
image.png
docker attach 回到交互界面
image.png
其他选项使用
创建一个容器指定其主机名为evn.xiang.com,dns为223.5.5.5,域为evn.org —rm为退出后移除容器
[root@localhost ~]# docker run —name t1 -it -h evn.scxiang.com —dns 223.5.5.5 —dns-search evn.org —rm —network bridge busybox:latest
—add-host 添加解析记录
[root@localhost ~]# docker run —name t1 -it -h evn.scxiang.com —dns 223.5.5.5 —dns-search evn.org —rm —network bridge —add-host www.evn.org:2.2.2.2 busybox:latest

3.5 删除容器

docker kill NAME 强制移除容器,只能删除在运行的容器
image.png
docker rm NAME 移除容器
image.png

3.6 查看容器网络桥

docker network ls 查看网络桥
image.png

3.6 查看容器详细信息

docker inspect NAME ,如网络的信息、存储挂载情况等
image.png

3.7 exec容器内命令执行

docker exec NAME COMMAND 在容器内部运行指定命令
image.png

3.8 容器日志查看

docker logs NAME ,可查看容器内所有操作
image.png

3.9 容器状态

image.png

3.10 容器镜像制作

下图描述了dockerfile、镜像、容器、仓库之间的逻辑关系
image.png
命令:docker commit [OPTIONS] CONTAINER_NAME [REPOSITORY[:TAG]]
选项
-a 作者
-c 容器默认运行命令
-m 提交信息
-p 暂停容器
[root@scxiang ~]# docker commit -a “EvnXiang505597482@qq.com“ -p -c ‘CMD [“/bin/httpd”,”-h /data/html”]’ t1 evn/httpd:v0.1-1
image.png

3.11 为镜像打标签

[root@localhost ~]# docker tag 4a1ea7cdc54d evnxiang/httpd:v0.1-1
image.png

3.12 镜像push

推送本地镜像到Docker仓库,但是此服务器需要我们有仓库的账户,且镜像标签的格式为”$DOCKER_USER_ID/IMAGE”,当登录成功之后,即可使用docker push命令进行推送

3.13 镜像导出、导入

导出:docker save [OPTIONS] IMAGES [IMAGE…]
-o 保存到文件
导入:docker load [OPTIONS]
-i 从指定文件导入
image.png

3.14 容器应用场景

交互式容器:工具类:开发,测试,临时性的任务
[root@docker ~]# docker container run -it —name=”test_host” —rm centos
—rm 表示推出容器时,容器将自动被删除
守护式容器:网络服务
[root@docker ~]# docker container run -d —name=”web-server” -p 8080:80 nginx

3.15 容器的连接方法

1.attach方式
[root@docker ~]# docker container attach 4186a1dd39fc
2.exec方式
此方式为子进程的登录方式,在已有工作容器中生成子进程,做登录,可以进行容器的调试,退出时也不会影响到当前容器
[root@docker ~]# docker container exec -it 4186a1dd39fc /bin/bash

3.16 容器的基础管理

查看容器里运行程序
[root@docker ~]# docker top web-server
[root@docker ~]# docker container top web-server
日志查看
[root@docker ~]# docker logs web-server
[root@docker ~]# docker logs -tf web-server
-t 现实时间戳
-f 日志跟踪,持续输出

3.17 容器提权

在linux系统下进程号为1的程序必须是initd或者systemd,这是所有程序的父进程,其它程序由该程序派生而来,因此在容器下面,如果容器的第一个进程不是initd或者systemd,在容器内部我们将没有权限启动其它的程序,但是在运行容器时,我们可以通过传递参数对改变容器的第一个运行程序指定为init,之后就可以通过systemctl方式运行其它程序了,但是一般不建议这样去做,可能因权限过高导致位置问题。所以在启动其它程序时,可以通过找到原程序文件直接启动即可。
[root@node01 ~]# docker run -itd —name test1 centos:7 /bin/sh
image.png
[root@node02 ~]# docker run -itd —name test2 —privileged centos:7 /sbin/init
image.png

四、容器网络

6种名称空间:UTS,User、Mount、IPC、Pid、Net
#yun install -y bridge-utils #安装brctl工具
# brctl show 查看docker bridge关联的桥
# iptables -t nat -vnL 查看nat映射表

4.1 容器网络分类

[root@docker02 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f3aae0938f2b bridge bridge local
2c44f4898eee host host local
6592a707e13f none null local
1、封闭式
2、桥接方式(NAT Bridge),此方式为默认网络
3、联盟式网络(多个容器共享UTS、Net、IPC名称空间)
4、开放式容器(共享物理机的网络空间)
注意:3,4两种方式都是通过共享网络名称空间实现
# docker network inspect bridge 查看网络桥详细信息

4.2 IP命令创建虚拟网卡并实现通信

ip命令程序包,iproute
创建两个名称空间r1,r2
[root@localhost ~]# ip netns add r1
[root@localhost ~]# ip netns add r2
[root@localhost ~]# ip netns list
r2
r1
image.png
创建一对虚拟网卡
[root@localhost ~]# ip link add name veth1.1 type veth peer name veth1.2
image.png
image.png
将veth1.2放到r1的名称空间中
[root@localhost ~]# ip link set dev veth1.2 netns r1
[root@localhost ~]# ifconfig veth1.1 10.10.10.1/24 up
[root@localhost ~]# ip netns exec r1 ifconfig veth1.2 10.10.10.2/24 up
[root@localhost ~]# ip netns exec r1 ip addr
image.png
image.png

4.3 指定容器的网络为bridge桥

[root@localhost ~]# docker run —name t1 -it —network bridge busybox:latest

4.4 指定容器网络为封闭式网络

此方式为没有网卡
[root@localhost ~]# docker run —name t1 -it —network none busybox:latest

4.5 端口映射

在创建容器端口映射时,iptables会去创建相应的nat转发规则
1、映射主机的随机端口
-p
# docker run —name web1 -p 80 -it —network bridge —rm nginx:alpine
2、使用指定的物理地址
-p ::
# docker run —name web1 -p 192.168.17.128::80 -it —network bridge —rm nginx:alpine
3、映射指定物理主机的端口
-p :
# docker run —name web1 -p 80:80 -it —network bridge —rm nginx:alpine
4、映射指定物理主机地址和端口
-p ::
# docker run —name web1 -p 192.168.17.128:8080:80 -it —network bridge —rm nginx:alpine
# docker port NAME 查看端口映射情况
image.png

4.6 容器网络(联盟式容器)

联盟式容器是指使用某个已存在容器的网络接口的容器,接口被联盟内的各容器共享使用;因此联盟式容器彼此间完全无隔离,联盟式容器彼此间虽然共享同一个网络名称空间,但是其他的名称空间如User、Mount等还是隔离的,联盟式容器彼此间存在端口冲突的可能性,因此,通常只会在多个容器上的程序需要程序loopback接口互相通信,或对某个已经存在的容器的网络属性进行监控时才使用此种模式的网络模型
例如:创建容器b1,b2,但是b2共享b1的网路名称空间
[root@localhost ~]# docker run —name b1 -it —rm busybox:latest
[root@localhost ~]# docker run —name b2 -it —rm —network container:b1 busybox:latest
也可以共享宿主机的协议栈
[root@localhost ~]# docker run —name b2 -it —rm —network host busybox:latest

4.7 修改docker0桥地址、创建新桥

修改docker0桥
image.png
创建自定义桥
# docker network create -d bridge —subnet “172.16.0.0/16” —gateway “172.16.0.1” mybr0
image.png
image.png

4.8 跨主机网络

image.png
image.png

五、容器持久化存储

docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层
,如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件副本所隐藏,此即”写时复制(COW)”机制
容器卷独立于容器的生命周期实现数据持久化,因此删除容器之时既不会删除卷,也不会对未被引用的卷做垃圾回收操作
使用联合文件系统的问题:
1、不易于宿主机访问
2、容器间数据共享不便
3、删除容器其数据会丢失
解决方案:”卷”
卷是容器上的一个或者多个”目录”,此类目录可绕过联合文件系统,与宿主机上的某个目录”绑定(关联)”
image.png
卷实现了”程序(镜像)”和”数据(卷)”分离,以及”程序(镜像)”和”制作镜像的主机”分离,用户制作镜像时无须再考虑镜像运行的容器所在主机的环境
image.png

5.0 手工复制

将宿主机的文件拷贝到容器内
[root@docker ~]# docker container cp anaconda-ks.cfg web-server:/usr/share/nginx/html/
将容器内文件拷贝到宿主机内
[root@docker ~]# docker container cp web-server:/usr/share/nginx/html/50x.html ./

5.1 容器卷分类

Docker有两种类型的卷,每种类型都在容器中存在一个挂载点,但其在宿主机上位置有所不同
1、docker-managed volume
# docker run —name w1 -it -v /data busybox
image.png
# docker inspect w1 查看容器详细信息
image.png
image.png
这种方式会使容器在宿主机中创建一个随机挂载点
2、Bind-mount Volume
# docker run -it -v HOST_DIR:CONTAINER_DIR —name NAME IMAGES
# docker run —name w2 -it -v /container/volume1:/data/ busybox
image.png

5.2 多个容器的卷使用同一个主机目录

docker run -it —name c1 -v /docker/volumes/v1:/data/ busybox
# docker run -it —name c2 -v /docker/volumes/v1:/data/ busybox

5.3 复制使用其他容器的卷

docker run -it —name b1 -v /docker/volumes/v1:/data busybox
# docker run -it —name b2 —volumes-from b1 busybox
作用:在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数据卷容器进行统一管理

六 容器资源限制

6.1 限制CPU

通过—cpus选项进行cpu限制
备注:lorel/docker-stress-ng是一个压测工具

  1. root@master-01:~# docker run -it -d --cpus 1 lorel/docker-stress-ng --cpu 1

6.2 限制内存

通过-m选项进行内存限制

  1. root@master-01:~# docker run -it -d -m 280m lorel/docker-stress-ng --vm 2