文章目录
1.Docker概述
- 简介
Docker 是一个开源的应用容器引擎,基于 Go 语言
并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
- 背景
项目线上环境的配置是十分麻烦的,特别是不是很熟悉Linux的朋友。每一个机器都要部署环境(Redis集群、ES…),而且Windows到Linux也有很多坑,费时费力。
我们开发好一个项目,打成一个jar或war包很容易,但是部署前服务器的环境安装和配置可能一天又过去了还装不好!想着如何可以在打成jar包的时候把我们开发时的环境也带上?
从
jar ----> 服务器(Redis、ES、JDK、Mysql…) 需要开发+运维
到
jar+容器(Redis、ES、JDK、Mysql…) ----> 服务器 (即项目带上环境安装打包)开发人员就能搞定
Docker给出了以上问题的解决方案!
JRE–多个应用(端口冲突)—原来都是交叉的!
隔离:Docker核心思想!打包装箱!每个箱子是互相隔离的。通过该机制,可以将服务器利用到极致。
- 相关网站
官方网站:
官方文档:(超详细)
仓库地址:(类似github)
docker中文网:
https://www.docker.org.cn/index.html
菜鸟教程:
https://www.runoob.com/docker/docker-tutorial.html
- 作用
传统虚拟机
Docker
区别:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内核,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。
DevOps(开发、运维)
- 应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
- 更便捷的升级和扩容
项目打包成一个镜像
- 更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
- 更高效的计算资源利用
2. Docker基本组成
Docker架构图
镜像( image ) :
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run ==> tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器( container ) :
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。启动,停止,删除,基本命令!目前就可以把这个容器理解为就是一个简易的linux系统
仓库(repository ) :
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库!
Docker Hub (默认是国外的)
阿里云…都有容器服务器(配置镜像加速)
3. Docker使用
3.1 操作环境
使用阿里云服务器
环境参数:
系统版本信息
:
内核参数
:3.10.0-1160.11.1.el7.x86_64
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vOANR7iP-1626274830897)(C:/Users/Gangbb/AppData/Roaming/Typora/typora-user-images/image-20210713124130815.png)]
3.2 Docker安装
下载地址:https://docs.docker.com/engine/install/
- 卸载旧版本docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装需要的工具包
yum install -y yum-utils
- 设置docker镜像仓库
# 1.官网默认镜像(国外的,很慢)
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 2.阿里云镜像(推荐,快得多)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装最新的docker引擎
先更新下软件包的索引
yum makecache fast
安装引擎
# ce-社区版 ee-企业版 (一般都是用社区版)
yum install docker-ce docker-ce-cli containerd.io
Ps:如果想要安装指定版本:
# VERSION_STRING是版本号 yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
- 启动docker
systemctl start docker
启动后查看docker信息:
docker version
说明启动成功!
- helle world测试
- 拉取hello world
docker run hello-world
- 查看hello world镜像
docker images
- 如果需要卸载docker
# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除资源
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
3.3 阿里云镜像加速
- 登录到阿里云控制台,搜索
容器镜像服务
- 找到镜像加速地址
- 配置使用
# 1. 创建一个目录
sudo mkdir -p /etc/docker
# 2. 编写配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://6f5o0pi2.mirror.aliyuncs.com"]
}
EOF
# 3. 服务重启
sudo systemctl daemon-reload
# 4. 重启docker
sudo systemctl restart docker
4. Docker运行流程和原理
运行流程
底层原理
Docker是一个Client - Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!DockerServer接收到Docker-Client的指令,就会执行这个命令!
Docker为什么比虚拟机快
1、Docker有着比虚拟机更少的抽象层。
2、docker利用的是宿主机的内核,vm需要是Guest Os.
所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导性的操作。虚拟机是加载Guest OS,分钟级别的,而docker 是利用宿主机的操作系统吗,省略了这个复杂的过程,秒级!
对比图
5. Docker的常用命令
5.1 帮助命令
# 显示docker版本信息
docker version
# 显示docker的系统信息,包括镜像和容器的数量
docker info
# docker 帮助命令
docker --help 或者 docker 某命令 --help
官网的命令查看地址:https://docs.docker.com/reference/
别人的docker命令笔记:https://www.docker.org.cn/dockerppt/106.html
5.2 镜像命令
5.2.1 查看所有镜像
docker images
[root@LYX ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 c0e850d7b9bb 2 months ago 667MB
tomcat latest c0e850d7b9bb 2 months ago 667MB
minio/minio latest 305cf2390a4e 2 months ago 184MB
hello-world latest d1165f221234 4 months ago 13.3kB
REPOSITORY = 镜像的仓库源
TAG = 镜像的标签
IMAGE ID = 镜像的id
CREATED = 镜像的创建时间
SIZE = 镜像的大小
docker images
其他可选项
[root@LYX ~]# docker images --help
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all Show all images (default hides intermediate images) (列出所有镜像)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs (只显示镜像的id)
5.2.2 搜索镜像
可以在官网的网页搜索:https://registry.hub.docker.com/
命令搜索:
docker search xxx
docker search
其他可选项(一些筛选条件)
[root@LYX ~]# docker search --help
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 search mysql -filter=STARS=3000
5.2.3 下载镜像
docker pull 镜像名[:tag]
示例(不指定版本下载):
[root@LYX ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql # 不写tag,默认下载最新版
b4d181a07f80: Pull complete # 分层下载:docker image的核心 联合文件系统
a462b60610f5: Pull complete
578fafb77ab8: Pull complete
524046006037: Pull complete
d0cbe54c8855: Pull complete
aa18e05cc46d: Pull complete
32ca814c833f: Pull complete
9ecc8abdb7f5: Pull complete
ad042b682e0f: Pull complete
71d327c6bb78: Pull complete
165d1d10a3fa: Pull complete
2f40c47d0626: Pull complete
Digest: sha256:52b8406e4c32b8cf0557f1b74517e14c5393aff5cf0384eff62d9e81f4985d4b # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# 由最后一行可知:docker pull mysql = docker pull docker.io/library/mysql:latest
示例(指定版本下载):
先去官网搜索到所支持的版本
[root@LYX ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
b4d181a07f80: Already exists # 可以看到前面下载的最新版已经带有这些东西,可以公用,就不用下载了,极大减少内存。
a462b60610f5: Already exists
578fafb77ab8: Already exists
524046006037: Already exists
d0cbe54c8855: Already exists
aa18e05cc46d: Already exists
32ca814c833f: Already exists
52645b4af634: Pull complete
bca6a5b14385: Pull complete
309f36297c75: Pull complete
7d75cacde0f8: Pull complete
Digest: sha256:1a2f9cd257e75cc80e9118b303d1648366bc2049101449bf2c8d82b022ea86b7
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
看看结果:
5.2.4 删除镜像
根据id删除:
docker rmi -f 镜像id
示例:
批量删除:
docker rmi -f 镜像id 镜像id 镜像id 镜像id...
删除全部容器:
docker rmi -f $(docker images -ap)
5.3 容器命令
**说明:**我们有了镜像才可以创建容器。
- 下载一个centos镜像
docker pull centos
- 新建容器并创建
docker run [可选参数] image
# 参数说明
--name="Name" # 容器名字,用于区分容器
-d # 后台方式运行
-it # 使用交互方式进行,进入容器查看内容
-p # (小写p)指定容器的端口 -p 8080:8080
-p 主机端口:容器端口 # 主机端口映射容器端口(常用)
-p ip:主机端口:容器端口 # 上面的基础再带个ip
-p 容器端口
-P # (大写P)随机指定端口
测试
[root@LYX ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 5c62e459e087 2 weeks ago 556MB
tomcat 9.0 c0e850d7b9bb 2 months ago 667MB
tomcat latest c0e850d7b9bb 2 months ago 667MB
minio/minio latest 305cf2390a4e 2 months ago 184MB
hello-world latest d1165f221234 4 months ago 13.3kB
centos latest 300e315adb2f 7 months ago 209MB
[root@LYX ~]# docker run -it centos /bin/bash # (启动并进入容器)
[root@c32b27564ef1 /]# ls #(查看容器内的 centos的 目录)
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
# 容器内的centos跟外面没有半点关系,而且只是centos的基础版本,很多命令不完善
退出容器
- 查看所有运行中的容器
# 查看所有运行中的容器
docker ps
# 查看所有运行过的容器(运行中+历史运行过的)
docker ps -a
# 最近创建的容器
docker ps -a -n=x
# 只显示容器编号
docker ps -q docker ps -aq
- 退出容器
# 容器直接停止并退出
exit
# 快捷键方式,容器不停止退出
Ctrl + P + Q
exit
:离开容器,并关闭容器,这种好比要出门了,且要关灯,只有等下次重新启动该容器后,才会再次打开灯。Ctrl + p + q
:暂时离开容器,还会回来,这种好比临时出门,下楼拿快递就回来,此时状态容器状态还是 up 运行中。
- 删除容器
# 删除指定容器,不能删除正在运行的容器,如需强制删除需要 rm -f
docker rm 容器id
# 删除所有容器
docker rm -f $(docker ps -aq)
# 通过管道删除所有容器 (查出所有容器过滤到docker rm)
docker ps -a -q|xargs docker rm
- 启动和停止容器
# 启动容器
docker start 容器id
# 重启容器
docker restart 容器id
# 停止当前正在运行的容器
docker stop 容器id
# 强制停止当前容器
docker kill 容器id
5.4 其他重要命令
- 后台启动容器
docker run -d 镜像名
示例:
运行后发现并没有centos在运行!
坑: docker 容器使用后台运行,就必须要有一个前台进程,dokcer发现没有应用,就会自动停止。
- 查看日志
docker logs -tf --tail 日志条数 容器id
- 容器中进程信息
docker top 容器id
- 查看镜像的元数据
docker inspect 容器id
- 进入当前正在运行的容器
因为我们通常都是使用后台方式运行的,需要进入容器,修改一些配置。
# 方式一
docker exec -it 容器id bashshell(例如:/bin/bash)
# 方式二
docker attach 容器id
两者区别:
docker exec
:进入容器后开启一个新的终端,可以在里面操作(常用)docker attach
:进入容器正在执行的终端,不会启动新的进程
- 从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径
PS:拷贝是一个手动的过程,未来我们使用 -v 卷技术,可以实现自动备份