zoukankan      html  css  js  c++  java
  • Docker容器介绍与安装-Day 01

    1. 什么是容器?

    容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。
    隔离环境下运行的容器拥有自己的系统文件(好比/目录下面的文件),ip地址,主机名等(就好比虚拟化了一个新的操作系统)。如下图:
    

    2. Docker容器和KVM虚拟化的区别

    容器:共用宿主机内核,容器的第一个进程直接运行需要运行的服务,轻量级,损耗少,启动快,性能高,但是只能运行linux操作系统。
    
    虚拟机:需要硬件支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统。
    

    3. 容器技术的发展过程

    (1)chroot技术,新建一个子系统(拥有自己完整的系统文件)
    参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
    (2)linux容器(lxc)  linux container(namespaces 命名空间 隔离环境 及cgroups 资源限制)
    cgroups  限制一个进程能够使用的资源。cpu,内存,硬盘io
    kvm虚拟机:资源限制(1c 1G 20G)
    (3)docker容器
    

    4. Docker容器介绍

    Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。每一个容器,他都有自己的系统文件rootfs.
    由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
    namespace  资源隔离
    cgroups    进程的资源限制
    kvm       虚拟磁盘文件,资源隔离
    kvm       资源限制,--cpus --memory
    
    docker是一种软件的打包技术
    
    构建:做一个docker镜像
    运输:docker pull
    运行:启动一个容器
    
    kvm解决了硬件和操作系统之间的依赖
    kvm独立的虚拟磁盘,xml配置文件
    
    docker解决了软件和操作系统环境之间的依赖,能够让独立服务或应用程序在不同的环境中,得到相同的运行结果。
    docker镜像有自己的文件系统。
    
    docker容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。
    

    5. docker的安装

    5.1 配置要求

    操作系统 内存要求 IP地址 主机名
    CentOS7.6 2G 10.0.0.11 docker01
    CentOS7.6 2G 10.0.0.12 docker02

    5.2 安装步骤

    两台机器安装方式相同

    cat >> /etc/hosts << EOF
    10.0.0.11 docker01
    10.0.0.12 docker02
    EOF
    rm -fr /etc/yum.repos.d/local.repo
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
    sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
    yum install docker-ce -y
    systemctl enable docker
    systemctl start docker
    

    6. docker的主要组成部分

    docker是传统的CS架构,分为docker client和docker server,像mysql一样    
    docker主要组件有:镜像、容器、仓库, 网络,存储
    
    启动容器必须需要一个镜像,仓库中只存储镜像
    容器---镜像---仓库
    
    查看docker版本:docker version
    [root@controller ~]# docker version 
    Client:  # 客户端版本信息
     Version:	17.12.0-ce  # 客户端docker版本
     API version:	1.35        # api版本
     Go version:	go1.9.2     # go语言版本(docker是go语言开发的)
     Git commit:	c97c6d6     # git提交的id
     Built:	Wed Dec 27 20:10:14 2017  # 版本更新时间
     OS/Arch:	linux/amd64       # 
    
    Server:                     # docker服务端
     Engine:                    # docker引擎
      Version:	17.12.0-ce
      API version:	1.35 (minimum version 1.12)
      Go version:	go1.9.2
      Git commit:	c97c6d6
      Built:	Wed Dec 27 20:12:46 2017
      OS/Arch:	linux/amd64
      Experimental:	false
      
    查看docker详细信息docker info(可以用来做监控)
    [root@docker01 ~]# docker info
    Containers: 0         # 容器数量
     Running: 0           # 运行中的容器
     Paused: 0            # 暂停的容器
     Stopped: 0           # 停止的容器
    Images: 0             # 镜像数量
    Server Version: 18.09.8     # 版本
    Storage Driver: overlay2
     Backing Filesystem: xfs    # 文件系统
     Supports d_type: true
     Native Overlay Diff: true
    Logging Driver: json-file
    Cgroup Driver: cgroupfs
    Plugins:
     Volume: local
     Network: bridge host macvlan null overlay
     Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
    Swarm: inactive
    Runtimes: runc
    Default Runtime: runc
    Init Binary: docker-init
    containerd version: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
    runc version: 425e105d5a03fabd737a126ad93d62a9eeede87f
    init version: fec3683
    Security Options:
     seccomp
      Profile: default
    Kernel Version: 3.10.0-957.el7.x86_64
    Operating System: CentOS Linux 7 (Core)
    OSType: linux
    Architecture: x86_64
    CPUs: 4
    Total Memory: 1.934GiB
    Name: docker01
    ID: 2ZVM:MUC6:AIKD:S4LY:47LB:QY6Y:4MF3:4U6N:VDNG:LTFU:RGGI:VCXC
    Docker Root Dir: /var/lib/docker
    Debug Mode (client): false
    Debug Mode (server): false
    Registry: https://index.docker.io/v1/
    Labels:
    Experimental: false
    Insecure Registries:
     127.0.0.0/8
    Live Restore Enabled: false
    Product License: Community Engine
    
    WARNING: bridge-nf-call-iptables is disabled
    WARNING: bridge-nf-call-ip6tables is disabled
    

    6. 启动第一个容器

    # 配置docker镜像加速,国内源(镜像默认从国外下载)
    [root@docker01 ~]# vi /etc/docker/daemon.json  #该文件默认不存在,需要手动创建
    {
      "registry-mirrors": ["https://registry.docker-cn.com"]
    }
    	
    [root@docker01 ~]# systemctl restart docker
    
    [root@docker01 ~]# docker run -d -p 80:80 nginx  # 这里要注意,最后一列,一定是容器执行的命令(不需要执行命令的最后一列是镜像名称),倒数第二列一定是容器的镜像,注意启动容器时参数位置不能乱
    Unable to find image 'nginx:latest' locally
    latest: Pulling from library/nginx
    f5d23c7fed46: Pull complete 
    918b255d86e5: Pull complete 
    8c0120a6f561: Pull complete 
    Digest: sha256:eb3320e2f9ca409b7c0aa71aea3cf7ce7d018f03a372564dbdb023646958770b
    Status: Downloaded newer image for nginx:latest
    df186433980cb46d0e01c6a1fe8ca9cb147f43c5d4fe651fec6b9a7cd52c4938
    
    # run(创建并运行一个容器)
    # -d 放在后台
    # -p 端口映射
    # nginx docker镜像的名字
    
    访问10.0.0.11
    [root@docker01 ~]#  curl -I 10.0.0.11
    HTTP/1.1 200 OK
    Server: nginx/1.17.2
    Date: Sun, 28 Jul 2019 02:56:55 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Tue, 23 Jul 2019 11:45:37 GMT
    Connection: keep-alive
    ETag: "5d36f361-264"
    Accept-Ranges: bytes
    

    7. docker的镜像管理

    7.1 搜索镜像

    docker search 镜像名

    # 选镜像的建议:
    1,优先考虑官方(OFFICIAL)
    2,stars数量多的(STARS)
    3. 也可以通过浏览器到官方下载,hub.docker.com
    [root@docker01 ~]#  docker search CentOS-7
    NAME  # 镜像名称                            DESCRIPTION  # 描述                            STARS #点赞的次数     OFFICIAL # 官方的           AUTOMATED  # 通过工具,自动构建的镜像
    saltstack/centos-7-minimal                 Centos 7 Minimal                                11                                      [OK]
    maaydin/centos-7-zookeeper                 Apache Zookeeper Docker Image based on CentO…   1                                       
    smarshalansherman/centos-7-maven           centos-7-maven                                  1                                       [OK]
    pacur/centos-7                             Pacur CentOS 7                                  1                                       [OK]
    dokken/centos-7                            For use with kitchen-dokken, Base image plus…   0                                       
    fnbin/centos-7                                                                             0                                       
    fnbin/centos-7-zmq                                                                         0                                       
    pythonpillow/centos-7-amd64                                                                0                                       
    d33tah/centos-7-with-ssh-and-docker                                                        0                                       
    diodonfrost/centos-7-ansible               Provides docker containers use for testing a…   0                                       [OK]
    opencpu/centos-7                           OpenCPU Server 2.0 builds for CentOS 7          0                                       [OK]
    vadv/centos-7-pg96-python35                                                                0                                       
    fnbin/centos-7-czmq                                                                        0                                       
    ivancalifornias/centos-7-node-npm                                                          0                                       
    ezamriy/centos-7-vagrant-supervisor-ssh    CentOS 7 vagrant friendly container with sup…   0                                       [OK]
    jeqo/centos-7                                                                              0                                       
    rubydistros/centos-7                       Ruby on CentOS 7                                0                                       
    contrast/centos-7-golang                                                                   0                                       
    ivancalifornias/centos-7-robot-framework                                                   0                                       
    william9527/centos-7-dev                                                                   0                                       
    ivancalifornias/centos-7-golang            A container of my setup to build and package…   0                                       
    ceejatec/centos-70-couchbase-build                                                         0                                       
    jqka/centos-7.3.1611                       Centos-7.3.1611                                 0                                       [OK]
    dfvinogradoff/centos-7-build                                                               0                                       
    galateanl/centos-7-docker                  for deployment with centos 7, php 7.2, yarn …   0                                       [OK]
    

    docker官网搜索镜像
    搜索镜像
    镜像列表

    7.2 获取镜像

    docker pull 镜像名称  # 下载镜像
    docker push 镜像名称  # 上传镜像
    # 由于默认下载镜像特别慢,所以需要配置镜像加速,
    # 镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker 中国官方镜像加速:https://registry.docker-cn.com(推荐使用该地址,比较稳定,其他地址有时候更新后,可能无法使用)
    	
    # 官方pull	    docker pull centos:6.8(没有指定版本,默认会下载最新版)
    # 私有仓库pull	docker pull daocloud.io/huangzhichong/alpine-cn:latest 
    

    7.3 配置docker镜像加速

    vi /etc/docker/daemon.json  # 该文件默认不存在,需要手动创建
    {
      "registry-mirrors": ["https://registry.docker-cn.com"]
    }	
    

    7.4 查看镜像列表

    docker images 
    docker image  ls
    

    7.5 删除镜像

    docker rmi 镜像名或镜像ID:版本
    例子:
    docker rmi centos:latest
    docker image rm centos:latest
    # 注意:如果被删除的镜像正在被容器使用,是无法删除的。
    

    7.6 导出镜像

    docker save  镜像名:版本
    例子:
    docker save centos > docker-centos7.4.tar.gz
    docker image save -o /opt/docker.tar.gz 镜像:版本
    

    7.7 导入镜像

    docker load  镜像包
    例子:
    docker load -i docker-centos7.4.tar.gz
    docker image load -i docker-centos7.4.tar.gz
    

    8. docker的容器管理

    docker run -d -p 80:80 nginx:latest
    # 参数介绍:
    run(创建并运行一个容器)
    -d 放在后台
    -p 端口映射
    -v  源地址(宿主机):目标地址(容器) 
    nginx docker镜像的名字
    
    # 进入容器
    docker run -it --name centos6 centos:6.9 /bin/bash
    # 参数介绍:
    -it   分配交互式的终端,i交互式,t终端
    --name 指定容器的名字
    /bin/sh覆盖容器的初始命令
    

    8.1 创建并启动容器

    docker run image_name
    docker run -it image_name CMD  # 创建并运行容器后,再进入容器
    docker run --name 容器启动后的名称 -d 镜像名
    
    docker run ==== docker create  + docker start
    

    8.2 启动容器

    docker start 容器名
    

    8.3 停止容器

    docker stop CONTAINER_ID
    

    8.4 杀死容器

    docker kill container_name
    

    8.5 查看容器列表

    docker ps        # 查看正在运行的容器
    docker ps –a     # 查看所有容器,包括停止运行的
    docker ps -l     # 查看最近一个启动的容器
    docker ps --no-trunc  # 显示完整的容器信息
    
    # [root@docker01 ~]# docker ps
    CONTAINER ID (容器ID)       IMAGE (使用的镜像)              COMMAND  (执行的命令)                  CREATED (创建时间)            STATUS (当前状态)              PORTS (端口映射情况 )                NAMES (容器名称)
    

    8.6 进入容器(目的,调试,排错)

    docker exec  (会分配一个新的终端tty)
    docker exec -it  容器id或容器名字 /bin/bash(/bin/sh)
    		
    docker attach(使用同一个终端)
    docker attach [OPTIONS] CONTAINER
    

    8.7 删除容器

    docker rm    # 删除已经停止的容器
    docker rm -f # 删除正在运行的容器
    

    8.8 强制删除所有容器

    docker rm -f `docker ps -a -q`
    # -f  强制删除
    # -a  所有容器
    # -q  只显示容器ID
    

    8.9 容器与宿主机之间的文件传输

    docker cp 宿主机目录,文件位置  容器ID:容器目录,文件位置
    docker 容器ID:容器目录,文件位置 cp 宿主机目录,文件位置  
    #例子:docker cp ./ 66aee4681ad9:/etc/hosts # 把容器的/etc/hosts文件,复制到宿主机的当前目录
    

    8.10 总结

    docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
    业务在容器中运行:夯住,启动服务
    

    9. docker容器的网络访问(端口映射)

    指定映射(docker 会自动添加一条iptables规则来实现端口映射)
    	-p hostPort:containerPort
    	-p ip:hostPort:containerPort  多个容器都想使用80端口
    	-p ip::containerPort(随机端口)
    	-p hostPort:containerPort:udp
    	-p  10.0.0.100::53:udp
    	-p 81:80 –p 443:443 可以指定多个-p
    
    随机映射
    	docker run -P (随机端口)
    
    通过iptables来实现的端口映射
    

    10. docker的数据卷管理

    -v 宿主机目录:容器目录
    如果数据库的挂载点下有数据,会直接挂载到容器中,覆盖原有的数据,如果没有,则容器中的数据库,会复制到这个挂载点

    10.1 练习案例:通过配置数据卷在NGINX站点目录下添加像素小鸟。

    资源包下载地址:
    链接:https://pan.baidu.com/s/1i9q5uk_GMmjJ8FDLs3sq7A
    提取码:o3y1

    (1)解压像素小鸟资源包
    [root@docker01 /srv]# unzip xiaoniaofeifei.zip 
    [root@docker01 /srv]# ls
    2000.png  21.js  icon.png  img  index.html  sound1.mp3  xiaoniaofeifei.zip
    
    (2)创建容器与数据卷
    [root@docker01 /srv]# docker run -d -p 81:80 -v /srv:/usr/share/nginx/html nginx:latest 
    7ad034e16cb97c2a828cebafda6878c2de9ae86d752a5f3536fd10746779a781
    
    (3)查看容器运行状态
    [root@docker01 /srv]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    7ad034e16cb9        nginx:latest        "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes        0.0.0.0:81->80/tcp   suspicious_goldwasser
    
    

    (4)浏览器访问

    10.2 总结:使用数据卷的好处

    当我们的网站遇到bug的时候,直接修改宿主机目录下的web网站相关文件就可以了,而不用登录到容器中进行修改。
    
    例如:在宿主机目录,修改像素小鸟网站标题
    [root@docker01 /srv]# cat index.html|head -7
    <!DOCTYPE HTML>
    ………………省略若干行
            <title>小鸟飞飞飞-文章库小游戏</title>
    ………………省略若干行
    
    修改后
    [root@docker01 /srv]# cat index.html|head -7
    <!DOCTYPE HTML>
    ………………省略若干行
            <title>小鸟飞飞飞-修改测试</title>
    ………………省略若干行
    

    浏览器访问

    10.3 指定卷的方式

    创建一个基于数据卷的容器
    [root@docker01 /srv]# docker run -d -p 82:80 -v test:/usr/share/nginx/html nginx:latest 
    ad07534ee9f37bd481d13c7115082aed055d5a9614c73398a40a6b8e6f190be5
    
    查看数据卷生成情况
    [root@docker01 /srv]# docker volume ls
    DRIVER              VOLUME NAME
    local               test
    
    查看数据卷详细
    [root@docker01 /srv]# docker volume inspect test
    [
        {
            "CreatedAt": "2019-07-28T12:12:16+08:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/test/_data",
            "Name": "test",
            "Options": null,
            "Scope": "local"
        }
    ]
    [root@docker01 /srv]# cd /var/lib/docker/volumes/test/_data
    [root@docker01 /var/lib/docker/volumes/test/_data]# ls
    50x.html  index.html
    

    10.4 数据卷总结

    持久化
    数据卷(文件或目录)
    	-v 卷名:/data(卷不存在,自动创建,如果卷中有东西,就直接把该卷挂载到容器指定目录下。如果卷中没有东西,就会把容器目录下的东西挂载到宿主机数据卷所在的目录下)
    	-v src(宿主机的目录):dst(容器的目录)
    数据卷容器
    	--volumes-from(跟某一个已经存在的容器挂载相同的卷)
    

    10.5 练习:基于nginx多端口的多站点。

    # 配置要求
    基于nginx启动一个容器,监听80和81,访问80,出现nginx默认欢迎首页,访问81,出现小鸟。
    -p 80:80 -p 81:81 -v  xxx:xxx -v  xxx:xxxx
    
    (1)清除所有容器
    root@docker01 ~]# docker rm -f `docker ps -a -q`
    ad07534ee9f3
    7ad034e16cb9
    
    (2)生成81端口的配置文件
    [root@docker01 /tmp]# vim xiaoniao.conf
    server {
       listen 81;
       server_name localhost;
       root   /tmp;
       index index.html index.htm;
       location / {
       }
    }
    
    (3)启动容器
    [root@docker01 /tmp]# docker run -d -p 80:80 -p 81:81 -v /tmp/xiaoniao.conf:/etc/nginx/conf.d/xiaoniao.conf -v /srv:/tmp nginx:latest 
    5ebcbadb1f1bb5463225db302b7ecb590d5d47b6b92029ceceebee8e09be0319
    

    (4)浏览器访问
    image.png
    image.png

    11. 为什么容器起来了,马上就退出了?

    [root@docker01 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    66aee4681ad9        nginx               "/docker-entrypoint.…"   23 minutes ago      Up 22 minutes       0.0.0.0:80->80/tcp   nice_jones
    # 如上面这个nginx容器,看“COMMAND”这里,就是这个命令让nginx运行在后台的
    
    
    [root@docker01 ~]# docker run -d centos          # 又如这个centos容器,启动的时候没有指定使用的命令,ps查看默认的COMMAND为/bin/bash,这个命令是无法让centos这个容器夯主的。
    f54c64a994de21bf31058324ef6c1d46d0a5d400a2f2234b1f76a615bab39d14
    
    [root@docker01 ~]# docker ps  -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                NAMES
    f54c64a994de        centos              "/bin/bash"              5 seconds ago       Exited (0) 4 seconds ago                        musing_benz
    66aee4681ad9        nginx               "/docker-entrypoint.…"   26 minutes ago      Up 25 minutes              0.0.0.0:80->80/tcp   nice_jones
    
    # 这里换一种方式启动
    [root@docker01 ~]# docker run -d centos tail -f /etc/hosts  # 指定容器执行的命令为tail -f /etc/hosts,这样容器就会在前台 运行,不会退出
    f67ff71336027de1ad316315a8ad035851accf90725d79f356fc16ae765b1c3a
    [root@docker01 ~]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
    f67ff7133602        centos              "tail -f /etc/hosts"   7 seconds ago       Up 6 seconds                            magical_bhaskara
    
  • 相关阅读:
    Eos开发——构造查询条件
    随记
    Spring的三种通过XML实现DataSource注入方式
    事务处理
    Spring AOP实例——异常处理和记录程序执行时间
    输出日志实例改成用Spring的AOP来实现
    用ProxyFactoryBean创建AOP代理
    Spring的通知(Advice)
    Spring的3种切入点PointCut实现
    学习AOP之JAVA的代理机制
  • 原文地址:https://www.cnblogs.com/xiets/p/14086638.html
Copyright © 2011-2022 走看看