底层原理

Docker是怎么工作的?

Docker是一个C-S结构的系统,Docker的守护进程运行在服务主机上,通过Socket从客户端访问。

DockerServer接收到DockerClient的指令就会执行这个命令。

image-20201013120921063

Docker为什么比VM快?

  1. Docker有着比虚拟机更少的抽象层
  2. Docker利用的是宿主机的内核,VM需要有Guest OS。所以新建一个容器的时候,docker不需要像VM一样重新加载一个操作系统内核,避免引导

image-20201013120834703

Docker常用命令

docker的默认工作路径

1
/var/lib/docker

帮助命令

1
2
3
docker version			# 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker <命令> --help # 查看帮助命令

镜像命令

docker images 查看所有本地的主机上的镜像

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

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

# 命令可选项
-a, --all 列出所有镜像
-q, --quiet 只显示镜像的id

docker search 搜索镜像

1
2
3
4
5
6
7
[root@localhost ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10046 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3680 [OK]

# 可选项,通过收藏数过滤
--filter=STAR=3000 搜索出来的镜像是STARS大于3000的

docker pull [:tag] 下载镜像

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
[root@localhost ~]# docker pull mysql
Using default tag: latest # 如果不写tag,默认是latest
latest: Pulling from library/mysql
d121f8d1c412: Pull complete # 分层下载,docker镜像的核心 联合文件系统
f3cebc0b4691: Pull complete
1862755a0b37: Pull complete
489b44f3dbb4: Pull complete
690874f836db: Pull complete
baa8be383ffb: Pull complete
55356608b4ac: Pull complete
dd35ceccb6eb: Pull complete
429b35712b19: Pull complete
162d8291095c: Pull complete
5e500ef7181b: Pull complete
af7528e958b6: Pull complete
Digest: sha256:e1bfe11693ed2052cb3b4e5fa356c65381129e87e38551c6cd6ec532ebe0e808
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址

# 下载指定版本,共用的层会复用,不用重复下载
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
d121f8d1c412: Already exists
f3cebc0b4691: Already exists
1862755a0b37: Already exists
489b44f3dbb4: Already exists
690874f836db: Already exists
baa8be383ffb: Already exists
55356608b4ac: Already exists
277d8f888368: Pull complete
21f2da6feb67: Pull complete
2c98f818bcb9: Pull complete
031b0a770162: Pull complete
Digest: sha256:14fd47ec8724954b63d1a236d2299b8da25c9bbb8eacc739bb88038d82da4919
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker rmi 删除镜像

1
2
docker rmi -f <镜像id> [<镜像id> <镜像id>]		# 删除指定的镜像
docker rmi -f $(docker images -aq) # 删除所有镜像

容器命令

**注:**有了镜像才可以创建容器,以centos镜像为例

1
docker pull centos

docker run [可选参数] 新建并启动容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 参数说明
--name="<Name>" 容器名字,自定义,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口,配置端口转发
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P 随机指定端口

例:
# 启动并进入容器
[root@localhost ~]# docker run -it centos /bin/bash
# 退出容器并关闭容器
[root@bebbdced119e /]# exit
# 退出容器但不关闭容器
Ctrl + p + q

docker ps [可选参数] 列出运行的容器

1
2
3
4
# 参数说明
-a 列出所有运行过的容器
-n=<n> 列出最近创建的n个容器
-q 只显示容器编号

**docker rm 删除容器

1
2
3
docker rm <容器id>				删除指定容器,不能删除正在运行的容器,若要强制删除加参数-f
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
3
4
docker run -d centos

# 问题:docker ps发现centos停止了
# 常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止

查看日志

1
2
docker logs -ft <容器id>				# 查看所有日志
docker logs -ft --tail <n> <容器id> # 查看最新的n条日志

**查看容器中的进程信息 **

1
docker top <容器id>

查看容器的元数据

1
docker inspect <容器id>

进入正在后台运行的容器

1
2
3
4
5
6
7
# 方法1
docker exec -it <容器id> <bashshell>
# 进入容器后开启一个新的终端,可以在里面操作(常用)

# 方法2
docker attach <容器id>
# 进入容器正在执行的终端,不会启动新的进程

从容器内拷贝文件

1
docker cp <容器id>:<容器内路径> <目的主机路径>