docker 入门教程
一:docker
1. 容器简介
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,它允许您使用由一组容器组成的应用程序。
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 上安装
- 下载 Docker Desktop for Mac
- 双击
Docker.dmg
打开安装程序,然后将 Docker 图标拖到 Applications 文件夹中。
Docker Desktop 安装包括 Docker Engine、Docker CLI 客户端、 Docker Compose、Docker Content Trust、Kubernetes 和 Credential Helper。
4.3 windows 上安装
注意 dokcer 只支持 win10
- 下载 Docker Desktop for windows
- 安装和开启 Hyper-V
- 双击下载安装包按照提示进行安装
5. 镜像加速
国内从 DockerHub 拉取镜像会比较慢,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
- Docker 官方中国区 https://registry.docker-cn.com
- 网易 http://hub-mirror.c.163.com
- 中国科学技术大学 https://docker.mirrors.ustc.edu.cn
- 阿里云 < 你的 ID>.mirror.aliyuncs.com
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 镜像常用命令
-
下载镜像
docker hub 是由 docker 官方负责维护的公共仓库,包含大量的容器镜像。
在
hub.docker.com
上搜索你要的镜像,然后根据页面提示下载,命令格式:$ sudo docker pull 镜像名
-
查看镜像列表
$ sudo docker image ls
-
删除镜像
$ sudo docker image rm 镜像名
-
推送镜像
推送一个镜像到镜像仓库
$ sudo docker push 镜像名
-
保存镜像
保存一个或多个镜像到一个 tar 归档文件
$ sudo docker image save 镜像名 -o xxx.tar
-
加载镜像
从 tar 归档或者标准输入来加载镜像
$ sudo docker image load 镜像名 -i xxx.tar
-
构建镜像
从 Dockerfile 构建一个镜像
$ sudo docker build -t name:tag path
7. 容器操作
7.1 什么是容器
容器就是根据镜像启动的一个进程,它是一个运行的系统。
7.2 容器的常用命令
-
创建容器
根据镜像创建一个容器
$ sudo docker container run [OPTIONS] image [command]
例如:
$ sudo docker run ubuntu:lastest /bin/echo "Hello world"
表示通过镜像
unbuntu:lastest
启动一个容器,运行/bin/echo "hello world"
命令,如果本地没有unbuntu:lastest
镜像,会自动去仓库下载。 -
创建容器的常用参数
参数 描述 -i 交互式创建容器 -t 分配一个伪终端 -d 运行容器到后台 -e 设置环境变量 -p 映射容器端口到主机 -h 设置容器主机名 –link 添加连接到另一个容器 –network 连接容器到一个网络 -v 挂载宿主机目录到容器 –restart 容器退出后的重启策略,默认 no[always|failure] –name 给容器命令 -
启动容器
启动一个停止的容器
$ sudo docker container start 容器名/ID
-
停止容器
停止一个运行的容器
$ sudo docker container stop 容器名/ID
-
查看日志
查看运行的容器的日志
$ sudo docker container logs 容器名/ID
-
执行命令
在运行的容器中执行命令
$ sudo docker container exec -it 容器名/ID command
-
查看容器列表
$ sudo docker container ls
-
删除一个容器
$ sudo docker container rm 容器名/ID
8.使用 docker 安装 jenkins
-
下载镜像
在 hub.docker.com 中搜索
jenkins
,可以找到官方镜像,但是已经弃用,推荐使用社区维护的镜像,地址为:https://hub.docker.com/r/jenkins/jenkins。选择一个合适的版本下载,例如:$ sudo docker pull jenkins/jenkins:alpine
-
创建容器
创建命令如下:
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
参数说明:
-d
: 后台运行容器-u root
:使用 root 用户登录--name jenkins
指定一个容器的名称-v jenkins_home:/var/jenkins_home
:创建卷jenkins_home
持久化 workhome 保存在宿主机上-v $(which docker):/usr/bin/docker
: 映射宿主机中的 docker 客户端到容器中-v /var/run/docker.sock:/var/run/docker.sock
: 映射 docker 守护进程的unix socket
程序到容器中-p 8080:8080
: 映射容器的 8080 端口到宿主机的 8080 端口(前面是宿主机的端口,后面的是容器的端口)jenkins/jenkins:alpine
镜像名称
如:
[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
-
访问 jenkins
容器创建成功后,在宿主机上访问
http://127.0.0.1:8080
即可访问容器中的jenkins
使用阿里云服务器,你永远要记住还有安全组这么个东西。想要开放8080端口,需要配置安全组。
- 1、进入ECS云服务器控制台
- 2、先找到需要操作的目标实例,点击“更多”–“网络和安全组”–“安全组配置”
- 3、点击“配置规则”
- 4、点击“添加安全组规则”,添加8080号端口,如下图:
端口范围填:8080/8080
授权对象填:0.0.0.0/0
第一次登录会要填写管理员密码可以通过docker logs jenkins
查看
二、使用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.txt
和Dockerfile
都放在项目根目录下,然后在目录中运行命令
docker build -t api-auto .
3. 通过容器运行脚本
docker run --rm api-auto
三、通过jenkins自动构建容器运行
1. 创建项目
参照上节课
2. 构建命令如下:
运行容器的思想是,把jenkins的工作目录也映射到python的容器中,那执行完自动化代码后,python容器会把报告写入jenkins的工作目录
docker build -t api-auto . # 构建镜像
docker run --rm --volumes-from jenkins -w $WORKSPACE api-auto # 运行容器
docker rmi api-auto # 删除镜像
在Jenkins 容器中要做的是
-
构建自动化项目的容器
-
运行容器
最后,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` 删除所有镜像
评论