一、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 命令查看你当前的内核版本
1
2 1uname -r
2
2、使用 root 权限登录 Centos,更新yum包到最新
1
2 1sudo yum update
2
如果安装过旧版本的话,需要卸载旧版本
1
2 1sudo yum remove docker docker-common docker-selinux docker-engine
2
3、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖
1
2 1sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2
4、设置yum源
1
2 1sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2
推荐使用阿里云安装:
1
2 1yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2
5、查看所有仓库中所有docker版本,并选择特定版本安装
1
2 1yum list docker-ce --showduplicates | sort -r
2
6、安装docker
1
2 1sudo yum install docker-ce-18.03.1.ce
2
7、启动并加入开机启动
1
2
3 1sudo systemctl start docker
2sudo systemctl enable docker
3
8、验证安装是否成功
1
2 1docker version
2
有client和service两部分表示docker安装启动都成功了
8、测试运行 hello-world
9、Docker 客户端
docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。
可以通过命令 docker command –help 更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats 指令的具体使用方法:
1
2 1docker stats --help
2
10、运行一个web应用
在docker容器中运行一个 Python Flask 应用来运行一个web应用。
1
2
3 1docker pull training/webapp # 载入镜像
2docker run -d -P training/webapp python app.py
3
使用 docker ps 来查看我们正在运行的容器:
1
2 1docker ps
2
这里多了端口信息。
0.0.0.0:32768->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32768 上。
这时可以通过浏览器访问WEB应用:
可以通过 -p 参数来设置不一样的端口:
1
2 1docker run -d -p 5000:5000 training/webapp python app.py
2
查看 WEB 应用程序日志
1
2 1docker logs -f 4d1aa7d8ebd9 #docker logs [ID或者名字] 可以查看容器内部的标准输出。
2
注意:-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
使用 docker top 来查看容器内部运行的进程
1
2 1docker logs 4d1aa7d8ebd9
2
停止 WEB 应用容器:
1
2
3 1docker stop 4d1aa7d8ebd9
2
3
已经停止的容器,可以使用命令 docker start 来启动:
1
2 1docker start 4d1aa7d8ebd9
2
查询最后一次创建的容器:
1
2 1docker ps -l
2
正在运行的容器,可以使用 docker restart 命令来重启:
1
2 1docker restart 4d1aa7d8ebd9
2
可以使用 docker rm 命令来删除不需要的容器:
1
2 1docker rm 4d1aa7d8ebd9
2
注意:删除容器时,容器必须是停止状态,否则会报如下错误:
1
2 1Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove
2
三、配置docker镜像加速器
1、创建目录
1
2 1mkdir -p /etc/docker
2
2、创建daemon.json文件
1
2 1vim /etc/docker/daemon.json
2
daemon.json
1
2
3
4
5
6 1#网易云
2{"registry-mirrors":["http://hub-mirror.c.163.com"]}
3
4#阿里云
5{"registry-mirrors":["https://xxx.mirror.aliyuncs.com"]}
6
1
2 1systemctl daemon-reload
2
1
2 1systemctl restart docker
2
四、Docker 镜像
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
1、列出镜像列表
1
2 1[root@localhost ~]# docker images
2
各个选项说明:
-
**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来寻找适合我们的镜像。
1
2 1docker search MySQL
2
参数说明:
- **NAME:**镜像仓库源的名称
- **DESCRIPTION:**镜像的描述
- **OFFICIAL:**是否docker官方发布
3、拖取镜像
1
2 1docker pull mysql
2
下载完成后,就可以使用这个镜像了。
4、启动镜像
1
2 1docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
2
-
—name 为设置容器的名字,我设置为mysql
-
-p 端口映射
-
-e 为设置执行时的环境变量,在这里我设置mysql的root密码,相关变量可参考官网
-
-d 为设置镜像,镜像名:版本
5、 查看Docker当前运行
1
2 1docker ps
2
6、停止Docker容器
1
2 1docker stop ID
2
** **7、删除镜像
1
2 1docker rmi ID
2
在镜像未停止的情况下,可以使用 -f 是强制删除,但是这样不友好。
1
2 1docker rmi -f ID
2
报错:
Error response from daemon: conflict: unable to delete 3ee5e1ce00fc (cannot be forced) – image has dependent child images
解决方法:找到你要删除的那个TAG,然后通过docker rmi [repository]:[tag]来删除,例如:
1
2 1docker rmi docker-demo:1.0.0
2
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、导入导出镜像
导出:
1
2 1sudo docker save -o docker-demo.tar docker-demo
2
导入:
1
2 1docker load -i docker-demo.tar
2
五、DockerFile创建镜像
1、创建文件Dockerfile文件,该文件名不可更改
1
2 1vi Dockerfile
2
编写文本,并保存退出:
1
2
3
4 1FROM alpine:latest
2MAINTAINER smilevt
3CMD echo "Hello Docker!
4
docker build命令用于使用 Dockerfile 创建镜像,
1
2 1docker build -t hello_docker .
2
- -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、查询安装过的包
1
2 1yum list installed | grep docker
2
2、删除安装的软件包
1
2 1systemctl stop docker
2
1
2 1yum -y remove docker-engine.x86_64
2
3、删除镜像/容器
1
2 1rm -rf /var/lib/docker
2