栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Docker

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Docker

Docker 安装Docker 环境准备
  • Linux CentOS7
  • XShell
环境查看
#系统内核是 3.10以上的
[root@localhost ~]# uname -r
3.10.0-693.el7.x86_64
#系统版本
[root@localhost ~]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

安装

打开官网

https://www.docker.com/get-started

帮助文档查看,安装步骤

  • 安装环境

    • To install Docker Engine, you need a maintained version of CentOS 7 or 8. Archived versions aren’t supported or tested.
      
  • 卸载旧版本

    • sudo yum remove docker 
                       docker-client 
                       docker-client-latest 
                       docker-common 
                       docker-latest 
                       docker-latest-logrotate 
                       docker-logrotate 
                       docker-engine
      
  • 需要的安装包

    • sudo yum install -y yum-utils
      
  • 设置镜像仓库

    • #默认是国外的
      sudo yum-config-manager 
         --add-repo 
         https://download.docker.com/linux/centos/docker-ce.repo
      #阿里云(推荐使用)
      yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      
  • 更新yum软件包索引

    • [root@localhost ~]# yum makecache fast
      已加载插件:fastestmirror, langpacks
      base                                                                            | 3.6 kB  00:00:00     
      extras                                                                          | 2.9 kB  00:00:00     
      updates                                                                         | 2.9 kB  00:00:00     
      Loading mirror speeds from cached hostfile
       * base: mirrors.aliyun.com
       * extras: mirrors.163.com
       * updates: mirrors.aliyun.com
      
  • 安装docker相关的内容

    • #docker-ce社区版  docker-ee 企业版
      sudo yum install docker-ce docker-ce-cli containerd.io
      
  • 启动docker
    • sudo systemctl start docker
      
  • 检查是否安装成功

    • docker version
      
    • [root@localhost ~]# docker versionClient: Docker Engine - Community Version:           20.10.8 API version:       1.41 Go version:        go1.16.6 Git commit:        3967b7d Built:             Fri Jul 30 19:55:49 2021 OS/Arch:           linux/amd64 Context:           default Experimental:      trueServer: Docker Engine - Community Engine:  Version:          20.10.8  API version:      1.41 (minimum version 1.12)  Go version:       go1.16.6  Git commit:       75249d8  Built:            Fri Jul 30 19:54:13 2021  OS/Arch:          linux/amd64  Experimental:     false containerd:  Version:          1.4.9  GitCommit:        e25210fe30a0a703442421b0f60afac609f950a3 runc:  Version:          1.0.1  GitCommit:        v1.0.1-0-g4144b63 docker-init:  Version:          0.19.0  GitCommit:        de40ad0
      
  • 测试helloworld

    • sudo docker run hello-world
      
    • [root@localhost ~]# docker run hello-worldUnable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-worldb8dfde127a29: Pull complete Digest: sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1Status: Downloaded newer image for hello-world:latestHello from Docker!This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.    (amd64) 3. The Docker daemon created a new container from that image which runs the    executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it    to your terminal.To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID: https://hub.docker.com/For more examples and ideas, visit: https://docs.docker.com/get-started/
      
  • 查看下载的这个hello-world镜像

    • [root@localhost ~]# docker imagesREPOSITORY    TAG       IMAGE ID       CREATED        SIZEhello-world   latest    d1165f221234   5 months ago   13.3kB
      
  • 了解:卸载docker

    • #1.Uninstall the Docker Engine, CLI, and Containerd packages:sudo yum remove docker-ce docker-ce-cli containerd.io#2.Images, containers, volumes, or customized configuration files on your host are not automatically removed. To delete all images, containers, and volumes:sudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerd
      
配置阿里云镜像加速

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EBxCxWGx-1633510608757)(F:Java學習笔记note_imagedocker阿里云镜像服务.png)]

  • 登录阿里云,找到容器镜像服务
  • 找到镜像加速地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eOhlGDUs-1633510608759)(F:Java學習笔记note_imagedocker阿里云镜像加速地址.png)]

  • 配置使用

    • #第一步sudo mkdir -p /etc/docker#第二步sudo tee /etc/docker/daemon.json <<-'EOF'{  "registry-mirrors": ["https://t4c3om50.mirror.aliyuncs.com"]}EOF#第三步sudo systemctl daemon-reload#第四步sudo systemctl restart docker
      
回顾HelloWorld流程
  • run运行流程分析图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mniEB2oA-1633510608760)(F:Java學習笔记note_imagedockerDocker中HelloWorld镜像运行流程.png)]

底层原理 Docker是如何工作的?
  • Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问

  • DockerServer接受到Docker-Client的指令,就会执行这个命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UaIrl33s-1633510608762)(F:Java學習笔记note_imagedockerdocker底层实现原理.png)]

Docker为什么比VM快?
  • Docker有比VM更少的抽象层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mt5Ndfsv-1633510608762)(F:Java學習笔记note_imagedockerdocker对比VM结构.png)]

  • docker利用的是宿主机的内核,vm需要是Guest OS
    • 所以说,新建一个容器的时候,docker不需要虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,是分钟级别的。而docker是利用宿主机的操作系统,省略了这个复杂的过程,是秒级别的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fLHGllB1-1633510608763)(F:Java學習笔记note_imagedockerdocker对比VM性能.png)]

Docker的常用命令 帮助命令
docker version # 显示docker的版本信息docker info	# 显示docker的系统信息,包括镜像和容器的数量docker 命令 --help #万能命令

帮助文档的地址:https://docs.docker.com/engine/reference/

官网 --> doc --> reference

镜像命令 images 查看本机上的所有本地镜像
  • docker images 查看本机上的所有本地镜像

    • [root@localhost ~]# docker imagesREPOSITORY    TAG       IMAGE ID       CREATED        SIZEhello-world   latest    d1165f221234   5 months ago   13.3kB
      
    • REPOSITORY:镜像的仓库源

    • TAG:镜像的标签

    • IMAGE ID:镜像的ID

    • CREATED:创建时间

    • SIZE:镜像的大小

    • [root@localhost ~]# docker images --helpUsage:  docker images [OPTIONS] [REPOSITORY[:TAG]]List imagesOptions:  -a, --all             Show all images (default hides intermediate images)  -q, --quiet           only show image IDs
      
    • -a:显示所有镜像

    • -q:显示镜像ID

docker search 搜索镜像
[root@localhost ~]# docker search mysqlNAME                              DEscriptION                                     STARS     OFFICIAL   AUTOMATEDmysql                             MySQL is a widely used, open-source relation…   11325     [OK]       mariadb                           MariaDB Server is a high performing open sou…   4303      [OK]  #可选项:通过搜索来过滤--filter=STARS=3000 #搜索出来的镜像STARS大于3000[root@localhost ~]# docker search mysql --filter=STARS=3000NAME      DEscriptION                                     STARS     OFFICIAL   AUTOMATEDmysql     MySQL is a widely used, open-source relation…   11325     [OK]       mariadb   MariaDB Server is a high performing open sou…   4303      [OK]  
docker pull 下载镜像
# 下载镜像docker pull 镜像名[:tag][root@localhost ~]# docker pull mysqlUsing default tag: latest  # 如果不写tag,默认就是lastestlatest: Pulling from library/mysqle1acddbe380c: Pull complete  # 分层下载,docker image的核心 联合文件系统bed879327370: Pull complete 03285f80bafd: Pull complete ccc17412a00a: Pull complete 1f556ecc09d1: Pull complete adc5528e468d: Pull complete 1afc286d5d53: Pull complete 6c724a59adff: Pull complete 0f2345f8b0a3: Pull complete c8461a25b23b: Pull complete 3adb49279bed: Pull complete 77f22cd6c363: Pull complete Digest: sha256:d45561a65aba6edac77be36e0a53f0c1fba67b951cb728348522b671ad63f926Status: Downloaded newer image for mysql:latestdocker.io/library/mysql:latest #真实地址#等价于它[root@localhost ~]# docker pull mysql[root@localhost ~]# docker pull docker.io/mysql:lastest# 指定版本下载[root@localhost ~]# docker pull mysql:5.75.7: Pulling from library/mysqle1acddbe380c: Already exists bed879327370: Already exists 03285f80bafd: Already exists ccc17412a00a: Already exists 1f556ecc09d1: Already exists adc5528e468d: Already exists 1afc286d5d53: Already exists 4d2d9261e3ad: Pull complete ac609d7b31f8: Pull complete 53ee1339bc3a: Pull complete b0c0a831a707: Pull complete Digest: sha256:7cf2e7d7ff876f93c8601406a5aa17484e6623875e64e7acc71432ad8e0a3d7eStatus: Downloaded newer image for mysql:5.7docker.io/library/mysql:5.7

镜像查看

[root@localhost ~]# docker imagesREPOSITORY    TAG       IMAGE ID       CREATED        SIZEmysql         5.7       6c20ffa54f86   9 days ago     448MBmysql         latest    5a4e492065c7   9 days ago     514MBhello-world   latest    d1165f221234   5 months ago   13.3kB
docker rmi 删除镜像
[root@localhost ~]# docker rmi -f 6c20ffa54f86 #通过ID删除指定镜像[root@localhost ~]# docker rmi -f 6c20ffa54f86 5a4e492065c7 #删除多个镜像[root@localhost ~]# docker rmi -f ${docker images -aq} #删除所有镜像
容器命令

说明:有了镜像才可以创建容器

  • 下载一个centos镜像来测试
[root@localhost ~]# docker pull centosUsing default tag: latestlatest: Pulling from library/centos7a0437f04f83: Pull complete Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1Status: Downloaded newer image for centos:latestdocker.io/library/centos:latest
新建容器并启动
docker run[可选参数] image#参数说明--name="Name" 容器名字,用于区分容器-d 后台方式运行-it 使用交互方式运行,进入容器查看难爱用-p 指定容器的端口 -p 8080:8080      -p ip:主机端口:容器端口      -p 主机端口:容器端口 (常用)      -p 容器端口-P 随机指定端口	# 测试,启动并进入容器[root@localhost ~]# docker run -it centos /bin/bash[root@a4664e605673 /]# ls   #查看容器内的centos,基础版本,很多命令都是不完善的bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  vardev  home  lib64  media       opt  root  sbin  sys  usr#从容器退出主机[root@a4664e605673 /]# exitexit[root@localhost ~]# lsaaa              animal                extra_timi.dic  initial-setup-ks.cfg  模板  图片  下载  桌面anaconda-ks.cfg  apache-tomcat-7.0.75  fruit           公共                   视频  文档  音乐
列取所有的运行的容器
#docker ps命令    # 列出当前正在运行的容器-a # 列出当前正在运行的容器+历史运行过的容器-n=? # 显示最近创建的容器-q # 只显示容器的编号[root@localhost ~]# docker psConTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES[root@localhost ~]# [root@localhost ~]# docker ps -aConTAINER ID   IMAGE         COMMAND       CREATED         STATUS                          PORTS     NAMESa4664e605673   centos        "/bin/bash"   4 minutes ago   Exited (0) about a minute ago             pedantic_wiles66e273e6db29   hello-world   "/hello"      14 hours ago    Exited (0) 14 hours ago                   wizardly_rubin[root@localhost ~]# docker ps -n=2ConTAINER ID   IMAGE         COMMAND       CREATED         STATUS                     PORTS     NAMESa4664e605673   centos        "/bin/bash"   7 minutes ago   Exited (0) 5 minutes ago             pedantic_wiles66e273e6db29   hello-world   "/hello"      14 hours ago    Exited (0) 14 hours ago              wizardly_rubin[root@localhost ~]# docker ps -aqa4664e60567366e273e6db29
退出容器
exit # 直接容器停止并退出Ctrl + P + Q # 容器不停止退出#容器不停止退出[root@localhost ~]# docker psConTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES[root@localhost ~]# docker run -it centos /bin/bash[root@2e8d67507fcf /]# [root@localhost ~]# docker psConTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES2e8d67507fcf   centos    "/bin/bash"   18 seconds ago   Up 17 seconds             zealous_wu
删除容器
docker rm 容器ID #删除指定容器,不能删除正在运行的容器docker rm -f $(docker ps -aq) #删除所有的容器docker ps -a -q|xargs docker rm -f #删除所有的容器
启动和停止容器的操作
docker start 容器ID #启动容器docker restart 容器ID #重启容器docker stop 容器ID #停止当前正在运行的容器docker kill 容器ID #强制停止当前容器
常用的其他命令 后台启动容器
[root@localhost ~]# docker run -d centos18c2ea0959a1c49e45119995678e2850f6fa2e32f3b93583c5acc09d92bcce15[root@localhost ~]# docker psConTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES# 问题用docker ps命令发现centos停止了# 常见的坑,docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止# nginx,容器启动后,发现自己没有提供服务就会立刻停止,就没有程序了
查看日志
docker logs -f -t --tail 容器ID[root@localhost ~]# docker run -d centos /bin/sh -c "while true;do echo gavinjoeng;sleep 1;done"3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c[root@localhost ~]# docker psConTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES3fa5ddb72ebc   centos    "/bin/sh -c 'while t…"   3 seconds ago   Up 2 seconds             naughty_leavitt#显示日志[root@localhost ~]# docker logs -tf --tail 10 3fa5ddb72ebc2021-08-27T15:28:15.411823465Z gavinjoeng2021-08-27T15:28:16.413672805Z gavinjoeng2021-08-27T15:28:17.416079677Z gavinjoeng2021-08-27T15:28:18.420492674Z gavinjoeng2021-08-27T15:28:19.424540768Z gavinjoeng2021-08-27T15:28:20.426611589Z gavinjoeng2021-08-27T15:28:21.430560124Z gavinjoeng2021-08-27T15:28:22.434961818Z gavinjoeng2021-08-27T15:28:23.439664019Z gavinjoeng2021-08-27T15:28:24.443796818Z gavinjoeng2021-08-27T15:28:25.446166648Z gavinjoeng2021-08-27T15:28:26.448911908Z gavinjoeng2021-08-27T15:28:27.451890978Z gavinjoeng[root@localhost ~]# docker logs --help-tf #显示日志--tail number #要显示日志条数# 参数说明  --details        Show extra details provided to logs  -f, --follow         Follow log output      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g.                       42m for 42 minutes)  -n, --tail string    Number of lines to show from the end of the logs (default "all")  -t, --timestamps     Show timestamps      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative                       (e.g. 42m for 42 minutes)
查看容器中进程信息 ps
# 命令docker top容器id[root@localhost ~]# docker top 3fa5ddb72ebcUID                 PID                 PPID                C                   STIME               TTY                 TIME                CMDroot                3785                3764                0                   23:27               ?                   00:00:00            /bin/sh -c while true;do echo gavinjoeng;sleep 1;doneroot                4305                3785                0                   23:33               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
查看镜像的元数据
[root@localhost ~]# docker inspect 3fa5ddb72ebc# 查看镜像的元数据[    {        "Id": "3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c",        "Created": "2021-08-27T15:27:06.49589249Z",        "Path": "/bin/sh",        "Args": [            "-c",            "while true;do echo gavinjoeng;sleep 1;done"        ],        "State": {            "Status": "running",            "Running": true,            "Paused": false,            "Restarting": false,            "OOMKilled": false,            "Dead": false,            "Pid": 3785,            "ExitCode": 0,            "Error": "",            "StartedAt": "2021-08-27T15:27:06.950495944Z",            "FinishedAt": "0001-01-01T00:00:00Z"        },        "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",        "ResolvConfPath": "/var/lib/docker/containers/3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c/resolv.conf",        "HostnamePath": "/var/lib/docker/containers/3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c/hostname",        "HostsPath": "/var/lib/docker/containers/3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c/hosts",        "LogPath": "/var/lib/docker/containers/3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c/3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c-json.log",        "Name": "/naughty_leavitt",        "RestartCount": 0,        "Driver": "overlay2",        "Platform": "linux",        "MountLabel": "",        "ProcessLabel": "",        "AppArmorProfile": "",        "ExecIDs": null,        "HostConfig": {            "Binds": null,            "ContainerIDFile": "",            "LogConfig": {                "Type": "json-file",                "Config": {}            },            "NetworkMode": "default",            "PortBindings": {},            "RestartPolicy": {                "Name": "no",                "MaximumRetryCount": 0            },            "AutoRemove": false,            "VolumeDriver": "",            "VolumesFrom": null,            "CapAdd": null,            "CapDrop": null,            "CgroupnsMode": "host",            "Dns": [],            "DnsOptions": [],            "DnsSearch": [],            "ExtraHosts": null,            "GroupAdd": null,            "IpcMode": "private",            "Cgroup": "",            "links": null,            "OomScoreAdj": 0,            "PidMode": "",            "Privileged": false,            "PublishAllPorts": false,            "ReadonlyRootfs": false,            "SecurityOpt": null,            "UTSMode": "",            "UsernsMode": "",            "ShmSize": 67108864,            "Runtime": "runc",            "ConsoleSize": [                0,                0            ],            "Isolation": "",            "CpuShares": 0,            "Memory": 0,            "NanoCpus": 0,            "CgroupParent": "",            "BlkioWeight": 0,            "BlkioWeightDevice": [],            "BlkioDeviceReadBps": null,            "BlkioDeviceWriteBps": null,            "BlkioDeviceReadIOps": null,            "BlkioDeviceWriteIOps": null,            "CpuPeriod": 0,            "CpuQuota": 0,            "CpuRealtimePeriod": 0,            "CpuRealtimeRuntime": 0,            "CpusetCpus": "",            "CpusetMems": "",            "Devices": [],            "DeviceCgroupRules": null,            "DeviceRequests": null,            "KernelMemory": 0,            "KernelMemoryTCP": 0,            "MemoryReservation": 0,            "MemorySwap": 0,            "MemorySwappiness": null,            "OomKillDisable": false,            "PidsLimit": null,            "Ulimits": null,            "CpuCount": 0,            "CpuPercent": 0,            "IOMaximumIOps": 0,            "IOMaximumBandwidth": 0,            "MaskedPaths": [                "/proc/asound",                "/proc/acpi",                "/proc/kcore",                "/proc/keys",                "/proc/latency_stats",                "/proc/timer_list",                "/proc/timer_stats",                "/proc/sched_debug",                "/proc/scsi",                "/sys/firmware"            ],            "ReadonlyPaths": [                "/proc/bus",                "/proc/fs",                "/proc/irq",                "/proc/sys",                "/proc/sysrq-trigger"            ]        },        "GraphDriver": {            "Data": {                "LowerDir": "/var/lib/docker/overlay2/86543b769cabebb54b3a9b6500f311a183a79ea98dc967e432ba4bea646f5419-init/diff:/var/lib/docker/overlay2/808c328f1ed4dd18a455a956c4bc9fac7036ff068d96f41200c953c0371f2700/diff",                "MergedDir": "/var/lib/docker/overlay2/86543b769cabebb54b3a9b6500f311a183a79ea98dc967e432ba4bea646f5419/merged",                "UpperDir": "/var/lib/docker/overlay2/86543b769cabebb54b3a9b6500f311a183a79ea98dc967e432ba4bea646f5419/diff",                "WorkDir": "/var/lib/docker/overlay2/86543b769cabebb54b3a9b6500f311a183a79ea98dc967e432ba4bea646f5419/work"            },            "Name": "overlay2"        },        "Mounts": [],        "Config": {            "Hostname": "3fa5ddb72ebc",            "Domainname": "",            "User": "",            "AttachStdin": false,            "AttachStdout": false,            "AttachStderr": false,            "Tty": false,            "OpenStdin": false,            "StdinOnce": false,            "Env": [                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"            ],            "Cmd": [                "/bin/sh",                "-c",                "while true;do echo gavinjoeng;sleep 1;done"            ],            "Image": "centos",            "Volumes": null,            "WorkingDir": "",            "Entrypoint": null,            "OnBuild": null,            "Labels": {                "org.label-schema.build-date": "20201204",                "org.label-schema.license": "GPLv2",                "org.label-schema.name": "CentOS base Image",                "org.label-schema.schema-version": "1.0",                "org.label-schema.vendor": "CentOS"            }        },        "NetworkSettings": {            "Bridge": "",            "SandboxID": "eabaaa7b520e7436863111eb41d2f1218d12c75dcea461713c44d078f8e9b2b2",            "HairpinMode": false,            "linkLocalIPv6Address": "",            "linkLocalIPv6PrefixLen": 0,            "Ports": {},            "SandboxKey": "/var/run/docker/netns/eabaaa7b520e",            "SecondaryIPAddresses": null,            "SecondaryIPv6Addresses": null,            "EndpointID": "f22eec6e40da41e3a202c282c89f3d5cae600714aef6397b210da6b5dee386c7",            "Gateway": "172.17.0.1",            "GlobalIPv6Address": "",            "GlobalIPv6PrefixLen": 0,            "IPAddress": "172.17.0.2",            "IPPrefixLen": 16,            "IPv6Gateway": "",            "MacAddress": "02:42:ac:11:00:02",            "Networks": {                "bridge": {                    "IPAMConfig": null,                    "links": null,                    "Aliases": null,                    "NetworkID": "dd8a2dfb2294325f7aae3845b6926f078395438b00762592f1d0affb75004343",                    "EndpointID": "f22eec6e40da41e3a202c282c89f3d5cae600714aef6397b210da6b5dee386c7",                    "Gateway": "172.17.0.1",                    "IPAddress": "172.17.0.2",                    "IPPrefixLen": 16,                    "IPv6Gateway": "",                    "GlobalIPv6Address": "",                    "GlobalIPv6PrefixLen": 0,                    "MacAddress": "02:42:ac:11:00:02",                    "DriverOpts": null                }            }        }    }]
进入当前正在运行的容器
#方式一#命令docker exec -it 容器id /bin/bash[root@localhost ~]# docker psConTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES4cfbffdf6ff0   centos    "/bin/bash"   2 minutes ago   Up 2 minutes             peaceful_rosalind[root@localhost ~]# docker exec -it 4cfbffdf6ff0 /bin/bash[root@4cfbffdf6ff0 /]# lsbin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  vardev  home  lib64  media       opt  root  sbin  sys  usr[root@4cfbffdf6ff0 /]# ps -efUID         PID   PPID  C STIME TTY          TIME CMDroot          1      0  0 00:42 pts/0    00:00:00 /bin/bashroot         16      0  0 00:43 pts/1    00:00:00 /bin/bashroot         33      0  0 00:45 pts/2    00:00:00 /bin/bashroot         49     33  1 00:46 pts/2    00:00:00 ps -ef#方式二#命令docker attach 容器id[root@localhost ~]# docker psConTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES4cfbffdf6ff0   centos    "/bin/bash"   10 minutes ago   Up 10 minutes             peaceful_rosalind[root@localhost ~]# docker attach 4cfbffdf6ff0 [root@4cfbffdf6ff0 /]# 
  • 两者区别
    • docker exec -it 容器id /bin/bash:进入容器后开启一个新的终端,可以在里面操作(常用)
    • docker attach 容器id:进入容器正在执行的终端,不会启动新的进程
从容器中拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径# 运行一个容器[root@localhost ~]# docker run -it centos /bin/bash# 进入容器[root@localhost home]# docker attach 397c3156371a [root@397c3156371a /]# cd /home# 查看容器目录[root@397c3156371a home]# ls#创建文件[root@397c3156371a home]# touch forCopyTest.java# 退出容器[root@397c3156371a home]# exitexit[root@localhost home]# docker psConTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES# 容器文件复制到主机[root@localhost home]# docker cp 397c3156371a:/home/forCopyTest.java /home# 查看主机文件[root@localhost home]# lsforCopyTest.java  gavinjoeng.java  jeonggwongjyu
总结
  • Docker Commands Diagram

Docker 命令大全
  • 启动docker
sudo systemctl start docker
  • docker search 搜索镜像
[root@localhost ~]# docker search mysql
容器生命周期管理
  • run
  • start/stop/restart
  • kill
  • rm
  • pause/unpause
  • create
  • exec
容器操作
  • ps
  • inspect
  • top
  • attach
  • events
  • logs
  • wait
  • export
  • port
容器rootfs命令
  • commit
  • cp
  • diff
镜像仓库
  • login
  • pull
  • push
  • search
本地镜像管理
  • images
  • rmi
  • tag
  • build
  • history
  • save
  • load
  • import
  • info|version
  • info
  • version
Docker安装Nginx
# 启动nginxsystemctl start docker# 搜索镜像docker search nginx# 下载镜像docker pull nginx# 后台启动并且以名字为nginx01、端口号为3344启动nginxdocker run -d --name nginx01 -p 3344:80 nginx#参数: -d 后台运行  --name 起名  -p 端口# 运行测试docker pscurl localhost:3344
端口暴露

  • 思考问题:我们每次改动nginx配置文件,都需要进入容器内部,十分麻烦,我要可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改?
  • -v 数据卷
Docker安装Tomcat
#  知识点补充:官方使用docker run -it --rm tomcat:9.0我们之前的启动都是后台,停止容器之后,容器还是可以查到,docker run -it --rm,一般用来测试,用完就删除# 下载再启动Tomcatdocker pull tomcat# 启动运行docker run -d -p 3355:8080 --name tomcat01 tomcat# 浏览器访问192.168.180.96:3355# 进入容器docker exec -it tomcat01 /bin/bash# 发现问题:# 1. linux命令少了# 2. 没有webapps# 原因: 默认为最少镜像,阉割版本,发现文件在webapps.dist目录下# 把webapps.dist的文件复制到webapps目录下cp -r webapps.dist/* webapps# 页面可以正常显示啦~
  • 思考问题:我们以后要部署项目,如果每次都要进入容器都需要进入容器内部,十分麻烦,我要可以在容器外部提供一个映射路径webapps,我们在外部放置项目就自动同步到内部就好啦~
Docker部署ElasticSearch + Kibana
  • es 暴露的端口很多、十分消耗内存,es的数据一般需要放置到安全目录,挂载!
# --net somenetwork 网络配置,暂时去掉#$ docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag# 启动elasticsearchdocker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2# 查看cpu状态docker stats # 测试es否成功了curl localhost:9200
  • docker所占内存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SzDz2zLY-1633510608767)(F:Java學習笔记note_imagedockerdocker中es所占用内存.png)]

  • 如何限制内存限制
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="Xms64m -Xmx512m" elasticsearch:7.6.2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SxabHYNc-1633510608767)(F:Java學習笔记note_imagedockerdocker对es限制内存后.png)]

  • 思考的问题:使用Kibana连接ES,思考网络如何才能连接过去

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ggrjv09G-1633510608769)(F:Java學習笔记note_imagedocker使用Kibana连接ES.png)]

端口号占用问题 解决 Error starting userland proxy: listen tcp 0.0.0.0:6379: bind: address already in use

今天启动redis突然出现连接端口有问题,错误如下:

truedei@truedei:~$ truedei@truedei:~$ sudo docker start redisError response from daemon: driver failed programming external connectivity on endpoint redis (87977922525bd67cb6e39c26b2f0229081ff428693991d923c595752a733d41b): Error starting userland proxy: listen tcp 0.0.0.0:6379: bind: address already in useError: failed to start containers: redistruedei@truedei:~$ 

就查了下端口,果然有在使用的:

truedei@truedei:~$ netstat -ntpl |grep 6379(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      -                   truedei@truedei:~$ 

查一下是谁在占用,让我很是惊讶,居然是他自己,端口被占用了,而且还没启动

truedei@truedei:~$ ps -aux |grep 6379redis     1397  0.0  0.0  42608  2292 ?        Ssl  07:30   0:00 /usr/bin/redis-server 127.0.0.1:6379truedei   5096  0.0  0.0  14536   976 pts/4    S+   07:33   0:00 grep 6379truedei@truedei:~$ truedei@truedei:~$ sudo docker psConTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMEStruedei@truedei:~$ truedei@truedei:~$ 

先结束掉在说,奇怪的是,杀都杀不掉

truedei@truedei:~$ sudo kill -9 1397truedei@truedei:~$ ps -aux |grep 6379redis     8263  0.0  0.0  42608  2164 ?        Ssl  07:35   0:00 /usr/bin/redis-server 127.0.0.1:6379truedei   8291  0.0  0.0  14536   984 pts/4    S+   07:35   0:00 grep 6379truedei@truedei:~$ 

仔细看了一下这个redis并不是docker中安装的redis,而是在本机的:

/usr/bin/redis-server

那就停止掉本机的,果然可以了:

truedei@truedei:~$ /etc/init.d/redis-server stop[ ok ] Stopping redis-server (via systemctl): redis-server.service.truedei@truedei:~$ truedei@truedei:~$ ps -aux |grep 6379truedei  10583  0.0  0.0  14536   948 pts/4    S+   07:37   0:00 grep 6379truedei@truedei:~$ truedei@truedei:~$ 

然后再启动:

truedei@truedei:~$ truedei@truedei:~$ sudo docker start redisredistruedei@truedei:~$ truedei@truedei:~$ sudo docker psConTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES85cb7d83a2ff        redis               "docker-entrypoint.s…"   22 hours ago        Up 5 seconds        0.0.0.0:6379->6379/tcp   redistruedei@truedei:~$ truedei@truedei:~$ 

总结:

出现这种情况的大多数原因都是自己的本机安装了redis,而docker中安装的redis与物理机绑定的端口号是相同的,所以就造成了这个原因。 解决方案有很多种: 1、直接卸载物理机的redis 2、不让开机启动 3、修改docker映射的端口号 4、…等

可视化
  • portainer

  • Rancher(CI/CD再用)

portainer
// 建议不要使用9000端口直接映射docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

访问:http://192.168.180.96:8088/

Docker镜像讲解 镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件

所有的应用,直接打包docker镜像,就可以直接跑起来

如何得到镜像:

  • 远程仓库下载
  • 自己制作一个镜像DockerFile
Docker 镜像加载的原理

UnionFS(联合文件系统)

UnionFS (联合文件系统) : Union文件系统( UnionFS)是一种分层、 轻量级并且高性能的文件系统,它支持对文件系统的修改
作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual
filesystem)。Union 文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像) ,可以制作各
种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的
文件系统会包含所有底层的文件和目录

Docker 镜像加载原理

docker的镜像实际上由一层一层的文件 系统组成,这种层级的文件系统UnionFS.

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这-层与我们典型的Linux/Unix系统是一样的 ,包含boo加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs.

rootfs (root file system) , 在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu , Centos等等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NMnU1tiL-1633510608769)(F:Java學習笔记note_imagedockerDocker 镜像加载的原理.png)]

平时我们安装进虚拟机的 Centos 都是好几个 G,为什么 docker 才 200MB

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZQ2riYac-1633510608771)(F:Java學習笔记note_imagedockerdocker镜像为什么这么小.png)]

对于一个精简的 OS,rootfs 可以是很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用 Host 的 kernel,自己只需要提供 rootfs 就可以了,由此可见对于不同的 linux 发行版,bootfs 基本是一致的,rootfs 会有差别,因此不同的发行版可以公用 bootfs。

分层理解

分层的镜像

我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载。

为什么 Docker 镜像要采用这种分层的结构呢

最大的好处就是资源共享,比如多个镜像都从相同的 base 镜像构建而来的,那么宿主机只需要在磁盘上保留一份 base 镜像,同时内存中也只需要加载一份 base 镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。

查看镜像的分层的方式可以通过 docker image inspect 命令。

 docker image inspect redis:latest[    //...        "RootFS": {            "Type": "layers",            "Layers": [                "sha256:95ef25a3204339de1edf47feaa00f60b5ac157a498964790c58c921494ce7ffd",                "sha256:ad9080bec957893dd0e5d146ec4fed09232e4d2c40d6975bfb1d31ad7eeba6ae",                "sha256:03f8dae99b4d972acfb5afb240d170f71420aed3960b1b9e502c718938fc41a5",                "sha256:ce89ae6e6358780e4f0ac30e78edb8a867c577765ab2daa7eaac447701228863",                "sha256:e7b10f84d45b2e8277e0d2b49db8137aa2c5a01f90c8e951477425a1521f1bc2",                "sha256:ed8f8f354de8b585acea9d30ce39cfea0b2f74d1572b3ba045cdbd5441e8f918"            ]        },        "metadata": {            "LastTagTime": "0001-01-01T00:00:00Z"        }    }]
  • 理解

所有的Docker 镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。

举一个简单的例子,假如基于Ubuntu Linux 16.04 创建一个新的镜像,这就是镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。

该镜像当前已经包含三个镜像层,如下图所示(这只是一个用于演示的简单的例子)

在添加额外的镜像层的同时,镜像始终保持当前所有镜像的组合,理解这一点非常重要,下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。

上图中的镜像层跟之前图中的略有所区别,主要是便于展示文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像文件只有6个,这是因为最上层的文件7是文件5的一个更新版本。

这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件 系统。

Linux上可用的存储引擎有AUFS、Overlay2、 Device Mapper、Btrfs 以及ZFS.顾名思义,每种存储引擎都基于Linux 中对应的
文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。

Docker在Windows上仅支持windowsfilter 一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW[1]。
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

特点

Docker镜像都是只读的,当容器启动后,一个新的可写层被加载到镜像的顶部!

这一层就是我们通常说的容器层,容器层之下的都交镜像层。

我们所有的操作都是基于容器操作的。

  • 在这幅图中,我们可以看到,Docker 容器的生命周期里分为五种状态,其分别代表着:
  • Created:容器已经被创建,容器所需的相关资源已经准备就绪,但容器中的程序还未处于运行状态。
  • Running:容器正在运行,也就是容器中的应用正在运行。
  • Paused:容器已暂停,表示容器中的所有程序都处于暂停 ( 不是停止 ) 状态。
  • Stopped:容器处于停止状态,占用的资源和沙盒环境都依然存在,只是容器中的应用程序均已停止。
  • Deleted:容器已删除,相关占用的资源及存储在 Docker 中的管理信息也都已释放和移除。
Commit镜像
docker commit 提交容器成为一个新的副本# 命令和git原理类似$ docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

实战测试

  • 启动tomcat
docker run -it --name tomcat-gavinjoeng -p 8080:8080 tomcat
  • 进入tomcat容器
docker exec -it tomcat-gavinjoeng /bin/bash
  • 把webapps.dist的文件复制到webapps目录下
cp -r webapps.dist/* webapps
  • 将操作过的容器通过commit提交为一个镜像
docker commit -a="gavinjoeng" -m="add index to webapps" a44a58b7174b tomcat-gavinjoeng 

如果想要保存当前容器的状态,可以通过 commit 来提交,获得一个镜像,就好比之前 vm 虚拟机的快照

容器数据卷 什么是容器数据卷

docker的理念回顾

将应用和环境打包成一个镜像

如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

需求:MySQL数据可以存储在本地!容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!这就是卷技术,目录的挂载,将我们容器内的目录,挂载到Linux上面

总结:容器的持久化和同步操作,容器间也是可以数据共享的!

使用数据卷

方式一:直接使用命令来挂载 -v

docker run -it -v  #主机目录,容器内目录,互为映射# 测试docker run -it -v /home/test:/home centos /bin/bash
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/296842.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号