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.2
e4aaf2b7e3889861d3184fdfc0b7cb4d1e216a430a47d2668ceb3be86bbd1e0b
[root@test ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e4aaf2b7e388 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 bash
root@e4aaf2b7e388:/#
root@e4aaf2b7e388:/# ll
bash: ll: command not found
root@e4aaf2b7e388:/# ls
bin data docker-entrypoint.d etc lib media opt root sbin sys usr
boot dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
root@e4aaf2b7e388:/# echo "nginx web" > /data/index.html
root@e4aaf2b7e388:/# ls /data/
index.html
root@e4aaf2b7e388:/# exit
exit
[root@test ~]# ls /var/lib/docker/volumes/nginx-data/_data/index.html
/var/lib/docker/volumes/nginx-data/_data/index.html
[root@test ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 486M 0 486M 0% /dev
tmpfs 496M 0 496M 0% /dev/shm
tmpfs 496M 628K 495M 1% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/vda1 40G 3.1G 35G 9% /
tmpfs 100M 0 100M 0% /run/user/0
overlay 40G 3.1G 35G 9% /var/lib/docker/overlay2/de41d03cf3547e519e1bddcaa95e05fcf5083c9c8736c6818fb8445f5f30cac6/merged
shm 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.html
test web page
[root@test ~]# docker run -d --name web1 -v /data/testapp/:/usr/share/nginx/html/testapp -p 80:80 nginx:1.20.2
b7180a61c0e4645b05ff173e1bb40226da4c05c2d3f963565856de32d523d736
[root@test ~]# docker run -d --name web2 -v /data/testapp/:/usr/share/nginx/html/testapp -p 81:80 nginx:1.20.2
95a2b87a89b6fe13e28b3e6c44bac30fca470b36b01e0627ba0acedbc025d717
[root@test ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95a2b87a89b6 nginx:1.20.2 "/docker-entrypoin..." 3 seconds ago Up 2 seconds 0.0.0.0:81->80/tcp web2
b7180a61c0e4 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.2
6a80ce00a3189f6a007f782222e10575cefdac6468ba5e050d214ac9f9f97917
[root@test ~]# curl http://172.17.57.210:83/testapp/
test web page
[root@test ~]# vim /data/testapp/index.html
[root@test ~]# !curl
curl 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.38
cf10b5f502375022acf31d240a18382bd357bcfad48e3c0c32c6e37b4bcc4927
docker 数据管理-删除容器
数据卷的特点及使用:
数据卷是宿主机的目录或者文件,并且可以在多个容器之间共同使用。
在宿主机对数据卷更改数据后会在所有容器里面会立即更新。
数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不影响。
在容器里面的写入数据不会影响到镜像本身。
数据卷使用场景:
容器数据持久化(mysql数据、nginx日志等类型)
静态web页面挂载
应用配置文件挂载
多容器间的目录或文件共享
创建容器的时候指定参数会删除/var/lib/docker/containers/的容器数据目录,但是不会删除数据卷的内容
[root@test ~]# docker rm -f web3
web3
[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.8
Unable to find image 'registry.cn-hangzhou.aliyuncs.com/zhangshijie/pause:3.8' locally
Trying to pull repository registry.cn-hangzhou.aliyuncs.com/zhangshijie/pause ...
3.8: Pulling from registry.cn-hangzhou.aliyuncs.com/zhangshijie/pause
9457426d6899: Pull complete
Digest: sha256:e0cc6dba04bee00badd8b13495d4411060b5563a9499fbc20e46316328efad30
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/zhangshijie/pause:3.8
7ab39a873897cc03d3789744c1d70c13464ca0224ebf9049861a6871dfe4fe78
[root@test ~]# docker run -d --name web11 --volumes-from volume-server -p80:80 nginx:1.20.2
40dec0c370c5c609ae995b4007ac6d1f929af46941255f35d2d5fc8d994f4127
[root@test ~]#
[root@test ~]# docker run -d --name web22 --volumes-from volume-server -p81:80 nginx:1.20.2
335e61add6a44f7a674ba2a24bdc6f38f64a775035fa3da2ff9eaab38d881cf2
6.Docker 的 bridge 和 container 模式网络
Docker服务安装完成之后,默认在每个宿主机会生成一个名称为docker0的网卡其IP地址都是172.17.0.1/16,并且会生成三种不能类型的网
络
[root@test ~]# ifconfig docker0
docker0: 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 list
NETWORK ID NAME DRIVER SCOPE
39e002393c8f 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.2
cb9709a29dd055743169094589ff7e10ab4b8b7aaff64302aa11b1c9fe3f1631
Docker 网络-container 模式
Container模式即容器模式,使用参数 --net=container:目标容器名称/ID 指定,使用此模式创建的容器需指定和一个已经存在的容器共享一个网
络namespace,而不会创建独立的namespace,即新创建的容器不会创建自己的网卡也不会配置自己的IP,而是和一个已经存在的被指定的
目标容器共享对方的IP和端口范围,因此这个容器的端口不能和被指定的目标容器端口冲突,除了网络之外的文件系统、用户信息、进程信息
等仍然保持相互隔离,两个容器的进程可以通过lo网卡及容器IP进行通信
飞
还未添加个人签名 2018-05-29 加入
还未添加个人简介
评论