Docker入门

一、Docker简介

简单来说,Docker就是一个引擎,一个可以创建镜像的引擎。Docker分为三大部分,分别为镜像、容器、仓库。

  • 镜像:docker镜像就相当于一个模板,这个模板可以创建多个容器,比如,镜像是一个类,类有多个实例。
  • 容器:docker容器可以运行一个或者多个应用,它是通过镜像来创建的。一个docker容器就相当于一个小型的Linux系统,因为容器里面有些指令是被删除的,比如vim指令等。
  • 仓库:docker仓库是存放镜像的地方,比如DockerHub、阿里云镜像仓库。

总体的架构图如下:

docker 采用多容器还是多镜像 docker一个容器多个镜像_docker

二、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

结果:

docker 采用多容器还是多镜像 docker一个容器多个镜像_linux_02

三、配置阿里云镜像加速

如图所示操作:

  • 搜索容器镜像服务,然后点击镜像加速器,复制红色框的代码直接怼进去就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一个容器多个镜像_mysql_03


docker 采用多容器还是多镜像 docker一个容器多个镜像_docker 采用多容器还是多镜像_04

五、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

结果如下

docker 采用多容器还是多镜像 docker一个容器多个镜像_docker 采用多容器还是多镜像_05

七、部署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 采用多容器还是多镜像 docker一个容器多个镜像_docker 采用多容器还是多镜像_06

八、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等标准目录和文件。

docker 采用多容器还是多镜像 docker一个容器多个镜像_linux_07


docker 采用多容器还是多镜像 docker一个容器多个镜像_mysql_08


镜像之间的资源是共享的,比如A比B第一层,如果A中包含了B中需要的资源,那么在创建B镜像的时候,就不需要再下载重复的资源了。镜像本身是只读的,创建了容器之后,就相当于在镜像上面加一层可操作的层。

九、容器数据卷

什么是数据卷

当我们在使用docker的时候,会产生一些数据,但是一旦关闭了docker容器之后,这些数据也就会随之消失,所以我们需要对docker容器中有用的数据进行持久化,就需要我们把这些数据挂载到Linux本机上。

特点

  1. 数据卷可以实现容器之间共享和重用数据。
  2. 卷的更改不会包含在镜像的更新中。
  3. 卷的声明周期=开始创建~没有容器使用了。
  4. 在容器外部的挂载文件修改内容,可以同步到容器里面。

使用数据卷

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 采用多容器还是多镜像 docker一个容器多个镜像_linux_09


docker 采用多容器还是多镜像 docker一个容器多个镜像_docker_10

匿名和具名挂载

  1. 匿名挂载
    挂载时没有指定本地名字,所以生成的名字是一串随机的字符串。
docker run -d --name nginx01 -P -v /etc/ngnix ngnix:1.19.2-alpine
参数解释
-P 随机端口映射
# 查看docker挂载,可见名字是匿名的。
docker volume ls

docker 采用多容器还是多镜像 docker一个容器多个镜像_docker_11

  1. 具名挂载
    挂载时指定了本地名字,通过这个名字可以查看这个卷的相关信息(路劲等)
docker run -d --name ngnix01 -v testNgnix:/etc/ngnix ngnix:1.19.2-alpine

# 通过卷的名字查看相关信息
docker volume inspect testNgnix

# 没有指定目录的话,一般都在/var/lib/docker/volume/xxxx/_data文件夹下面

docker 采用多容器还是多镜像 docker一个容器多个镜像_linux_12


拓展

# 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