docker 安装、namespace、数据卷和网络模式练习

一 梳理各namespace的作用
namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用一个宿主机内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离:

  1. MNT Namespace(mount),提供磁盘挂载点和文件系统的隔离能力.每个容器都要有独立的根文件系统有独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境。宿主机使用chroot技术把容器锁定到一个指定的运行目录里面并作为容器的根运行环境。
    2.IPC Namespace(Inter-Process Communication),提供进程间通信的隔离:
    IPC namespace隔离进程间通信资源(同一个IPC namespace的进程内可实现内存等资源共享,但是不同的IPC namespace则严格隔离)。
    3.UTS Namespace(UNIX Timesharing System),提供主机名隔离:
    UTS namespace用于系统标识、其中包含了hostname和域名domainname,它使得一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主机系统和其上的其他容器。
    4.PID Namespace(Process identification)提供进程隔离能力,在Linux系统中,有一个PID为1的进程(init/systemd)是其他所有进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的子进程,那么多个容器的进程通PID namespace进程隔离(比如PID编号重复、容器内的主进程生成与回收子进程等。)
    5.Net Namespace,提供网络隔离:每个容器都类似于虚拟机一样有自己的网卡、监听端口、TCP/IP协议栈等,docker使用network namespace启动一个vethX接口,这样你的容器将拥有它自己的桥接IP地址,通常是docker0,而docker0实质就是Linux的虚拟网桥,网桥是在OSI七层模型的数据链路层的网络设备,通过mac地址对网络进行划分,并且在不同网络直接传递数据。
    6.User Namespace,提供用户隔离:允许在各个宿主机的各个容器内创建相同的用户名以及相同的用户UID和GID,会把用户的作用范围限定在每个容器内。
    7.Linux control groups(Linux Cgroups),提供进程所属的控制组的身份隔离。限制一个进程组能够使用的资源上限,包括CPU、内存、硬盘、网络带宽等。此外,能够对进程进行优先级设置,以及将进程挂起和恢复操作。

二. 使用apt/yum/二进制安装指定版本的docker
1.二进制安装指定版本的docker
a.下载包docker-20.10.19.tgz,下载下载docker-20.10.19-binary-install.tar.gz 安装包
b.解压文件
解压下载的docker-20.10.19-binary-install.tar.gz 包,在解压包当前目录下,cp ./limits.conf /etc/security/limits.conf
cp ./sysctl.conf /etc/sysctl.conf
解压下载的docker-20.10.19.tgz,拷贝解压后docker目录所有文件到/usr/bin/目录里: cp docker/* /usr/bi
c.拷贝服务文件到相应目录
mkdir /etc/docker && \cp daemon.json /etc/docker
\cp containerd.service /lib/systemd/system/containerd.service
\cp docker.service /lib/systemd/system/docker.service
\cp docker.socket /lib/systemd/system/docker.socket
\cp ./docker-compose-Linux-x86_64_1.28.6 /usr/bin/docker-compose
groupadd docker && useradd docker -r -m -s /sbin/nologin -g docker
d.启动服务
systemctl enable containerd.service && systemctl restart containerd.service
systemctl enable docker.service && systemctl restart docker.service
systemctl enable docker.socket && systemctl restart docker.socket

检查docker info命令,查看是否正常。

二. apt命令安装指定版本的docker
1.更新 apt 包索引
apt-get update
2.安装 apt 依赖包,用于通过HTTPS来获取仓库
$ apt-get install
apt-transport-https
ca-certificates
curl
gnupg-agent
software-properties-common
3.添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4.设置稳定版仓库
$ add-apt-repository
“deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable”
5.安装 Docker-ce
$ apt-get update
$ apt-get install docker-ce docker-ce-cli containerd.io
6.设置开机自启动并启动 Docker-ce, 安装成功后默认开启
7.测试运行
docker run hello-world
8.添加当前用户到 docker 用户组

列出自己的用户组,确认自己在不在 docker 组中

groups

没有则新增docker组

groupadd docker

把当前用户加入到docker组中

gpasswd -a ${USER} docker

重启docker服务

service docker restart

三. 熟练使用docker数据卷
docker 数据管理:Docker的镜像是分层设计的,镜像层是只读的,通过镜像启动的容器添加了一层可读写文件系统,用户写入的数据保存在这一层当中。
如果要将写入到容器的数据永久保存,则需要将容器中的数据保存到宿主机的指定目录,目前Docker的数据类型分为两种:
一是数据卷(data volume),数据卷实际上就是宿主机上的目录或者是文件,可以被直接mount到容器当中作为容器的本地文件系统使用,实际生产环境中,需要针对不同类型的服务、不同类型的数据存储要求做相应的规划,最终保证服务的可扩展性、稳定性以及数据的安全性。基于数据卷通过将宿主机的文件或目录挂载到容器的指定目录,当容器中的挂载目录产生的新数据即可间接的保存到宿主机以实现持久化的目的.
二是数据卷容器(Data volume container), 数据卷容器是将宿主机的目录挂载至一个专用的数据卷容器,然后让其他容器通过数据卷容器继承挂载的目录或文件,以实现将新产生的数据持久化到宿主机的目的。
#Docker 数据管理-创建数据卷
root@yong:~# docker volume create nginx1-data
nginx1-data
#把nginx1-data数据卷mount到容器的/data目录下
root@yong:~# docker run -it -d -p 80:80/tcp -v nginx1-data:/data 605c77e624dd /bin/bash
a37dc815bfd85708fc6dc6fbc4637fb8838c47c34711f4327c2814b01b3599cd
#进入容器查看data目录,写入数据
root@yong:~# docker exec -it a37 /bin/bash
root@a37dc815bfd8:/# ls
bin boot data dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@a37dc815bfd8:/# echo “nginx web” > /data/index.html
#到宿主机volumes目录下查看容器里写的文件
root@yong:/var/lib/docker/volumes/nginx1-data/_data# cat index.html
nginx web

#Docker 数据管理-数据目录挂载
以数据卷的方式,将自定义的宿主机目录或文件提供给容器使用。
#在宿主机上创建目录,并写入文件
root@yong:/var/lib/docker/volumes/nginx1-data/_data# mkdir -p /data/testapp
root@yong:/var/lib/docker/volumes/nginx1-data/_data# echo “testapp web page” > /data/testapp/index.html
#把创建的文件挂载给2个新生成在容器
root@yong:/var/lib/docker/volumes/nginx1-data/_data# docker run -it -d -p 80:80/tcp -v /data/testapp/index.html:/usr/share/nginx/html/testapp nginx /bin/bash
b5ac0ac9318d5cb0db37fb2b00a262b24cb92a3e4162395126c552e766bcab22
root@yong:/var/lib/docker/volumes/nginx1-data/_data# docker run -it -d -p 81:80/tcp -v /data/testapp/index.html:/usr/share/nginx/html/testapp nginx /bin/bash
cb6e373e1013445723354079af95603b737dc5660f84270c198fc288eda741f9

#进入到2个容器里查看文件内容/usr/share/nginx/html/testapp
root@yong:/var/lib/docker/volumes/nginx1-data/_data# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb6e373e1013 nginx “/docker-entrypoint.…” 6 hours ago Up 6 hours 0.0.0.0:81->80/tcp, :::81->80/tcp charming_mclaren
b5ac0ac9318d nginx “/docker-entrypoint.…” 6 hours ago Up 6 hours 0.0.0.0:80->80/tcp, :::80->80/tcp angry_euclid
root@yong:/var/lib/docker/volumes/nginx1-data/_data# docker exec -it cb6e373e1013 /bin/bash
root@cb6e373e1013:/usr/share/nginx/html# cat testapp
testapp web page
root@cb6e373e1013:/usr/share/nginx/html# exit
exit
root@yong:/var/lib/docker/volumes/nginx1-data/_data# docker exec -it b5a /bin/bash
root@b5ac0ac9318d😕# cat /usr/share/nginx/html/testapp
testapp web page

#Docker 数据管理-数据目录及配置多卷挂载:
nginx多卷挂载:
root@yong:/# mkdir -p /data/nginx/conf
root@yong:/# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb6e373e1013 nginx “/docker-entrypoint.…” 6 hours ago Up 6 hours 0.0.0.0:81->80/tcp, :::81->80/tcp charming_mclaren
b5ac0ac9318d nginx “/docker-entrypoint.…” 6 hours ago Up 6 hours 0.0.0.0:80->80/tcp, :::80->80/tcp angry_euclid
root@yong:/# docker cp charming_mclaren:/etc/nginx/nginx.conf /data/nginx/conf/
root@yong:/# docker run -it -d --name web3 -v /data/testapp:/usr/share/nginx/html/testapp -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -p 83:80 nginx

root@yong:/# docker pull mysql:5.7.38
root@yong:/# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.38 459651132a11 3 months ago 429MB
nginx latest 605c77e624dd 9 months ago 141MB
root@yong:/# docker run -it -d -p 3306:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.38
5f358742dd85ecb207b35b9a8eb5383ae8019f595991f4e06ac5e042fdb7faca
root@yong:/# docker exec -it 5f35 /bin/bash
bash-4.2# mysql -uroot -p123456 -h192.168.159.128
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.38 MySQL Community Server (GPL)

Copyright © 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
±-------------------+
4 rows in set (0.00 sec)

#Docker 数据管理-删除容器
创建容器的时候指定参数会删除/var/lib/docker/containers/的容器数据目录,但是不会删除数据卷的内容
root@yong:/# docker stop web3
web3
root@yong:/# docker rm web3
web3
root@yong:/# cat /data/nginx/conf/nginx.conf
user nginx;
worker_processes auto;
删除容器后,原先挂载给容器的宿主机目录里文件还存在

Docker 数据管理-数据卷容器:
数据卷容器功能是可以让数据在多个docker容器之间共享,即先要创建一个后台运行的A容器作为Server,之后创建的B容器、C容器等都可以同时访问A容器的内容,因此数据卷容器用于为其它容器提供卷的挂载继承服务,数据卷为其它容器提供数据读写服务,A容器称为server端、其它容器成为client端.
#创建数据卷Server容器,准备给client容器挂载
docker run -d --name volume-server -v /data/testapp:/usr/share/nginx/html/testapp -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro registry.cn-hangzhou.aliyuncs.com/zhangshijie/pause:3.8

#创建2个client,继承server的数据卷
docker run -d --name web1 --volumes-from volume-server -p 80:80 nginx
docker run -d --name web2 --volumes-from volume-server -p 81:80 nginx

特点:
 适用于同类服务的数据卷共享
 client会继承卷server挂载和挂载权限
 停止卷server,也不影响已经运行的容器、甚至也不影响新建容器
 删除卷server,不影响已经运行的容器,但是不能新建容器

#Docker网络
Docker服务安装完成之后,默认在每个宿主机会生成一个名称为docker0的网卡其IP地址都是172.17.0.1/16。
docker的默认模式即不指定任何模式就是bridge模式,也是目前使用比较多的网络模式,此模式创建的容器会为每一个容器分配自己的网络IP等信息,并将容器连接到一个虚拟网桥与外界通信。
#创建bridge网络模式的容器
root@yong:/data/testapp# docker run -it -d --name nginx-web1-bridge-test-container -p 80:80 --net=bridge nginx
bfee5d42516e07200f4e1e8a5f41178bafa399dbea289b2329cc783e7458e428
#inspect查看bridge,在container里可查看到创建的容器信息
root@yong:/data/testapp# docker network inspect bridge
“Containers”: { “bfee5d42516e07200f4e1e8a5f41178bafa399dbea289b2329cc783e7458e428”: {
“Name”: “nginx-web1-bridge-test-container”,
“EndpointID”: “17b41e370a7469f51fc0a53f08e2b1298b32299b9f44216e7be109252236d248”,
“MacAddress”: “02:42:ac:11:00:02”,
“IPv4Address”: “172.17.0.2/16”,
“IPv6Address”: “”
}
},
root@yong:/data/testapp# curl -I 172.17.0.2:80
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Sat, 22 Oct 2022 12:15:19 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网络-container模式
Container模式即容器模式,使用参数 --net=container:目标容器名称/ID 指定,使用此模式创建的容器需指定和一个已经存在的容器共享一个网络namespace,而不会创建独立的namespace,即新创建的容器不会创建自己的网卡也不会配置自己的IP,而是和一个已经存在的被指定的目标容器共享对方的IP和端口范围,因此这个容器的端口不能和被指定的目标容器端口冲突,除了网络之外的文件系统、用户信息、进程信息等仍然保持相互隔离,两个容器的进程可以通过lo网卡及容器IP进行通信。
#创建net为bridge容器,为后面容器创建网络为container模式准备

docker run -it -d --name nginx-container -p 80:80 --net=bridge nginx

docker run -it -d --name php-container --net=container:nginx-container php

#查看netns namespace,只有一个netns,只有一个IP地址
root@yong:/var/run/docker/netns# ln -s /var/run/docker/netns/* /var/run/netns/
root@yong:/var/run/docker/netns# ip netns list
42a36713c246 (id: 0)
root@yong:/var/run/docker/netns# ip netns exec 42a36713c246 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
26: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值