Docker学习

Docker学习

1 简介

我们常说的容器是一种IT技术。容器技术提高了硬件资源利用率、方便了企业的业务快速横向扩容、实现了业务宕机自愈功能,是非常有影响喝价值的技术。容器技术最早出现在freebsd叫做jail。

1.1、docker简介

1.1.1、Docker是什么?

Docker是2013年开源的应用程序,基于go语言写的。Docker是基于linux内核实现,最早采用LXC技术(LXC是linux原生支持的容器技术,可以提供轻量级的虚拟化)。

Docker相比虚拟机的交付速度更快,资源消耗更低(原因:1、docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。2、docker利用的是宿主机的内核,而不需要加载操作系统OS内核。),docker采用的是客户端/服务端架构。docker的三大理念是build(构建)、ship(运输)、run(运行)。
Docker学习_第1张图片

1.1.2、Docker的组成:

Docker 主机(Host):一个物理机或虚拟机,用于运行Docker服务进程和容器。
Docker 服务端(Server):Docker守护进程,运行docker容器。
Docker 客户端(Client):客户端使用docker命令或其他工具调用docker API。
Docker 仓库(Registry):保存镜像的仓库,类似于git或svn这样的版本控制。
Docker 镜像(Images):镜像可以理解为创建实例使用的模板。
Docker 容器(Container):容器是从镜像生成对外提供服务的一个或一组服务。

1.1.3、Docker对比虚拟机

Docker学习_第2张图片

1.1.4、常见名词解释

Docker image:是docker容器的模板,runtime依据docker image创建容器。
Dockerfile:包含N个命令的文本文件,通过dockefile创建出docker image。
ACI(App container image):与docker image类似,是CoreOS开发的rkt容器的镜像格式。
Image Registry:docker官方提供的私有仓库部署工具。
Docker hub:docker官方的公共仓库,已经保存了大量常用的镜像,可以方便直接使用。
Harbor:vmware提供的自带web界面自带认证功能的镜像仓库,目前很多公司在使用。

1.1.5、编排工具

当多个容器在多个主机运行的时候,单独管理容器是相当复杂而且很容易出错,而且也无法实现某一台主机宕机后容器自动迁移到其他主机从而实现高可用的目的,也无法实现动态伸缩的功能,因此需要有一种工具可以实现统一管理、动态伸缩、故障自愈、批量执行等功能,这就是容器编排引擎。

容器编排通常包括容器管理、调度、集群定义和服务发现等功能。
常用的就是Kubernetes(K8s):使用go语言写的,内部项目为Borg,且其同时支持docker和CoreOS。

1.1.6、docker(容器)的依赖技术

  • 容器网络
    docker自带的网络docker network 仅支持管理单机上的容器网络,当多主机运行的时候需要使用第三方开源网络,例如calico、flannel等。
  • 服务发现
    容器的动态扩容特性决定了容器IP也会随之变化,因此需要有一种机制可以自动识别并将用户请求动态转发到新创建的容器上,kubernets自带服务发现功能,需要结合kube-dns服务解析内部域名。
  • 容器监控
    可以通过原生命令docker ps/top/stats 查看容器运行状态。
  • 数据管理
    容器的动态迁移会导致其在不同的Host之间迁移,因此如何保证与容器相关的数据也能随之迁移或随时访问,可以使用逻辑卷/存储挂载 等方式解决。
  • 日志收集
    docker原生的日志查看工具 docker logs,但是容器内部的日志需要通过ELK等工具来收集处理。

2、安装docker

安装教程网上都有,自己查询
查看docker信息

[root@node02 ~]# docker info
Containers: 0  # 容器个数
 Running: 0  # 运行中的容器
 Paused: 0  # 暂停的容器个数
 Stopped: 0  # 停止的容器个数
Images: 0  # 镜像个数
....

目前 docker 的默认存储引擎为 overlay2。

2.1、搜索镜像

格式:

docker serach 镜像名

2.2、下载镜像

docker pull 镜像名

下载中
Docker学习_第3张图片

2.3、查看本地镜像

[root@node02 docker_study]# docker pull alpine  # 拉取alpine镜像
Using default tag: latest
latest: Pulling from library/alpine
f56be85fc22e: Pull complete 
Digest: sha256:124c7d2707904eea7431fffe91522a01e5a861a624ee31d03372cc1d138a3126
Status: Downloaded newer image for alpine:latest
您在 /var/spool/mail/root 中有邮件
[root@node02 docker_study]# docker images  # 查看本地镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
alpine              latest              9ed4aefc74f6        5 weeks ago         7.05MB

2.4、镜像导出

可以将本地镜像导出为一个压缩文件,然后复制到其他服务器进行导入使用
导出方法:
将镜像alpine压缩存储到/opt/alpine.tar.gz

[root@node02 docker_study]# docker save alpine -o /opt/alpine.tar.gz

查看镜像内容:

root@node02 docker_study]# cd /opt/
您在 /var/spool/mail/root 中有邮件
[root@node02 opt]# ls
alpine.tar.gz
[root@node02 opt]# tar xvf alpine.tar.gz
[root@node02 opt]# ls
187d3fbd6d78f45ee5d316f07a4e3721c8e4e91b75cbf9ee0ab0ac1bcbef78e8
9ed4aefc74f6792b5a804d1d146fe4b4a2299147b0f50eaf2b08435d7b38c27e.json
alpine.tar.gz
manifest.json
repositories
[root@node02 opt]# cat manifest.json # 包含了镜像的相关配置,配置文件、分层
[{"Config":"9ed4aefc74f6792b5a804d1d146fe4b4a2299147b0f50eaf2b08435d7b38c27e.json","RepoTags":["alpine:latest"],"Layers":["187d3fbd6d78f45ee5d316f07a4e3721c8e4e91b75cbf9ee0ab0ac1bcbef78e8/layer.tar"]}]
您在 /var/spool/mail/root 中有邮件

2.5、镜像导入:

将刚才的镜像导入到docker

[root@node02 opt]# scp /opt/alpine.tar.gz 192.168.88.100:/opt/
alpine.tar.gz                    100% 7175KB  45.4MB/s   00:00    
您在 /var/spool/mail/root 中有邮件

可以在192.168.88.100下查看是否传过来:

[root@node01 opt]# ls
alpine.tar.gz

发现已经过来了
将其导入到docker中,并进行镜像验证

[root@node01 docker_server2]# docker load < /opt/alpine.tar.gz 
f1417ff83b31: Loading layer  7.338MB/7.338MB
Loaded image: alpine:latest
[root@node01 docker_server2]# docker images # 验证镜像过来没
REPOSITORY                                             TAG       IMAGE ID       CREATED       SIZE
alpine                                                 latest    9ed4aefc74f6   5 weeks ago   7.05MB

2.6、删除镜像:

docker rmi 镜像名

2.7、删除容器

docker rm 容器ID/容器名称
docker rm  容器ID/容器名称 -f   # 强制删除正在运行的容器

3、容器操作基础命令:

命令格式:
docker run [选项] [镜像名] [shell命令] [参数]

3.1、从镜像启动一个容器

会直接进入到容器,并随即生成容器ID和名称

[root@node02 opt]# docker run alpine
您在 /var/spool/mail/root 中有邮件

显示正在运行的容器

[root@node02 opt]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
a2d5165c8664        alpine              "/bin/sh"           7 seconds ago       Exited (0) 7 seconds ago                       lucid_newton

退出容器不注销
Ctrl+p+q

显示所有容器:
包括已经关闭的

[root@node02 opt]# docker ps -a

删除运行中的容器:

docker rm -f 容器ID

自定义容器名称:

docker run -it --name nginx-text nginx

在这里插入图片描述

查看容器已经映射的端口:

docker port 容器名

后台启动容器

root@ubuntu:~# docker run -d -P nginx
8b77b9b8dc0bbc8ca554e08da08f9f9754b09661818f622caaf256e9a870ac53

容器的启动和关闭

docker stop 容器名
docker start 容器名

进入到正在运行的容器
使用attach命令:

docker attach 容器名

使用exit推出后容器关闭,不推荐使用。

使用nsenter命令:
推荐使用此方式,nsenter命令需要通过PID进入到容器内部,不过可以使用docker inspect获取到容器的PID

你可能感兴趣的:(docker,学习,容器)