Docker系列01—Docker 基础入门

一、初识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镜像加速 【阿里云】

  1. 注册阿里云账号,专用加速器地址路径:

     https://cr.console.aliyun.com/#/accelerator

  1. 配置镜像加速地址

 

[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 拉取镜像

  1. 不带版本号默认拉取最新版本

[root@docker ~]# docker pull nginx
Using default tag: latest [root@docker ~]# docker pull busybox
Using default tag: latest
  1. 带版本号即拉取指定服务版本

[root@docker ~]# docker pull nginx:1.17.0-alpine
1.17.0-alpine: Pulling from library/nginx
  1. 查看当前主机的镜像列表【这两种一样】

[root@docker ~]# docker images
[root@docker ~]# docker image ls
  1. 【说明:】 有两种实用的镜像:

    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

 

 


 

 


 

posted @ 2020-08-18 10:43  子禾org  阅读(182)  评论(1编辑  收藏  举报