第一章: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持续化部署前后端分离项目

容器技术介绍

  1. 容器container是指的一种技术,而Docker只是一个容器技术的实现,或者说让容器技术普及开来的最成功的实现
    容器正在引领基础架构的一场新的革命:90年代的pc,00年代的虚拟化,10年代的cloud,11年代的容器
  2. 什么是容器?
    容器是一种快速的打包技术:标准化、轻量级、易移植
  3. linux container容器技术诞生于2008年,简称(LXC), 它是一种内核轻量级的操作系统层虚拟化技术,
    linux container主要由NameSpace和Cgroup两大机制来保证实现,
  • Namespcace命名空间,主要用来资源的隔离
  • Cgroup主要用来资源的管理控制作用,比如进程组使用CPU/MEM的限制,进程组的优先级控制,进程组的挂起和恢复等等
  1. 容器的快速发展和普及
    到2020年,全球超过50%的公司将在生产环境中使用容器
  2. 容器的标准化
  • 容器运行时标准:简单来讲就是规定了容器的基本操作规范,比如如何下载镜像、创建容器、启动容器
  • 容器镜像标准:主要定义镜像的基本格式
  • 容器是关乎"sudo": 容器会加速你的软件开发、容器会加速你的程序编译和构建、容器会加速的测试、容器会加速你的部署、容器会加速你的更新、容器会加速你的故障恢复
  1. 参考文档
  2. 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)

镜像和容器

  1. image镜像
    docker image是一个read-only文件,该文件包含文件系统、源码、库文件、依赖、工具和运行application所需要的文件,
    可以理解成一个模板,docker image具有分层的概念
  2. container容器
  3. 一个运行中的docker image, 实质上是复制image并在image最上层加一层read-write层(也称为container-layer, 容器层),
  4. 基于同一个image可以创建多个container
  5. docker怎么管理网站_docker怎么管理网站

  6. 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位,停止一个正在运行的容器

容器的基本操作命令:

docker怎么管理网站_nginx_02

命令行小技巧之批量操作

  1. 快速停止一批容器(除了容器247508733ed5不停止,其余的都停止)
    sudo docker container stop $(sudo docker container ls -aq | grep -v 247508733ed5)
  2. 快速启动一批容器
    sudo docker container start $(sudo docker container ls -aq | grep -v 247508733ed5)
  3. 批量删除容器
    sudo docker container rm $(sudo docker container ls -aq | grep -v 2475)
  4. 删除一个正在运行的容器 -f选项
    sudo docker container rm a4 -f

容器的attached和detached模式

  1. docker的两种运行模式,最简单的理解就是,attached模式在前台运行,detached模式在后台运行
  2. detached模式转换为attached模式(后台运行模式转换为前台运行模式)
    sudo docker attach container id
  3. 后台模式启动一个容器, --detache 可以简写为:-d
    sudo docker container run --detach -p 80:80 nginx

容器的交互模式

  1. 查看运行的容器中的日志
    方法1: 查看一次
    sudo docker container logs container id 方法2:跟踪查看 -f选项
    sudo docker container logs container id -f
  2. 交互模式运行容器
    sudo docker container run -it ubuntu sh
  3. 进入容器内的shell环境
    sudo docker container exec -it container id sh

容器和虚拟机

docker怎么管理网站_nginx_03

  1. 容器不是mini虚拟机:
  • 容器其实是进程(containers are just processes)
  • 容器中的进程被限制了对CPU、内存等资源你的访问
  • 当进程停止后,容器就退出了
  1. 查看容器内运行了哪些进程
    sudo docker container top 034
  2. 安装pstree查看进程上层依赖关系
    apt install psmisc
  3. 先查看出容器的worker进程
    sudo docker top container id
  4. 然后通过查出来的worker id 去查看进程上层依赖关系
    sudo pstree -halps work的proceess id
  5. docker怎么管理网站_nginx_04


创建容器时,背后到底发生了什么

docker container run 背后发生了什么?
sudo docker container run --detach --publish 80:80 --name nginx_server01 nginx

  1. 在本地查找是否有nginx:latest这个镜像,发现没有找到
  2. 去远程的image registry查找nginx:latest镜像(默认的registry是docker hub)
  3. 下载最新版本的nginx:latest镜像到本地
  4. 根据拉取下来的nginx镜像创建一个新的容器,并且准备启动
  5. docker engine给这个容器分配一个虚拟的ip地址
  6. 在宿主机上打开80端口并将容器内的80端口转发到宿主机上
  7. 启动容器,运行指定的命令(这里是一个shell脚本去启动nginx)

第三章,镜像的创建、管理和发布

镜像的获取方式

  1. 将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

镜像的获取、查看、删除

  1. 下载镜像的指定版本
    sudo docker image pull nginx:1.20.0
  2. 查看单个镜像的详细信息
    sudo docker image inspect image id
  3. 删除镜像
    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程序,

项目目录结构

docker怎么管理网站_docker怎么管理网站_05

一个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, 执行成功

镜像的构建和分享

  1. 为存在的镜像创建一个额外的tag镜像
    sudo docker image tag ubuntu_python:20_04-3_10 1341935532/hello:1.0
  2. 将本地镜像推送到docker hub上
    现在本地登录docker hub
    sudo docker login 输入用户名和密码,注意,用户名不要写@qq.com后缀
    将本地创建好的镜像发送到docker hub(注意:要上传的镜像名称前缀必须是我们docker hub上的用户id,否则上传会失败)
    sudo docker image push 1341935531/hello:1.0
  3. 从docker hub上拉取自己上传的镜像到本地
    sudo docker image pull 1341935531/hello:1.0

至此,我们就自己构建了一个镜像上传到了docker hub, 并且可以从docker hub下载自己构建的镜像,直接使用。

通过commit创建镜像

  1. 将当前容器保存为镜像
    sudo docker container commit container_id 1341935531/nginx:1.0
  2. 通过新保存的镜像创建容器,就具有和原有容器一样效果
    sudo docker container run --detach --publish 80:80 1341935531/nginx:1.0
  3. 不通过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.py
    cd / 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