了解Docker

Docker是一个开源的`应用容器引擎`,让开发者可以打包他们的应用以及依赖到一个`可移植`的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现`虚拟化`,容器是完全使用`沙箱机制`,相互之间不会有任何接口。

了解Docker

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口

一个完整的Docker有以下几个部分组成:

  • DockerClient客户端
  • Docker Daemon守护进程
  • Docker Image镜像
  • DockerContainer容器

PS:来自百度百科(Docker的简介)

Docker概述

学习视频:Docker最新超详细版教程

参考文档:Docker的概述和安装

Docker是基于GO语言开发的开源项目

一些学习地址:

Docker与虚拟机的比较

PS:虚拟机技术

PS:Docker容器化技术

  • 传统虚拟机:虚拟出一系列硬件,运行一个完整的操作系统,然后在这个系统安装和运行软件
  • 容器内的应用直接运行在宿主机上,容器没有自己的内核,也没有虚拟出硬件,十分轻便
  • 每个容器都是相互隔离的,每个容器都有属于自己的文件系统,互不影响

Docker基本组成

基本概念:

  • 镜像(image):docker镜像可以比作一个模板,可以通过这个模板创建容器服务,tomcat镜像→run→tomcat01容器,通过镜像可以创建多个容器(最终服务运行或项目运行就是在容器中)

  • 容器(container):docker利用容器技术,独立地运行一个或一组应用,通过image来创建

    启动、停止、删除等基本命令

    PS:可以蒋容器理解为一个简单的Linux系统

  • 仓库(repository):仓库是存放镜像的地方,有公有和私有仓库之分

    PS:Docker Hub(默认是国外的),阿里云等平台都有容器服务器(配置镜像加速)

Docker作用

可以实现DevOps(开发,运维)

  • 应用更快速的交付和部署:打包镜像发布测试,一键运行
  • 更便捷的升级和扩缩容:使用Docker,部署像搭积木一样,项目打包为一个镜像,方便扩展
  • 更简单的系统运维:在容器化之后,开发和测试环境都是高度一致的
  • 更高效的计算资源利用:Docker是内核级别的虚拟化,可以在一个物理机上运行多个容器实例,容器的性能可以被压榨到极致

Docker安装

环境准备

  • Linux操作系统
  • Xshell(连接远程服务器)
1
2
3
4
#查看系统内核(系统内核3.10以上的)
uname -r
#查看系统信息
cat /etc/os-release

安装步骤

官网安装文档:https://docs.docker.com/engine/install/

CentOS系统
1
2
3
4
5
6
7
8
9
10
#卸载旧版本Docker系统(如果有点话)
sudo yum remove docker\
#安装需要的安装包
yum install -y yum-utils
#配置下载Docker镜像
sudo yum-config-manager\
--add-repo\
https://download.docker.com/linux/centos/docker-ce.repo
#安装docker,一路输入确定安装即可
sudo yum install docker-ce docker-ce-li containerd.io

启动测试

1
2
3
4
5
6
7
8
#查看docker是否安装成功和版本
docker -v
#启动docker
systemctl start docker
#运行测试
docker run hello-world
#查看下载的hello-world镜像
docker images

卸载Docker

1
2
3
4
#卸载
yum remove docker-ce docker-ce-li containerd.io
#删除文件(/var/lib/docker时是docker的默认工作路径)
rm -rf /var/lib/docker

Docker配置阿里云镜像仓库地址

参考教程:https://www.cnblogs.com/allenjing/p/12575972.html

  • 登录阿里云找到容器镜像服务
  • 选择镜像加速器复制加速器地址
1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":["https://bjyjzfeq.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker运行原理

底层原理:

Docker工作原理:Docker是一个CS结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问

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

Docker常用命令

帮助命令

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
37
38
39
40
41
42
43
44
45
46
#显示版本
docker version
#显示Docker的系统信息
docker info
#帮助信息
docker --help
Commands:
attach # 当前 shell 下 attach 连接指定运行镜像
build # 通过 dokcerfile 定制镜像
commit # 提交当前容器为新的镜像
cp # 从容器中拷贝指定文件或目录到宿主机
create # 创建一个新的容器 ,同 run ,但不会启动容器
diff # 查看 docker 容器变化
events # 从 docker 服务器获取容器实时事件
exec # 在已存在的容器上运行命令
export # 导出容器的内容流作为一个 tar 归档文件(对应 import)
history # 展示镜像的形成历史
images # 列出系统当前所有镜像
import # 从 tar 包中的内容创建一个新的文件系统映像(对应 export)
info # 查看系统相关信息
inspect # 查看容器详细信息
kill #kill 指定的 docker 容器
load # 从一个 tar 包中加载一个镜像(对应 save)
login # 注册或登陆一个 docker 源服务器
logout # 登出当前源服务器
logs # 输出当前容器的日志内容
pause # 暂停容器
port # 查看映射端口对应的容器内部源端口
ps # 列出容器列表
pull # 从 docker 镜像源服务器拉取指定镜像或库镜像
push # 推送指定镜像或者库镜像到 docker 源服务器
rename #
restart # 重启运行的容器
rm # 移除一个或多个容器
rmi # 移除一个或多个镜像
run # 创建一个新的容器并运行一个命令
save # 保存一个镜像为一个 tar (对应 load)
search # 在 docker hub 中搜索镜像
start # 启动容器
stop # 停止容器
tag # 给源镜像打标签
top # 查看容器中运行的进程消息
unpause # 取消暂停容器
version # 查看容器版本号
wait # 获取容器停止时的退出状态值

镜像命令

  • docker images
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#主机上的所有本地镜像
docker images help
REPOSITORY TAG IMAGE ID CREATED SIZE
# 解释
REPOSITORY:镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像的 ID
CREATED:创建时间
SIZE:大小
# 可选项
-a --all # 列出所有镜像
-q --quiet # 只列出镜像的 ID
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
  • docker search
1
2
3
4
#搜索镜像
docker search hello-world
#搜索镜像的star>1000的镜像
docker search hello-world --filter=stars=3000
  • docker pull
1
2
3
4
5
6
#下载镜像[:tag]  (不写tag默认就是latest)
docker pull mysql
#等价写法 (docker.io/library/mysql:latest为存放的镜像的文件真实地址)
docker pull docker.io/library/mysql:latest
#下载指定版本
docker pull mysql:5.7
  • docker rmi
1
2
3
4
5
#删除镜像
# docker rmi 镜像 ID [镜像 ID,...] 删除没有运行容器的镜像
docker rmi bbf6571db497
#docker rmi -f 镜像 ID [镜像 ID,...] 删除连带删除容器的镜像
#docker rmi -f $(docker images -aq) 删除所有容器和镜像

容器命令

1
2
3
4
5
6
7
8
9
10
11
12
#前置环境:下载一个centos镜像
docker pull centos
#新建并运行容器
docker run --help
docker run -it centos /bin/bash
#列出所有运行的容器
docker ps
#-q 只显示容器编号,-a 列出当前正在运行的容器+带出历史运行过的容器,-n=? 显示最新常见的容器的个数
#直接容器停止并退出
exit
#容器不停止而退出
Ctrl+P+Q
  • 删除容器
1
2
3
4
5
6
# 删除指定的容器,rm -f 表示强制删除正在运行的容器 
docker rm [-f] 容器 ID
# 删除所有的容器
docker rm -f $(docker ps -aq)
# 删除所有容器
docker ps -a -q|xargs docker rm
  • 启动停止容器
1
2
3
4
5
6
7
8
9
10
# 启动容器 
docker start 容器 ID
# 重启容器
docker restart 容器 ID
# 停止正在运行的容器
docker stop 容器 ID
# 强制停止当前运行的容器
docker kill 容器 ID
# 后台启动容器
docker run -d centos

常见问题:-d 运行之后,docker ps 发现它并没有运行

原因:docker 容器使用后台运行,就必须要有一个前台进程,docker 发现没有应用,就会自动停止

nginx 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了。

  • 查看容器进程的信息
1
docker top 018801a5cdcf
  • 查看镜像中的元数据
1
docker inspect 018801a5cdcf 
查看评论