docker 学习笔记
- 2022-10-21 北京
本文字数:5006 字
阅读完需:约 1 分钟
1.什么是 docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
2.docker 优缺点
3.Namespace 分类和作用
Control group (cgroup) Namespace:提供进程所属的控制组的身份隔离
MNT Namespace(mount):提供磁盘挂载点和文件系统的隔离能力
IPC Namespace(Inter-Process Communication):提供进程间通信的隔离能力
UTS Namespace(UNIX Timesharing System):提供主机名隔离能力
PID Namespace(Process Identification):提供进程隔离能力
Net Namespace(network):提供网络隔离能力
User Namespace(user):提供用户隔离能力
Time Namespac:提供时间隔离能力
Syslog Namespace:提供 syslog 隔离能力
4.yum 安装指定版本 docker
yum -y install docker
[root@test ~]# yum -y install docker
Loaded plugins: fastestmirror
Determining fastest mirrors
base | 3.6 kB 00:00:00
epel | 4.7 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
(1/7): base/7/x86_64/group_gz | 153 kB 00:00:00
(2/7): epel/x86_64/group_gz | 97 kB 00:00:00
(3/7): epel/x86_64/updateinfo | 1.0 MB 00:00:00
(4/7): base/7/x86_64/primary_db | 6.1 MB 00:00:00
(5/7): epel/x86_64/primary_db | 7.0 MB 00:00:00
(6/7): extras/7/x86_64/primary_db | 249 kB 00:00:00
(7/7): updates/7/x86_64/primary_db5.Docker 数据卷常用命令
docker 数据管理-docker 创建数据卷:
[root@test ~]# docker run -it -d -p 80:80 -v nginx-data:/data nginx:1.20.2e4aaf2b7e3889861d3184fdfc0b7cb4d1e216a430a47d2668ceb3be86bbd1e0b[root@test ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe4aaf2b7e388 nginx:1.20.2 "/docker-entrypoin..." 4 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp reverent_bell[root@test ~]# docker exec -it e4aaf2b7e388 bashroot@e4aaf2b7e388:/#root@e4aaf2b7e388:/# llbash: ll: command not foundroot@e4aaf2b7e388:/# lsbin data docker-entrypoint.d etc lib media opt root sbin sys usrboot dev docker-entrypoint.sh home lib64 mnt proc run srv tmp varroot@e4aaf2b7e388:/# echo "nginx web" > /data/index.htmlroot@e4aaf2b7e388:/# ls /data/index.htmlroot@e4aaf2b7e388:/# exitexit[root@test ~]# ls /var/lib/docker/volumes/nginx-data/_data/index.html/var/lib/docker/volumes/nginx-data/_data/index.html[root@test ~]# df -hFilesystem Size Used Avail Use% Mounted ondevtmpfs 486M 0 486M 0% /devtmpfs 496M 0 496M 0% /dev/shmtmpfs 496M 628K 495M 1% /runtmpfs 496M 0 496M 0% /sys/fs/cgroup/dev/vda1 40G 3.1G 35G 9% /tmpfs 100M 0 100M 0% /run/user/0overlay 40G 3.1G 35G 9% /var/lib/docker/overlay2/de41d03cf3547e519e1bddcaa95e05fcf5083c9c8736c6818fb8445f5f30cac6/mergedshm 64M 0 64M 0% /var/lib/docker/containers/e4aaf2b7e3889861d3184fdfc0b7cb4d1e216a430a47d2668ceb3be86bbd1e0b/shm
docker 数据管理-数据目录挂载
以数据卷的方式,将自定义的宿主机目录或文件提供给容器使用,比如容器可以直接挂载宿主机本地的数据目录(如 mysql 容器的数据持久化)、 配置文件(如 nginx 的配置文件)、静态文件(如 web 服务的图片或 js 文件)等,只需要在创建容器的时候指定挂载即可。
docker 数据管理-数据目录挂载:
[root@test ~]# mkdir /data/testapp -p[root@test ~]# echo "test web page" > /data/testapp/index.html[root@test ~]# cat /data/testapp/cat: /data/testapp/: Is a directory[root@test ~]# cat /data/testapp/index.htmltest web page[root@test ~]# docker run -d --name web1 -v /data/testapp/:/usr/share/nginx/html/testapp -p 80:80 nginx:1.20.2b7180a61c0e4645b05ff173e1bb40226da4c05c2d3f963565856de32d523d736[root@test ~]# docker run -d --name web2 -v /data/testapp/:/usr/share/nginx/html/testapp -p 81:80 nginx:1.20.295a2b87a89b6fe13e28b3e6c44bac30fca470b36b01e0627ba0acedbc025d717[root@test ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES95a2b87a89b6 nginx:1.20.2 "/docker-entrypoin..." 3 seconds ago Up 2 seconds 0.0.0.0:81->80/tcp web2b7180a61c0e4 nginx:1.20.2 "/docker-entrypoin..." 22 seconds ago Up 21 seconds 0.0.0.0:80->80/tcp web1[root@test ~]# curl http://172.17.57.210:81/testapp/test web page[root@test ~]# curl http://172.17.57.210:80/testapp/test web pagedocker 数据管理-数据目录及配置多卷挂载:
nginx多卷挂载:[root@test ~]# mkdir /data/nginx/conf -p[root@test ~]# docker cp web1:/etc/nginx/nginx.conf /data/nginx/conf/[root@test ~]# docker run -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:1.20.26a80ce00a3189f6a007f782222e10575cefdac6468ba5e050d214ac9f9f97917[root@test ~]# curl http://172.17.57.210:83/testapp/test web page[root@test ~]# vim /data/testapp/index.html[root@test ~]# !curlcurl http://172.17.57.210:83/testapp/hello word!!!mysql容器:[root@test ~]# docker pull mysql:5.7.38[root@test ~]# docker run -it -d -p 3306:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.38cf10b5f502375022acf31d240a18382bd357bcfad48e3c0c32c6e37b4bcc4927
docker 数据管理-删除容器
数据卷的特点及使用: 数据卷是宿主机的目录或者文件,并且可以在多个容器之间共同使用。 在宿主机对数据卷更改数据后会在所有容器里面会立即更新。 数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不影响。 在容器里面的写入数据不会影响到镜像本身。
数据卷使用场景: 容器数据持久化(mysql数据、nginx日志等类型) 静态web页面挂载 应用配置文件挂载 多容器间的目录或文件共享
创建容器的时候指定参数会删除/var/lib/docker/containers/的容器数据目录,但是不会删除数据卷的内容[root@test ~]# docker rm -f web3web3[root@test ~]# ls /data/testapp/index.html/data/testapp/index.html #挂载的数据卷不会被删除
docker 数据管理-数据卷容器:
数据卷容器功能是可以让数据在多个docker容器之间共享,即先要创建一个后台运行的A容器作为Server,之后创建的B容器、C容器等都可以同时访问A容器的内容,因此数据卷容器用于为其它容器提供卷的挂载继承服务,数据卷为其它容器提供数据读写服务,A容器称为server端、其它容器成为client端
特点: 适用于同类服务的数据卷共享 client会继承卷server挂载和挂载权限 停止卷server,也不影响已经运行的容器、甚至也不影响新建容器 删除卷server,不影响已经运行的容器,但是不能新建容器卷容器server[root@test ~]# 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.8Unable to find image 'registry.cn-hangzhou.aliyuncs.com/zhangshijie/pause:3.8' locallyTrying to pull repository registry.cn-hangzhou.aliyuncs.com/zhangshijie/pause ...3.8: Pulling from registry.cn-hangzhou.aliyuncs.com/zhangshijie/pause9457426d6899: Pull completeDigest: sha256:e0cc6dba04bee00badd8b13495d4411060b5563a9499fbc20e46316328efad30Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/zhangshijie/pause:3.87ab39a873897cc03d3789744c1d70c13464ca0224ebf9049861a6871dfe4fe78
[root@test ~]# docker run -d --name web11 --volumes-from volume-server -p80:80 nginx:1.20.240dec0c370c5c609ae995b4007ac6d1f929af46941255f35d2d5fc8d994f4127[root@test ~]#[root@test ~]# docker run -d --name web22 --volumes-from volume-server -p81:80 nginx:1.20.2335e61add6a44f7a674ba2a24bdc6f38f64a775035fa3da2ff9eaab38d881cf2
6.Docker 的 bridge 和 container 模式网络
Docker服务安装完成之后,默认在每个宿主机会生成一个名称为docker0的网卡其IP地址都是172.17.0.1/16,并且会生成三种不能类型的网络[root@test ~]# ifconfig docker0docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::42:3ff:fe13:d09a prefixlen 64 scopeid 0x20<link> ether 02:42:03:13:d0:9a txqueuelen 0 (Ethernet) RX packets 10337 bytes 615978 (601.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 16813 bytes 25969345 (24.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0另外会额外创建三个默认网络,用于不同的使用场景[root@test ~]# docker network listNETWORK ID NAME DRIVER SCOPE39e002393c8f bridge bridge local ##桥接网络,默认使用的模式,容器基于SNAT进行地址转换访问宿主机以外的环境0f7a38f11e70 host host local #host网络,直接使用宿主机的网络( 不创建net namespace),性能最好,但是容器端口不能冲突95c8263afe73 none null local #空网络,容器不会分配有效的IP地址(只有一个回环网卡用于内部通信),用于离线数据处理等场景
Docker 网络-bridge 模式
docker的默认模式即不指定任何模式就是bridge模式,也是目前使用比较多的网络模式,此模式创建的容器会为每一个容器分配自己的网络IP等信息,并将容器连接到一个虚拟网桥与外界通信[root@test ~]# docker network inspect bridge[ { "Name": "bridge", "Id": "39e002393c8f336e61ab4869bdc0da78e5ac0286eb271ad42e3ed9c0e1904bcb", "Created": "2022-10-18T23:56:46.243062131+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" } ][root@test ~]# docker run -it -d --name nginx-web1-bridge-test-container -p 80:80 --net=bridge nginx:1.20.2cb9709a29dd055743169094589ff7e10ab4b8b7aaff64302aa11b1c9fe3f1631Docker 网络-container 模式
Container模式即容器模式,使用参数 --net=container:目标容器名称/ID 指定,使用此模式创建的容器需指定和一个已经存在的容器共享一个网络namespace,而不会创建独立的namespace,即新创建的容器不会创建自己的网卡也不会配置自己的IP,而是和一个已经存在的被指定的目标容器共享对方的IP和端口范围,因此这个容器的端口不能和被指定的目标容器端口冲突,除了网络之外的文件系统、用户信息、进程信息等仍然保持相互隔离,两个容器的进程可以通过lo网卡及容器IP进行通信
飞
还未添加个人签名 2018-05-29 加入
还未添加个人简介










评论