Docker基础知识!

Posted handsomeboy-东

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker基础知识!相关的知识,希望对你有一定的参考价值。

docker

Docker概述

Docker是Linux中运行应用的开源工具,是一种轻量级的虚拟机,它诞生于2013年,最初发起者是dotCloud公司,它的设计宗旨是:“Build,Ship and Run Any App,Anywhere”,即通过对应用最简的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”

Docker与传统虚拟化的区别

特性Docker容器虚拟机
计算能力损耗几乎无损耗50%左右
性能接近原生弱于原生
系统支持单机量成百上千个几十个
隔离性资源限制(进程隔离)完全隔离
磁盘占用MBGB

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基础知识!的主要内容,如果未能解决你的问题,请参考以下文章

docker 应用-1(安装以及基础命令)

Docker背后的内核知识

过去分词做状语转

Docker 入门

Docker镜像之commit

Docker镜像的构成__docker commit