第1集 什么是docker?
一、Docker简介
1.1 什么是虚拟化?
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。
1.2 什么是Docker
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
1.3 为什么选择Docker?
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
(1)更高效的利用系统资源。
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
(2)更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
(3)一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
(4)持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
(5)更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
(6)更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
1.4 docker的基本组成
-
镜像(image)
Docker的镜像image就是一个只读的模板。镜像可以用来创建Docker的容器,一个镜像可以创建很多容器。
-
容器(container)
镜像(image)和容器(container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
-
仓库(repository)
-
仓库repository是集中存放镜像文件的场所。
-
仓库repository和仓库注册服务器registry是由区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签tag。
-
仓库分为公开仓库和私有仓库两种形式。
-
最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。
-
国内的公开仓库包括阿里云、网易云等。
-
总结
-
Docker本身是一个容器运行载体或者称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器。image文件可以看做是容器的模板。Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。
-
image文件生成的容器实例,本身也是一个文件,称为镜像文件。
-
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器。
-
至于仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库中拉下来就可以了。
第2集 安装docker
本次安装是在CentOS7版本上
1.卸载docker引擎
# 1.卸载docker引擎
sudo yum remove docker*
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
# 2.先安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3. 设置稳定版仓库 官方(不推荐 下载慢)
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4. 安装指定docker版本
#查找docker版本
yum list docker-ce --showduplicates | sort -r
sudo yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6
#当然你也可以安装最新版本
yum install docker-ce
5. 启动&开机启动docker
systemctl enable docker --now
#6. 查看docker 启动状态
systemctl status docker
#查看docker版本
docker version
7. docker加速配置(阿里云镜像加速地址)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://b94z7sno.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
8. 安装docker compose
curl -SL https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
第3集 Docker进程相关命令
一、docker基本命令
1. 启动Docker服务
systemctl start docker
2. 停止Docker服务
systemctl stop docker
3. 重启Docker服务
systemctl restart docker
4. 查看Docker服务状态
systemctl status docker
5. 开机自启动Docker服务
systemctl enable docker
二、镜像相关命令
1 搜索镜像
# 从网络上查找需要的镜像
docker search 镜像名称
2拉取镜像
# 从Docker的仓库下载镜像到本地,镜像名称格式为名称:版本号,如果版本号不指定则是最新的版本。如果不知道镜像版本,可以去Docker Hub搜索对应镜像查看即可。
docker pull 镜像名称
3 查看镜像
# 查看本地镜像
docker images
# 查看本地所有镜像
docker images -a
# 查看本地镜像的id
docker images -q
4 删除镜像
# 删除镜像 -f表示强制删除
docker rmi [-f] 镜像id[镜像名称]
# 删除所有镜像
docker rmi -f $(docker images -qa)
三、容器相关命令
1 . 查看运行的容器
# 查看正在执行的容器
docker ps
# 查看所有的容器
docker ps -a
2. 创建并启动容器
docker run 参数
参数说明:
-i:保持容器运行。通过和-t同时使用。加入-it这两个参数以后,容器创建后会自动进入容器中,退出容器后,容器会自动关闭。
-t:为容器重新分配一个伪输入终端,通常和-i同时使用。
-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。
-it:创建的容器一般称为交互式容器。
-id:创建的容器一般称为守护式容器、
--name:威创建的容器命名。
-p:映射端口 外部端口:容器内部暴露的端口
3. 进入容器
docker exec -it 容器id[容器名称] /bin/bash
4. 查看容器信息
docker inspect 容器id[容器名称]
5. 停止容器
docker stop 容器id[容器名称]
6. 启动容器
docker start 容器id[容器名称]
7. 重启容器
docker restart 容器id[容器名称]
8. 强制停止容器
docker kill 容器id[容器名称]
9. 删除容器
# 需要先停止容器,然后再删除
docker rm 容器id[容器名称]
# 强制删除容器
docker rm -f 容器id[容器名称]
# 强制删除所有容器
docker rm -f $(docker ps -qa)
10. 查看容器日志
docker logs -f 容器id[容器名称]
四、常用命令
attach Attach to a running container # 当前 shell 下 attach 连接指定运行镜像
build Build an im from a Docker registry server # 从当前 Docker registry 退出
logs Fetch the logs of a container # 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口对应的容器内部源端口
pause Pause all processes within a container # 暂停容器
ps List containers # 列出容器列表
pull Pull an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器
restart Restart a running container # 重启运行的容器
rm Remove one or more containers # 移除一个或者多个容器
rmi Remove one or more images # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run Run a command in a new container # 创建一个新的容器并运行一个命令
save Save an image to a tar archive # 保存一个镜像为一个 tar 包[对应 load]
search Search for an image on the Docker Hub # 在 docker hub 中搜索镜像
start Start a stopped containers # 启动容器
stop Stop a running containers # 停止容器
tag Tag an image into a repository # 给源中镜像打标签
top Lookup the running processes of a container # 查看容器中运行的进程信息
unpause Unpause a paused container # 取消暂停容器
version Show the docker version information # 查看 docker 版本号
wait Block until a container stops, then print its exit code # 截取容器停止时的退出状态值age from a Dockerfile # 通过 Dockerfile 定制镜像
commit Create a new image from a container changes # 提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container # 创建一个新的容器,同 run,但不启动容器
diff Inspect changes on a container's filesystem # 查看 docker 容器变化
events Get real time events from the server # 从 docker 服务获取容器实时事件
exec Run a command in an existing container # 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history Show the history of an image # 展示一个镜像形成历史
images List images # 列出系统当前镜像
import Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]
info Display system-wide information # 显示系统相关信息
inspect Return low-level information on a container # 查看容器详细信息
kill Kill a running container # kill 指定 docker 容器
load Load an image from a tar archive # 从一个 tar 包中加载一个镜像[对应 save]
login Register or Login to the docker registry server # 注册或者登陆一个 docker 源服务器
logout Log out
第4集 Docker 的数据卷
在Docker的使用过程中往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,所以这就涉及到Docker容器的数据操作。容器中数据管理主要有两种方式:数据卷和数据卷容器。
一、 数据卷
1. 数据卷的作用:
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
2. 配置数据卷
- 命令
docker run ... -v 宿主机目录(文件):容器内目录(文件) ...
注意事项:
①目录必须是绝对路径。
②如果目录不存在,则会自动创建。
③可以挂载多个数据卷。
- 一个容器挂载一个数据卷
docker run -id --name c1 -v /root/data:/root/data_container centos:7
-
两个容器挂载同一个数据卷
docker run -id --name c1 -v /root/data:/root/data_container centos:7 docker run -id --name c2 -v /root/data:/root/data_container centos:7
-
数据卷分类
-
指定目录挂载
# 宿主名目录(文件)的路径为绝对路径 docker run ... -v 宿主机目录(文件):容器内目录(文件) ...
-
示例
docker run -d -v /var/log/nginx:/var/log/nginx/ --name nginx nginx
-
-
匿名目录挂载
# 可以在宿主机的/var/lib/docker/volumes目录中找到容器挂载的目录,但是目录的名称是随机的 docker run ... -v 容器内目录(文件) ...
-
示例
docker run -d -v /var/log/nginx/ --name nginx nginx
-
-
具名目录挂载
#可以在宿主机的/var/lib/docker/volumes目录中找到容器挂载的目录,但是目录的名称是自己指定的 docker run ... -v 名称:容器内目录(文件) ...
-
示例
docker run -d -v nginx80:/var/log/ --name nginx nginx
-
-
二、数据卷容器
概念
-
多容器进行数据交换。
-
多个容器挂载同一个数据卷。
-
数据卷容器。
配置数据卷容器
-
创建启动c3数据卷容器,使用-v参数设置数据卷
docker run -id -v /volume --name c3 centos:7
-
创建启动c1、c2容器,使用–volumes-from参数设置数据卷。
docker run -id --volumes-from c3 --name c1 centos:7 docker run -id --volumes-from c3 --name c2 centos:7
这种情况下,如果移除己挂载卷的容器,无论是最初的dbstore
容器,还是后面的db1
或db2
容器,卷都不会被移除。要将卷从硬盘上移除,必须使用docker rm -v
命令删除最后一个引用了该卷的容器。
第5集 Docker部署应用
一、部署MYSQL数据库
需求: Docker中部署Mysql,并通过外部Mysql客户端操作Mysql数据库
- 实现步骤
-
①搜索MySQL镜像。
-
②拉取MySQL镜像。
-
③创建容器。
-
④操作容器中的MySQL。
-
- 示例
#搜索MySQL镜像
docker search mysql
#拉取MySQL镜像
docker pull mysql:5.7
#创建容器,设置端口映射、目录映射
docker run -id -p 3306:3306 --name mysql5.7 -v /var/mysql5.7/conf:/etc/mysql/conf.d -v /var/mysql5.7/logs:/logs -v /var/mysql5.7/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai --restart=always mysql:5.7 --lower_case_table_names=1
二、Docker安装Tomcat
需求:在Docker容器中部署Tomcat,并通过外部机器访问Tomcat部署的项目。
- 实现步骤
-
①搜索Tomcat镜像。
-
②拉取Tomcat镜像。
-
③创建容器。
-
④部署项目。
-
⑤测试访问。
-
- 应用示例
# 搜索Tomcat镜像
docker search tomcat
# 拉取tomcat镜像
docker pull tomcat
# 创建容器,设置端口映射、目录映射
docker run -id --name tomcat -p 8080:8080 -v /var/tomcat:/usr/local/tomat/webapps tomcat
三、Docker安装Nginx
需求:在Docker容器中部署Nginx,并通过外部机器访问Nginx。
- 实现步骤
-
①搜索Nginx镜像。
-
②拉取Nginx镜像。
-
③创建容器。
-
④测试访问
-
- 应用示例
# 搜索Nginx镜像
docker search nginx
# 拉取Nginx镜像
docker pull nginx
# 创建容器,设置端口映射、目录映射
# niginx的配置文件
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
#启动Nginx
docker run -id --name=nginx \
-p 80:80 \
-v /var/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /var/nginx/logs:/var/log/nginx \
-v /var/nginx/html:/usr/share/nginx/html \
nginx
三、Docker安装Redis
需求:在Docker容器中部署Redis,并通过外部机器访问Redis。
- 实现步骤
-
①搜索Redis镜像。
-
②拉取Redis镜像。
-
③创建容器。
-
④测试访问。
-
- 应用示例
# 搜索Redis镜像
docker search redis
# 拉取Redis镜像
docker pull redis:5.0
# 创建容器,设置端口映射
docker run -id --name redis5.0 -p 6379:6379 redis:5.0
第6集 Docker镜像原理
docker镜像的本质是什么?
- Docker中一个CentOS镜像为什么只有200MB,而一个CentOS操作系统的iso文件要几个G?
- Docker中的一个Tomcat镜像为什么有500MB,而一个Tomcat安装包只有70多MB
Linux文件系统
-
操作系统组成部分:
-
进程调度子系统。
-
进程通信子系统。
-
内存管理子系统。
-
设备管理子系统。
-
文件管理子系统。
-
网络通信子系统。
-
作业控制子系统。
-
-
Linux文件系统由bootfs和rootfs两部分组成。
-
bootfs:包含bootloader(引导加载程序)和kernel(内核)。
-
rootfs:root文件系统,包含的就是典型的Linux系统中的/dev,/proc,/etc等标准目录和文件。
-
不同的Linux发行版,bootfs基本一样,而rootfs不同,如Ubuntu和CentOS等。
-
Docker镜像原理
- Docker镜像是由特殊的文件系统叠加而成。
- 最低端是bootfs,并使用宿主机的bootfs。
- 第二层是root文件系统的rootfs,称为base image。
- 然后再往上可以叠加其他的镜像文件。
- 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像称为基础镜像。
- 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。
总结
-
问:Docker镜像的本质是什么?
-
答:是一个分层文件系统。
-
问:Docker中一个CentOS镜像为什么只有200MB,而一个CentOS操作系统的iso文件要几个G?
-
答:CentOS的iso镜像包含bootfs和rootfs,而Docker的centos镜像复用操作系统的bootfs,只有rootfs和其它镜像层。
-
问:Docker中的一个Tomcat镜像为什么有500MB,而一个Tomcat安装包只有70多MB?
-
答:Docker中镜像是分层的,Tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所以整个队外暴露的Tomcat镜像大小约500多MB
第7集 容器如何转为镜像
一、容器如何转为镜像
#容器转为镜像
docker commit 容器id 镜像名称:版本号
#将镜像压缩
docker save -o 压缩文件名称 镜像名称:版本号
#将压缩文件还原为镜像
docker load -i 压缩文件名称
二、不可不会的Dockerfile
-
概念
-
Dockerfile是一个文本文件。
-
包含了一条条的指令。
-
每一条指令构建一层,基于基础镜像,最终构建一个新的镜像。
-
对于开发人员,可以为开发团队提供一个完全一致的开发环境。
-
对于测试人员,可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像。
-
对于运维人员,在部署的时候,可以实现应用的无缝移植。
-
-
Dockerfile相关指令
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定Dockerfile基于那个image构建 |
MAINTAINER | 作者信息 | 用来标明这个Dockerfile谁写的 |
LABEL | 标签 | 用来标明Dockerfile的标签,可以使用Label代替Maintainer,最终都是在docker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令,默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”] |
CMD | 容器启动命令 | 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
ENV | 环境变量 | 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
- 自定义CentOS镜像
- Dockerfile
# 定义父镜像
FROM centos:7
# 定义作者信息
MAINTAINER weiwei.xu <chengran@gmail.com>
# 执行安装vim命令
RUN yum -y install vim
# 定义默认的工作目录
WORKDIR /usr
# 定义容器启动执行的命令
CMD /bin/bash
- 通过Dockfile构建镜像
docker build -f Dockerfile文件路径 -t 镜像名称:版本号 镜像存放的绝对路径
评论区