Docker概述
Docker官方文档
Docker的Logo设计为蓝色鲸鱼, 拖着许多集装箱. 鲸鱼可以看作为宿主机, 而集装箱可以理解为相互隔离的容器, 每个集装箱中都包含自己的应用程序. 正如Docker的设计宗旨一样: Build, Ship and RunAny App, Anywhere, 即通过对应用组件的封装、发布、部署、运行等生命周期的管理, 达到应用组件级别的”一次封装, 到处运行”的目的. 这里的组件, 既可以是一个应用, 也可以是一套服务, 甚至是一个完整的操作系统.
Docker的容器技术可以在一台主机上轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器. 通过这种容器打包应用程序, 意味着简化了重新部署、调试这些琐碎的重复工作, 极大地提高了工作效率.
特性 | Docker容器 | 虚拟机 |
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源限制 | 完全隔离 |
Docker的三大核心概念: 镜像、容器、仓库
Docker的核心概念及安装
镜像(Image)
Docker的镜像是创建容器的基础, 类似虚拟机的快照, 可以理解为是一个面向Docker容器引擎的只读模板.
Docker提供了简单的机制来创建和更新现有的镜像, 用户也可以从网上下载已经做好的应用镜像来直接使用.
容器(Container)
Docker的容器是从镜像创建的运行实例, 它可以被启动、停止和删除. 所创建的每一个容器都是相互隔离、互不可见的, 可以保证平台的安全性. 还可以把容器看作是一个简易版的Linux环境, Docker利用容器来运行和隔离应用.
仓库(Repository)
Docker仓库是用来集中保存镜像的地方, 当创建了自己的镜像之后, 可以使用push命令将它上传到公共仓库(Public)或者私有仓库(Private), 这样一来当下次要在另一台机器上使用这个镜像的时候, 只需要从仓库上pull下来就可以了.
仓库注册服务器(Registry)是存放仓库的地方, 其中包含了多个仓库, 每个仓库集中存放某一类镜像, 并且使用不同的标签(tag)来区分它们. 目前最大的公共仓库是Docker Hub, 其中存放了数量庞大的镜像供用户下载使用.
安装Docker
1.如果存在旧版本, 则卸载旧版本.
1 | yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine |
2.使用yum进行安装
1 | yum install -y yum-utils device-mapper-persistent-data lvm2 |
3.安装Docker引擎, 启动服务并设置为开机自启动.
1 | # 将软件包信息进行本地缓存, 用于提高搜索安装软件的速度. |
4.检查是否安装成功
1 | docker version |
5.配置Docker加速仓库
1 | mkdir -p /etc/docker |
6.验证安装是否正确
1 | docker run hello-world |
首先运行容器的时候, 在本地搜索可用的镜像, 如果找不到, 则再去远端官方仓库拉取(这里指定了为阿里云). Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:7f0a9f93b4aa3022c3a4c147a449bf11e0941a1fd0bf4a8e6c9408b2600777c5
Status: 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:
- The Docker client contacted the Docker daemon.
- The Docker daemon pulled the “hello-world” image from the Docker Hub.
(amd64)- The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.- 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/
Docker镜像操作
搜索镜像
搜索仓库中的共享镜像: docker search 关键字 [-s 星级值] NAME: 镜像名称 DESCRIPTION: 描述 STARS: 星级 OFFICIAL: 是否官方创建 AUTOMATED: 是否主动创建
获取镜像
从网络下载镜像到本地, 不指定标签时会默认从仓库中下载最新版本的镜像: docker pull 仓库名称[:标签]
镜像文件由若干层(Layer)组成, 称为AUFS(联合文件系统), 是实现增量保存与更新的基础, 下载过程中会输出镜像的各层信息.
查看镜像信息
查看下载到本地的所有镜像: docker images 仓库名称[:标签] 获取镜像详细信息: docker inspect 镜像ID号 为本地的镜像添加新的标签: docker tag 仓库名称[:标签] 新仓库名称[:新标签] REPOSITORY: 镜像归属的仓库 TAG: 镜像的标签信息 IMAGE ID: 镜像的唯一ID号 CREATED: 镜像创建时间 SIZE: 镜像大小 REPOSITORY TAG IMAGE ID CREATED SIZE
删除镜像
删除指定镜像: docker rmi 仓库名称[:标签] 删除所有镜像: docker rmi $(docker images -q)
导出镜像
docker save -o 存储文件名 存储的镜像
载入镜像
docker load < 存出的文件 docker --intput 存出的文件
上传镜像
在Docker Hub官方里创建账号后上传镜像到新建的公共仓库中: docker tag 仓库名称[:标签] 用户名/仓库名称:标签 docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: dcyun Password: 输入密码 WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
docker push 仓库名称 [:标签]
Docker容器操作
容器创建与启动
新键一个容器: docker create [选项] 仓库名称[:标签] 运行程序 |__ -i --让容器的输入保持打开 |__ -t --让Docer分配一个伪终端 启动停止状态的容器: docker start 容器的ID/名称 查看所有容器的运行状态: docker ps [选项] |__ -a --列出系统中全部的容器(默认只列出当前运行的容器) |__ -q --只列出ID号 CONTAINER ID: 容器的ID号 IMAGE: 加载的镜像 COMMAND: 运行程序 CREATED: 创建时间 STATUS: 目前所处状态: created(已创建) restarting(重启中) running(运行中) removing(迁移中) paused(暂停) exited(停止) dead(不可用) PORTS: 端口映射 NAMES: 镜像自动为容器创建的名字(唯一) CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
创建并启动容器: docker run [选项] 镜像 运行程序 |__ -d --让docker容器以守护状态在后台运行
效果等同于先执行create再执行start命令
Unable to find image 'centos:latest' locally latest: Pulling from library/centos 3c72a8ed6814: Pull complete Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd Status: Downloaded newer image for centos:latest WARNING: IPv4 forwarding is disabled. Networking will not work.
ls -l
total 0
lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Sep 4 02:27 dev
drwxr-xr-x. 1 root root 66 Sep 4 02:27 etc
drwxr-xr-x. 2 root root 6 May 11 2019 home
lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx——. 2 root root 6 Aug 9 21:40 lost+found
drwxr-xr-x. 2 root root 6 May 11 2019 media
drwxr-xr-x. 2 root root 6 May 11 2019 mnt
drwxr-xr-x. 2 root root 6 May 11 2019 opt
dr-xr-xr-x. 149 root root 0 Sep 4 02:27 proc
dr-xr-x—. 2 root root 162 Aug 9 21:40 root
drwxr-xr-x. 11 root root 163 Aug 9 21:40 run
lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 May 11 2019 srv
dr-xr-xr-x. 13 root root 0 Sep 3 06:01 sys
drwxrwxrwt. 7 root root 145 Aug 9 21:40 tmp
drwxr-xr-x. 12 root root 144 Aug 9 21:40 usr
drwxr-xr-x. 20 root root 262 Aug 9 21:40 var
容器的运行与终止
终止运行的容器: docker stop 容器的ID/名称 创建一个容器并运行, 如果本地镜像不存在会从仓库中拉取镜像后进行创建: docker run 仓库名称[:标签]
容器的进入
进入运行着的容器: docker exec -it 容器的ID/名称 /bin/bash [root@容器ID号 /] exit
容器的导出与导入
将创建好的容器导出为文件: docker export 容器的ID/名称 > 文件名 导入文件成为本地镜像: cat 文件名 | docker import - 生成的镜像名称:标签
容器的删除
docker rm [选项] 容器的ID/名称 |__ -f --强制删除 删除所有容器: docker rm $(docker ps -aq)