docker基础

本文详细介绍了如何在Redhat7.5系统上安装Docker,并进行一系列配置,包括开机自动挂载、网络配置、容器运行、镜像构建和管理。内容涵盖iptables配置、数据持久化、容器间通信以及Docker的优化技巧,如减少镜像大小和数据卷管理。此外,还讨论了Docker的安全特性,如控制组(cgroups)和命名空间。
摘要由CSDN通过智能技术生成

安装redhat7.5系统
挂载 准备yum
mkdir /var/www/html/rhel7.5

mount /home/kiosk/Desktop/iso/rhel-server-7.5-x86_64-dvd.iso /var/www/html/r hel7.5
开机自其
vim /etc/rc.d/rc.local
mount -a
真迹上网配置
iptables -t nat -I POSTROUTING -s 172.25.0.0/24 -j MASQUERADE
sysctl -a |grepip_forward
net.ipv4.ip_forward = 1

yum
删除之前的新建
vim /etc/yum.repos.d/rhel.repo
[rhel]
name=rhel
baseurl=http://172.25.31.254/rhel7.5
gpgcheck=0
yum repolist
命令 依赖性库 打包放入容器
ldd /usr/sbin/httpd
轻量级
以进程的形式存在

以镜像的文件构成
做一次形成一次镜像
构建完成是只读的

server1
安装
containerd.io-1.2.5-3.1.el7.x86_64.rpm
container-selinux-2.21-1.el7.noarch.rpm
docker-ce-18.09.6-3.el7.x86_64.rpm
docker-ce-cli-18.09.6-3.el7.x86_64.rpm
yum install -y *
运行容器
开启
systemctl start docker.service
加载tar包
docker load -i game2048.tar

查看容器
docker images

查看加载历史 一层一层构建的构成
docker history 镜像名
docker history game2048:latest
运行容器
docker run -d --name game1 -p 80:80 game2048
查看进程
docker ps
查看详情
docker info
查看网卡与通道网卡
ifconfig

查看版本具体信息
docker inspect game1

which /sbin/brctl
yum whatprovies /sbin/brctl

yum install bridge-utils-1.5-9.el7.x86_64 -y
查看
brctl show

真迹上网配置
iptables -t nat -I POSTROUTING -s 172.25.0.0/24 -j MASQUERADE
sysctl -a |grepip_forward
net.ipv4.ip_forward = 1

存放数据
cd /var/lib/docker
ls
挂载方式
目录对应

容器共享内存
对容器写操作 写在本地 并没有写在容器里
需要容器保存
exit 直接关闭

查看所有容器

构建镜像
基础镜像
docker run -it --name vm1 busybox
-it是交互
可以上网自动在官网下载

保存写入docker数据
docker load -i ubuntu.tar
docker run -it --name vm1 ubuntu

docker ps -a
放入后台
ctrl+p+q
回到前台
docker container attach vm1
touch test
查看具体命令
docker history ubuntu:latest
提交保存
docker commit vm1 test:v1
名字vm1 镜像test:版本号v1

docker images test
docker images ubuntu
docker images
查看找出多出写入层面
docker history test:v1
docker history ubuntu:latest
看不到具体操作情况
存在安全隐患

透明化写入
mkdir docker 以下文件或目录都需在docker目录容器之下才能生效
编辑
vim docker/dockerfile
FROM ubuntu
RUN echo testfile1 > file1
RUN echo testfile2 > file2
以那个文件为基础镜像
cd docker
运行加入
docker build -t test:v2 .
查看镜像
docker images
查看历史
docker history test:v2

创建新的镜像
编辑
vim docker/dockerfile
FROM ubuntu
RUN echo testfile1 > file1
RUN echo testfile2 > file2
RUN echo testfile3 > file3
加入运行
docker build -t test:v3 .
查看镜像
docker images
查看历史操作
docker history test:v3

copy 复制
add 解压并复制

copy
echo “hello tom”>testfile
编辑
vim dockerfile
FROM ubuntu
COPY testfile /tmp
生成
docker build -t cece:v1 .
查看历史操作
docker history cece:v1

ADD 解压并复制
vim dockerfile
FROM ubuntu
COPY testfile /tmp
ADD nginx-1.17.0.tar.gz /tmp
生成
docker build -t cece:v2 .
docker history cece:v2
docker images cece
进入交互查看
docker run -it --name nginx cece:v2
ls tmp/
nginx-1.17.0 testfile
删除便于下次交互
docker rm nginx

数据挂载
volume

创建 /data
vim dockerfile
FROM ubuntu
COPY testfile /tmp
ADD nginx-1.17.0.tar.gz /tmp
VOLUME ["/data"]
生成
docker build -t cece:v3 .
过程
docker history cece:v3
镜像
docker images cece
进入交互
docker run -it --name vm1 cece:v3
ls
bin data

共享数据
宿主机目录
查看镜像具体情况
docker inspect vm1 运行名字
docker inspect vm1|grep Source
source": “/var/lib/docker/volumes/a49497270977ec87986a36521a203f00a5d2b08f4810dce6e327fe873b8a1a3b/_data”

进入宿主机目录
cd /var/lib/docker/volumes/a49497270977ec87986a36521a203f00a5d2b08f4810dce6e327fe873b8a1a3b/_data/
ls

创建文件
touch file1
touch test

回到运行界面,查看容器目录
docker attach vm1
ls data/
file1 test
数据共享文件也在/data里面

删除容器目录data里的文件
rm -f data/*

查看宿主机共享目录
ls /var/lib/docker/volumes/a49497270977ec87986a36521a203f00a5d2b08f4810dce6e327fe873b8a1a3b/_data/
file1 test
文件还存在本地,必须在本地删除才可完全删除
只能查看和删除容器目录自己的内容

宿主机目录:容器目录 数据共享一块硬盘空间
实现数据同步共享
docker run -it --name vm2 -v /opt/data:/data cece:v3
-v指定挂载目录

进入宿主机
ls /opt/data/
rm -f /opt/data/test

进入容器目录data
删除
docker rm vm2
docker run -it --name vm2 -v /opt/data:/data cece:v3
ls data/
文件已删除

执行命令
cmd 本身后面加入命令会覆盖这个本身命令
entrypoint 本身命令会传递给它

vim dockerfile
FROM ubuntu
ENV name world
ENTRYPOINT echo “hello,$name”
构建
docker build -t test:v1 .
运行
docker run --rm test:v1
hello,world
–rm 运行完成删除
过程
docker history test:v1

标准语法
vim dockerfile
FROM ubuntu
ENV name world
ENTRYPOINT ["/bin/echo", “hello, n a m e " ] 命 令 , 参 数 , 数 值 逗 号 隔 开 构 建 d o c k e r b u i l d − t t e s t : v 2. 运 行 d o c k e r r u n − − r m t e s t : v 2 h e l l o , name"] 命令 ,参数, 数值 逗号隔开 构建 docker build -t test:v2 . 运行 docker run --rm test:v2 hello, name"]dockerbuildttest:v2.dockerrunrmtest:v2hello,name
需加参数才可以
FROM ubuntu
ENV name world
ENTRYPOINT [”/bin/sh","-c",“echo hello,$name”]
命令 ,参数, 数值 逗号隔开
docker build -t test:v3 .
docker run --rm test:v3
hello,world

CMD 加参数直接忽略
vim dockerfile
FROM ubuntu
ENTRYPOINT ["/bin/echo",“hello”]
CMD [“world”]
docker build -t test:v6 .
docker run --rm test:v6
hello world
后面加参数直接忽略CMD
docker run --rm test:v6 hehe
hello hehe

优化镜像压缩大小5种
1 清理镜像构建的中间产物
cd ~/docker
建立自动化安装脚本
vim dockerfile
FROM rhel7
EXPOSE 80
MAINTAINER hey52l@163.com
COPY nginx.repo /etc/yum.repos.d/
RUN rpmdb --rebuilddb 重建yum数据
RUN yum install -y gcc make pcre-devel zlib-devel
ADD nginx-1.17.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.17.0
RUN ./configure --prefix=/usr/local/nginx
RUN make && make install
ENTRYPOINT ["/usr/local/nginx/sbin/nginx", “-g”, “daemon off;”]
建立yum文件
vim nginx.repo
[rhel7.5]
name=rhel7.5
baseurl=http://172.25.31.254/rhel7.5
gpgcheck=0

ls
dockerfile nginx-1.17.0.tar.gz nginx.repo
docker build -t nginx:v1 .
docker images nginx:v1
300M

2 相同命令写一起 减少层 下载完删除下载目录
vim dockerfile
FROM rhel7
EXPOSE 80
MAINTAINER 372491631@qq.com
COPY nginx.repo /etc/yum.repos.d/
ADD nginx-1.17.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.17.0
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -rf /mnt/nginx-1.17.0
ENTRYPOINT ["/usr/local/nginx/sbin/nginx", “-g”, “daemon off;”]
docker images nginx
257MB

3 只生成二进制命令,利用主机现有nginx环境,删除之前安装过程相关生成
– 多阶段构建
vim dockerfile
FROM rhel7
EXPOSE 80
MAINTAINER hey52l@163.com
COPY nginx.repo /etc/yum.repos.d/
ADD nginx-1.17.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.17.0
RUN sed -i ‘s/CFLAGS=“KaTeX parse error: Expected 'EOF', got '#' at position 12: CFLAGS -g"/#̲CFLAGS="CFLAGS -g”/g’ auto/cc/gcc && rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -rf /mnt/nginx-1.17.0

FROM rhel7
EXPOSE 80
MAINTAINER 372491631@qq.com
VOLUME ["/usr/local/nginx/html"]
COPY --from=bulid /usr/local/nginx /usr/local/nginx
ENTRYPOINT ["/usr/local/nginx/sbin/nginx", “-g”, “daemon off;”]

docker build -t nginx:v3 .
docker images nginx
226M

4 bios镜像太大,可缩减镜像到精简镜像
使用精简镜像 直接保存到宿主机模块 生成二进制命令即可
下载精简镜像
mkdir distroless
vim Dockerfile

FROM nginx:1.16.1 as base

https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

ARG Asia/Shanghai

RUN mkdir -p /opt/var/cache/nginx &&
cp -a --parents /usr/lib/nginx /opt &&
cp -a --parents /usr/share/nginx /opt &&
cp -a --parents /var/log/nginx /opt &&
cp -aL --parents /var/run /opt &&
cp -a --parents /etc/nginx /opt &&
cp -a --parents /etc/passwd /opt &&
cp -a --parents /etc/group /opt &&
cp -a --parents /usr/sbin/nginx /opt &&
cp -a --parents /usr/sbin/nginx-debug /opt &&
cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt &&
cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt &&
cp -a --parents /lib/x86_64-linux-gnu/libc.so.* /opt &&
cp -a --parents /lib/x86_64-linux-gnu/libdl.so.* /opt &&
cp -a --parents /lib/x86_64-linux-gnu/libpthread.so.* /opt &&
cp -a --parents /lib/x86_64-linux-gnu/libcrypt.so.* /opt &&
cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt &&
cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt &&
cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime

FROM gcr.io/distroless/base

COPY --from=base /opt /

EXPOSE 80 443

ENTRYPOINT [“nginx”, “-g”, “daemon off;”]
docker load -i distroless.tar
docker build -t nginx:v5
docker images nginx
28M
docker run -d -p 80:80 --name nginx nginx:v5
浏览器可直接登陆

1 清理镜像构建的中间产物(安装包,yum缓存)
2 减少镜像层数
3 多阶段构建(构建过程可以在临时容器完成,安装完删除)
4 使用更加精简的基础镜像

仓库
登陆docker.com
名字与创建名字相同
可见 Public 公共
create Repositroy

名称建立好
命令上传
docker login
用户
密码

docker push nginx:latest
打标签 不能改名
docker tag nginx:latest hey/nginx:latest 帐号/镜像
docker images
查看生成镜像名称

推送 帐号/镜像
docker push hey/nginx:latest

docker rmi hey/nginx:latest
拉取到本地 可以改名
docker pull hey/nginx:latest

改名
docker tag hey/nginx:latest wsp:latest

docker index(所有的镜像索引) – registry(所有的镜像) – registry client(docker pull)
docker index 校验合法性

阿里云镜像
产品与服务- 容器镜像服务 – 镜像加速器
配置加速器
拉取镜像
尝试速度

registry仓库 下载此软件 阿里云账户登陆

企业内部镜像 私有仓库 公司本地自己使用
登陆阿里官网 会自动生成配置文件内容
编辑配置文件
vim /etc/docker/daemon.json
{
“registry-mirrors” [“https://阿里云账户自己生成网址”]
}

重启动
systemctl restart docker.service
systemctl daemon-reload

拉取 registry
docker pull registry
运行
docker run -d -p 5000:5000 --name registry registry

查看ps
docker ps

查看本地端口数据卷
docker volume ls
查看端口
netstat -antuple
上传准备

打标签
docker tag
查看镜像
docker images

上传
docker push localhost:5000/nginx
curl localhost:5000
curl localhost:5000/v2/_catalog
docker inspect registry
cd /var/lib/docker/volumes/e81abc2f01f213bd51d24d4e984b19bc2166e9e59d57f6eb2c30d7b1be39d87d/_data/
tree查看目录结构
yum install tree
tree docker

证书
创建证书目录
mkdir certs
cd certs

生成自签名加密证书e81abc2f01f213bd51d24d4e984b19bc2166e9e59d57f6eb2c30d7b1be39d87d
openssl req
-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key
-x509 -days 365 -out certs/domain.crt
CN
Shaanxi
Xi’an
Test
Linux
test.org
ls
cd certs
ls
生成密钥
docker ps
停止
docker rm -f registry

使用证书
docker run -d
–restart=always
–name registry
-v “$(pwd)”/certs:/certs \ 指定数据卷
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \ 编辑容器运行参数
-e REGISTRY_HTTP_TLS_CERTIFICATE=/root/certs/domain.crt \ 钥匙
-e REGISTRY_HTTP_TLS_KEY=/root/certs/domain.key \ 锁
-p 443:443 \ 端口映射
registry

docker ps
netstat -tnpl

写本地解析
vim /etc/hosts
172.25.31.1 westos.org
mkdir /etc/docker/certs.d/westos.org
复制到
cp /root/certs/domain.crt /etc/docker/certs.d/westos.org/ca.crt

标签
docker tag nginx:latest test.org/nginx:latest
拉取
docker push test.org/nginx

域名访问使用
限制访问 链接

建立证书目录
mkdir anth
cd auth/
添加认证功能
docker run
–entrypoint htpasswd
registry:2 -Bbn testuser testpassword >> auth/htpasswd
用户目录 密码目录 |也可以使用用户密码直接生成 testuser testpassword |linux redhat
查看生成文件
cd auth/
ls
cat htpasswd
停止

本地认证的方式启动
docker run -d
–restart=always
–name registry
-v “KaTeX parse error: Undefined control sequence: \ at position 21: …"/certs:/certs \̲ ̲-e REGISTRY_HTT…(pwd)”/auth:/auth
-e “REGISTRY_AUTH=htpasswd”
-e “REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm”
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
registry

docker ps
docker login westos.org
docker push westos.org/ngin
自动生成配置文件
cat /root/.docker/config.json
测试

上传

server2
远程主机使用
server2
安装docker
tar zxf docker…

编辑本地解析
vim /etc/hosts
172.25.31.1 test.org
证书目录传给它
docker login test.org
docker pull test.org/nginx
docker images
docker run -d --name nginx -p 80:80 test.org/nginx
curl localhost

server1
docker search docker-registry-web
docker pull hyper/docker-registry-web
cat /root/.docker/config.json

图形化操作
查找图形
找赞最多的 在git里查找
docker run -it -p 8080:8080 --name registry-web --link registry:westos.org
-e REGISTRY_URL=https://westos.org/v2
-e REGISTRY_TRUST_ANY_SSL=true
-e REGISTRY_BASIC_AUTH=“YWRtaW46d2VzdG9z”
-e REGISTRY_NAME=westos.org:443 hyper/docker-registry-web

docker ps -a
删除id
docker rm id

harbor仓库图形化功能较多
UI界面美观

docker run -it -p 8080:8080 --name registry-web --link registry-srv -e REGISTRY_URL=http://westos.org/v2 -e REGISTRY_NAME=localhost:5000 hyper/docker-registry-web

docker网络设置
brtcl show
容器依靠虚拟网卡链接

docker网络三种模式
docker network ls

桥接模式bridge
docker run -it --name vm4 ubuntu 默认使用桥接模式
配置nat才可以访问外网
内核路由功能

host模式host
docker run -it --name vm2 --network host ubuntu
容器和外部直接通信
没有隔离性不安全
服务开启端口容易冲突

none禁用网络模式
docker run -it --name vm1 --network none ubuntu
只有回环接口
数据库会应用到
重要数据不允许链接外网

自定义网络
1种
dns自动解析功能 直接通过容器名访问 不需要ip

其余2种
跨主机应用
docker network create --help
-d 驱动指定网卡驱动模式 默认bridge
设置网络模式
docker network create -d bridge net1
查看添加网络
docker network ls
设置运行自定义网络容器
docker run -it --name vm1 --network net1 ubuntu
查看网络情况
docker network inspect net1
再次创建网络顺延下去
docker run -it --name vm2 --network net1 ubuntu
可互相ping通

自定义网络模式设置顺序
先设置网络模式起个名字
在设置运行容器是应用的网络名

指定子网与网关 需在设置网络模式时指定
docker network create -d bridge --subnet 172.25.0.0/24 --gaeway 172.25.0.1 net2
指定ip在运行容器时指定即可 已配置子网与网关时才能指定ip
docker run -it --name vm5 --network net2 --ip 172.25.0.100 ubuntu
桥接到不通的容器上 网桥不互通 即不通容器的ip是不能互相通信的
ping vm2 ping不通

iptables -S
-A DOCKER-ISOLATION-STAGE-2 -o br-a0423d196189 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-16de62ba16e8 -j DROP
查看规则 显示通信互相drop

几种链接方式 不通容器互相通信方式
1 自定义bridge自动添加本地解析
不通容器通信需添加链接的虚拟机名
中间商 相互链接通信
自动添加本地解析
连接net2网络 自定义网络及指定运行容器
docker network connect net2 vm1
docker start vm1
docker start vm5

docker container attach vm1
ping vm5

2 容器使用共享网络 joined模式
使用同一个ip
使用回环接口通信 localhost
web 应用服务器 使用回环接口 更快速
强制删除
docker rm -f vm5
docker run -it --name vm1 ubuntu
使用vm1的网络 网络共享
docker run -it --name vm2 --network container:vm1 ubuntu
docker container attach vm1
cat /etc/hosts
vi /etc/hosts
172.17.0.2 vm1
ping vm1

3 link方式
启用别名与另一个容器通信
自动添加本地解析所以可以直接通信
环境变量自动做了相应的设置
docker run -d --name web nginx
共用link通道 启用别名通信
docker run -it --name vm2 --link web:webline ubuntu
可直接
ping webline
ping web
关闭再次开启时 ip会改变 自动链接 本地解析自动修改
docker start web
docker start vm2
docker container attach vm2
cat /etc/hosts
规则策勒 会自动做地址伪装
brctl show
iptables -t nat -S
-A POSTROUTING -s 172.25.0.0/24 ! -o br-a0423d196189 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 ! -o br-16de62ba16e8 -j MASQUERADE

使用容器上网
宿主机开启地址伪装 并开启路由 必须本身可以上网
iptables -t nat -I POSTROUTING -s 172.25.0.0/24 -j MASQUERADE
sysctl -a|grep ip_forward
net.ipv4.ip_forward = 1

跨主机容器通信
sandbox沙盒 容器网络琖(interface,路由表,dns…)
endpoint:链接网线 将andbox接入network 接入网络用 生成虚拟网络对相当于网线两端 (veth pair)
network 包含一组endpoint 同一网络network的endpoint可以直接通信

步骤
server1
添加网卡
cd /etc/sysconfig/network-scripts/
mv ifcfg-eth0~ ifcfg-eth1
vim ifcfg-eth1
启用网卡
ip link set up eth1
打开网卡混杂模式
ip link set eth1 promisc on

serer2 同上
添加网卡
启用网卡

打开网卡混杂模式

serer1
自定义网络macvlan
docker network create -d macvlan --subnet 172.25.0.0/24 --gateway 172.25.0.254 -o parent=eth1 macvlan1
docker network ls
serer2
自定义网络macvlan
docker network create -d macvlan --subnet 172.25.0.0/24 --gateway 172.25.0.254 -o parent=eth1 macvlan1
server1
指定ip运行容器
docker run -it --name vm1 --network macvlan1 --ip 172.25.0.100 ubuntu
server2
指定ip运行容器
docker run -it --name vm2 --network macvlan1 --ip 172.25.0.200 ubuntu
ping vm1可通

brctl show
没有桥接方式 使用物理方式

可设置多个子接口 eth0:0-eth0:65535
使用vlan子接口 eth0:0 网络不会冲突
按照上面重新操作
docker network create -d macvlan --subnet 172.25.0.0/24 --gateway 172.25.0. 54 -o parent=eth1.1 macvlan1
docker run -it --name vm1 --network macvlan1 --ip 172.25.0.100 ubuntu
docker network create -d macvlan --subnet 172.25.0.0/24 --gateway 172.25.0.2 54 -o parent=eth1.1 macvlan2

docker run -it --name vm2 --network macvlan2 --ip 172.25.0.200 ubuntu
ping vm1
不通的vlan想要通信需设置网关即可
加路由

外网如何访问容器
创建容器
docker run -d --name web -p 80:80 nginx
iptables规则
iptables -t nat -S
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
docker port web
curl localhost

查看端口 代理端口
netstat -antuple
tcp6 0 0 :::80 ::? LISTEN 0 57379 5549/docker-proxy

docker run -d --name vm2 -p 8080:80 nginx
ps ax|grep docker-proxy

本机访问本机容器 使用iptables
外部主机访问宿主机容器 使用docker-proxy

docker数据卷的管理
分层文件系统 性能差
生命周期短 容器删除里面数据全部删除

1 挂载可绕开分层文件系统 仅现本地磁盘
直接用容器挂载本地
docker run -d --name web1 -p80:80 -v /opt/website:/usr/share/nginx/html nginx
查看容器挂载
docker exec web1 mount
写入本地文件
vim /opt/website/index.html
test1
curl localhost
应用容器不可直接进入 无交互界面 没有shell
docker container attach web1
使用shell交互链接
docker start web1
docker exec -it web1 bash
进入容器更改数据
echo test2 usr/share/nginx/html/index.html
echo test2 >>usr/share/nginx/html/index.html
cat usr/share/nginx/html/index.html
进入主机查看更改结果
curl localhost
物理机为准 有相同的会覆盖掉容器里的数据
docker run -it --name vm1 -v /opt/data1:/data1 -v /opt/data2:/data2:ro ubuntu
物理机最大权限 容器里如设置ro没有权限操作
touch /data1/file1
容器里如设置ro没有权限操作
touch /data2/file2
touch: cannot touch ‘/data2/file2’: Read-only file system
物理机创建
vim /opt/data1/file1
ceshi
容器查看
docker container attach vm1
cat /data1/file1
ceshi 已覆盖
卸载即恢复数据
删除vm1
cd /var/lib/docker/volumes/
cat a49497270977ec87986a36521a203f00a5d2b08f4810dce6e327fe873b8a1a3b/_data/file1无数据

挂载yum rhel7
docker run -it --name vm1 -v /etc/yum.repos.d/rhel.repo:/etc/yum.repos.d/rhel.repo:ro rhel7 bash
只读yum
/usr/bin/yum repolist
echo > /etc/yum.repos.d/rhel.repo
清除不了
移植性差 稳定性高

2 dockermanage管理卷
默认容器数据都在容器保存数据目录下
无指定物理机目录就自动挂载到容器保存目录里
docker volume prune 全部清除
容器挂载本身
docker run -d --name web -p 80:80 -v /usr/share/nginx/html nginx
curl localhost
docker inspect web

“Source”: “/var/lib/docker/volumes/9f2521e89e9ebc3844e5175d919abfc515e3c97b879f3c8b44a28799a6faa70b/_data”,
“Destination”: “/usr/share/nginx/html”,

ls /var/lib/docker/volumes

cd /var/lib/docker/volumes/9f2521e89e9ebc3844e5175d919abfc515e3c97b879f3c8b44a28799a6faa70b/_data/

echo test1> index.html
curl localhost

docker rm -f web
docker ps -a
改名
docker run -d --name web2 -p 80:80 -v website:/usr/share/nginx/html nginx
docker inspect web2
“Source”: “/var/lib/docker/volumes/website/_data”,
“Destination”: “/usr/share/nginx/html”,

echo test2> /var/lib/docker/volumes/website/_data/index.html
curl localhost
制作新的容器数据
docker volume create webdata
删除容器
docker rm -f web2
复制容器数据
cp /var/lib/docker/volumes/website/_data/* /var/lib/docker/volumes/webdata/_data/
删除其他数据
docker volume rm 9f2521e89e9ebc3844e5175d919abfc515e3c97b879f3c8b44a28799a6faa70b website
docker ps -a

直接用该数据开启新的容器即可
docker run -d --name web -p 80:80 -v webdata:/usr/share/nginx/html nginx
curl localhost
不开启80端口
docker run -d --name web2 -v webdata:/usr/share/nginx/html nginx
docker rm -f web
docker inspect web2
“IPAddress”: “172.17.0.3”
curl 172.17.0.3
写入新数据只要挂载其数据的容器内容即可批量改变
echo bbs > /var/lib/docker/volumes/webdata/_data/index.html
curl 172.17.0.3

3种方式映射方式 主机与容器
设备映射 NFS EBS

插件调用存储 多方位存储
适用那种插件就调用那种API
nfs举例 利用convoy软件实现同时数据共享挂载节点

server1 server2 同时安装实现nfs功能完全
yum install nfs-utils -y
systemctl start rpcbind

server1
mkdir /mnt/nfs
vim /etc/exports
/mnt/nfs *(rw,no_root_squash)
systemctl start nfs
exportfs -rv

server2
mkdir /mnt/nfs
showmount -e 172.25.31.1
mount 172.25.31.1:/mnt/nfs /mnt/nfs
touch file1

server1 server2同时设置convoy软件
tar zxf convoy.tar.gz
cd convoy/
cp convoy* /usr/local/bin/
convoy --help
convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &
mkdir /etc/docker/plugins
mkdir /var/run/convoy
echo “unix:///var/run/convoy/convoy.sock” > /etc/docker/plugins/convoy.spec
创建节点
convoy create vol1
convoy list
查看生成配置文件
ls /mnt/nfs/config
节点挂载容器
docker run -it --name vm1 -v vol1:/data ubuntu
touch /data/file{1…9}
ls /mnt/nfs/vol1 共享目录查看
ls /var/lib/docker/volumes/vol1/_data 各个数据查看
删除节点
convoy delete vol1
convoy list

安全
LINUX控制组
查看cgroup 挂载情况
mount -t cgroup

cpu
容器的cpu参数 一对数字字母随即的
和cpu下面的基本一样
里面记录数字都是继承于上级的cpu参数
确保容器资源压力超负荷 分配固定的cpu内存
挂了不会影响其他主机
确保不受攻击

内核运行空间
容器网络down 不允许做危险操作
服务端防护
容器映射本机cgroup用户可防护本机及容器
增强安全特性莫板
设置只读
内核能力机制
docker程序本身

先实现系统测试 再去容器测试 系统是原理性操作 容器是命令实现功能
内核数据
docker run -it --name vm1 ubuntu
docker inspect vm1 |grep pid
ls /proc/10666/ns 容器
ls /sys/fs/cgroup/cpu/docker/ 系统

docker container attach vm1
id

ip link set down eth0

cat /etc/security/limits.conf 查看内核限制参数
free -m查看内存
ls /sys/fs/cgroup/查看管理组具体
cd memory/ 查看 内存参数
ls
cd cpu cou参数
ls

步骤
系统测试
cpu目录里 新建控制器目录
mkdir aa
ls aa/
下载控制工具
yum search cgroup
yum -y libcgroup-tools.x86_64
yum install -y libcgroup-tools.x86_64
调用周期
cd aa/
echo 20000 > cpu.cfs_quota_us
修改参数
dd if=/dev/zero of=/dev/null &
top查看占比大的运行内存pid
查到的pid写入到任务文件 关联
echo 10661 >tasks
top

容器测试
运行容器
docker run --help |grep cpu
docker run -it --name vm2 --cpu-period 100000 --cpu-quota 50000 ubuntu
dd if=/dev/zero of=/dev/null &
top
进入主机目录查看对应的数据即可
cd /sys/fs/cgroup/cpu
cd docker/
cd c4bbd3d5a7a02cbdc567696c6a3053d2a480cc1ce82a8f9b64d18b2ece2ec9f7/
cat cpu.cfs_quota_us
50000
cat cpu.cfs_period_us
100000

实验过程 先系统 后容器

内存管理
docker run -it --memory 256M --memory-swap 256M ubuntu
free -m
cd /sys/fs/cgroup/
ls
cd memory/

创建系统限制空间
mkdir a2
cd a2/
ls
cat memory.limit_in_bytes
bc
25610241024
268435456
echo 268435456 >memory.limit_in_bytes
free -m

交换内存管理
cd /dev/shm/
dd if=/dev/zero of=bigfile bs=1M count=100
free -m
空闲空间少了100M
dd if=/dev/zero of=bigfile bs=1M count=10000
free -m
利用交换内存扩展磁盘空间
没有起到限制内存的作用

关联a2控制器
cgexec -g memory:a2 dd if=/dev/zero of=bigfile bs=1M count=100
与内存限制一致

cd -
echo 268435456 > memory.memsw.limit_in_bytes
cd /dev/shm/
cgexec -g memory:a2 dd if=/dev/zero of=bigfile bs=1M count=100000
Killed
当超过内存限制时 自动杀掉
free -m
查看内存没有变化

上传下载速度管理
系统操作
cd /sys/fs/cgroup/blkio
mkdir a3
cd a3/
docker run --help |grep device
ll /dev/sda
brw-rw----. 1 root disk 8, 0 Oct 10 09:22 /dev/sda
利用磁盘卷参数
bc
1024*1024
1048576
echo “8:0 1048576” >blkio.throttle.write_bps_device
cd ~ 需出来进行
cgexec -g blkio:a3 dd if=/dev/zero of=testfile bs=1M count=10
系统不起作用
cgexec -g blkio:a3 dd if=/dev/zero of=testfile bs=1M count=10 oflag=direct
后面跟oflag=direct参数即可生效

容器操作
docker run -it --name vm --device-write-bps /dev/sda:1M ubuntu
dd if=/dev/zero of=testfile bs=1M count=10 oflag=direct
后面跟oflag=direct参数即可生效

容器交换空间内存
cd /sys/fs/cgroup/freezer/docker/
docker run -it --name vm ubuntu
ls
cd 105347fee639215ed378cabc4f05ed9c0d78fdd706f0f946d018345558e8eff4/
ls
cat tasks
cat freezer.state
THAWED
docker container pause vm
cat freezer.state
FROZEN
docker ps
docker container unpause vm

docker run -it --name vm1 -m 256M ubuntu
free -m
cat /proc/cpuinfo

查看不了真实内存限制比

利用lxcfs软件 容器限制管理 查看真实内存限制比
安装
scp lxcfs-2.0.5-3.el7.centos.x86_64.rpm root@172.25.31.1:/root/
yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm
rpm -qpl lxcfs-2.0.5-3.el7.centos.x86_64.rpm
lxcfs /var/lib/lxcfs/ &
cd /var/lib/lxcfs/
ls
cd proc/
ls

docker run -it --name vm2 -m 256M \

-v /var/lib/lxcfs/proc/cpuinfo:proc/cpuinfo
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo
-v /var/lib/lxcfs/proc/stat:/proc/stat
-v /var/lib/lxcfs/proc/swaps:/proc/swaps
-v /var/lib/lxcfs/proc/uptime:/proc/uptime
ubuntu
free -m
运行

cpu 内存 磁盘 交换空间 时间
这些全部挂载到容器里
查看内存 可查看真实内存

设置特权运行级别
修改不了网卡之类的
docker run --help |grep pri
–privileged
docker run -it --name vm3 --privileged=true ubuntu
添加网卡ip
ip addr add 192.168.0.1/24 dev eth0
ip a
docker inspect vm3 |grep pri
接近宿主机权限
查看
默认情况都是false
“Privileged”: false,
可设置容器的白名单

linux官网分配可查到使用方法
http://man7.org/linux/man-pages/man7/capabilities.7.html
kernel auditin
内核的
读写
网络

相当于添加网络管理白名单 允许部分功能使用
docker run --help |grep cap
查看帮助
–cap-add Add Linux capabilities
–cap-add=NET_ADMIN
docker run -it --name vm5 --cap-add=NET_ADMIN ubuntu
ip addr add 10.0.0.1/24 dev eth0
ip a

特权是关闭的
docker inspect vm5 |grep Pri
“Privileged”: false

可直接查看参数
docker inspect -f {{.HostConfig.Privileged}} vm5
false
docker inspect -f {{.HostConfig.CapAdd}} vm5
[NET_ADMIN]
docker inspect vm5|less
可直接查找

hostconfig 下面的"Privileged": false

镜像最简 非超户 “Privileged”: false
安全 网络流量限速
守护进程 可自动重启服务
数据目录权限设置
容器内存cpu使用率
都可以设置

内存空间
查看容器pid
docker inspect vm5 |grep Pid
ls /proc/7200/ns/
ls /proc/sys/
ls /proc/sysrq-trigger
ll /dev/sd*
ll /dev/mem
系统触发器也没有内存空间
内存
硬盘
都不可设置权限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值