Docker(一)基础知识

一、什么是容器

容器技术已经成为应用程序封装和交付的核心技术

容器技术的核心有以下几个内核技术组成:

  - Cgroups( Control Groups ) - 资源管理,可以对单个程序限制使用几u几g的资源

  - NameSpace - 进程隔离(命名空间)

  - SELinux安全,基于文件的权限限制

由于是在物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速

Docker是完整的一套容器管理系统

Docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术

二、容器的优点

相比于传统的虚拟化技术,容器更加简洁高效

传统虚拟机需要给每个VM安装操作系统

容器不需要操作系统,使用宿主机的共享公共库和程序

#虚拟机vs容器:

三、容器的缺点

容器的隔离性没有虚拟化强

共用Linux内核,安全性有先天缺陷

SELinux难以驾驭

监控容器和容器排错是挑战

四、安装前准备

需要64位操作系统,32位不支持

至少RHEL7及以上的版本

关闭防火墙,和OpenStack一样,Docker会接管防火墙的工作

五、安装Docker

环境信息:

  • node1:192.168.0.30
  • docker1:192.168.0.31
  • docker2:192.168.0.32

1.VMware安装虚拟机使用CentOS7-1804.iso;docker软件包在RHEL7-extras.iso中

链接:https://pan.baidu.com/s/1yBrcvFCOL13xLvfBdi08qg?pwd=vr6i 
提取码:vr6i

#配置本地yum源

vim /etc/yum.repos.d/local.repo

[CentOS7-Base]
name=CentOS7-Base
baseurl=file:///iso/base
enabled=1
gpgcheck=0

[RHEL7-Extras]
name=RHEL7-Extras
baseurl=file:///iso/extras
enabled=1
gpgcheck=0

2.卸载防火墙

systemctl stop firewalld

systemctl disable firewalld

yum autoremove -y firewalld  #autoremove 可以将即使是不使用的依赖包也删除

rm -rf /etc/firewalld/

rm -rf /var/lib/firewalld/

rm -rf /var/log/firewalld/

检查是否卸载成功:

rpm -qa|grep -i firewalld 返回空

3.软件包安装

docker1、docker2上执行:

yum install -y docker

systemctl restart docker

systemctl enable docker

4.安装完成后会多一个网络配置docker0

[root@docker1 ~]# ifconfig

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:f4:de:54:dc  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.31  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::20c:29ff:fe2a:55a4  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:2a:55:a4  txqueuelen 1000  (Ethernet)
        RX packets 377  bytes 29160 (28.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 515  bytes 112413 (109.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 32  bytes 2592 (2.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 32  bytes 2592 (2.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

六、镜像管理

在Docker中容器是基于镜像启动的

镜像是启动容器的核心

镜像采用分层设计,类似于vmware的链接克隆,母盘不能改动,克隆出的虚拟机可以再次做链接克隆,只要保证上一个克隆机和母盘不改动即可

使用快照的COW技术,确保底层数据不丢失

#一般母盘会从官方镜像仓库下载镜像,Docker官方提供的公共镜像仓库:https://hub.docker.com

docker search busybox  #在镜像仓库查找镜像,OFFICIAL为[OK]的代表这个镜像是官方镜像

INDEX       NAME                                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/busybox                             Busybox base image.                             3013      [OK]       
docker.io   docker.io/radial/busyboxplus                  Full-chain, Internet enabled, busybox made...   54                   [OK]
docker.io   docker.io/yauritux/busybox-curl               Busybox with CURL                               23                   
docker.io   docker.io/arm32v7/busybox                     Busybox base image.                             10                   
docker.io   docker.io/arm64v8/busybox                     Busybox base image.                             4                    
docker.io   docker.io/odise/busybox-curl                                                                  4                    [OK]
docker.io   docker.io/i386/busybox                        Busybox base image.                             3                    
docker.io   docker.io/s390x/busybox                       Busybox base image.                             3                    
docker.io   docker.io/busybox42/zimbra-docker-centos      A Zimbra Docker image, based in ZCS 8.8.9 ...   2                    [OK]
docker.io   docker.io/joeshaw/busybox-nonroot             Busybox container with non-root user nobody     2                    
docker.io   docker.io/p7ppc64/busybox                     Busybox base image for ppc64.                   2                    
docker.io   docker.io/prom/busybox                        Prometheus Busybox Docker base images           2                    [OK]
docker.io   docker.io/amd64/busybox                       Busybox base image.                             1                    
docker.io   docker.io/busybox42/nginx_php-docker-centos   This is a nginx/php-fpm server running on ...   1                    [OK]
docker.io   docker.io/ppc64le/busybox                     Busybox base image.                             1                    
docker.io   docker.io/spotify/busybox                     Spotify fork of https://hub.docker.com/_/b...   1                    
docker.io   docker.io/vukomir/busybox                     busybox and curl                                1                    
docker.io   docker.io/antrea/busybox                                                                      0                    
docker.io   docker.io/arm32v5/busybox                     Busybox base image.                             0                    
docker.io   docker.io/busybox42/alpine-pod                                                                0                    
docker.io   docker.io/busybox42/php-fpm-ldap                                                              0                    
docker.io   docker.io/hugegraph/busybox                   test image                                      0                    
docker.io   docker.io/openebs/busybox-client                                                              0                    
docker.io   docker.io/privatebin/chown                     Docker image providing busybox' chown, st...   0                    
docker.io   docker.io/rancher/busybox                                                                     0                    

docker pull docker.io/busybox  #从镜像仓库下载镜像(从官方仓库下载镜像)

Using default tag: latest
Trying to pull repository docker.io/library/busybox ... 
latest: Pulling from docker.io/library/busybox
325d69979d33: Pull complete 
Digest: sha256:560af6915bfc8d7630e50e212e08242d37b63bd5c1ccf9bd4acccf116e262d5b

docker images  #查看镜像,REPOSITORY镜像名,TAG标签

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/busybox   latest              8135583d97fe        2 weeks ago         4.863 MB

[root@docker1 ~]# docker save docker.io/busybox:latest -o busybox.tar  #导出镜像,并将镜像复制到另外一台机器上

[root@docker1 ~]# ls

busybox.tar

[root@docker2 ~]# docker load -i busybox.tar  #导入镜像

9547b4c33213: Loading layer 5.092 MB/5.092 MB
Loaded image: docker.io/busybox:latest.092 MB

[root@docker2 ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/busybox   latest              8135583d97fe        2 weeks ago         4.863 MB

[root@docker1 ~]# docker run -it docker.io/centos:latest /bin/bash  #下载好centos镜像后,使用run生成一个容器。下次run还会生成一个新容器

[root@78a0b70d6cad /]# cat /etc/redhat-release  #已经进入容器了,查看容器系统版本

CentOS Linux release 8.4.2105

七、命名空间(进程隔离)

uts:主机名,和真机主机名无联系

net:网络,给容器一套单独的网络

pid:进程,容器内只有属于容器内的进程

user:用户,容器内只有属于容器内的用户

mount:容器内的根目录与宿主机不在一起

ipc:信号向量,容器内只能kill掉容器内的进程,无法kill宿主机进程;而宿主机可以kill掉容器内进程

#示例:

[root@docker1 ~]# docker run -it docker.io/centos:latest /bin/bash  #进入容器

[root@29049e15549e /]# sleep 56789  #执行一个进程

[root@docker1 /]# ps -ef|grep sleep  #重新打开一个宿主机bash,可以查看到容器内进程

root       2715   2683  0 04:50 pts/1    00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 56789
root       2741   2720  0 04:51 pts/2    00:00:00 grep --color=auto sleep

八、Docker命令

1.镜像常用命令

docker images  #查看镜像列表

docker history  #查看镜像制作历史

docker inspect  #查看镜像底层信息

docker pull        #下载镜像

docker push      #上传镜像

docker rmi         #删除本地镜像,命令为docker rmi 镜像名:标签,删除前确保已经没有使用此镜像创建的容器,有的话需要先删除容器

docker save       #镜像另存为tar包

docker load       #使用tar包导入镜像

docker search    #搜索镜像

docker tag         #修改镜像名称和标签,注意镜像名+标签必须唯一,如果不唯一修改会失败。命令docker tag 旧镜像名:旧标签 新镜像名:新标签,修改后相当于创建了一个软连接

#演示:
[root@docker1 ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/busybox   latest              8135583d97fe        2 weeks ago         4.863 MB

[root@docker1 ~]# docker tag docker.io/busybox:latest aa:bb

[root@docker1 ~]# docker images  #可以看到镜像ID一致

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
aa                  bb                  8135583d97fe        2 weeks ago         4.863 MB
docker.io/busybox   latest              8135583d97fe        2 weeks ago         4.863 MB

[root@docker1 ~]# docker rmi aa:bb

Untagged: aa:bb
Untagged: docker.io/busybox@sha256:560af6915bfc8d7630e50e212e08242d37b63bd5c1ccf9bd4acccf116e262d5b

[root@docker1 ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/busybox   latest              8135583d97fe        2 weeks ago         4.863 MB

2.容器常用命令

docker run  #运行容器,创建一个新的容器并把它运行起来,参数-i交互式的;-t终端;-d后台运行

docker ps  #查看容器列表,参数-a显示所有启动过的容器;-q仅显示容器ID

docker stop  #关闭容器

docker start  #启动容器

docker restart  #重启容器

docker attachlexec  #进入容器,使用attach进入容器退出后会停止容器,因此大多数情况使用的是docker exec -it 容器ID bash

docker inspect  #查看容器底层信息

docker top  #查看容器内进程列表,使用格式docker top 容器ID

docker rm  #删除容器,删除前需要停止容器

#演示1:

可以先docker run -itd创建并后台运行一个容器,然后使用docker exec -it访问容器;docker stop|start管理容器,这样这个容器就可以当成虚拟机使用了,重启之后的内容也不会丢失

[root@docker1 ~]# docker run -itd docker.io/centos:latest

15257daa0b4f5a61d005f26316d4dd128aeedb621d3d8c5daba203154e1a8a3a

[root@docker1 ~]# docker ps

CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS               NAMES
15257daa0b4f        docker.io/centos:latest   "/bin/bash"         10 seconds ago      Up 8 seconds                            fervent_babbage

[root@docker1 ~]# docker exec -it 15257daa0b4f bash

[root@15257daa0b4f /]# 

#演示2:

docker rm $(docker ps -aq) 删除所有已创建过的容器

29049e15549e
928a6443d41c
6b28b5de794b
78a0b70d6cad

 

posted @   vorn  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示