一、Docker简介
1、Docker是什么?
项目中部署不同程序员的配置可能不同,那么上线或者测试的时候就会有很大问题,如何确保应用能够在这些环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复?
解决方案:使用Docker——一个系统平滑移植,容器虚拟化技术。安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
Docker的出现使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
总而言之,开发的环境和运维的环境不一致,希望能把环境一起复制过来,一次镜像,处处运行。
Docker是基于Go语言实现的云开源项目
2、Docker与容器
比较了 Docker 和传统虚拟化方式的不同之处:
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
- Docker容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
3、官网
Docker官网:www.docker.com
DockerHub官网:hub.docker.com/
二、Docker安装
1、Docker说明
Docker依赖于已存在并运行的Linux内核环境。Docker必须部署在Linux内核的系统上,如果其他系统想部署Docker就必须安装一个虚拟的Linux环境。
目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上,要求系统为64位、Linux系统内核版本为 3.8以上,这里选用Centos7.x
查看自己的内核
cat /etc/redhat-release
uname -r
2、Docker组成
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
通俗的说法
Docker镜像文件相当于是一个Java的类,可以创建对象,Docker的容器实例就有点像创建出来的对象。

3、Docker安装
- Docker安装官网网址:docs.docker.com/engine/inst…
- 卸载旧版本:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- yum安装gcc相关内容
yum -y install gcc
yum -y install gcc-c++
- 安装需要的软件包
sudo yum install -y yum-utils
- 设置镜像仓库
下面这个最好不要执行
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
推荐下面这个指令
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新yum软件包索引
yum makecache fast
- 安装Docker CE
sudo yum install docker-ce docker-ce-cli containerd.io
- 启动测试docker
systemctl start docker
ps -ef | grep docker
- 可以简单测试hello-world
docker run hello-world
- 卸载
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
3、阿里云镜像加速
登录:promotion.aliyun.com/ntms/act/ku…
搜索容器镜像服务
容器镜像服务 (aliyun.com):进入镜像工具、镜像加速器,赋值地址。
配置镜像加速器:
目录地址:/etc/docker/daemon.json
修改daemon文件,直接执行即可,不需要进入daemon.json文件:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://l1bjslsx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
4、docker的工作流程
docker run 干了什么?
- docker有着比虚拟机更少的抽象层
由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
- docker利用的是宿主机的内核,而不需要加载操作系统OS内核
当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。
三、Docker命令
1、帮助启动类命令
#启动docker
systemctl start docker
#停止docker
systemctl stop docker
#重启docker
systemctl restart docker
#查看docker状态
systemctl status docker
#开机启动
systemctl enable docker
#查看docker概要信息
docker info
#查看docker总体帮助文档
docker --help
#查看docker命令帮助文档
docker 具体命令 --help
2、镜像命令
(1)列出本地的镜像
docker images
各个参数说明
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签版本号
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像
选项说明
- **-a:**列出本地所有的镜像
- **-q:**只显示镜像id
(2)查询某个镜像
docker search 【options】某个XXX镜像的名字
各个参数说明
NAME:镜像仓库源的名称
DESCRIPTION:镜像的描述
OFFICIAL:是否 docker 官方发布
stars:类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED:自动构建。
选项说明
- **--automated :**只列出 automated build类型的镜像;
- **--no-trunc :**显示完整的镜像描述;
- **-f <过滤条件>:**列出收藏数不小于指定值的镜像;
- **--limit:**只列出一定数量的镜像,默认是25个
(3)下载镜像
docker pull 某个镜像的名字:【TAG】
#TAG有值就是最新版
#写了就是该版本
(4)查看镜像/容器/数据卷所占的空间
docker system df
(5)删除镜像
删除单个镜像:
docker rmi -f 镜像ID
删除多个镜像:
docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部镜像:
docker rmi -f $(docker images -qa)
3、容器命令
(1)新建/启动容器
docker run 【options】 image 【command】【args】
OPTIONS说明
- --name="容器新名字",为容器指定一个名称
- -d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
- -i:以交互模式运行容器,通常与 -t 同时使用
- -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用
也即启动交互式容器(前台有伪终端,等待交互)。
例子
#拉取ubuntu镜像
docker pull ubuntu
#查看镜像
docker images
#后台启动ubuntu
docker run -it ubuntu /bin/bash
#查看正在运行的容器
docker ps
#查看所有运行过的容器
docker ps -a
#查看最近创建的n个容器
docker ps -n number
查看会发现:names是一个奇怪的值
[root@oliver001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80ebd502fc24 ubuntu "/bin/bash" 13 seconds ago Up 12 seconds musing_archimedes
如果希望自己设置来明确一下,可以使用--name来启动:
docker run -it --name=ubuntu01 ubuntu /bin/bash
(2)退出容器
两种退出方式:
- exit退出并停止容器
- ctrl+p+q退出不停止容器
如果想再进去这个容器:
docker exec -it 容器名 bashShell(例如:/bin/bash)
(3)启动已经停止的容器
docker start 容器ID或容器名
(4)重启容器
docker restart 容器ID或容器名
(5)强制停止容器
docker kill 容器ID或容器名
(6)删除已经停止的容器
#注意这个必须先stop掉,再删除
docker rm 容器名或容器ID
#一次删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
(7)启动守护式容器(后台服务器)
docker run -d 容器名
(8)查看容器日志
docker logs 容器id
(9)查看容器内部的运行进程
docker top 容器ID
(10)查看容器内部的细节
docker inspect 容器ID
(11)进入正在运行的容器并以命令行交互
exec的方式重新进入:
docker exec -it 容器ID bashShell
attach的方式重新进入:
docker attach 容器ID
上面两个的区别
- attach:直接进入容器启动命令的终端,不会启动新的进程。用exit退出,会导致容器的停止。
- exec:是在容器中打开新的终端,并且可以启动新的进程。用exit退出,不会导致容器的停止。
(12)从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
(13)导入和导出容器
- export:导出容器的内容作为一个tar归档文件
- import:从tar报中的内容创建一个新的文件系统再导入为镜像
案例:把一个docker容器删掉再恢复回来
docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
#案例
docker export xxxxxx > abcd.tar
cat abcd.tar | docker import - atguigu/ubunut:3.7