Docker基础知识!
Posted handsomeboy-东
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker基础知识!相关的知识,希望对你有一定的参考价值。
docker
Docker概述
Docker是Linux中运行应用的开源工具,是一种轻量级的虚拟机,它诞生于2013年,最初发起者是dotCloud公司,它的设计宗旨是:“Build,Ship and Run Any App,Anywhere”,即通过对应用最简的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”
Docker与传统虚拟化的区别
特性 | Docker容器 | 虚拟机 |
---|---|---|
计算能力损耗 | 几乎无 | 损耗50%左右 |
性能 | 接近原生 | 弱于原生 |
系统支持单机量 | 成百上千个 | 几十个 |
隔离性 | 资源限制(进程隔离) | 完全隔离 |
磁盘占用 | MB | GB |
Docker原理
cgroup(资源控制)和namespases(名称空间)两种构成,控制管理六个名称空间
6个名称空间:
- user:操作进程的用户和用户组
- net:网络设备、端口
- pid:进程号
- uts:主机名和主句域
- ipc:应用间的通信使用的内存空间
- mount:文件系统和挂载点
Docker三大组件
- 镜像:一组资源的集合,包含了应用程序、相关依赖包和运行环境等,相当于容器的模板
- 容器:基于镜像的一种运行时状态,每个容器都是相互隔离的
- 仓库:存放image镜像
Docker网络模式
- HOST模式:docker容器没有自己的网卡和IP,而是使用宿主机的ip和端口,和宿主机共用一个网络名称空间,它的最大优势时网络性能比较好,但是因为它是直接使用的宿主机的IP地址,其隔离性不好,安全性相对不高
- Container模式:容器不会创建自己的网卡和ip,而是和一个指定容器共享IP,端口范围,它不是跟宿主机共享IP地址,相对host模式安全性较高,两个容器的进程可以通过lo:0网卡设备通信
- None模式:该模式下容器只有lo回环网卡,关闭了网络功能
- Bridge模式:该模式会为每一个容器设置IP地址,将容器连接到一个docker虚拟网,通过docker0网桥及iptables的nat表配置与宿主机通信,从docker0子网中分配一个IP给容器使用
Dockerfile
- Dockerfile中每个指令都会创建一个新的镜像层
- 镜像层将被缓存和复用(前一层会缓存给后一层使用)
- 当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
- 某一层的镜像缓存失效过后,它只会的镜像层缓存都会失效,镜像层时不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件
- 涉及技术有bootfs和rootfs,docker的启动时是与宿主机共享内核空间bootfs即rootfs这类的操作系统基础环境
Docker镜像的分层
docker镜像分成基于AUFS(能把多个文件内容合并在一起)构建
- worker层:读写,container容器层
- upper层:应用
- lower:依赖环境
- base image :基础镜像
Docker安装部署
##安装依赖包
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
##设置阿里云镜像源
[root@docker ~]# cd /etc/yum.repos.d/
[root@docker yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
##安装docker-ce社区版
[root@docker yum.repos.d]# yum install -y docker-ce
[root@docker yum.repos.d]# systemctl start docker
[root@docker yum.repos.d]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
##这里我们暂时不用镜像仓库,设置镜像加速,镜像加速可以到阿里免费领取
[root@docker yum.repos.d]# mkdir -p /etc/docker
[root@docker yum.repos.d]# tee /etc/docker/daemon.json <<-'EOF'
>
> "registry-mirrors": ["https://r4f0p1ia.mirror.aliyuncs.com"]
>
> EOF
[root@docker yum.repos.d]# systemctl daemon-reload
[root@docker yum.repos.d]# systemctl restart docker
##网络优化
[root@docker yum.repos.d]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@docker yum.repos.d]# systemctl restart network
[root@docker yum.repos.d]# systemctl restart docker
##修改配置文件
[root@docker yum.repos.d]# cd /etc/docker/
[root@docker docker]# ls
daemon.json key.json
[root@docker docker]# vim daemon.json ##添加以下内容
"graph": "/data/docker", ##数据目录
"storage-driver": "overlay2", ##存储引擎
"insecure-registries": ["registry.access.redhat.com","quary.io"] ##私有仓库
"regustry-mirrors": ["https://r4f0p1ia.mirror.aliyuncs.com"] ##镜像加速
"bip": "172.7.5.1/24", ##docker网络
"exec-opts": ["native.cgroupdriver-systemd"], ##启动时额外参数
"live-restore": true
Docker命令
管理镜像
##查看docker版本
[root@docker yum.repos.d]# docker -v
Docker version 20.10.8, build 3967b7d
##从官方docker hub下载镜像
[root@docker docker]# docker pull hello-world:latest
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
##查看镜像
[root@docker docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 5 months ago 13.3kB
##运行镜像
[root@docker docker]# docker run hello-world
##搜索镜像
[root@docker ~]# docker search nginx
##查看镜像信息
[root@docker ~]# docker inspect d1165f221234(容器ID)
##给镜像打标签
[root@docker ~]# docker tag hello-world:latest hello-world:whd
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 6 months ago 13.3kB
hello-world whd d1165f221234 6 months ago 13.3kB
centos 7 8652b9f0cb4c 9 months ago 204MB
##删除镜像,docker rmi 镜像名称/标签
[root@docker ~]# docker rmi hello-world:whd
Untagged: hello-world:whd
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 6 months ago 13.3kB
centos 7 8652b9f0cb4c 9 months ago 204MB
##导出镜像为文件
[root@docker ~]# docker save -o hello-world hello-world:latest
[root@docker ~]# ls
anaconda-ks.cfg hello-world initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@docker ~]# scp hello-world root@192.168.118.88:/opt ##传入另一台服务器
[root@node2 opt]# docker load < hello-world ##导入镜像
f22b99068db9: Loading layer [==================================================>] 15.36kB/15.36kB
Loaded image: hello-world:latest
[root@node2 opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 6 months ago 13.3kB
容器操作
[root@docker ~]# docker run hello-world ##运行一个镜像为容器
[root@docker ~]# docker ps -a ##查看所有容器状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5d09aed4e48 hello-world "/hello" 11 seconds ago Exited (0) 10 seconds ago festive_wiles
[root@docker ~]# docker rm f5d09aed4e48 ##删除容器,只删除未运行的,加-f可强制删除运行的容器
f5d09aed4e48
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
##创建容器
[root@docker ~]# docker create -it nginx:latest /bin/bash
978de36e212ce0611030e85f3c45dac885bed07989dcbefcee7ba4d79b482d8e
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
978de36e212c nginx:latest "/docker-entrypoint.…" 7 seconds ago Created dazzling_pascal
[root@docker ~]# docker start 978de36e212c ##根据容器ID启动容器
978de36e212c
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
978de36e212c nginx:latest "/docker-entrypoint.…" 23 seconds ago Up 3 seconds 80/tcp dazzling_pascal
##一次性创建容器
[root@docker ~]# docker run centos:7 /usr/bin/bash -c ls /
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
720bc6dc8403 centos:7 "/usr/bin/bash -c ls…" 13 seconds ago Exited (0) 12 seconds ago romantic_khorana
978de36e212c nginx:latest "/docker-entrypoint.…" 14 minutes ago Up 13 minutes 80/tcp dazzling_pascal
##停止容器
[root@docker ~]# docker stop 978de36e212c
978de36e212c
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
720bc6dc8403 centos:7 "/usr/bin/bash -c ls…" 3 minutes ago Exited (0) 3 minutes ago romantic_khorana
978de36e212c nginx:latest "/docker-entrypoint.…" 18 minutes ago Exited (137) 6 seconds ago dazzling_pascal
##持续后台运行
[root@docker ~]# docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
4f3e6ae802c124acd0ae2927f00f51aba0d95aaaf315fac5ac1be1d0dc3e4694
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4f3e6ae802c1 centos:7 "/usr/bin/bash -c 'w…" 6 seconds ago Up 5 seconds musing_chaplygin
720bc6dc8403 centos:7 "/usr/bin/bash -c ls…" 9 minutes ago Exited (0) 8 minutes ago romantic_khorana
978de36e212c nginx:latest "/docker-entrypoint.…" 23 minutes ago Exited (137) 5 minutes ago dazzling_pascal
##进入容器
[root@docker ~]# docker exec -it 4f3e6ae802c1 /bin/bash #容器必须为开启状态
[root@4f3e6ae802c1 /]# exit #退出容器,也可以用ctrl+d
##导出容器
[root@docker ~]# docker export 720bc6dc8403 > centos7_01
[root@docker ~]# ls
anaconda-ks.cfg centos7_01 hello-world initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@docker ~]# docker import centos7_01 centos:7 ##导入容器生成镜像,先删除原有镜像
sha256:b8fd67de266efab02246838b6fa0579f9d7371a0a22b757a242de1dd9e276c03
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 b8fd67de266e 8 seconds ago 204MB
nginx latest 822b7ec2aaf2 3 hours ago 133MB
hello-world latest d1165f221234 6 months ago 13.3kB
网络管理
[root@docker ~]# docker network ls ##查看网络列表
NETWORK ID NAME DRIVER SCOPE
27c66017f197 bridge bridge local
81e631b13efa host host local
f330b96785dc none null local
##自定义网络
[root@docker ~]# docker network create --subnet=172.18.0.0/16 mynetwork #未指定网络模式,默认为bridge
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
27c66017f197 bridge bridge local
81e631b13efa host host local
da866d133585 mynetwork bridge local
f330b96785dc none null local
[root@docker ~]# docker run -itd --name test2 --net mynetwork --ip 172.18.0.100 centos:7 /bin/bash
fdd8a497d4daa9f89976da05ed4f25dbb89fe15347930738dcc5bbe803083cb1
##添加nginx服务,设置nat端口映射
[root@docker ~]# docker run -itd --name nginx_01 --network mynetwork --ip 172.18.0.10 nginx:latest /bin/bash
66b34e794169a7817057b10afce835103136c600220d5e9075a9605664b3de87
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
66b34e794169 nginx:latest "/docker-entrypoint.…" 12 seconds ago Up 11 seconds 80/tcp nginx_01
fdd8a497d4da centos:7 "/bin/bash" 25 minutes ago Up 25 minutes test2
[root@docker ~]# docker run -itd -p 333:80 nginx /bin/bash ##指定端口映射固定IP地址
068caa856ec34884b9962b6cc6e8a171f3658dce22184adf0db49bf403ec3caa
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
068caa856ec3 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:333->80/tcp, :::333->80/tcp awesome_curie
66b34e794169 nginx:latest "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 80/tcp nginx_01
fdd8a497d4da centos:7 "/bin/bash" 30 minutes ago Up 30 minutes test2
[root@docker ~]# docker exec 068caa856ec3 nginx #运行服务
在浏览器查看
[root@docker ~]# docker run -itd -P nginx /bin/bash ##用大写P表示随机给予端口映射
ea84118985ca363917b41da6829d263ae344a8b283f79c476b6271ce7ea3155b
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea84118985ca nginx "/docker-entrypoint.…" 49 seconds ago Up 48 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp nice_meitner
068caa856ec3 nginx "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 0.0.0.0:333->80/tcp, :::333->80/tcp awesome_curie
66b34e794169 nginx:latest "/docker-entrypoint.…" 9 minutes ago Up 9 minutes 80/tcp nginx_01
fdd8a497d4da centos:7 "/bin/bash" 35 minutes ago Up 35 minutes
[root@docker ~]# docker exec ea84118985ca nginx
##指定容器为特权容器
[root@docker ~]# docker run -itd --name centos-systemd --privileged=true centos:7 /sbin/init
55a1a7c675bcc22c5f33b48cba54779482d0106c0183fc19a7417e229644d66c
[root@docker ~]# docker exec -it fdd8a497d4da /bin/bash
[root@55a1a7c675bc /]# yum install -y httpd
[root@55a1a7c675bc /]# systemctl start httpd
[root@55a1a7c675bc /]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Sat 2021-09-04 11:32:36 UTC; 20s ago
…………………………
Docker数据卷
- 数据卷:实现宿主机与容器之间的数据共享
- 数据卷容器:实现容器与容器之间的数据共享
##宿主机米兰/var/www挂载容器中的/data1,/var/html挂载/data2
[root@docker ~]# docker run -v /var/www:/data1 -v /var/html:/data2 --name centos_v1 -it centos:7 /bin/bash
[root@8d19fd5f44a2 /]# ls ##查看自动创建的data1和data2
anaconda-post.log bin data1 data2 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
##分别在容器两个目录下创建文件
[root@8d19fd5f44a2 /]# cd data1/
[root@8d19fd5f44a2 data1]# touch txt.1
[root@8d19fd5f44a2 data1]# ls
txt.1
[root@8d19fd5f44a2 data1]# cd ../data2/
[root@8d19fd5f44a2 data2]# touch txt.2
[root@8d19fd5f44a2 data2]# ls
txt.2
##返回宿主机查看
[root@8d19fd5f44a2 data2]# exit
[root@docker ~]# cd /var/www/
[root@docker www]# ls
txt.1
[root@docker www]# cd /var/html/
[root@docker html]# ls
txt.2
##创建数据卷容器,指定卷来自centos_01
[root@docker html]# docker run -it --volumes-from centos_v1 --name db1 centos:7 /bin/bash
[root@aa687b5b14ba /]# cd data1/
[root@aa687b5b14ba data1]# ls
txt.1
##容器互联(先删除前面创建的所有容器)
[root@docker html]# docker run -itd --name centos_01 centos:7 /bin/bash
f7695de3066212eb55b275b23cd97ed0aa83e28016e3bb51f42e8cfc9783c5a7
[root@docker html]# docker run -itd --name centos_02 --link centos_01:centos_01 centos:7 /bin/bash
##--link设置centos_01和centos_02互联
b7b1a5c49eb00338c0d0a46b05837d0d2310f9a78b85c0df3ca1ce0c2e844bf6
[root@docker html]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b7b1a5c49eb0 centos:7 "/bin/bash" 2 minutes ago Up 2 minutes centos_02
f7695de30662 centos:7 "/bin/bash" 6 minutes ago Up 6 minutes centos_01
[root@docker html]# docker inspect --format='.NetworkSettings.IPAddress' b7b1a5c49eb0
##查看centos_02容器IP地址
172.17.0.3
[root@docker html]# docker exec -it f7695de30662 /bin/bash #进入centos_01容器
[root@f7695de30662 /]# yum install -y net-tools #下载ifconfig工具,也可以用ipconfig查看IP地址
[root@f7695de30662 /]# ping 172.17.0.3 #
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.111 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.056 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.057 ms
以上是关于Docker基础知识!的主要内容,如果未能解决你的问题,请参考以下文章