一、初识Docker和容器
1.1 什么是docker
容纳其他物品的工具,可以部分或完全封闭,被用于容纳、存储、运输物品。物体可以被放置在容器中,而容器则可以保护内容物。
容器? 容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,ip地址,主机名等。
总结:
与宿主机使用同一个内核,性能损耗小;
不需要指令级模拟;
容器可以在CPU核心的本地运行指令,不要要任何专门的解释机制;
避免了准虚拟机和系统调用替换中的复杂性;
轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机之间的资源共享。
1.2 docker容器技术与传统虚拟机技术的比较
1.3 要使用容器必须需要在内核级支持2种技术
namespace 名称空间
cotrol group(cgroup) 控制组
为什么centos6版本不能使用容器?
因为centos6的内核版本是2.6;容器需要一个user的名称空间,知道内核版本3.8才有:
control group(cgroup)
blkio: 块设备
cpu: CPU
cpuacct: CPU资源使用报告
cpuset: 多处理平台上的CPU集合
devices: 设备访问
memory: 内存用量及报告
perf_event: 对cgroup中的任务进行统一性能测试
net_cls: cgroup中的任务创建的数据报文的类别标识符
1.4 docker介绍
Docker是一个开放源代码软件项目,让应用程序布署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。
Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施。
依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。”
1.5 docker运行架构
二、安装启动Docker
2.1 安装环境
1)依赖的基础环境:
- 64位CPU
- Linux kernel(内核) 3.10+
- Linux kernel cgroups and namespaces
2) 查询自己服务器的状态
使用的服务器版本
[root@docker ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)
内核版本
[root@docker ~]# uname -r 3.10.0-862.el7.x86_64
ip地址【这里使用的是腾讯云,不显示公网】
[root@docker ~]# hostname -I 172.17.32.10
2.2 安装docker
2.2.1 使用官方安装脚本自动安装 【缺点:不能安装自定义版本】
[root@docker ~]# curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2.2.2 Centos7 【使用yum安装,推荐】
# 1. 添加docker-ce源信息 [root@docker ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo # 2. 修改docker-ce源 [root@python ~]# sed -i 's@download.docker.com@mirrors.tuna.tsinghua.edu.cn/docker-ce@g' /etc/yum.repos.d/docker-ce.repo # 3. 更新并安装docker-ce 【安装的默认是最新版本】 [root@docker ~]# yum makecache fast [root@docker ~]# yum -y install docker-ce
=====安装指定版本的docker====
1,查看都有那些版本
[root@docker ~]# yum list docker-ce.x86_64 --showduplicates | sort -r
2,下载指定版本,我在这里下载的稳定版本
[root@docker ~]# yum -y install docker-ce-17.03.2.ce
2.3 升级docker 【需要了解】
2.3.1 查找主机上关于docker的软件包
[root@docker ~]# rpm -qa |grep docker python36-docker-pycreds-0.2.1-2.el7.noarch python36-dockerpty-0.4.1-10.el7.noarch python36-docker-2.6.1-3.el7.noarch docker-client-1.13.1-103.el7.x86_64 docker-1.13.1-103.el7.x86_64 docker-compose-1.13.1-103.el7.noarch
2.3.2 使用yum remove 卸载软件 【docker-client,docker-commen,docker-版本号】
[root@docker ~]# yum remove docker-client-1.13.1-103.el7.x86_64 [root@docker ~]# yum remove docker-1.13.1-103.el7.x86_64 [root@docker ~]# yum remove docker-compose-1.13.1-103.el7.noarch
2.3.3 使用curl 升级到最新版本 / 或者使用yum的方式
[root@docker ~]# curl -fsSL https://get.docker.com/ | sh
2.3.4 在线升级docker后出现的问题
【问题】: 原本启动的容器无法被启动,显示
Error response from daemon: Unknown runtime specified docker-runc
【解决】:
[root@docker ~]# grep -rl ‘docker-runc’ /var/lib/docker/containers/ [root@docker ~]# grep -rl 'docker-runc' /var/lib/docker/containers/ | xargs sed -i 's/docker-runc/runc/g' [root@docker ~]# systemctl restart docker
2.4 启动docker
2.4.1 配置docker镜像加速 【docker cn 加速】
[root@docker ~]# mkdir -p /etc/docker [root@docker ~]# tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://registry.docker-cn.com"] } EOF
2.4.2 配置docker镜像加速 【阿里云】
-
注册阿里云账号,专用加速器地址路径:
https://cr.console.aliyun.com/#/accelerator
-
配置镜像加速地址
[root@docker ~]# mkdir -p /etc/docker [root@docker ~]# tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"] } EOF # 修改配置文件后需要重载配置文件和重启容器 [root@docker ~]# systemctl daemon-reload [root@docker ~]# systemctl restart docker
2.4.3 启动docker服务
# 1.重新加载docker的启动配置 【一般在修改了daemon.json文件后使用】 [root@docker ~]# systemctl daemon-reload # 2. 将docker设置为开机自启 [root@docker ~]# systemctl enable docker # 3. 启动/重启docker服务 [root@docker ~]# systemctl start docker [root@docker ~]# systemctl restart docker
-查看docker版本-
[root@docker ~]# docker version Client: Docker Engine - Community Version: 19.03.8 API version: 1.40 Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:27:04 2020 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.8 API version: 1.40 (minimum version 1.12) Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:25:42 2020 OS/Arch: linux/amd64 Experimental: false
三、Docker的基础命令
3.1 镜像操作
3.1.1 搜索官方仓库的镜像
[root@docker ~]# docker search nginx
搜索结果:
参数 |
说明 |
NAME |
镜像名称 |
DESCRIPTION |
镜像描述 |
STARS |
点赞数量(认同) |
OFFICIAL |
是否为官方 |
AUTOMATED |
是否是自动构建 |
3.1.2 拉取镜像
-
不带版本号默认拉取最新版本
[root@docker ~]# docker pull nginx
Using default tag: latest [root@docker ~]# docker pull busybox
Using default tag: latest
-
带版本号即拉取指定服务版本
[root@docker ~]# docker pull nginx:1.17.0-alpine
1.17.0-alpine: Pulling from library/nginx
-
查看当前主机的镜像列表【这两种一样】
[root@docker ~]# docker images
[root@docker ~]# docker image ls
-
【说明:】 有两种实用的镜像:
BusyBox : 集成了一百多个最常用的linux命令的精简工具箱,不到2M。被称为'linux系统的瑞士军刀'。
Alpine : 面向安全的轻型linux发行版,关注安全,性能和资源效能。
3.1.3 导出镜像
[root@docker~]# docker image save busybox > save-busybox.tar.gz
[root@docker ~]# ll save-busybox.tar.gz
-rw-r--r-- 1 root root 1446400 Mar 27 17:13 save-busybox.tar.gz [root@docker ~]# docker image save -o /tmp/nginx_busybox.tar.gz busybox nginx
[root@docker ~]# ll /tmp/nginx_busybox.tar.gz
-rw------- 1 root root 155635200 Mar 27 18:20 /tmp/nginx_busybox.tar.gz
【参数说明: 】
· -o : 指定导出镜像的位置;
· 可以指定多个镜像打包为一个文件;
· 指定为.tar.gz的文件,可以解压。
3.1.4 删除镜像 【两种方式一样】
[root@docker ~]# docker rmi busybox
Untagged: busybox:latest [root@docker ~]# docker image rm busybox
Untagged: busybox:latest
3.1.5 导入镜像
[root@docker ~]# docker load -i save-busybox.tar.gz
a6d503001157: Loading layer [==================================================>] 1.437MB/1.437MB Loaded image: busybox:latest
3.2 容器操作
3.2.1 启动容器
docker run 镜像名 eg: docker run [options] image [command] [arg..] options 常用命令选项: · -t : 打开一个终端,想使用交换机一样使用容器 · -i : 以交互模式运行容器,通常与 -t 同时使用 · --name : 为启动的容器起一个名字 · --network : 为启动的容器指定一个网络 · --rm : 容器一但停止,自动删除【一般用于测试】 · -d : 后台运行 容器,并返回容器ID · -a : 指定标准输入输出内容类型,可选【stdin | stdout | stderr】 · -h : 指定容器的hostname · -t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用 · -e : A="b",设置环境变量 · --env-file=[] : 从指定文件读入环境变量 · -m : 设置容器使用内存的最大值 · --net="" : 指定容器的网络连接类型,支持【bridge|host|none|container】类型 · --link=[] : 添加链接到另一个容器 · --expose=[] : 开放一个端口或一组端口 · --volume , -v : 绑定一个卷 · -P : 随机端口映射,容器内部端口随机映射到主机的高端口 · -p :指定端口映射,格式为:【主机(宿主)端口:容器端口】 · -dns 8.8.8.8 : 指定容器使用的DNS服务器,默认和宿主机一致 · -dns-search example.com : 指定容器DNS搜索域名,默认和宿主一致
示例:运行一个容器
[root@docker ~]# docker run -d --name web01 -p 1234:80 nginx:1.17.0-alpine
339995b22002ffaad4b86014608bd58818dafc6a942bb945c44a75a3411e3f0a [root@docker ~]# docker port web01 # 查看端口映射情况
80/tcp -> 0.0.0.0:1234 #将容器的80/tcp端口,映射到宿主机的1234端口 [root@python ~]# docker ps -a # 显示全部容器状态 [root@python ~]# docker ps # 只显示运行的容器
参数说明:
CONTAINER ID: 容器的专属ID
IMAGE: 基于哪一个进项启动的
COMMAND: 服务运行的命令【后面详解】
CREATED: 创建时间,距离当前时间
STATUS: 容器的状态,up为运行,down为关闭
PORTS: 容器的映射端口
NAME: 容器的专属别名
示例:运行一个容器并进入
[root@docker ~]# docker run -it --name busybox_01 busybox /bin/sh
/ # ls bin dev etc home proc root sys tmp usr var / # exit 退出进入的容器 [root@docker ~]#
3.2.2 停止运行中的容器
docker stop 关闭运行的容器 docker kill 杀死运行的容器
3.2.3 激活关闭中的容器
# docker start [root@docker ~]# docker start busybox_01
busybox_01
3.2.4 查看容器的详细信息
[root@docker ~]# docker inspect web01 显示详细信息
[root@docker ~]# docker inspect web01 | grep 'IPAddress'
"SecondaryIPAddresses": null, "IPAddress": "172.18.0.2", "IPAddress": "172.18.0.2",
3.2.5 删除容器
[root@docker ~]# docker kill web01 先关闭
web01 [root@docker ~]# docker rm web01 再删除
web01 [root@docker ~]# docker rm -f busybox_01 先关闭再删除
busybox_01 [root@python ~]# docker rm -f `docker ps -a -q` 删除所有容器, -f 强制删除
3.2.6 对运行的容器执行指定命令exec
[root@docker ~]# docker exec
[root@docker ~]# docker container exec
格式 Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] options 选项 · -d : 在后台运行命令 · -e : 设置环境变量 · -i : 交互式 · -t : 打开一个终端 · -u : 用户名或UID
示例:
[root@docker ~]# docker run -d -p 1234:80 --name web01 nginx:1.17.0-alpine
· 在容器外部执行命令[查看ip] [root@docker ~]# docker exec web01 ip a |grep '172'
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
3.2.7 查询容器内部日志
[root@docker ~]# curl 0.0.0.0:1234
[root@docker ~]# docker logs web01
172.18.0.1 - - [31/Mar/2020:06:09:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
3.2.8 图形总结命令
3.3 补充操作
# 类似于linux的 df 命令,用于查看Docker的磁盘使用情况 [root@docker ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 54 6 12.41GB 11.84GB (95%) Containers 6 5 199B 0B (0%) Local Volumes 3 2 146.9MB 15B (0%) Build Cache 0 0 0B 0B # 用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像) [root@docker ~]# docker system prune # 清理的更加彻底,可以将没有容器使用的Docker镜像都删除掉(慎重!) [root@docker ~]# docker system prune -a