千家信息网

docker的原理和基础操作

发表于:2024-10-01 作者:千家信息网编辑
千家信息网最后更新 2024年10月01日,Docker 概念Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互
千家信息网最后更新 2024年10月01日docker的原理和基础操作

Docker 概念

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。'

一个完整的Docker有以下几个部分组成:

  1. dockerClient客户端

  2. Docker Daemon守护进程

  3. Docker Image镜像

  4. DockerContainer容器

Docker 与虚拟机的区别:

!!!相同点:①可在不同的主机之间迁移;②都具备 root 权限;③都可以远程控制;④都有备份、回滚操作。
!!!不同点:**1、操作系统上:**docker:在性能上有优势,可以轻易的运行多个操作系统;虚拟机:可以安装任何系统,但是性能不及容器。**2、原理:**docker:和宿主机共享内核,所有容器运行在容器引擎之上,容器并非一个完整的操作系统,所有容器共享操作系统,在进程级进行隔离。虚拟机:每一个虚拟机都建立在虚拟的硬件之上,提供指令级的虚拟,具备一个完整的操作系统。**3、优点:**docker:高效、集中。一个硬件节点可以运行数以百计的的容器,非常节省资源,QoS 会尽量满足,但不保证一定满足。内核由提供者升级,服务由服务提供者管理。虚拟机:对操作系统具有绝对权限,对系统版本和系统升级具有完全的管理权限。具有一整套的的资源:CPU、RAM 和磁盘。QoS 是有保证的,每一个虚拟机就像一个真实的物理机一样,可以实现不同的操作系统运行在同一物理节点上。**4、缺点:**docker:对内核没有控制权限,只有容器的提供者具备升级权限。只有一个内核运行在物理节点上,几乎不能实现不同的操作系统混合。容器提供者一般仅提供少数的几个操作系统。虚拟机:每一台虚拟机都具有更大的负载,耗费更多的资源,用户需要全权维护和管理。一台物理机上能够运行的虚拟机非常有限。(3)Docker的使用场景:1、打包应用程序简化部署;2、可脱离底层硬件任意迁移;例:服务器从腾讯云迁移到阿里云。(4)Docker 核心概念:镜像容器仓库

-------------------------------------------------------------部署19版docker--------------------------------------------------------

 #安装软件包,存储映射等依赖包yum install yum-utils device-mapper-persistent-data lvm2 -y#设置阿里云镜像源yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安装docker-ce引擎yum install -y docker-ce#关闭防火墙,开启docker[root@localhost ~]# systemctl stop firewalld.service[root@localhost ~]# setenforce 0[root@localhost ~]# systemctl start docker#公有仓库搜索nginx镜像[root@localhost ~]# docker search nginxNAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATEDnginx                             Official build of Nginx.                        12370    #下载次数           [OK]                jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con…   1703                                    [OK]#镜像加速#tee标准输入到daemon.json中,指向阿里云的镜像加速地址tee /etc/docker/daemon.json <<-'EOF'{  "registry-mirrors": ["https://8ulga20n.mirror.aliyuncs.com"]}EOF#重新加载系统守护进程,重启docker[root@localhost ~]# cd /etc/docker/[root@localhost docker]# lsdaemon.json  key.json[root@localhost docker]# cat daemon.json {  "registry-mirrors": ["https://8ulga20n.mirror.aliyuncs.com"]}[root@localhost docker]# systemctl daemon-reload [root@localhost docker]# systemctl restart docker#下载nginx镜像[root@localhost docker]# docker pull nginx#查看docker镜像列表[root@localhost docker]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEnginx #名称           latest #标识          231d40e811cd        4 weeks ago         126MB#查看docker,通过id查看详细信息[root@localhost docker]# docker inspect 231d40e811cd[    {        "Id": "sha256:231d40e811cd970168fb0c4770f2161aa30b9ba6fe8e68527504df69643aa145",        "RepoTags": [#修改镜像标签[root@localhost docker]# docker tag nginx:latest nginx:web[root@localhost docker]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEnginx               latest              231d40e811cd        4 weeks ago         126MBnginx               web                 231d40e811cd        4 weeks ago         126MB#删除某个镜像[root@localhost docker]# docker rmi nginx:web Untagged: nginx:web[root@localhost docker]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEnginx               latest              231d40e811cd        4 weeks ago         126MB#导出镜像[root@localhost docker]# cd /opt/[root@localhost opt]# docker save -o nginx nginx:latest [root@localhost opt]# lscontainerd  mysql-5.7.20  nginx  rh  school.json  top10.json#迁移镜像方便第二台docke节点也可用#第二台docker同样的操作1[root@localhost opt]# scp /opt/nginx root@192.168.136.167:/opt/#导入镜像[root@localhost opt]# docker load < nginx831c5620387f: Loading layer  72.48MB/72.48MB5fb987d2e54d: Loading layer  57.67MB/57.67MB4fc1aa8003a3: Loading layer  3.584kB/3.584kBLoaded image: nginx:latest[root@localhost opt]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEnginx               latest              231d40e811cd        4 weeks ago         126MB

容器管理

#创建容器[root@localhost opt]# docker create -it nginx:latest /bin/bashf6be6d4fd3ba040770da758b94b559a5de7d5cd53c661ced6c2a5f27bab3a3cd#查看容器[root@localhost opt]# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMESf6be6d4fd3ba        nginx:latest        "/bin/bash"         18 seconds ago      Created       #创建的状态                          zen_kapitsa#开启容器[root@localhost opt]# docker start f6be6d4fd3ba[root@localhost opt]# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMESf6be6d4fd3ba        nginx:latest        "/bin/bash"         About a minute ago   Up 8 seconds  #开启状态      80/tcp              zen_kapitsa#docker run 相当于加载了这个镜像(如果没有这个镜像就会去下载),还开启docker,还创建了容器docker run paigeeworld/centos7 /usr/bin/bash -c ls /[root@localhost opt]# docker ps -aCONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                      PORTS               NAMES9cd607702893        paigeeworld/centos7   "/usr/bin/bash -c ls…"   18 seconds ago      Exited (0) 16 seconds ago                       confident_newtonf6be6d4fd3ba        nginx:latest          "/bin/bash"              9 minutes ago       Up 8 minutes                80/tcp              zen_kapitsa#容器进入[root@localhost opt]# docker exec it 9cd607702893 /bin/bash#持续在后台执行[root@localhost opt]# docker run -d paigeeworld/centos7 /bin/bash -c "while true;do echo hello;done"ebe894f3fdf8f64d9e1daf24ef957b2f027ca805f8acd9262e1c3572ff3ab08d[root@localhost opt]# docker ps -aCONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                     PORTS               NAMESebe894f3fdf8        paigeeworld/centos7   "/bin/bash -c 'while…"   5 seconds ago       Up 3 seconds                                   ecstatic_swanson9cd607702893        paigeeworld/centos7   "/usr/bin/bash -c ls…"   8 minutes ago       Exited (0) 3 minutes ago                       confident_newtonf6be6d4fd3ba        nginx:latest          "/bin/bash"              18 minutes ago    #容器导出[root@localhost opt]# docker export ebe894f3fdf8 > nginx_c[root@localhost opt]# lscontainerd  mysql-5.7.20  nginx  nginx_c  rh  school.json  top10.json#容器导入,迁移[root@localhost opt]# scp /opt/nginx_c root@192.168.136.167:/opt/[root@localhost opt]# cat nginx_c | docker import - nginx:websha256:3461d80047f4f5465d8842f52094ee171fb9a259f606862fab607b9f024db2c6[root@localhost opt]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEnginx               web                 3461d80047f4        4 seconds ago       355MB#删除容器[root@localhost opt]# docker rmi 231d40e811cd Untagged: nginx:latestDeleted: sha256:231d40e811cd970168fb0c4770f2161aa30b9ba6fe8e68527504df69643aa145Deleted: sha256:dc8adf8fa0fc82a56c32efac9d0da5f84153888317c88ab55123d9e71777bc62Deleted: sha256:77fcff986d3b13762e4777046b9210a109fda20cb261bd3bbe5d7161d4e73c8eDeleted: sha256:831c5620387fb9efec59fc82a42b948546c6be601e3ab34a87108ecf852aa15f[root@localhost opt]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE#批量删除容器,关闭的才能删除#通过awk输出删除第一个位置id[root@localhost opt]# docker ps -a | awk '{print "docker rm "$1}' | bash[root@localhost opt]# docker ps -aCONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS               NAMESebe894f3fdf8        paigeeworld/centos7   "/bin/bash -c 'while…"   15 minutes ago      Up 15 minutes                           ecstatic_swansonf6be6d4fd3ba        nginx:latest          "/bin/bash"              33 minutes ago      Up 31 minutes       80/tcp              zen_kapitsa

资源控制

#cpu使用率控制#设置容器占用cpu资源为20%[root@localhost docker]# docker run --cpu-quota 20000 nginx:latest#按比例,权重分配创建两个容器为c1和c2,若只有这两个容器,设置容器的权重,是的c1和c2的cpu资源占比为33.3%和66.7%docker run -itd --name c1 --cpu-shares 512 nginx:latestdocker run -itd --name c2 --cpu-shares 1024 nginx:latest[root@localhost docker]# docker ps -aCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMESd28b1d73b0ed        nginx:latest        "nginx -g 'daemon of…"   6 seconds ago       Up 5 seconds               80/tcp              c2de49e4d6b4f9        nginx:latest        "nginx -g 'daemon of…"   17 seconds ago      Up 16 seconds              80/tcp              c135cb117c9cc7        nginx:latest        "nginx -g 'daemon of…"   6 minutes ago       Exited (0) 5 minutes ago                       dazzling_goldberg2286b99c2c6d        nginx:latest        "/bin/bash"              7 minutes ago       Up 7 minutes               80/tcp              flamboyant_booth#限制容器使用指定的cpu,0,1核心数为2[root@localhost docker]# docker run --name c3 --cpuset-cpus 0,1 nginx:latest [root@localhost docker]# docker ps -aCONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS               NAMES83e56a65c604        nginx:latest        "nginx -g 'daemon of…"   About a minute ago   Exited (0) 52 seconds ago                       c3#对blkio某一块磁盘的读写的限制--device-read-bps   限制读某个设备的bps(数据量)--device-write-bps  限制写入某个设备的bps--device-read-iops  限制读某个设备的ipos(次数)--device-write-iops  限制写某个设备的ipos[root@localhost docker]# docker run -d --device-write-bps /dev/sda:30mb nginx:latest 1a386d9c306baa36c02edda2df793ff673b46f4ace4e5ee5f72177d8cd4a3d42[root@localhost docker]# docker ps -aCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES1a386d9c306b        nginx:latest        "nginx -g 'daemon of…"   4 seconds ago    

docker数据卷管理

数据管理操作
方便查看容器内产生的数据
多容器间实现数据共享
两种管理方式
数据卷 :宿主机和容器之间的数据共享
数据卷容器 :容器和容器之间的数据共享

[root@localhost ~]# docker pull centos#数据卷[root@localhost ~]# docker run -v /var/www:/data1 --name web1 -it centos /bin/bash#-v指定宿主机的目录,:连接容器中的目录,-it,标准型输出,登录终端[root@e95aad3dee7a /]# lsbin    dev  home  lib64       media  opt   root  sbin  sys  usrdata1  etc  lib   lost+found  mnt    proc  run   srv   tmp  var[root@e95aad3dee7a /]# cd data1/[root@e95aad3dee7a data1]# echo "123" > chen01.txt[root@e95aad3dee7a data1]# lschen01.txt[root@e95aad3dee7a data1]# exitexit[root@localhost ~]# cd /var/www/[root@localhost www]# lschen01.txt[root@localhost www]# cat chen01.txt 123#数据卷容器[root@localhost www]# docker run --name web100 -v /data1 -v /data2 -it centos /bin/bash[root@a0687fef8d8f /]# lsbin    data2  etc   lib    lost+found  mnt  proc  run   srv  tmp  vardata1  dev    home  lib64  media       opt  root  sbin  sys  usr[root@a0687fef8d8f /]# cd data1[root@a0687fef8d8f data1]# echo "111" > 111.txt[root@a0687fef8d8f data1]# cd ../data2/[root@a0687fef8d8f data2]# echo "222" > 222.txt[root@a0687fef8d8f data2]# exit#新容器挂载到我们刚才创建的web100容器,web100提供两个共享目录[root@localhost www]# docker run -it --volumes-from web100 -it centos /bin/bash[root@7a360567847b /]# lsbin    data2  etc   lib    lost+found  mnt  proc  run   srv  tmp  vardata1  dev    home  lib64  media       opt  root  sbin  sys  usr[root@7a360567847b /]# cd data1/[root@7a360567847b data1]# ls111.txt[root@7a360567847b data1]# cd ../data2/[root@7a360567847b data2]# ls222.txt
#端口映射,-P随机映射端口,-p指定自己设置的映射端口 docker run -d -P httpd:centosdocker run -d -p 23764:80 httpd:centos

容器互联(使用centos镜像)

#创建并运行容器取名为web1,端口号自动映射docker run -itd -P --name web1 centos /bin/bash #创建并运行容器取名web2docker run -itd -P --name web2 --link web1:web1 centos /bin/bash进web2容器ping web1[root@localhost ~]# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMESca605a29a8f5        centos              "/bin/bash"         15 seconds ago      Up 11 seconds                           web20e46fd7a0f96        centos              "/bin/bash"         42 seconds ago      Up 41 seconds                           web1[root@localhost ~]# docker exec it ca605a29a8f5 /bin/bashError: No such container: it[root@localhost ~]# docker exec -it ca605a29a8f5 /bin/bash[root@ca605a29a8f5 /]# ping web1PING web1 (172.17.0.2) 56(84) bytes of data.64 bytes from web1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.087 ms64 bytes from web1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.120 ms64 bytes from web1 (172.17.0.2): icmp_seq=3 ttl=64 time=0.046 ms64 bytes from web1 (172.17.0.2): icmp_seq=4 ttl=64 time=0.060 ms64 bytes from web1 (172.17.0.2): icmp_seq=5 ttl=64 time=0.051 ms
0