一、Docker简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
1、Docker有以下几个部分组成:
-
dockerClient客户端
-
Docker Daemon守护进程
-
Docker Image镜像
-
DockerContainer容器
2、特性
docker的典型场景:
-
Automating the packaging and deployment of applications(使应用的打包与部署自动化)
-
Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)
-
Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)
-
Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)
由于其基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资源占用小。因此对于构建隔离的标准化的运行环境,轻量级的PaaS(如dokku), 构建自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。
3、局限
Docker并不是全能的,设计之初也不是KVM之类虚拟化手段的替代品,简单总结几点:
-
Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
-
LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
-
隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
-
网络管理相对简单,主要是基于namespace隔离
-
cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
-
Docker对disk的管理比较有限
-
container随着用户进程的停止而销毁,container中的log等用户数据不便收集
二、安装Docker
1、通过 uname -r 命令查看你当前的内核版本
uname -r
2、使用 root
权限登录 Centos,更新yum包到最新
sudo yum update
如果安装过旧版本的话,需要卸载旧版本
sudo yum remove docker docker-common docker-selinux docker-engine
3、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4、设置yum源
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
5、查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
6、安装docker
sudo yum install docker-ce-18.03.1.ce
7、启动并加入开机启动
sudo systemctl start docker
sudo systemctl enable docker
8、验证安装是否成功
docker version
有client和service两部分表示docker安装启动都成功了
8、测试运行 hello-world
9、Docker 客户端
docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。
可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats 指令的具体使用方法:
docker stats --help
10、运行一个web应用
在docker容器中运行一个 Python Flask 应用来运行一个web应用。
docker pull training/webapp # 载入镜像
docker run -d -P training/webapp python app.py
使用 docker ps 来查看我们正在运行的容器:
docker ps
这里多了端口信息。
0.0.0.0:32768->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32768 上。
这时可以通过浏览器访问WEB应用:
可以通过 -p 参数来设置不一样的端口:
docker run -d -p 5000:5000 training/webapp python app.py
查看 WEB 应用程序日志
docker logs -f 4d1aa7d8ebd9 #docker logs [ID或者名字] 可以查看容器内部的标准输出。
注意:-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
使用 docker top 来查看容器内部运行的进程
docker logs 4d1aa7d8ebd9
停止 WEB 应用容器:
docker stop 4d1aa7d8ebd9
已经停止的容器,可以使用命令 docker start 来启动:
docker start 4d1aa7d8ebd9
查询最后一次创建的容器:
docker ps -l
正在运行的容器,可以使用 docker restart 命令来重启:
docker restart 4d1aa7d8ebd9
可以使用 docker rm 命令来删除不需要的容器:
docker rm 4d1aa7d8ebd9
注意:删除容器时,容器必须是停止状态,否则会报如下错误:
Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove
三、配置docker镜像加速器
1、创建目录
mkdir -p /etc/docker
2、创建daemon.json文件
vim /etc/docker/daemon.json
daemon.json
#网易云
{"registry-mirrors":["http://hub-mirror.c.163.com"]}
#阿里云
{"registry-mirrors":["https://xxx.mirror.aliyuncs.com"]}
systemctl daemon-reload
systemctl restart docker
四、Docker 镜像
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
1、列出镜像列表
[root@localhost ~]# docker images
各个选项说明:
-
REPOSITORY:表示镜像的仓库源
-
TAG:镜像的标签
-
IMAGE ID:镜像ID
-
CREATED:镜像创建时间
-
SIZE:镜像大小
因为我的是刚装的,只运行了一个helloworld和测试web应用时装的两个镜像。
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
2、查找镜像
可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
也可以使用 docker search 命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。可以通过 docker search 命令搜索 MySQL来寻找适合我们的镜像。
docker search MySQL
参数说明:
- NAME:镜像仓库源的名称
- DESCRIPTION:镜像的描述
- OFFICIAL:是否docker官方发布
3、拖取镜像
docker pull mysql
下载完成后,就可以使用这个镜像了。
4、启动镜像
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
-
—name 为设置容器的名字,我设置为mysql
-
-p 端口映射
-
-e 为设置执行时的环境变量,在这里我设置mysql的root密码,相关变量可参考官网
-
-d 为设置镜像,镜像名:版本
5、 查看Docker当前运行
docker ps
6、停止Docker容器
docker stop ID
7、删除镜像
docker rmi ID
在镜像未停止的情况下,可以使用 -f 是强制删除,但是这样不友好。
docker rmi -f ID
报错:Error response from daemon: conflict: unable to delete 3ee5e1ce00fc (cannot be forced) - image has dependent child images
解决方法:找到你要删除的那个TAG,然后通过docker rmi [repository]:[tag]
来删除,例如:
docker rmi docker-demo:1.0.0
8、Docker命令小结
命令 | 用途 |
---|---|
docker pull | 获取image |
docker build | 创建image |
docker images | 列出image |
docker run | 运行container |
docker ps | 列出container |
docker rm | 删除container |
docker rmi | 删除image |
docker cp | 在host和container之间拷贝文件 |
docker commit | 保存改动为新的image |
9、导入导出镜像
导出:
sudo docker save -o docker-demo.tar docker-demo
导入:
docker load -i docker-demo.tar
五、DockerFile创建镜像
1、创建文件Dockerfile文件,该文件名不可更改
vi Dockerfile
编写文本,并保存退出:
FROM alpine:latest
MAINTAINER smilevt
CMD echo "Hello Docker!
docker build命令用于使用 Dockerfile 创建镜像,
docker build -t hello_docker .
- -t :镜像的名字及标签,通常 name:tag 或者 name
- path : . 点代表当前路径下的所有文件。
2、镜像分层
Dockerfile的每一行都会产生一个新层(新ID),比如:
已经存在image里面的层是只读的,一旦镜像运行为容器之后,就会产生一个新层(RW读写),分层的好处就是多个image可以共享相同的层,减少存储大小。
3、Dockerfile命令小结
命令 | 用途 |
---|---|
FROM | base image |
RUN | 执行命令 |
ADD | 添加文件 |
COPY | 拷贝文件 |
CMD | 执行文件 |
EXPOSE | 暴露端口 |
WORKDIR | 指定路径 |
MAINTAINER | 维护者 |
ENV | 设定环境 |
ENTRYPOINT | 容器入口 |
USER | 指定用户 |
VOLUME | mount point |
六、卸载Docker
1、查询安装过的包
yum list installed | grep docker
2、删除安装的软件包
systemctl stop docker
yum -y remove docker-engine.x86_64
3、删除镜像/容器
rm -rf /var/lib/docker