Docker入门

作者:cao.dingzheng; cai.ruiying [ZSK]

1     初识Docker

1.1  是什么?

         Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口,它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就像在真实的物理机上运行一样。这样一来,就不用担心环境问题。

1.2  为什么使用它?

       为什么要使用Docker呢?我们来看看它的几大优势。第一,快速交付和部署,解决环境配置难题;第二,高效虚拟化,内核级的虚拟化,使得它占用资源少、启动快、体积小,能够带来更高的性能和使用效率;第三,灵活应用,它几乎可以在任意的平台上运行,包括物理机、虚拟机、云服务器等,因此它的迁移、扩展更轻松;第四,简单易用,它的修改以增量的方式被分发和更新,从而实现自动化并且高效的管理。

       下面我们对比一下Docker与常用的Linux虚拟机的关键点,就可以一目了然的了解到Docker的优势。

1.3  Docker VS VM

       VM(Virtual Machine,虚拟机)是一个运行在宿主机之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。       

         Docker只包含应用程序以及依赖库,基于libcontainer运行在宿主机上(libcontainer 是Docker中用于容器管理的包),并处于隔离环境,因此Docker更加轻量高效,

         至此,我们可以了解到,我们可以把Docker当作轻量级的虚拟机,它同样能够能够提供虚拟化的环境,但是成本却小得多,一台主机上可以同时运行数千个 Docker 容器。       当然,它目前仍然存在不足,例如:隔离效果不如VM;网络配置功能相对简单,主要以桥接方式为主等。通过这些了解,我们可以根据自己的需要,选择使用。

2     安装与使用

       (备注:本文以CentOS为例。)

2.1  安装

       Docker支持CentOS及以上64位版本,我们根据自己Linux机器的具体版本,来选择安装。

(1) 查看Linux版本

命令:uname -r

 解析:

(2)    查询可安装版本

命令:yum list docker-ce  --showduplicates | sort -r

(3)    安装

命令:yum install docker-ce-<版本号> docker-ce-cli-<版本号> containerd.io

例如:yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io

注意:这里的版本,要从我们刚才查询到的列表中选择。

2.2  使用

(1)    启动

命令:systemctl start docker

(2)    验证

命令:docker --help,或者:docker run hello-world

(3)    在容器内运行一个应用程序

命令:docker run ubuntu:15.10 /bin/echo "Hello world"

解析:

       ubuntu:15.10 格式是docker镜像名称:tag标签,指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。

       以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。

2.3  运行交互式容器

2.3.1   前台模式

命令:docker run -i -t ubuntu:15.10 /bin/bash

参数解释:

       -i: 交互式操作。

       -t: 终端

       /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

2.3.2   后台模式

(1)    启动

命令:docker run -it -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

参数解释:

       -d:后台运行

  在输出中,我们没有看到期望的 "hello world",而是一串长字符。

       这个长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么。

       首先,我们需要确认容器有在运行,可以查看进行:docker ps

解析:

CONTAINER ID: 容器 ID。

IMAGE: 使用的镜像。

COMMAND: 启动容器时运行的命令。

CREATED: 容器的创建时间。

STATUS: 容器状态。

PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。

NAMES: 自动分配的容器名称。

容器状态如下:

(2)    查看运行日志

在宿主主机内使用 docker logs 命令,查看容器内的标准输出:

命令:docker logs ID号 或者docker logs 容器名称(NAMES) 

(3)    停止容器运行

命令:docker kill ID号/容器名称(NAMES)或者docker stop ID号/容器名称(NAMES)

2.4  常用命令

2.4.1   查看所有的容器

命令:docker ps -a

2.4.2   启动已停止的容器

命令:docker start ID号 或者docker start  容器名称(NAMES)或者docker restart ID号/容器名称(NAMES)来进行重启(已有容器)

2.4.3   后台启动容器

后台启动容器命令:docker run -itd --name centos7-test centos:centos7 /bin/bash

参数解释:

--name:为启动的容器命名

在使用 -d 参数时,容器启动后会后台运行。

2.4.4   进入后台运行的容器

(1)    进入后台运行的容器:docker attach ID号或者names

说明:退出容器终端会导致容器停止。

(2)    进入后台运行的容器:docker exec -it ID号或者names /bin/bash

说明:推荐大家使用 docker exec 命令,此命令进入容器后,退出容器终端时,不会导致容器的停止。

2.4.5   退出容器

命令:exit

2.4.6   导出容器/镜像

(1)    导出容器:docker export ID号或者names > 导出路径

如:docker export 1e560fca3906 > ubuntu.tar

docker export ubuntu-test > /home/qc/cdz/docker/ubuntu.tar

(2)    导出镜像:

docker save image > 路径

如:docker save cdz/centos7.v2 > /home/qc/cdz/docker/centos/centos7.v2.tar

2.4.7   导入镜像

命令:cat /home/qc/cdz/docker/centos7.tar | docker import – cdz/ centos7.v1: centos7

可以通过docker images查看镜像库

2.4.8   删除容器

命令:docker rm -f ID号或者names

2.4.9   删除镜像

命令:docker image rm -f IMAGE ID 或者RESPOSITORY:TAG

3    常见问题

3.1  安装报错

问题:

Package: 3:docker-ce-18.09.9-3.el7.x86_64 (docker-ce-stable) Requires: container-selinux >= 2.9

原因:

container-selinux版本低或者是没安装。yum 安装container-selinux 一般的yum源又找不到这个包。需要安装epel源才能yum安装container-selinux。

解决方法:

直接用yum安装container-selinux可能会报错,可以进行如下步骤:

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

yum install epel-release

yum install container-selinux

yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io

这时docker镜像就完成了安装。

3.2  直接pull下载的centos7镜像存在防火墙未关闭无法访问

解决方法:

首先运行centos7镜像后进入容器。

然后下载firewalld systemd:yum install firewalld systemd -y

查看放火墙状态:systemctl status firewalld

彻底关闭防火墙,两个命令均需执行:

systemctl disable firewalld.service

systemctl stop firewalld

最后将运行的容器导出为tar包再导入到imags里,这时防火墙问题已经解决了。

 

posted @ 2020-10-26 16:44  USTCINFO_QC  阅读(185)  评论(0编辑  收藏  举报