写点什么

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_db
复制代码

5.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 page
复制代码

docker 数据管理-数据目录及配置多卷挂载:

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.2cb9709a29dd055743169094589ff7e10ab4b8b7aaff64302aa11b1c9fe3f1631
复制代码

Docker 网络-container 模式

Container模式即容器模式,使用参数 --net=container:目标容器名称/ID 指定,使用此模式创建的容器需指定和一个已经存在的容器共享一个网络namespace,而不会创建独立的namespace,即新创建的容器不会创建自己的网卡也不会配置自己的IP,而是和一个已经存在的被指定的目标容器共享对方的IP和端口范围,因此这个容器的端口不能和被指定的目标容器端口冲突,除了网络之外的文件系统、用户信息、进程信息等仍然保持相互隔离,两个容器的进程可以通过lo网卡及容器IP进行通信

复制代码


用户头像

关注

还未添加个人签名 2018-05-29 加入

还未添加个人简介

评论

发布
暂无评论
docker学习笔记_飞_InfoQ写作社区