第一章:docker的安装和介绍
本课程将带领大家系统学习docker,什么是容器,创建管理容器,到容器的各个技术细节(网络/存储/服务编排/监控)等,
再到通过容器进行CI/CD,持续集成、持续部署,彻底掌握容器技术。
无论是前后端开发,还是运维测试,docker都是必学的技术,
快速上手容器与镜像的使用与管理
什么是容器和镜像?
容器和镜像有什么区别?
如何快速搭建 Docker 的开发环境?
镜像的创建、发布与管理
镜像应该如何分层?
镜像如何跨机器移动?
掌握docker的网络、编排、监控
Docker的bridge、Host网络模式
单机和多机容器间的网络互访
端口映射到底是如何工作的?
容器编排技术 Docker compose
什么是横向扩展和负载均衡?
在阿里云arm主机安装使用Docker
玩转CI/CD持续集成、持续部署
CI/CD的基本概念是什么?
GitHub上镜像的自动构建
GitHub Action构建docker镜像
Gitlab自动化部署容器服务
CI/CD持续化部署前后端分离项目
容器技术介绍
- 容器container是指的一种技术,而Docker只是一个容器技术的实现,或者说让容器技术普及开来的最成功的实现
容器正在引领基础架构的一场新的革命:90年代的pc,00年代的虚拟化,10年代的cloud,11年代的容器 - 什么是容器?
容器是一种快速的打包技术:标准化、轻量级、易移植 - linux container容器技术诞生于2008年,简称(LXC), 它是一种内核轻量级的操作系统层虚拟化技术,
linux container主要由NameSpace和Cgroup两大机制来保证实现,
- Namespcace命名空间,主要用来资源的隔离
- Cgroup主要用来资源的管理控制作用,比如进程组使用CPU/MEM的限制,进程组的优先级控制,进程组的挂起和恢复等等
- 容器的快速发展和普及
到2020年,全球超过50%的公司将在生产环境中使用容器 - 容器的标准化
- 容器运行时标准:简单来讲就是规定了容器的基本操作规范,比如如何下载镜像、创建容器、启动容器
- 容器镜像标准:主要定义镜像的基本格式
- 容器是关乎"sudo": 容器会加速你的软件开发、容器会加速你的程序编译和构建、容器会加速的测试、容器会加速你的部署、容器会加速你的更新、容器会加速你的故障恢复
- 参考文档
- docker也是c/s架构,有client,有server(engine)
第二章 容器快速上手
docker命令行
docker version // 查看docker版本
docker info // 查看docker环境的基本信息,包括容器数,运行的容器数,停止的容器数,镜像数等
docker // 可以查看所有的docker命令以及用法
docker container ps // 查看所有运行的容器(docker ps)
docker container ps -a // 查看所有容器(运行的+停止的)(docker ps -a)
docker image ls // 查看所有镜像(docker images)
镜像和容器
- image镜像
docker image是一个read-only文件,该文件包含文件系统、源码、库文件、依赖、工具和运行application所需要的文件,
可以理解成一个模板,docker image具有分层的概念 - container容器
- 一个运行中的docker image, 实质上是复制image并在image最上层加一层read-write层(也称为container-layer, 容器层),
- 基于同一个image可以创建多个container
- docker image的获取
自己制作, 从registry拉取,比如docker hub
创建我们第一个容器
sudo docker [container] run nginx // run命令:拉取nginx:lates镜像(如果本地没有这个镜像的haunt),创建容器create, 启动容器start的总和
sudo docker [container] ls [-a] // 查看所有容器(-a表示停止的容器也能看到),ls是新版中的命令,老版本是sudo docker [container] ps [-a]
sudo docker [container] stop a2 // a2表示容器id的前2位,停止一个正在运行的容器
容器的基本操作命令:
命令行小技巧之批量操作
- 快速停止一批容器(除了容器247508733ed5不停止,其余的都停止)
sudo docker container stop $(sudo docker container ls -aq | grep -v 247508733ed5)
- 快速启动一批容器
sudo docker container start $(sudo docker container ls -aq | grep -v 247508733ed5)
- 批量删除容器
sudo docker container rm $(sudo docker container ls -aq | grep -v 2475)
- 删除一个正在运行的容器 -f选项
sudo docker container rm a4 -f
容器的attached和detached模式
- docker的两种运行模式,最简单的理解就是,attached模式在前台运行,detached模式在后台运行
- detached模式转换为attached模式(后台运行模式转换为前台运行模式)
sudo docker attach container id
- 后台模式启动一个容器, --detache 可以简写为:-d
sudo docker container run --detach -p 80:80 nginx
容器的交互模式
- 查看运行的容器中的日志
方法1: 查看一次sudo docker container logs container id
方法2:跟踪查看 -f选项sudo docker container logs container id -f
- 交互模式运行容器
sudo docker container run -it ubuntu sh
- 进入容器内的shell环境
sudo docker container exec -it container id sh
容器和虚拟机
- 容器不是mini虚拟机:
- 容器其实是进程(containers are just processes)
- 容器中的进程被限制了对CPU、内存等资源你的访问
- 当进程停止后,容器就退出了
- 查看容器内运行了哪些进程
sudo docker container top 034
- 安装pstree查看进程上层依赖关系
apt install psmisc
- 先查看出容器的worker进程
sudo docker top container id
- 然后通过查出来的worker id 去查看进程上层依赖关系
sudo pstree -halps work的proceess id
创建容器时,背后到底发生了什么
docker container run 背后发生了什么?sudo docker container run --detach --publish 80:80 --name nginx_server01 nginx
- 在本地查找是否有nginx:latest这个镜像,发现没有找到
- 去远程的image registry查找nginx:latest镜像(默认的registry是docker hub)
- 下载最新版本的nginx:latest镜像到本地
- 根据拉取下来的nginx镜像创建一个新的容器,并且准备启动
- docker engine给这个容器分配一个虚拟的ip地址
- 在宿主机上打开80端口并将容器内的80端口转发到宿主机上
- 启动容器,运行指定的命令(这里是一个shell脚本去启动nginx)
第三章,镜像的创建、管理和发布
镜像的获取方式
- 将docker容器打包为docker镜像(离线获取镜像的方式)
sudo docker container commit -a author -m 创建nginx镜像 c41f5a960f75 nginx_server:v1 // 将容器保存为镜像
sudo docker image save --output nginx_server_v1.tar nginx_server:v1 // 将镜像保存文.tar文件
sudo docker load --input nginx_server_v1.tar // 将.tar文件导入为镜像
sudo docker run --detach --publish 80:80 --name nginx_server_v1 nginx_server:v1 // 根据新导入的镜像,创建并启动容器
镜像的registry介绍
有两个比较知名的registry: hub.docker.com, quay.io
镜像的获取、查看、删除
- 下载镜像的指定版本
sudo docker image pull nginx:1.20.0
- 查看单个镜像的详细信息
sudo docker image inspect image id
- 删除镜像
sudo docker image rm image id
docker镜像的导入导出
sudo docker container commit -a author -m 创建nginx镜像 c41f5a960f75 nginx_server:v1 // 将容器保存为镜像
sudo docker image save --output nginx_server_v1.tar nginx_server:v1 // 将镜像保存文.tar文件
sudo docker load --input nginx_server_v1.tar // 将.tar文件导入为镜像
sudo docker run --detach --publish 80:80 --name nginx_server_v1 nginx_server:v1 // 根据新导入的镜像,创建并启动容器
Dockerfile的介绍
- Dockerfile是用于构建docker镜像的文件
- Dockerfile里包含了构建镜像所需的"指令"
- Dockerfile具有其特定的语法规则
容器就是一个进程,所有镜像就是运行这个进程所需的环境,
假如我们要在一台ubuntu21.04上运行这个hello.py的python程序,
项目目录结构
一个Dockerfile的基本内容
FROM ubuntu:21.04
RUN apt update && \
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.10 python3-pip python3.10-dev
ADD app /app
CMD ["python3", "/app/hello.py"]
执行命令,通过Dockerfile构建我们需要的镜像
sudo docker [image] build --tag "ubuntu_python:20_04-3_10" .
通过创建好的镜像创建容器,并运行容器sudo docker [container] run --rm ubuntu_python:20_04-3_10
结果打印: hello world, 执行成功
镜像的构建和分享
- 为存在的镜像创建一个额外的tag镜像
sudo docker image tag ubuntu_python:20_04-3_10 1341935532/hello:1.0
- 将本地镜像推送到docker hub上
现在本地登录docker hubsudo docker login
输入用户名和密码,注意,用户名不要写@qq.com后缀
将本地创建好的镜像发送到docker hub(注意:要上传的镜像名称前缀必须是我们docker hub上的用户id,否则上传会失败)sudo docker image push 1341935531/hello:1.0
- 从docker hub上拉取自己上传的镜像到本地
sudo docker image pull 1341935531/hello:1.0
至此,我们就自己构建了一个镜像上传到了docker hub, 并且可以从docker hub下载自己构建的镜像,直接使用。
通过commit创建镜像
- 将当前容器保存为镜像
sudo docker container commit container_id 1341935531/nginx:1.0
- 通过新保存的镜像创建容器,就具有和原有容器一样效果
sudo docker container run --detach --publish 80:80 1341935531/nginx:1.0
- 不通过Dockerfile自建镜像,创建容器,将容器保存为自定义的镜像
通过ubuntu:21.04创建镜像并启动容器sudo docker container run -it ubuntu:21.04 sh
在下载的基础镜像中安装python环境apt update && \ DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.10 python3-pip python3.10-dev
然后cd到根目录下,新建一个文件hello.pycd /
echo "print('hello docker')" > hello.py
退出容器,将容器保存为镜像sudo docker container commit container_id 1341935531/python-demo
通过新保存的镜像创建临时容器,运行python脚本,然后自动删除容器sudo docker container run --rm 1341935532/python-demo:latest python3 /hello.py
聊聊scratch这个镜像
scratch是一个空的docker镜像,通过scratch来构建一个基础的镜像
hello.c代码:
#include <stdio.h>
int main()
{
printf("hello docker\n");
}
编译程一个二进制文件gcc --static -o hello hello.c
Dockerfile文件的编写
FROM scratch
ADD hello /
CMD ["/hello"]
通过编写好的Dockerfile和编译好的hello文件构建镜像docker image build -t 1341935531/c-hello .
通过构建的镜像创建并启动容器执行脚本文件,然后删除容器sudo docker container run --rm 1341935531/c-hello:latest
查看镜像的分层sudo docker image history image_id