docker 入门教程

一:docker

1. 容器简介

image-1653308054028

1.1 虚拟化技术

Hypervisor——一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。也可叫做 VMM( virtual machine monitor ),即虚拟机监视器。

被 Hypervisor 用来执行一个或多个虚拟机器的电脑称为主体机器(host machine),这些虚拟机器则称为客体机器(guest machine)。hypervisor 提供虚拟的作业平台来执行客体操作系统(guest operating systems),负责管理其他客体操作系统的执行阶段;这些客体操作系统,共同分享虚拟化后的硬件资源。

起初,大家普遍认为基于 hypervisor 的方式可以在最大程度上提供灵活性。所有虚拟机实例都能够运行任何其所支持的操作系统,而不受其他实例的影响。然而,越来越多的用户发现 hypervisor 提供这样一种广泛支持的特性其实是在给自己制造麻烦。对于 hypervisor 环境来说,每个虚拟机实例都需要运行客户端操作系统的完整副本以及其中包含的大量应用程序。从实际运行的角度来说,由此产生的沉重负载将会影响其工作效率及性能表现。

1.2 容器

因此出现了一种称为容器(Container)的新型虚拟化技术来帮助解决这些问题。

操作系统层虚拟化(英语:Operating system–level virtualization),亦称容器化(英语:Containerization),是一种虚拟化技术,这种技术将操作系统内核虚拟化,可以允许用户空间软件实例(instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。

1.3 虚拟机与容器的对比

项目

虚拟机

容器

启动时间

分钟级启动

秒级启动

体积

以 G 为单位

容器镜像大小通常以 M 为单位

性能

需要 Hypervisor 层,需要虚拟化硬件设备,具有完整的 Guest OS,开销大,性能较容器差

共享宿主机内核,系统级虚拟化,没有 Hypervisor 层开销,性能基本接近物理机

安全性

具有完成的 Guset OS,隔离性,稳定性好

因为共享了宿主机内核,只是进程级的隔离,因此隔离性和稳定性不如虚拟机。且容器有权限访问宿主机内核,存在一定的安全隐患。

要求

基于硬件虚拟化,需要 CPU 支持虚拟化技术

不用考虑 CPU 是否支持虚拟化

2. docker 是什么

Docker 是一个开源的应用容器引擎,使用 GO 语言开发,并利用 Linux 内核的几个特性来提供其功能。Docker 使应用程序与基础设施分开,以便可以快速交付软件。

2.1 应用场景

  • 快速、一致地交付您的应用程序

    • Docker 允许开发人员使用提供应用程序和服务的本地容器在标准化环境中工作,从而简化了开发生命周期。容器非常适合持续集成和持续交付 (CI/CD) 工作流。

  • 响应式部署和扩展

    • Docker 的可移植性和轻量级特性还使动态管理工作负载、根据业务需求几乎实时地扩展或拆除应用程序和服务变得容易。

  • 在相同硬件上运行更多工作负载

    • Docker 是轻量级和快速的。它为基于管理程序的虚拟机提供了一种可行且经济高效的替代方案,因此您可以使用更多的计算能力来实现您的业务目标。Docker 非常适合高密度环境以及需要以更少资源完成更多任务的中小型部署。

3. docker 架构

Docker 使用客户端-服务器架构。Docker 客户端与 Docker 守护进程对话,后者负责构建、运行和分发 Docker 容器的繁重工作。Docker 客户端和守护程序可以 在同一系统上运行,或者您可以将 Docker 客户端连接到远程 Docker 守护程序。Docker 客户端和守护进程使用 REST API、UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许您使用由一组容器组成的应用程序。

image-1653308072748

3.1 Docker 守护进程

Docker 守护进程 ( dockerd) 监听 Docker API 请求并管理 Docker 对象,例如镜像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。

3.2 Docker 客户端

Docker 客户端 ( docker) 是许多 Docker 用户与 Docker 交互的主要方式。当您使用诸如 之类的命令时 docker run,客户端会将这些命令发送到 dockerd,从而执行它们。该 docker 命令使用 Docker API。Docker 客户端可以与多个守护进程通信。

3.3 Docker 仓库

Docker 仓库用来存储 Docker 镜像。Docker Hub 是一个任何人都可以使用的公共仓库平台,Docker 默认配置在 Docker Hub 上查找镜像。也可以配置自己的私有仓库。

4. 安装 docker

4.1 Linux 上安装

在各种 Linux 系统上安装 docker 最简单的方法是使用官方脚本自动安装。

安装命如下:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

如:

[root@iZ2zebqeq8f5murg3r515qZ ~]# curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# Executing docker install script, commit: 93d2499759296ac1f9c510605fef85052a2c32be
+ sh -c 'yum install -y -q yum-utils'
Invalid configuration value: failovermethod=priority in /etc/yum.repos.d/CentOS-Linux-epel.repo; Configuration: OptionBinding with id "failovermethod" does not exist

Installed:
  yum-utils-4.0.21-3.el8.noarch                                                                                                                       

+ sh -c 'yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo'
Invalid configuration value: failovermethod=priority in /etc/yum.repos.d/CentOS-Linux-epel.repo; Configuration: OptionBinding with id "failovermethod" does not exist
Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
+ '[' stable '!=' stable ']'
+ sh -c 'yum makecache'
Invalid configuration value: failovermethod=priority in /etc/yum.repos.d/CentOS-Linux-epel.repo; Configuration: OptionBinding with id "failovermethod" does not exist
CentOS Linux 8 - AppStream                                                                                            137 kB/s | 4.3 kB     00:00    
CentOS Linux 8 - BaseOS                                                                                               391 kB/s | 3.9 kB     00:00    
CentOS Linux 8 - Extras                                                                                                49 kB/s | 1.5 kB     00:00    
Extra Packages for Enterprise Linux 8 - x86_64                                                                        140 kB/s | 4.7 kB     00:00    
Docker CE Stable - x86_64                                                                                              49 kB/s |  19 kB     00:00    
Metadata cache created.
+ '[' -n '' ']'
+ sh -c 'yum install -y -q docker-ce'
Invalid configuration value: failovermethod=priority in /etc/yum.repos.d/CentOS-Linux-epel.repo; Configuration: OptionBinding with id "failovermethod" does not exist
Importing GPG key 0x621E9F35:
 Userid     : "Docker Release (CE rpm) <docker@docker.com>"
 Fingerprint: 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
 From       : https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

Installed:
  container-selinux-2:2.167.0-1.module_el8.5.0+911+f19012f9.noarch              containerd.io-1.4.12-3.1.el8.x86_64                                   
  docker-ce-3:20.10.12-3.el8.x86_64                                             docker-ce-cli-1:20.10.12-3.el8.x86_64                                 
  docker-ce-rootless-extras-20.10.12-3.el8.x86_64                               docker-scan-plugin-0.12.0-3.el8.x86_64                                
  fuse-common-3.2.1-12.el8.x86_64                                               fuse-overlayfs-1.7.1-1.module_el8.5.0+890+6b136101.x86_64             
  fuse3-3.2.1-12.el8.x86_64                                                     fuse3-libs-3.2.1-12.el8.x86_64                                        
  libcgroup-0.41-19.el8.x86_64                                                  libslirp-4.4.0-1.module_el8.5.0+890+6b136101.x86_64                   
  slirp4netns-1.1.8-1.module_el8.5.0+890+6b136101.x86_64                       

+ version_gte 20.10
+ '[' -z '' ']'
+ return 0
+ sh -c 'yum install -y -q docker-ce-rootless-extras'
Invalid configuration value: failovermethod=priority in /etc/yum.repos.d/CentOS-Linux-epel.repo; Configuration: OptionBinding with id "failovermethod" does not exist

================================================================================

To run Docker as a non-privileged user, consider setting up the
Docker daemon in rootless mode for your user:

    dockerd-rootless-setuptool.sh install

Visit https://docs.docker.com/go/rootless/ to learn about rootless mode.


To run the Docker daemon as a fully privileged service, but granting non-root
users access, refer to https://docs.docker.com/go/daemon-access/

WARNING: Access to the remote API on a privileged Docker daemon is equivalent
         to root access on the host. Refer to the 'Docker daemon attack surface'
         documentation for details: https://docs.docker.com/go/attack-surface/

================================================================================

查看docker 的版本号

[root@iZ2zebqeq8f5murg3r515qZ ~]# docker --version
Docker version 20.10.12, build e91ed57

各种 Linux 系统的手动安装步骤见官方文档

4.2 mac 上安装

  1. 下载 Docker Desktop for Mac

  2. 双击 Docker.dmg 打开安装程序,然后将 Docker 图标拖到 Applications 文件夹中。

image-1653308100255
Docker Desktop 安装包括 Docker Engine、Docker CLI 客户端、 Docker Compose、Docker Content Trust、Kubernetes 和 Credential Helper。

4.3 windows 上安装

注意 dokcer 只支持 win10

  1. 下载 Docker Desktop for windows

  2. 安装和开启 Hyper-V

  3. 双击下载安装包按照提示进行安装

5. 镜像加速

国内从 DockerHub 拉取镜像会比较慢,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

5.1 Linux 系统

修改/etc/docker/daemon.json 文件,如果没有先建一个即可

[root@iZ2zebqeq8f5murg3r515qZ ~]# mkdir -p /etc/docker/
[root@iZ2zebqeq8f5murg3r515qZ ~]# vi /etc/docker/daemon.json

修改配置文件内如下:

{
"registry-mirrors": ["https://registry.docker-cn.com"]
}

然后重启服务

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

5.2 windows 系统

对于使用 Windows 10 的系统,在系统右下角托盘 Docker 图标内右键菜单选择 Settings,打开配置窗口后左侧导航菜单选择 Daemon。在 Registrymirrors 一栏中填写加速器地址 **https://docker.mirrors.ustc.edu.cn/** ,之后点击 Apply 保存后 Docker 就会重启并应用配置的镜像地址了。

5.3 Mac 系统

对于使用 Mac OS X 的用户,在任务栏点击 Docker for mac 应用图标-> Perferences…-> Daemon-> Registrymirrors。在列表中填写加速器地址 **https://docker.mirrors.ustc.edu.cn/** 。修改完成之后,点击 Apply&Restart 按钮,Docker 就会重启并应用配置的镜像地址了。

配置好后运行下面的命令检查配置是否生效:

$ docker info
Registry Mirrors:
    https://docker.mirrors.ustc.edu.cn/

6. 镜像操作

6.1 什么是镜像

Docker 镜像可以理解为一个精简的 Linux 操作系统安装包。通过镜像可以快速的启动容器。

6.2 镜像常用命令

  1. 下载镜像

    docker hub 是由 docker 官方负责维护的公共仓库,包含大量的容器镜像。

    hub.docker.com 上搜索你要的镜像,然后根据页面提示下载,命令格式:

    $ sudo docker pull 镜像名
    
  2. 查看镜像列表

    $ sudo docker image ls
    
  3. 删除镜像

    $ sudo docker image rm 镜像名
    
  4. 推送镜像

    推送一个镜像到镜像仓库

    $ sudo docker push 镜像名
    
  5. 保存镜像

    保存一个或多个镜像到一个 tar 归档文件

    $ sudo docker image save 镜像名 -o xxx.tar
    
  6. 加载镜像

    从 tar 归档或者标准输入来加载镜像

    $ sudo docker image load 镜像名 -i xxx.tar
    
  7. 构建镜像

    从 Dockerfile 构建一个镜像

    $ sudo docker build -t name:tag path
    

7. 容器操作

7.1 什么是容器

容器就是根据镜像启动的一个进程,它是一个运行的系统。

7.2 容器的常用命令

  1. 创建容器

    根据镜像创建一个容器

    $ sudo docker container run [OPTIONS] image [command]
    

    例如:

    $ sudo docker run ubuntu:lastest /bin/echo "Hello world"
    

    表示通过镜像 unbuntu:lastest 启动一个容器,运行 /bin/echo "hello world" 命令,如果本地没有 unbuntu:lastest 镜像,会自动去仓库下载。

  2. 创建容器的常用参数

    参数

    描述

    -i

    交互式创建容器

    -t

    分配一个伪终端

    -d

    运行容器到后台

    -e

    设置环境变量

    -p

    映射容器端口到主机

    -h

    设置容器主机名

    –link

    添加连接到另一个容器

    –network

    连接容器到一个网络

    -v

    挂载宿主机目录到容器

    –restart

    容器退出后的重启策略,默认 no[always|failure]

    –name

    给容器命令

  3. 启动容器

    启动一个停止的容器

    $ sudo docker container start 容器名/ID
    
  4. 停止容器

    停止一个运行的容器

    $ sudo docker container stop 容器名/ID
    
  5. 查看日志

    查看运行的容器的日志

    $ sudo docker container logs 容器名/ID
    
  6. 执行命令

    在运行的容器中执行命令

    $ sudo docker container exec -it 容器名/ID command
    
  7. 查看容器列表

    $ sudo docker container ls
    
  8. 删除一个容器

    $ sudo docker container rm 容器名/ID
    

8.使用 docker 安装 jenkins

  1. 下载镜像

    hub.docker.com 中搜索 jenkins,可以找到官方镜像,但是已经弃用,推荐使用社区维护的镜像,地址为:https://hub.docker.com/r/jenkins/jenkins。选择一个合适的版本下载,例如:

    $ sudo docker pull jenkins/jenkins:alpine
    
  2. 创建容器

    创建命令如下:

    docker run -d -u root --name jenkins -v jenkins_home:/var/jenkins_home -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -p 8080:8080 -p 50000:50000 jenkins/jenkins:alpine
    

    参数说明:

    • docker run: 运行一个新的容器。

    • -d: 后台运行容器。

    • -u root: 以 root 用户身份运行容器,获取足够的权限。

    • --name jenkins: 指定容器的名称为 "jenkins"。

    • -v jenkins_home:/var/jenkins_home: 将容器中的 "/var/jenkins_home" 目录与主机上名为 "jenkins_home" 的卷进行挂载,用于持久化 Jenkins 的数据。

    • -v $(which docker):/usr/bin/docker: 将主机上的 Docker 可执行文件与容器中的 "/usr/bin/docker" 进行挂载,允许容器内部执行 Docker 命令。

    • -v /var/run/docker.sock:/var/run/docker.sock: 将主机上的 Docker Socket 与容器中的 "/var/run/docker.sock" 进行挂载,允许容器内部与宿主机共享 Docker 引擎。

    • -p 8080:8080 -p 50000:50000: 将容器内部的端口 8080 和 50000 分别映射到主机上的相应端口,允许从主机访问 Jenkins 的 Web 界面和使用远程构建代理。

    • jenkins/jenkins:alpine: 使用 Jenkins 官方提供的 "alpine" 版本的镜像运行容器。

    这个命令将在 Docker 中启动一个 Jenkins 容器,并配置了一些必要的参数和挂载点,以便容器内部可以正常运行 Jenkins 服务,并与宿主机进行交互。

这样一来,Jenkins 作为持续集成/持续部署的平台,就可以在容器内部调用 Docker 命令,创建新的容器、启动容器、构建镜像等操作,实现更灵活和高效的构建和部署流程。image-1653308175521

image-1653308183656
如:

[root@iZ2zebqeq8f5murg3r515qZ ~]# docker run -d -u root --name jenkins -v jenkins_home:/var/jenkins_home -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -p 8080:8080 -p 50000:50000 jenkins/jenkins:alpine
Unable to find image 'jenkins/jenkins:alpine' locally
alpine: Pulling from jenkins/jenkins
59bf1c3509f3: Pull complete 
451f31369dc3: Pull complete 
72befd8cd6f7: Pull complete 
492e4aba0962: Pull complete 
6e366875e2cc: Pull complete 
58049cdaf964: Pull complete 
9e4fdcc85df7: Pull complete 
c7426b91a004: Pull complete 
b4bbcb653964: Pull complete 
1a810c709660: Pull complete 
53ae59e5765e: Pull complete 
adbb2c4eba5e: Pull complete 
d967cf9acbb1: Pull complete 
85cf46be0278: Pull complete 
c9af5fafe36c: Pull complete 
94ac2ffe547f: Pull complete 
Digest: sha256:9a35dce7e55680692ea60d48f11d693019f30726bf38c315ae582d04508c1ecd
Status: Downloaded newer image for jenkins/jenkins:alpine
e125ba10d609256931171ea81d4da59fdbe225ed219a66d9911b6e795ddadfa3
[root@iZ2zebqeq8f5murg3r515qZ ~]# docker image ls
REPOSITORY        TAG       IMAGE ID       CREATED      SIZE
jenkins/jenkins   alpine    bd32a86122c6   3 days ago   256MB

  1. 访问 jenkins

    容器创建成功后,在宿主机上访问 http://127.0.0.1:8080 即可访问容器中的 jenkins

    使用阿里云服务器,你永远要记住还有安全组这么个东西。想要开放8080端口,需要配置安全组。

  • 1、进入ECS云服务器控制台

  • 2、先找到需要操作的目标实例,点击“更多”–“网络和安全组”–“安全组配置”

  • 3、点击“配置规则”

  • 4、点击“添加安全组规则”,添加8080号端口,如下图:

image-1653308197656

端口范围填:8080/8080
授权对象填:0.0.0.0/0

第一次登录会要填写管理员密码可以通过docker logs jenkins查看

image-1653308208290

二、使用docker搭建自动化环境

1. 准备工作

1.1 包依赖

导出

pip freeze > requirements.txt

安装

pip install -r requirements.txt

2.2 Dockerfile

博客地址 http://testingpai.com/article/1633674033147

FROM python:3.8-apline  # base镜像
WORKDIR /app            # 工作目录 存在就切换,不存在就创建
COPY . .                # 把宿主机当前目录的所有文件拷贝到/app
# WORKDIR api-auto        # 再进入项目根目录
RUN pip install -r requirements.txt -i https://pypi.douban.com/simple  # 执行命令安装依赖
CMD ["python3", "main.py"] # 启动容器时需要运行的命令

2. 构建镜像

requirements.txtDockerfile都放在项目根目录下,然后在目录中运行命令

docker build -t api-auto .

3. 通过容器运行脚本

docker run --rm api-auto

三、通过jenkins自动构建容器运行

1. 创建项目

参照上节课

2. 构建命令如下:

image-1653308228233
image-1653308237147
image-1653308244837
image-1653308269904

运行容器的思想是,把jenkins的工作目录也映射到python的容器中,那执行完自动化代码后,python容器会把报告写入jenkins的工作目录

当您运行 docker run --rm --volumes-from jenkins -w $WORKSPACE api-auto 这条命令时,您实际上在告诉 Docker 运行一个新的容器,并且指定了一些特定的配置选项。下面是对这条命令中每个部分的详细解释:

  • docker run: 这是告诉 Docker 启动一个新容器的命令。

  • --rm: 这是一个选项/标志,表示当容器停止后会自动删除容器。这可以帮助您避免在不再需要的容器留下来占用空间。

  • --volumes-from jenkins: 这个选项告诉 Docker 从名为 "jenkins" 的容器中挂载共享卷到新创建的容器中。这意味着新容器将能够访问 "jenkins" 容器中的数据卷。

  • -w $WORKSPACE: 这个选项指定了容器的工作目录。其中 $WORKSPACE 是一个环境变量,它的值将被用作容器内的工作目录。这通常用于指定容器启动后应该执行命令的位置。

  • api-auto: 这是要运行的镜像的名称。Docker 将会根据这个名称找到并启动对应的镜像。

综合起来,这条命令告诉 Docker 要基于 "api-auto" 镜像创建一个新容器,该容器将会继承自 "jenkins" 容器的共享卷,工作目录将被设置为环境变量 $WORKSPACE 的值。这样就能够在容器中使用来自 "jenkins" 容器的数据,并且在指定的工作目录中执行相关操作。

docker build -t api-auto .   # 构建镜像
docker run --rm --volumes-from jenkins -w $WORKSPACE api-auto  # 运行容器

docker rmi api-auto  # 删除镜像

image-1653308310342
在Jenkins 容器中要做的是

  1. 构建自动化项目的容器

  2. 运行容器

最后,Docker 常用的个人命令

docker version   查看版本信息

docker info      显示统信息,包括镜像和容器数

docker --help    帮助命令

docker images    查看镜像 (docker images -a 含中间镜像层)

docker rmi -f 镜像ID    删除单个镜像

docker rm 容器ID  删除单个容器

docker pull 镜像名:版本号    拉取镜像

docker run -it REPOSITORY /bin/bash    启动镜像
--name="容器新名字": 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射;

docker ps       查看正在运行容器

docker ps -a    查看所有容器

docker start 容器ID或者容器名    启动容器

docker restart 容器ID或者容器名  重启容器

docker stop 容器ID或者容器名     停止容器

docker kill 容器ID或者容器名     强制停止容器

docker kill $(docker ps -a -q)  停用全部运行中的容器

docker rm $(docker ps -aq)	删除全部容器

docker rmi `docker images -q` 	删除所有镜像