Docker入门
一、Docker简介
简单来说,Docker就是一个引擎,一个可以创建镜像的引擎。Docker分为三大部分,分别为镜像、容器、仓库。
- 镜像:docker镜像就相当于一个模板,这个模板可以创建多个容器,比如,镜像是一个类,类有多个实例。
- 容器:docker容器可以运行一个或者多个应用,它是通过镜像来创建的。一个docker容器就相当于一个小型的Linux系统,因为容器里面有些指令是被删除的,比如vim指令等。
- 仓库:docker仓库是存放镜像的地方,比如DockerHub、阿里云镜像仓库。
总体的架构图如下:
二、Docker安装流程
- 首先卸载旧版本,无论有没有下载过,最好都执行一下以下指令。
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
install -y yum-utils \
device-mapper-persistent-data \
lvm2
- 设置Docker仓库(阿里云)
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装最新版本的 Docker Engine-Community 和 containerd
yum install docker-ce docker-ce-cli containerd.io
# ce是社区版、ee是企业版;这可以看成下载docker的服务端、客户端和容器
- 启动docker、并运行hello-world镜像
systemctl start docker
docker run hello-world
结果:
三、配置阿里云镜像加速
如图所示操作:
- 搜索容器镜像服务,然后点击镜像加速器,复制红色框的代码直接怼进去就ok了。
- 为了大家方便,臭弟弟把代码给放下面了:
# 常见docker目录
sudo mkdir -p /etc/docker
# 创建配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://kwfc34wp.mirror.aliyuncs.com"]
}
EOF
# 重启服务
sudo systemctl daemon-reload
# 重启docker
sudo systemctl restart docker
四、Docker的优点
为什么Docker比VM还要快呢?
- Docker是操作系统层面上的虚拟化,它不需要虚拟出完整的系统硬件功能,它是跟宿主机一起共享内核的,相当于虚拟机上的一个进程。它采用
命名空间
进行隔离,采用copy-on-write
实现高效的文件读写操作,能够快速的实现交付和部署,启动也是秒级的。 - VM是硬件层面上的虚拟化,需要虚拟出一个完整的Guest OS内核,启动是分钟级的。
- Docker容器可以随时启动和关闭,有利于扩容和缩容;而且一台机子可以运行多个Docker容器,有利于构建微服务架构。
详情见下图
五、Docker常用命令
帮助命令
docker version #查看版本
docker info #查看docker的详细信息
docker 命令 --help #查看帮助文档
docker images -a #查看所有镜像的所有信息
docker images -aq #查看所有镜像的id
搜索命令
docker search mysql #搜索mysql最新镜像
docker search --filter=star=3000 #搜索id大于3000的mysql
下载命令
docker pull mysql #下载最新版本(默认)的mysql镜像
docker pull mysql:5.7 #下载指定版本的mysql镜像
# 直接运行也算是下载————后台运行
docker run -d --name mysql01 mysql:5.7 /bin/bash
删除命令
docker rmi -f tomcat:9.0 #删除tomcat:9.0镜像
docker rmi -f $(docker images -aq) #按照镜像id,强制删除所有镜像。
容器相关命令
# 拉取mysql5:7镜像
docker pull mysql:5.7
# 运行
docker run -d --name mysql01 -p 3306:3306 mysql:5.7 /bin/bash
# 参数解释
-d: 代表后台运行。
--name:代表给这个容器起一个别名
-p:代表端口映射,写在左边的端口是本机端口,也就是远程端口;写在右边的是容器端口。
/bin/bash:表示通过该形式启动容器。
-it:交互运行,进去之后重新开启一个新的终端。
# 退出并关闭容器
exit
# 列出所有容器
docker ps -aq
# 参数解释
-a:列出所有容器,包括正在运行和已经停止的容器的所有信息
-aq:列出所有容器的id。
# 删除容器
docker rm -f 容器id/容器名称
docker rm -f $(docker ps -aq) 按照id删除所有容器
# 启动停止容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
# 查看日志
docker logs -tf --tail 10 容器id
# 参数解释
-tf:显示时间戳
--tail:后面加 n,表示显示前几行日志
# 查看进程信息
docker top $(docker ps -aq)
# 查看docker详细信息
docker inspect 容器id
# 进入容器
docker exec -it 容器id /bin/bash --会开启一个新的终端
docker attach 容器id -- 进入正在执行的终端
# 拷贝,将容器的文件/文件夹拷贝到本机
docker cp 容器id:/usrl/local/test.java /usr/local
六、部署Nginx
# 1. 从远程拉取Ngnix镜像。
docker pull ngnix:1.19.2-alpine
# 2. 运行该镜像,创建容器。
docker run -d --name ngnix01 -p 3344:80 ngnix:1.19.2-alpine
# 3. 访问ngnix
curl localhost:3344
结果如下
七、部署tomcat
# 1. 下载tomcat镜像
docker pull tomcat
# 2. 运行tomcat镜像
docker run -d --name tomcat01 -p 3355:8080 tomcat
# 3. `此时有个需要注意的点`
docker exec -it tomcat01 /bin/bash
进入tomcat01镜像后,进入webapps文件夹
cd webapps
ls -ll
发现这个文件里面什么都没有,其实,主要的文件都在webapps.dist文件夹下。
# 4. 拷贝webapps.dist下的文件到webapps文件夹下。
cp -r webapps.dist/* webapps/
# 5. 访问测试
curl localhost:3355
结果如下图
八、Docker镜像原理
1、镜像
镜像其实就是一种可执行的、轻量级的独立软件包,它包含软件的运行环境和基于这个环境可运行的软件。它包括运行某个软件所需要的所有内容,比如代码、配置文件、环境变量等等。
2、UnionFS
UnionFS,即联合文件系统,它是一种分层的、高性能的轻量级文件系统,它支持对文件的修改作为一次提交来一层层的叠加,同时可以将不同的目录挂载在同一虚拟文件下。
UnionFS是镜像的基础,镜像可以通过分层来进行继承,下载一个镜像时,会加载多个文件系统,但是从外部看起来只加载了一个文件系统。
3、镜像的加载原理
其实,镜像的加载是一层层叠加起来的。
Bootfs,包括BootLoader和Kernel,BootLoader引导加载Kernel。当Linux启动时,就会加载Bootfs文件系统,在Docker中,底层也是Bootfs文件系统,所以当Docker完成加载时,Kernel已经保存在内存中,那么Kernel的使用权就转交给了内存,此时Bootfs就会被卸载。
Rootfs,在Bootfs之上,包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。
镜像之间的资源是共享的,比如A比B第一层,如果A中包含了B中需要的资源,那么在创建B镜像的时候,就不需要再下载重复的资源了。镜像本身是只读的,创建了容器之后,就相当于在镜像上面加一层可操作的层。
九、容器数据卷
什么是数据卷
当我们在使用docker的时候,会产生一些数据,但是一旦关闭了docker容器之后,这些数据也就会随之消失,所以我们需要对docker容器中有用的数据进行持久化,就需要我们把这些数据挂载到Linux本机上。
特点
- 数据卷可以实现容器之间共享和重用数据。
- 卷的更改不会包含在镜像的更新中。
- 卷的声明周期=开始创建~没有容器使用了。
- 在容器外部的挂载文件修改内容,可以同步到容器里面。
使用数据卷
docker run -it -v 主机目录:容器目录 镜像
例如
docker run -it --name tomcat01 -v /usr/local/data:/usr/data tomcat
# 退出容器 Ctrl+P+Q,切换到/usr/local/data目录下
cd /usr/local/data
mkdir -p ../data/mydata/test.java
# 然后切换到容器里面
docker exec -it tomcat01
cd /usr/data
发现里面多了mydata文件夹,下面还有test.java文件。
因为自己在学习的时候忘记截图了,大家可以自己实践一下。
MYSQL持久化(防止删容器跑路)
# 先创建一个mysql01容器
docker run -it --name mysql01 \
-p 3306:3306 \
-v /usr/local/mysql/data:/val/lib/mysql \
-v /usr/local/mysql/config:/etc/mysql/config.d \
-e MYSQL_ROOT_PASSWORD=888888 \
mysql:5.7
# 通过navicat连接上数据库后,创建一个dockertest数据库
# 接着删除mysql01容器,本地dockertest数据库仍不会被删除
# 详情见下图
匿名和具名挂载
- 匿名挂载
挂载时没有指定本地名字,所以生成的名字是一串随机的字符串。
docker run -d --name nginx01 -P -v /etc/ngnix ngnix:1.19.2-alpine
参数解释
-P 随机端口映射
# 查看docker挂载,可见名字是匿名的。
docker volume ls
- 具名挂载
挂载时指定了本地名字,通过这个名字可以查看这个卷的相关信息(路劲等)
docker run -d --name ngnix01 -v testNgnix:/etc/ngnix ngnix:1.19.2-alpine
# 通过卷的名字查看相关信息
docker volume inspect testNgnix
# 没有指定目录的话,一般都在/var/lib/docker/volume/xxxx/_data文件夹下面
拓展
# ngnix01容器对该目录的权限是只读
docker run -d -P --name nginx01 -v /usr/local/ngnix:/etc/ngnix:ro ngnix
# ngnix01容器对该目录的权限是读写
docker run -d -P --name ngnix01 -v /usr/local/ngnix:/etc/ngnix:rw ngnix