欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

docker简介和常用命令“易读”

程序员文章站 2024-03-11 19:34:43
...

Docker容器理论部分

一)什么是容器

容器技术的核心有一下几个内核技术组成
 - Cgroups(control Groups)-资源管理
     控制你能使用多少系统资源(内存、cpu之类的)

 - ELinux安全

 - Namesqaces-进程隔离:六大命名空间

1、 封装应用

1.把一个服务提前配置好封装成一个容器,需要使用的时候直接倒出来就可以直接使用
2.比如一个Nginx刚刚下载时需要源码 编译 安装挺麻烦的,可以把他制作成rpm包,直接yum安装就可以使用了
3.容器和rpm包有点类似:  rpm是管理文件  、  容器是封装应用的

2、Docker 核心技术与实现原理

  • Docker有三大核心组件、六大命名空间

1)三大核心组件

1镜像
  ( 1)镜像是什么:  镜像是容器中最底层数据的块结构 
  ( 2)镜像采用的分层设计,快照,cow技术确保底层数据只读不丢失
  ( 3)镜像是一个只读的静态模板,保存了容器需要的环境和应用的执行代码。镜像采用分层机制,每个镜像都是只读的,但可以将写数据的层通过联合文件系统附加到原有的镜像上。这样镜像就很易于存储、传输和更新。
  ( 4)查看镜像: [[email protected]]# docker  images
  ( 5)Docker hub镜像创库: https://hub.docker.com


2、容器
  ( 1)容器是启动以后运行的实列,没有启动的时候是一个镜像
  ( 2)容器是基于镜像启动的
  ( 3)容器是一个运行时环境,是镜像的运行状态,是镜像执行的动态表现。容器提供了应用的统一的运行方式:创建、开始、停止、重启、销毁。


 3、镜像仓库
  Docker采用注册服务器来存储和共享用户的镜像,库是某个特定用户存储镜像的目录。通常一个用户可以建立多个库来保存自己的镜像。库是注册服务器的一部分,注册服务器分公有的和私有的,公有的如Docker官方提供的Docker Hub。

2)六大命名空间

  • 六大命名空间的作用
1.如果我们在服务器上启动了多个服务,这些服务其实会相互影响的,每一个服务都能看到其他服务的进程,也可以访问宿主机器上的任意文件

2.一旦服务器上的某一个服务被入侵,那么入侵者就能够访问当前机器上的所有服务和文件,这也是我们不想看到的,而 Docker 其实就通过 Linux 的 Namespaces 对不同的容器实现了隔离,独立。
  • 六大命名空间的功能
1.uts 命名空间
    命名空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 主机上的一个进程。

2.mnt (Mount文件系统)命名空间
    在这个文件系统所做的所有操作都不会影响到其他
类似 chroot,将一个进程放到一个特定的目录执行。  mnt 命名空间允许不同命名空间的进程看到的文件结构不同,这样每个命名空间 中的进程所看到的文件目录就被隔离开了
同 chroot 不同,每个命名空间中的容器在 /proc/mounts 的信息只包含所在命名空间的 mount point。

3.pid 命名空间
     隔离出独立的进程空间

4.net 命名空间
   ( 1)有了 pid 命名空间, 每个命名空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。
   ( 2)网络隔离是通过 net 命名空间实现的, 每个 net 命名空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。
   ( 3)Docker 默认采用 veth(虚拟接口) 的方式,将容器中的虚拟网卡同 host 上的一 个Docker 网桥 docker0 连接在一起。


5.ipc 命名空间(信号量、消息队列和共享内存)
进程间的通信:interprocess communication - IPC)比如信号 kill 给进程发信号

6.user 命名空间
每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程

二、Docker持久化存储

  • Docker容器其实就是一个进程,那么这个进程的数据到底存储在哪里了呢 :存储卷

  • 卷的概念

卷的概念
  - Docker容器本身不保存任何数据,容器关闭数据就消失了
  - 重要数据请使用外部卷存储(数据持久化)#存储卷就是个文件夹
  - 容器可以挂载真实机目录或共享存储为卷
  • Docker容器和真实机器的一个目录绑定实现共享存储
主机卷的映射
  -将真实机目录挂载到容器中提供持久化存储
  - 目录不存在就自动创建
  - 目录存在就直接覆盖掉
  
  - 将真实机的一个文件夹挂载到容器中使用的是'-v'这个参数
[[email protected] ~]# docker  run  -v  /真实机器的文件夹目录:/容器里面的目录  -it  
[[email protected] ~]# docker  run  -v  /date:/data  -it  docker.io/centos
  • 多台机器不同容器共享数据(NFS)
共享存储基本概念
   - 一台共享存储服务器可以提供给所有Docker主机使用 
   - 共享存储服务器(NAS、SAN、DAS等)
     - 如:
       - 使用NFS创建共享存储服务器
       - 客户端挂载NFS共享、并最终映射到容器中

备注:用的不多,一般情况用默认的就行

三、Docker网络拓扑

简单的网络拓扑
 - 最基础的Docker网络拓扑
 - 多个容器连接在一个docker虚拟交换机上
 - 一个网络指的就是一个虚拟交换机

1、查看Docker默认网络模型

 - 一般情况下使用桥接的比较多
 - 桥不需要我们管理,Docker自己管理
 - 查看Docker默认网络使用的命令
[[email protected] ~]# docker network 

2、使用Docker创建网桥

  • 要求:
  • 容器1 与 容器2 能够互通
  • 容器3 与 容器4 能够互通
  • 容器(12) 与 容器(34) 不能互通
1、创建docker1虚拟交换机
[[email protected] ~]# docker network create --subnet=10.10.10.0/24 docker1  #//--subnet指定使用的网段

2、查看
[[email protected] ~]# docker network ls

3、创建容器,使用'docker1'虚拟交换机
[[email protected] ~]# docker run -itd --network=docker1 myos1:latest

容器1/2使用默认虚拟交换机
容器3/4开启使用'docker1'虚拟交换机

理论总结

Docker就是封装应用
相关理论问题
  1.容器和虚拟机不同,虚拟机是完全隔离的,如果在虚拟机里面启动的所有服务应用都和真实机器基本没有关系  而Docker容器可以看作是一个封装的应用

  2.为了方便快捷,将需要的服务,应用封装成一个应用(Docker镜像)当需要用到这个应用时,直接把这个应用(Docker容器)的端口和‘真机(宿主机)’绑定

  3.默认容器可以访问外网, 但是外部网络(其他主机)不可以访问容器内的资源,服务,应用

   4.容器的特征是可以把宿主机变成对应的服务(将真机的端口和容器的端口绑定)使用的参数是  -p 宿主机端口:容器
      列如:把docker1服务器 变成httpd
   docker  run -itd -p 80:80 docker。Io/myos:httpd(以封装好的容器)

       列如:把docker1服务器 变成Nginx
docker  run -itd -p 80:80 docker。Io/nginx:latest(以封装好的容器)


   5.将生产环境中的各种各样的应用(比如web的应用,NOSQL)封装成镜像
再将镜像创建成容器(应用)时加 -p 就相当于这个容器(应用)直接融入这个服务器中直接使用就可以了,后台只是多了些进程

   6.假设,领导今天说了你需要部署10台的web集群,你只需要: 
将封装好的镜像:创建成容器的同时加-p 绑定 真是服务器的端口和容器的端口就行了

   7.所以Docker是弹性云
可以很快扩展出来,可以很快就关掉,可以把宿主机变成你需要各种各样的东西,只要你制作了这个镜像,那就想要什么run什么就完事了
所以大部分时间就可以把需要的各种各样的服务封装成Docker镜像,只要有Docker镜像想要什么run什么简单快捷方便实用。

Docker基本命令

  • Docker官方提供公共镜像的仓库

  • Docker hub镜像创库: https://hub.docker.com # Docker官方提供公共镜像的仓库(Registry)

  • 官网下载, 或者知道镜像名字 搜索镜像

  • 有OFFICIAL参数OK的 代表是官方的

  • STARS下载次数

- 在Docker中容器是基于镜像启动的
- 镜像是启动容器的核心
- 镜像采用分层设计
- 使用快照的COW技术,确保底层数据不丢失

镜像可以从官网下载,也可以自己做
1.官网下载
https://hub.docker.com   # Docker官方提供公共镜像的仓库(Registry)

2.命令行下载
[[email protected] ~]# docker search busybox       //搜索包含busybox的镜像

[[email protected] ~]# docker help pull        //查看pull帮助,或man帮助
[[email protected] ~]# docker pull docker.io/busybox   //下载镜像
[[email protected] ~]# docker images              //查看镜像
REPOSITORY[名称]      TAG[标签]       IMAGE ID[ID]     CREATED[时间]    SIZE[大小]
docker.io/busybox    latest         b534869c81f0     5 days ago      1.22 MB
# 名称+标签=唯一的列出子命令

一、镜像常用命令

1、 [[email protected] ~]# docker images    //查看镜像列表      #
2、 [[email protected] ~]# docker history   //查看镜像制作历史,了解镜像制作过去  #
3、 [[email protected] ~]# docker inspect   //查看镜像底层信息   #
4、 [[email protected] ~]# docker pull      //下载镜像
5、 [[email protected] ~]# docker push      //上传镜像
6、 [[email protected] ~]# docker rmi       //删除本地镜像       #
7、 [[email protected] ~]# docker save      //镜像另存为tar包    #
8、 [[email protected] ~]# docker load      //使用tar包导入镜像  #
9、 [[email protected] ~]# docker search    //搜索镜像
10、[[email protected] ~]# docker tag       //修改镜像名称和标签
1、下载镜像
[[email protected] ~]# docker pull docker.io/nginx

2、上传镜像
[[email protected] ~]# docker push docker.io/nginx

3、查看镜像
[[email protected] ~]# docker images
REPOSITORY           TAG             IMAGE ID           CREATED             SIZE
docker.io/nginx     latest         d8233ab899d4        10 days ago         1.199 MB
镜像名称               标签            ID                  创建时间             大小

4、查找busybox镜像
[[email protected] ~]# docker search docker.io/busybox

5、导出busybox镜像为busybox.tar  #导入导出也叫备份与恢复
[[email protected] ~]# docker save docker.io/nginx:latest -o nginx.tar
[[email protected] ~]# ls
busybox.tar  

6、导入镜像
[[email protected] ~]# scp nginx.tar [email protected]:/root
[[email protected] ~]# ls
nginx.tar  
[[email protected] ~]# docker load -i nginx.tar
3c816b4ead84: Loading layer 58.47 MB/58.47 MB
787822cf1b17: Loading layer 54.44 MB/54.44 MB
89decbdf7fb7: Loading layer 3.584 kB/3.584 kB
Loaded image: docker.io/nginx:latest/3.584 kB 
[[email protected] ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx     latest              42b4762643dc        4 weeks ago         109.2 M             e1ddd7948a1c        4 weeks ago      1.163 MB

7、删除镜像
[[email protected] docker]# docker rmi  docker.io/nginx

8、一次性导入多个镜像
[[email protected] docker]# for i in * ; do docker load -i $i; done

二、容器常用命令

1、[[email protected] ~]# docker run      //运行容器
2、[[email protected] ~]# docker ps       //查看容器列表 参数 -a 、 -aq
3、[[email protected] ~]# docker stop     //关闭容器
4、[[email protected] ~]# docker restart  //重启容器
5、[[email protected] ~]# docker attach   //进入容器、exit会导致容器关闭
6、[[email protected] ~]# docker exec     //进入容器、退出时不会导致容器关闭
7、[[email protected] ~]# docker inspect  //查看容器底层信息
8、[[email protected] ~]# docker top      //查看容器进程列表
9、[[email protected] ~]# docker rm       //删除容器

1、启动镜像

启动centos镜像生成一个容器

[[email protected] ~]# docker run -itd -p docker.io/centos /bin/bash
[[email protected] /]# ls /
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[[email protected] /]# cd /etc/yum.repos.d/
[[email protected] yum.repos.d]# ls
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Sources.repo  CentOS-fasttrack.repo
CentOS-CR.repo    CentOS-Media.repo      CentOS-Vault.repo
[[email protected] yum.repos.d]# rm -rf C*
[[email protected] yum.repos.d]# ls
[[email protected] yum.repos.d]#vi dvd.repo    //在容器里面配置一个yum源
[local]
name=local
baseurl=ftp://192.168.1.254/system
enable=1
gpgcheck=0
[[email protected] yum.repos.d]# yum -y install net-tools  //安装软件
[[email protected] yum.repos.d]# exit
exit


docker run 的参数有
-i :表示交互式
-t :表示终端
-d :将它作为一个守护进程放入后台运行
-v :将真机的目录和容器的目录绑定,实现数据持久化 
-p :宿主机端口:容器  将真机的端口和容器的端口绑定

2、镜像与容器常用指令

1、查看后台运行的容器
[[email protected] ~]# docker run -itd -p docker.io/nginx  //启动nginx的镜像
[[email protected] ~]# docker ps    //查看后台运行的容器
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
81458156f6e8        docker.io/nginx               "nginx -g 'daemon off"   9 seconds ago       Up 8 seconds        80/tcp              pedantic_goldberg

只显示容器ID
[[email protected] ~]# docker ps -q
81458156f6e8

显示所有的容器,包括没有启动的
[[email protected] ~]# docker ps -a
 
显示所有的容器ID
[[email protected] ~]# docker ps -qa
81458156f6e8
3656f1978967

2、查看centos镜像历史(制作过程)
 [[email protected] ~]# docker history docker.io/centos
 
3、删除镜像,启动容器时删除镜像会失败,先关闭容器,再删除容器,再删除镜像
[[email protected] ~]# docker stop 81  #81的意思是ID只要不重复,只写前面两个id号是没有问题的
  81
[[email protected] ~]# docker rm 81
  81
[[email protected] ~]# docker rmi docker.io/nginx   //删除nginx镜像

4、关闭/启动/重启容器
[[email protected] ~]# docker stop 0f   //0f为容器ID
0f
[[email protected] ~]# docker start 0f
0f
[[email protected] ~]# docker restart 0f
0f

5、连接容器
[[email protected] ~]# docker attach  [ID] #退出时会关闭容器
[[email protected] ~]# docker exec -it [ID] #退出时不会关闭容器



6、查看容器进程列表 
[[email protected] ~]# docker top


7、快捷删除容器
默认只删除没有在运行的容器
[[email protected] ~]# docker  rm  $(docker  stop  4848cdf82d53) #前一个命令执行的结果最为后一个命令的参数
[[email protected] ~]# docker  rm $(docker ps -aq) #ps -aq列出所有容器的ID 然后删除所有

自定义镜像

一、 docker commit

  • 使用镜像启动容器(等于创建一个前段盘)

  • 镜像:一个后端盘,然后创建前端盘,在前端盘里做配置,然后把这个整体打一个tar包,这就是一个新的镜像(自定义镜像)

  • .制作完成后也可以删除之前容器

  • .查看底层信息 docker history myos:latest

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j7WxUCMP-1583213964295)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200301124908973.png)]

docker commit:
[[email protected] ~]# docker run -it docker.io/centos:latest /bin/bash
[[email protected] /]# rm -rf /etc/yum.repos.d/*.repo  
[[email protected] /]# cat > /etc/yum.repos.d/local.repo <<EOF
> [local_repo]
> name=CentOS-$releasever - Base
> baseurl="ftp://192.168.1.254/centos-1804"
> enabled=1
> gpgcheck=0
> EOF
[[email protected] /]# yum repolist
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
local_repo                                               | 3.6 kB     00:00     
(1/2): local_repo/group_gz                                 | 166 kB   00:00     
(2/2): local_repo/primary_db                               | 5.9 MB   00:00     
repo id                            repo name                              status
local_repo                         CentOS- - Base                         9911
repolist: 9911
[[email protected] /]# yum -y install bash-com*   //在容器中下载几个常用软件包
[[email protected] /]# yum -y install net-tools
[[email protected] /]# yum -y install vim
[[email protected] /]# yum -y install psmisc
[[email protected] /]# yum -y install iproute 

[[email protected] ~]# docker ps -a           //查看容器名称对应的容器ID
CONTAINER ID   IMAGE    COMMAND   CREATED   STATUS   PORTS      NAMES
4fc74c6a9d1f  docker.io/centos:latest   "/bin/bash"   15 minutes ago  Exited (0) 5 minutes ago   romantic_lalande
[[email protected] ~]# docker commit 4fc74c6a9d1f  myos:latest  
//通过上一条命令的结果查看到容器ID,另生成一个经过修改的镜像


[[email protected] ~]# docker run -it myos:latest    //运行新生成的镜像
[[email protected] /]# ifconfig            //可以看到命令,不用再安装
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 0.0.0.0
 ..... ......
[[email protected] /]# exit
[[email protected] ~]# docker history myos:latest      
//查看容器历史创建,基于76d6bc25b8a5创建了一个855934bb3026的镜像
IMAGE  CREATED   CREATED BY    SIZE    COMMENT
855934bb3026   6 minutes ago       /bin/bash      171.9 MB            
76d6bc25b8a5  14 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]     0 B       
<missing>     14 months ago   /bin/sh -c #(nop)  LABEL org.label-schema.sch   0 B       
<missing>     14 months ago  /bin/sh -c #(nop) ADD file:8f4b3be0c1427b158f   199.7 MB

二、Dockerfile

Dockerfile: 可以理解为编排镜像的脚本语言

1.FROM :基础镜像 ,相当于我们的后端盘  
2.MAINTAINER:镜像创建者信息 
3.ENV:设置变量,运行环境 
4.RUN:制作镜像时执行的命令 #在容器内执行的命令 
5.ADD: 复制文件到镜像 有自动解包的功能 当前路径 #容器内路径 (当前路径:只能在Dockerfile下-->相 对路径) 
6.EXPOSE:开放端口 #标识监听的端口号 
7.WORKDIR:定义容器默认工作目录,永久改变默认工作目录(每次进入容器,都会到指定工作目录) (当前路径:只能 在Dockerfile下-->相对路径) 
8.CMD格式不支持空格,可以用,隔开 ps:CMD ["/bin/ls", "-al"] .CMD ["/usr/bin/python"] //修 改默认启动命令,做服务镜像用(比如nginx) 

制作一个centos镜像

[[email protected] ~]# mkdir abc
[[email protected] ~]# cd abc/
[[email protected] abc]# vim Dockerfile
FROM docker.io/centos:latest           #创建第一个后端盘
RUN  rm -rf /etc/yum.repos.d/*.repo    #在容器内执行的命令 
ADD  local.repo  /etc/yum.repos.d/local.repo  #复制文件到镜像
RUN  yum -y install bash-completion  net-tools  vim  psmisc  iproute
[[email protected] abc]# cp /etc/yum.repos.d/local.repo ./    将本地的yum源拷贝到当前目录
[[email protected] abc]# ls
Dockerfile  local.repo

-t名称标签
[[email protected] abc]# docker build -t centos:latest  .   //要加一个点.是Dockerfile所在目录
[[email protected] abc]# docker run -itd centos:latest


# ADD是复制本地文件到容器里但这个文件只支持在当前路径下

制作一个ssh镜像

ssh服务封装:如果Dockerfile文件不会写可以自己手动做一遍再将命令复制到Dockerfile里,再修改一下

1、进入myos:latest容器
[[email protected] ~]# docker start ae024160d57d    
[[email protected] ~]# docker attach ae024160d57d

2、搜索ssh软件包
[[email protected] /]# yum search  ssh     
[[email protected] /]# yum -y install openssh-server


3、起服务
 systemctl start sshd    # 这个命令是告诉systemd帮我起这个服务,pstree可以看到sshd这个服务是由systemd启动的子进程,但在容器里他的上帝进程不是systemd 调用不了systemctl这个命令,所以在容器里需要自己启动服务 
  #systemd起ssh服务也是靠sshd.service起的服务
[[email protected] /]# rpm -ql  openssh-server | grep sshd   # 可以查看ssh服务安装后生成的文件
.....
/usr/lib/systemd/system/sshd.service   # 这个文件里可以看见ssh的变量及启动服务路径
.....
[[email protected] /]# SSH_USE_STRONG_RNG=0
[[email protected] /]# /usr/sbin/sshd", "-D" #报错没有公私钥
[[email protected] /]# sshd-******   //生成公钥,但会报错,说没有这个文件[软件包装少了]
/usr/sbin/sshd-******: line 10: /etc/rc.d/init.d/functions: No such file or directory
[[email protected] /]# yum  provides  /etc/rc.d/init.d/functions  
//查看这个文件由那个软件包生成
initscripts-9.49.41-1.el7.x86_64 : The inittab file and the /etc/init.d scripts

[[email protected] /]# yum -y install initscripts

以上是创建ssh服务的过程
----------------------------------------------------------------------
可以选择将历史命令放入Dockerfile文件里
[[email protected] ~]# mkdir xx
[[email protected] ~]# cd xx/
[[email protected] xx]# vim Dockerfile
FROM myos:latest
RUN  yum -y install openssh-server initscripts
RUN  echo "a" | passwd --stdin root && sshd-******
ENV  SSH_USE_STRONG_RNG=0
EXPOSE 22
CMD  ["/usr/sbin/sshd", "-D"]

[[email protected] xx]# docker build -t myos:sshd .

制作一个Nginx镜像

docker run -it docker.io/centos:latest

在镜像中安装nginx,做好想要的配置(Dockerfile)
mkdir  /mynginx
cd  /mynginx
cp  /etc/yum.repos.d/local.repo  .
cp /root/nginx-1.10.tar.gz   .

vim Dockerfile
FROM docker.io/centos:latest
EXPOSE 80
EXPOSE 443
COPY  loacl.repo  /etc/yum.repos.d/local.repo
COPY  nginx-1.10.tar.gz  /usr/local/
RUN   yum -y install gcc make pcre zlib zlib-devel openssl-devel 
RUN   tar -xf /usr/local/nginx-1.10.tar.gz  
RUN   rm -rf  /usr/local/nginx-1.10.tar.gz

WORKDIR /usr/src/nginx-1.10

RUN  /usr/src/nginx-1.10/configure  \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_realip_module \
--with-pcre \
--with-http_ssl_module \
--with-stream
RUN make && make install
COPY ./nginx.conf /usr/local/nginx/conf/

WORKDIR /usr/local/nginx
RUN rm -rf /usr/src/nginx-1.10

CMD ["/usr/local/nginx/sbin/nginx"]



docker build  -t  nginx:latest