Docker为什么会出现
开发中的困扰
在日常开发中,想必都有这个场景:
测试:产品发版后又出问题了。
运维:我是按照开发给的包部署的,我排查下。
开发:我本地没问题的呀。
一款产品,开发和生产两套环境,运维人员环境配置费时费力,且很容易出现问题。
且出现问题后,开发人员和运维人员排查问题都是十分痛苦的,因为一个产品往往涉及到诸多环境,产生影响的因素实在太多。
寻求解决
这时候不禁会想,要是开发人员能够把代码和环境一块提供,运维人员拿来就直接运行,这个问题就迎刃而解了。
这就是所谓开发即运维,既能保证系统稳定性,也能提高部署效率。
为解决这一问题,Docker 横空出世!
Docker的历史
2010年,几个搞 IT 的人,在美国成立一家公司 dotCloud。
一开始他们是做一些 PaaS 的云计算服务。
他们将自己的容器化技术命名为 Docker。
Docker 基于 Go 语言开发。
Docker 刚刚诞生的时候,并没有引起行业的注意,这也导致 dotCloud 快要经营不下去。
为了公司能生存,他们决定开源,以寻求更多的关注。
2013 年,创始人将 Docker 开源,没想到一下子爆火!刚开源的时候,每个月都会更新一个版本。
于是,2014 年 4 月 9 日,Docker 1.0 发布。
Docker介绍

官方文档:https://docs.docker.com/docker-for-windows/
命令查阅:https://docs.docker.com/engine/reference/run/
Docker 是一个开源的应用容器引擎。
Docker 的思想来自于集装箱,彼此之间隔离。
Docker 通过隔离机制,可以将服务器利用到极致。
Docker 容器完全使用沙箱机制,相互之间不会有任何接口。
虚拟机结构

- 名称解释:
- kernel: 系统内核
- lib: 运行库 (多个APP 共享系统运行库)
- 它有以下明显的缺点:
- 资源占用多。启动虚拟机非常占内存,对电脑资源有不小的占用。
- 冗余步骤多。启动虚拟机后,还需要进行一些步骤才能进入系统,效率比较低。
- 启动很慢。由于虚拟机是虚拟化一整个系统,其启动时间会比较缓慢,一般都需要几分钟。
DevOps (开发, 运维)
- 应用更快速的交付和部署
- 传统: 一堆帮助文档, 安装程序
- Docker: 打包镜像发布测试, 一键运行
- 更便捷的升级和扩缩容
- 使用了Docker 之后, 部署应用就和搭积木一样
- 把项目打包为一个镜像, 直接拓展服务, 实现负载均衡
- 更简单的系统运维:
- 在容器化之后, 开发和测试环境都是高度一致的
- 更高效的计算资源利用:
- Docker 是内核级别的虚拟化, 可以在一个物理机上可以运行很多的容器实例, 服务器的性能可以被压榨到极致
Docker底层原理
Docker 是一个 Client-Server 结构的系统。
Docker 的守护进程在主机上,通过Socket从客户端访问。
Docker Server 接受 Docker-Client 的指令。

- 镜像(image):Docker 镜像好比一个模板,可以通过这个模板来创建容器(container),一个镜像可以创建多个容器。
- 容器(container):容器可以理解为一个简易的系统。
- 仓库(repository):存放镜像的地方。
Docker和虚拟机的区别
Docker所使用的容器化技术本质上属于虚拟化技术。
提到虚拟化技术,最有名的就是虚拟机技术。
虚拟机原理示意图

容器化技术原理示意图

由此可以看出,它不是模拟的完整的操作系统,而是基于操作系统封装成了一小个运行环境。
Docker 是怎么工作的?
- Docker 是一个client-server 结构的系统, Docker 的守护进程运行在主机上, 通过Socket 从客户端访问
- DockerServer 接收到Docker-Client 的指令, 就会执行这个命令
区别
| 传统虚拟机 | Docker | |
|---|---|---|
| 虚拟内容 | 硬件 + 完整的操作系统 + 软件 | APP + LIB |
| 大小 | 笨重,通常几个 G | 轻便几个 M 或 KB |
| 启动速度 | 慢,分钟级 | 快,秒级 |
| 运行形态 | 运行于Hypervisor 上 | 直接运行在宿主机内核上 |
| 并发性 | 一台宿主机上十几个, 最多几十个 | 上百个, 甚至数百上千个 |
| 性能 | 逊于宿主机 | 接近宿主机本地进程 |
Docker 为什么比 VM 快

- Docker 有着比 VM 更少的抽象层 (不需要模拟硬件环境再去跑GuestOS, 只需要Docker Engine 服务就可以运行容器)
- Docker 主要用的是宿主机的内核,而 VM 需要 Guest OS。
- 新建一个容器的时候,Docker 不需要像 VM 一样重新加载一个操作系统内核,避免了引导的过程 (共享内核, 减少开销)
Docker安装
环境查看
uname -r# 确认linux 系统内核版本在3.0 以上3.10.0-957.el7.x86_64
cat /etc/os-release# 确认linux 系统环境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"
安装
#1. 卸载旧版本sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
#2. 安装工具包yum install -y yum-utils
#3. 配置镜像仓库yum-config-manager \--add-repo \#https://download.docker.com/linux/centos/docker-ce.repo #该地址是docker 官方提供的镜像仓库地址, 是国外的, 下载很慢http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #使用阿里云镜像仓库, 要快很多
#4. 更新yum 软件包索引yum makecache fast
#5. 安装docker 引擎和containerd, 默认安装最新版 (ce 代表社区版, ee 代表企业版)yum install docker-ce docker-ce-cli containerd.io# 或者安装指定版本# 查看指定版本yum list docker-ce --showduplicates | sort -rdocker-ce.x86_64 3:20.10.9-3.el7 docker-ce-stabledocker-ce.x86_64 3:20.10.8-3.el7 docker-ce-stabledocker-ce.x86_64 3:20.10.7-3.el7 docker-ce-stabledocker-ce.x86_64 3:20.10.6-3.el7 docker-ce-stabledocker-ce.x86_64 3:20.10.5-3.el7 docker-ce-stabledocker-ce.x86_64 3:20.10.4-3.el7 docker-ce-stabledocker-ce.x86_64 3:20.10.3-3.el7 docker-ce-stabledocker-ce.x86_64 3:20.10.2-3.el7 docker-ce-stable....# 安装指定版本yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
#6. 启动dockersystemctl start docker
#7. 查看docker 是否启动成功docker version# 出现以下结果代表启动成功Client: Docker Engine - CommunityVersion: 20.10.12API version: 1.41Go version: go1.16.12Git commit: e91ed57Built: Mon Dec 13 11:45:41 2021OS/Arch: linux/amd64Context: defaultExperimental: true
#8. 测试hello worlddocker run hello-world# 成功启动后, 会返回以下信息Hello 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 theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto 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/
#9. 查看下载的hello-world 镜像docker images# 返回以下镜像列表REPOSITORY TAG IMAGE ID CREATED SIZEhello-world latest feb5d9fea6a5 3 months ago 13.3kBnacos/nacos-server 2.0.0 826b878af26e 10 months ago 975MB
卸载docker
#卸载docker#卸载安装包yum remove docker-ce docker-ce-cli containerd.io#删除目录rm -rf /var/lib/docker #该目录为docker 的默认工作目录rm -rf /var/lib/containerd
阿里云镜像加速
- 登录阿里云, 找到容器镜像服务

- 按照提示操作即可:

Docker run 命令运行流程图

Docker命令
帮助命令
docker 命令 --help #万能命令docker version #显示docker 的版本信息docker info #显示docker 的系统信息, 包括镜像和容器的数量
官方帮助文档的地址: https://docs.docker.com/engine/reference/commandline
镜像命令
docker images
查看所有本地的主机上的镜像
# 输入查看案所有本地的主机上的镜像docker images# 会返回如下列表REPOSITORY TAG IMAGE ID CREATED SIZEhello-world latest feb5d9fea6a5 3 months ago 13.3kBnacos/nacos-server 2.0.0 826b878af26e 10 months ago 975MB# 解释Repository: 镜像的仓库源TAG: 镜像的标签IMAGE ID: 镜像的idCREATED: 镜像的创建时间SIZE: 镜像的大小#可选项:Options:-a, --all Show all images (default hides intermediate images) #列出所有镜像--digests Show digests-f, --filter filter Filter output based on conditions provided--format string Pretty-print images using a Go template--no-trunc Don't truncate output-q, --quiet Only show image IDs #只显示镜像的id
docker search 搜索镜像
# 使用docker search 命令搜索mysql 镜像docker search mysql# 会返回如下列表NAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 11984 [OK]mariadb MariaDB Server is a high performing open sou… 4589 [OK]mysql/mysql-server Optimized MySQL Server Docker images. Create… 898 [OK]percona Percona Server is a fork of the MySQL relati… 567 [OK]phpmyadmin phpMyAdmin - A web interface for MySQL and M… 428 [OK]centos/mysql-57-centos7 MySQL 5.7 SQL database server 92mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 90centurylink/mysql Image containing mysql. Optimized to be link… 59 [OK]...# 可选项, 通过收藏来过滤--filter=stars=3000 #搜索出来的镜像就是STARS 大于3000 的# 搜索收藏大于3000 的mysql 镜像docker search mysql --filter=STARS=3000# 会返回如下列表NAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 11984 [OK]mariadb MariaDB Server is a high performing open sou… 4589 [OK]
下载命令
docker pull
下载镜像
# 使用pull 命令下载mysql 镜像# docker pull 镜像名[:tag] 用于指定下载的版本, 默认使用最新版docker pull mysql# 系统产生如下提示Using default tag: latest #如果不写tag, 默认就是latestlatest: Pulling from library/mysql72a69066d2fe: Pull complete #分层下载, docker image 的核心, 联合文件系统93619dbc5b36: Pull complete99da31dd6142: Pull complete626033c43d70: Pull complete37d5d7efb64e: Pull completeac563158d721: Pull completed2ba16033dad: Pull complete688ba7d5c01a: Pull complete00e060b6d11d: Pull complete1c04857f594f: Pull complete4d7cfa90e6ea: Pull completee0431212d27d: Pull completeDigest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 #签名Status: Downloaded newer image for mysql:latestdocker.io/library/mysql:latest # 真实地址# 以下两条命令等价docker pull mysqldocker pull docker.io/library/mysql:latest# 指定版本下载# 指定下载mysql 的5.7 版本docker pull mysql:5.7# 分层下载, 由于5.7 与最新版的若干镜像分层是一致的, docker pull 命令执行只会下载不同的部分, 用于节省磁盘和网络带宽, 原理是linux 的联合文件系统5.7: Pulling from library/mysql72a69066d2fe: Already exists93619dbc5b36: Already exists99da31dd6142: Already exists626033c43d70: Already exists37d5d7efb64e: Already existsac563158d721: Already existsd2ba16033dad: Already exists0ceb82207cd7: Pull complete37f2405cae96: Pull completee2482e017e53: Pull complete70deed891d42: Pull completeDigest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94Status: Downloaded newer image for mysql:5.7docker.io/library/mysql:5.7
删除镜像
docker rmi
删除镜像
# 根据镜像ID 删除镜像docker rmi -f c20987f18b13# 会产生以下提示# 由于下载只下载了与mysql 最新版有区别的镜像分层, 删除也只删除了与mysql 最新版有区别的镜像分层Untagged: mysql:5.7Untagged: mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94Deleted: sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76Deleted: sha256:6567396b065ee734fb2dbb80c8923324a778426dfd01969f091f1ab2d52c7989Deleted: sha256:0910f12649d514b471f1583a16f672ab67e3d29d9833a15dc2df50dd5536e40fDeleted: sha256:6682af2fb40555c448b84711c7302d0f86fc716bbe9c7dc7dbd739ef9d757150Deleted: sha256:5c062c3ac20f576d24454e74781511a5f96739f289edaadf2de934d06e910b92# 删除符合查询条件的镜像# docker images -aq 会查询出所有镜像的ID, 然后rmi 命令会根据镜像ID 循环删除# $() 用于包含表达式docker rmi -f $(docker images -aq)# 删除指定ID 的镜像docker rmi -f 镜像id# 删除多个ID 的镜像docker rmi -f 镜像id 镜像id 镜像id ...# 删除全部的镜像docker rmi -f $(docker images -aq)
容器命令
说明: 只有下载了镜像才能创建容器
案例: 下载CentOS 7 系统
启动
docker run [可选参数] image
参数说明
—name=”Name” #容器名字 -d #后台方式运行 -it #使用交互方式运行, 进入容器查看内容 -p #指定容器的端口
#使用方式如下:1. -p ip:主机端口:容器端口2. -p 主机端口:容器端口 (映射关系)3. -p 容器端口容器端口
-P #随机指定端口
测试, 启动并进入容器
docker run -it centos /bin/bash
会产生如下提示:
[root@b08ef9cc3be6 /]# #说明已经进入了容器 [root@b08ef9cc3be6 /]# ls #查看容器内的centos, 这是一个基础版本, 很多命令不完善 bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
退出容器(从容器中退回主机)
exit
<a name="efeff7c8"></a>## 列出所有的运行容器```shell#docker ps 命令#列出当前正在运行的容器-a #列出当前正在运行的容器 + 带出历史运行过的容器-n=? #显示最近创建的容器-q #只显示容器的编号#显示当前正在运行的容器docker ps#会产生如下容器信息CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES#显示当前正在运行的容器 + 历史运行过的容器docker ps -a#会产生如下容器信息CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb08ef9cc3be6 centos "/bin/bash" 4 minutes ago Exited (127) About a minute ago sharp_euler9f8a3ad5b0e9 mysql "docker-entrypoint.s…" About an hour ago Exited (1) About an hour ago practical_sanderson3c60c457339a centos "/bin/bash" 25 hours ago Exited (0) 25 hours ago hungry_solomon590baa543e53 hello-world "/hello" 31 hours ago Exited (0) 31 hours ago upbeat_shockley4e76bd27f241 hello-world "/hello" 2 days ago Exited (0) 2 days ago fervent_hodgkin70e487ddcdd8 nacos/nacos-server:2.0.0 "bin/docker-startup.…" 8 months ago Exited (137) 4 weeks ago nacos-standalone#显示容器IDdocker ps -aq#会产生如下容器ID 列表b08ef9cc3be69f8a3ad5b0e93c60c457339a590baa543e534e76bd27f24170e487ddcdd8
退出容器
exit #直接容器停止并退出Ctrl + P + Q #退出容器且不停止运行
删除容器
docker rm 容器id #删除指定的容器, 不能删除正在运行的容器, 如果要强制删除, 使用rm -fdocker rm -f $(docker ps -aq) #删除所有的容器docker ps -aq | xargs docker rm #使用管道命令删除所有的容器
启动和停止容器的操作
docker start 容器id #启动容器docker restart 容器id #重启重启docker stop 容器id #停止当前正在运行的容器docker kill 容器id #强制停止当前容器
常用其他命令
后台启动
#命令 docker run -d 镜像名docker run -d centos#问题docker ps, 发现centos 停止了#常见的坑: docker 容器使用后台运行, 就必须要有一个前台进程, docker 发现没有应用, 就会自动停止#容器启动后, 发现自己没有提供服务, 就会立刻停止, 就是没有程序了
查看日志
#查看所有日志 (没有--tail 表示查看所有日志)docker logs -tf 容器ID#可以自己编写shell 脚本打印日志#-c 表示往容器中写命令docker run -d centos /bin/sh -c "while true;do echo ks;sleep 1;done"#显示最近10 条日志docker logs -tf --tail 日志条数 容器ID#可选参数:-tf: t(timestamp) 加上事件戳, f(follow) 表示流式显示--tail 显示条数: 显示指定条数的日志
查看容器中进程信息
#根据容器ID 查看进程信息docker top 容器ID#查看正在运行的容器docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9d53b9244581 centos "/bin/bash" 29 minutes ago Up 29 minutes unruffled_dewdney#根据容器ID 查看进程信息docker top 9d53b9244581UID PID PPID C STIME TTY TIME CMDroot 12041 12019 0 14:14 pts/0 00:00:00 /bin/bash
查看镜像元数据
# 查看镜像元数据docker inspect 容器ID#查看正在运行的容器docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9d53b9244581 centos "/bin/bash" 40 minutes ago Up 39 minutes unruffled_dewdney#查看容器元数据docker inspect 9d53b9244581[{"Id": "9d53b92445814d547bd4f4d035f983eff52508b0b510450a2c674b621706a680","Created": "2022-01-21T06:14:01.978122813Z","Path": "/bin/bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 12041,"ExitCode": 0,"Error": "","StartedAt": "2022-01-21T06:14:02.462675053Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6","ResolvConfPath": "/var/lib/docker/containers/9d53b92445814d547bd4f4d035f983eff52508b0b510450a2c674b621706a680/resolv.conf","HostnamePath": "/var/lib/docker/containers/9d53b92445814d547bd4f4d035f983eff52508b0b510450a2c674b621706a680/hostname","HostsPath": "/var/lib/docker/containers/9d53b92445814d547bd4f4d035f983eff52508b0b510450a2c674b621706a680/hosts","LogPath": "/var/lib/docker/containers/9d53b92445814d547bd4f4d035f983eff52508b0b510450a2c674b621706a680/9d53b92445814d547bd4f4d035f983eff52508b0b510450a2c674b621706a680-json.log","Name": "/unruffled_dewdney","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/d4466b3a10622c6089de12d0084e6e0bc585a38123fd64fd60e5c0d1405498ac-init/diff:/var/lib/docker/overlay2/063cb712918c2787a420328900e64d7d7323fd382d76475288028b02a053a5fc/diff","MergedDir": "/var/lib/docker/overlay2/d4466b3a10622c6089de12d0084e6e0bc585a38123fd64fd60e5c0d1405498ac/merged","UpperDir": "/var/lib/docker/overlay2/d4466b3a10622c6089de12d0084e6e0bc585a38123fd64fd60e5c0d1405498ac/diff","WorkDir": "/var/lib/docker/overlay2/d4466b3a10622c6089de12d0084e6e0bc585a38123fd64fd60e5c0d1405498ac/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "9d53b9244581","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": true,"OpenStdin": true,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"],"Image": "centos","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20210915","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": "d7e66d850f67d6ec285af68b5dd8a91f9f9da053b6f34ff73f05680aac6156dd","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/d7e66d850f67","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "2fcc11d02ac215ebd2dd8c1960aa9d0cb0b951ab7818b59e03aefb7c0b7269e3","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": "ee8bc807558a08566907ee93ae088a2d0a689ab4c46f3feaa079f963314ee269","EndpointID": "2fcc11d02ac215ebd2dd8c1960aa9d0cb0b951ab7818b59e03aefb7c0b7269e3","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}}}}]
进入当前正在运行的容器
# 通常容器都是使用后台方式运行的, 需要进入容器, 修改一些配置
# 方式1: 根据容器ID 进入正在运行的容器
docker exec -it 容器id bashShell
# 查看正在运行的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d53b9244581 centos "/bin/bash" 40 minutes ago Up 39 minutes unruffled_dewdney
# 根据容器ID 进入正在运行的容器
docker exec -it 9d53b9244581 /bin/bash
[root@9d53b9244581 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 方式2:
docker attach 容器id
# 查看正在运行的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d7b0f83c3b6 centos "/bin/bash" 11 seconds ago Up 11 seconds zen_jepsen
# 根据容器ID 进入正在运行的容器
docker attach 9d7b0f83c3b6
[root@9d7b0f83c3b6 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#docker exec: 进入容器后开启一个新的终端, 可以在里面操作
#docker attach: 进入容器正在执行的终端, 不会启动新的终端
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径
# 查看正在运行的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d7b0f83c3b6 centos "/bin/bash" 11 seconds ago Up 11 seconds zen_jepsen
# 进入正在运行的容器
[root@localhost ~]# docker attach 9d7b0f83c3b6
[root@9d7b0f83c3b6 /]# cd /home
[root@9d7b0f83c3b6 home]# ls
# 在容器内新建一个文件
[root@9d7b0f83c3b6 home]# touch test.java
# 此时退出该容器, 容器停止运行
[root@9d7b0f83c3b6 home]# exit
exit
# 查看所有运行的容器(包括已经关闭的)
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d7b0f83c3b6 centos "/bin/bash" 9 minutes ago Exited (0) 14 seconds ago zen_jepsen
9d53b9244581 centos "/bin/bash" About an hour ago Exited (0) 11 minutes ago unruffled_dewdney
6c208ce77821 centos "/bin/bash" 21 hours ago Exited (255) About an hour ago quirky_beaver
34e9f8a7c3fb centos "/bin/bash" 21 hours ago Exited (0) 21 hours ago tender_payne
da7e642663b4 centos "/bin/bash" 21 hours ago Exited (0) 21 hours ago zen_goldstine
992577557e92 centos "/bin/sh -c 'while t…" 22 hours ago Exited (137) 22 hours ago heuristic_wright
acfd6a6173ec centos "/bin/sh -C 'while t…" 22 hours ago Exited (127) 22 hours ago wonderful_clarke
6ad3dd1f53bf centos "/bin/bash" 22 hours ago Exited (0) 22 hours ago vigorous_ellis
8c3a2907dc51 centos "/bin/bash" 22 hours ago Exited (0) 22 hours ago quirky_mccarthy
4ea3bfe9df4a centos "/bin/bash" 22 hours ago Exited (137) 22 hours ago dazzling_johnson
# 从容器内拷贝文件到主机上(即使容器关闭也没有影响)
# 拷贝是一个手动过程, 未来使用-v 卷技术, 可以实现自动同步
[root@localhost ~]# docker cp 9d7b0f83c3b6:/home/test.java /home
[root@localhost ~]# ls
anaconda-ks.cfg Desktop Documents Downloads ks.java Music mysql80-community-release-el7-3.noarch.rpm original-ks.cfg Pictures Public sysbench Templates Videos
Docker 命令总结

端口暴露
Docker 部署Nginx
#1. 搜索nginx 镜像
docker search nginx
#2. 下载nginx 镜像
docker pull nginx
#3. 启动nginx, 并将宿主机3344 端口映射到容器的80 端口, 后台运行, 容器名定义为nginx01
docker run -d --name nginx01 -p 3344:80 nginx
#4. 测试nginx
curl localhost:3344
Docker 部署Tomcat
# --rm: 表示用完即删
docker run -it --rm tomcat:9.0
#1. 下载tomcat 镜像
docker pull tomcat:9.0
#2. 启动tomcat, 并将宿主机3355 端口映射到容器的8080 端口, 后台运行, 容器名定义为tomcat02
docker run -d -p 3355:8080 --name tomcat02 tomcat
#3. 进入容器
docker exec -it tomcat02 /bin/bash
#4. 发现问题
#1. linux 命令少了(没有ll 命令); 2. 阿里云镜像的原因(没有webapps): 默认是最小的镜像, 所有不必要的都剔除掉, 保证最小可运行环境
#可以将webapps.dist 文件夹中的所有的文件复制到webapps 文件夹中, 这样就有项目部署到Tomcat 中了
部署ES + KIBANA
#ES 暴露的端口很多, ES 很耗内存, ES 的数据一般需要放置到安全目录, 挂载
#--net somenetwork: 网路配置
#-e "discovery.type=single-node": 集群配置, 默认为单节点
#tag: 版本号, 7.6.2
#以下是命令模版
docker run -d -name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
#以下是启动示例:
Cdocker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#启动ES 后, 机器会变得非常卡
#docker stats: 查看docker 对硬件的使用情况
docker stats
#会产生以下提示: MEM USAGE 一列可以看到内存使用量, 这里ES 使用了1.252GB 的内存
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
ff7e7575851b 0.15% 1.252 GiB / 15.5 GiB 8.08% 656 B / 656 B 0 B / 2.09 MB 51
#测试ES 是否成功运行
curl localhost:9200
{
"name" : "ff7e7575851b",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "qyJSBA9TTn-7CHjJSvEc_w",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
#关闭ES
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ff7e7575851b elasticsearch:7.6.2 "/usr/local/bin/do..." 22 minutes ago Up 22 minutes 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch
docker stop ff7e7575851b
#增加内存的限制: 修改配置文件, -e 环境修改
#ES_JAVA_OPTS="-Xms64m -Xmx512m" 默认使用64m 内存, 最大扩展到512m
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
#再次查看docker 对硬件的使用情况
docker stats
#会产生以下提示: 可以看到MEM USAGE 一列的内存使用量明显变小, 控制在512m 之内
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
bddb872a165c 1.19% 385 MiB / 15.5 GiB 2.43% 656 B / 656 B 0 B / 1.67 MB 47
KIBANA 如何连接ES?
- 问题: 容器之间互相隔离, 如何连接对方?

