Docker的使用

docker是什么

docker是虚拟化技术的一种

docker:轻量化的容器技术

运行机制:基于内核,把运行环境和依赖的库、运行的软件打包成镜像,docker镜像互相独立

特点:快速交付、部署、节省资源、简单、便捷

docker的历史

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)

Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroupnamespace,以及AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runCcontainerd

docker组成

镜像(lmage):

docker镜像就像是一个模板,可以通过这个模板创建容器服务,tomcat镜像run>tomcat01容器(提供服务器)。通过这个镜可以创建多个容器(最终服务行或者项目运行在容器中)。

容额(container):

Docker利用容器技术,独立返行一个或一个组应用,通过镜像来创建的。启动,停止,删除,基本命令!

目前可以把容器理解为就一个简易LINUX系统

仓库(repository):

仓理就是存放镜像的地方!

仓库分为公有仓库和私有仓库!

docker的底层原理

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问
docker server接收到docker-Clent的指令,就会执行指令

docker为什么比VM快!

Docker有着比虚拟机更少的抽象层

docker利用宿主机的内核,vm则需要guest os

安装

检查

Docker需要一个64位系统的红帽系统,内核的版本必须大于3.10。可以用下面的命令来检查是否满足docker的要求。

1
2
3
#查看内核版本
$ uname -r
3.10.0-229.el7.x86_64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#系统版本
[root@dockerhost ~]# 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"

安装过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#卸载旧的版本
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 #官方默认为国外源


sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云

#更新yum索引
[root@dockerhost ~]# yum makecache fast

#安装docker相关 (ce是社区版 ee为企业版)
sudo yum install docker-ce docker-ce-cli containerd.io

#启动
sudo systemctl start docker

#验证
sudo docker run hello-world
[root@dockerhost ~]# docker version
1
2
3
4
#查看下载镜像
[root@dockerhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB

常用命令

帮助命令

1
2
3
docker version #版本
docker --help #帮助
docker info #显示docker详细信息

镜像命令

docker images 查看本地镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@dockerhost ~]# docker images 
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB

# 解释
REPOSLORY 镜像的仓库源
TAG 镜像的标等
IMAGE ID 镜像id
CREATED 创建时间
SIZE 大小

# 可选项
-a,--all #列出所有镜像
-q,--quiet #列出镜像id

docker search 查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@dockerhost ~]# docker search busybox
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
busybox Busybox base image. 2569 [OK]
radial/busyboxplus Full-chain, Internet enabled, busybox made f… 48 [OK]


#可选项
Usage: docker search [OPTIONS] TERM

Search the Docker Hub for images

Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output

docker pull 拉取

1
docker pull [OPTIONS] NAME[:TAG|@DIGEST]

docker rmi 删除

1
2
3
[root@dockerhost ~]# docker rmi -f 容器id 					#删除指定容器
[root@dockerhost ~]# docker rmi -f 容器id 容器id 容器id #删除多个
[root@dockerhost ~]# docker rmi -f $(docker images -aq) #删除全部

容器命令

1
docker pull centos

创建容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

#参数
--nanme="name" 容器名,区别容器
-d 后台方式运行
-it 交互方式运行进入容器查看内容
-p 指定容器端口 -p 8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
-p 随机指定端口


#创建容器并启动
[root@dockerhost ~]# docker run --name docker-cent -it centos /bin/bash
[root@90841170aaad /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

退出容器

1
2
3
#退出
[root@90841170aaad /]# exit #停止容器并退出
ctrl + P + Q #不停止退出

删除容器

1
2
3
doncker rm 容器id					   #删除指定容器,不能删除运行状态容器
docker rm -f $(docker ps -aq) #删除所有
docker ps -a -q|xargs docker rm #删除所有

启动和停止

1
2
3
4
docker start 容器id		#启动
docker restart 容器id #重启
docker stop 容器id #停止
docker kill 容器id #强制杀进程

常用其它命令

后台运行

1
2
docker run -d 镜像
#注意,后台运行容器时,容器必须有前台服务进程,否则会被kill

查看logs

1
2
3
4
5
6
7
8
9
docker logs [OPTIONS] CONTAINER

#参数:
--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)

查看进程id

1
docker top 容器id

查看元数据

1
2
3
4
5
6
docker inspect [OPTIONS] NAME|ID [NAME|ID...]

Options:
-f, --format string Format the output using the given Go template
-s, --size Display total file sizes if the type is container
--type string Return JSON for specified type

进入正在运行的容器

1
2
3
4
5
#1.交互模式进入容器开启新的bashshell
docker exec -it 容器id bashshell

#2.进入容器当前shell
docker attach 容器id

从容器内copy到主机

1
docker cp 容器id:容器路径 主机路径