0%

Docker架构、镜像及容器


Docker概述

Docker官方文档
Docker的Logo设计为蓝色鲸鱼, 拖着许多集装箱. 鲸鱼可以看作为宿主机, 而集装箱可以理解为相互隔离的容器, 每个集装箱中都包含自己的应用程序. 正如Docker的设计宗旨一样: Build, Ship and RunAny App, Anywhere, 即通过对应用组件的封装、发布、部署、运行等生命周期的管理, 达到应用组件级别的”一次封装, 到处运行”的目的. 这里的组件, 既可以是一个应用, 也可以是一套服务, 甚至是一个完整的操作系统.

Docker的容器技术可以在一台主机上轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器. 通过这种容器打包应用程序, 意味着简化了重新部署、调试这些琐碎的重复工作, 极大地提高了工作效率.

Docker容器与传统虚拟化的比较
特性Docker容器虚拟机
启动速度秒级分钟级
计算能力损耗几乎无损耗50%左右
性能接近原生弱于
系统支持量(单机)上千个几十个
隔离性资源限制完全隔离

Docker的三大核心概念: 镜像、容器、仓库

Docker的核心概念及安装

镜像(Image)

Docker的镜像是创建容器的基础, 类似虚拟机的快照, 可以理解为是一个面向Docker容器引擎的只读模板.
Docker提供了简单的机制来创建和更新现有的镜像, 用户也可以从网上下载已经做好的应用镜像来直接使用.

容器(Container)

Docker的容器是从镜像创建的运行实例, 它可以被启动、停止和删除. 所创建的每一个容器都是相互隔离、互不可见的, 可以保证平台的安全性. 还可以把容器看作是一个简易版的Linux环境, Docker利用容器来运行和隔离应用.

仓库(Repository)

Docker仓库是用来集中保存镜像的地方, 当创建了自己的镜像之后, 可以使用push命令将它上传到公共仓库(Public)或者私有仓库(Private), 这样一来当下次要在另一台机器上使用这个镜像的时候, 只需要从仓库上pull下来就可以了.

仓库注册服务器(Registry)是存放仓库的地方, 其中包含了多个仓库, 每个仓库集中存放某一类镜像, 并且使用不同的标签(tag)来区分它们. 目前最大的公共仓库是Docker Hub, 其中存放了数量庞大的镜像供用户下载使用.

安装Docker

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
2
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.安装Docker引擎, 启动服务并设置为开机自启动.

1
2
3
4
5
6
# 将软件包信息进行本地缓存, 用于提高搜索安装软件的速度.
yum makecache fast
yum install -y docker-ce

systemctl start docker
systemctl enable docker

4.检查是否安装成功

1
2
docker version
docker info

5.配置Docker加速仓库

1
2
3
4
5
6
7
8
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://gr0jon39.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart 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:latest

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 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 bash

Share 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官方文档

搜索镜像

搜索仓库中的共享镜像:
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)
-------------------本文结束 感谢阅读-------------------