Docker学习
环境:CentOS6.8
Docker的三大核心概念:镜像(Image)、容器(Container)、仓库(Repository)
1、安装Docker
Docker支持CentOS6及以后的版本,对于本次使用的CentOS6.8系统可使用epel源安装Docker
yum -y install epel-release
yum -y install docker-io
CentOS系统中更新docker有两种方法:一是通过源码编译安装;二是下载二进制文件更新
2、镜像
Docker运行容器前需要本地存在对应的镜像,如果镜像不在本地,docker会默认从镜像仓库下载(默认使用Docker Hub)
下载镜像
docker pull NAME[:TAG] 从网络仓库中下载镜像,若不加TAG则使用latest标签,默认下载最新版本镜像
例:docker pull registry.hub.docker.com/ubuntu:14.04 从指定仓库下载指定标签的镜像
查看镜像
docker images 查看本地镜像
添加新标签
docker tag nginx:14 nginx:latest 将一个nginx:14镜像再添加一个latest标签,原镜像和标签依然存在
查看镜像详细信息
docker inspect 镜像ID 获取镜像的详细信息
搜索镜像
docker search mysql 搜索远端仓库中的镜像,默认搜索官方Docker Hub
删除镜像
docker rmi nginx:14 删除本地镜像,当一个镜像有多个标签时该命令只是删除了标签
创建镜像:1、基于已有镜像的容器创建;2、基于本地模板导入;3、基于Dockerfile创建。
1、docker commit -m "提交信息" -a "作者" 容器ID 新镜像名:标签 基于容器创建新镜像
2、可以使用OpenVZ提供的模板创建
cat 模板文件 |docker import - 模板名:标签 基于本地模板创建
3、Dockerfile创建镜像
存出和载入镜像
docker save -o centos_6u8.tar centos:6.8 将本地镜像centos:6.8存成centos_6u8.tar文件
docker load --input centos_6u8.tar 导入本地centos_6u8.tar模板文件
上传镜像
docker push 镜像 默认上传到Docker Hub,需要登录
3、容器
新建容器
docker create -it centos:6.8 使用centos:6.8这个镜像新建一个容器
docker start 容器ID 使用create命令新建的容器处于停止状态,此命令启动容器
新建并启动容器
docker run centos:6.8 /bin/echo "hello,world" 通过镜像启动容器并在容器中运行一条shell语句
docker run -i -t centos:6.8 /bin/bash 启动容器并进入容器中的交互环境
-t 让Docker分配一个伪终端并绑定到容器的标准输入上
-i 让容器的标准输入保持打开
当容器中运行的程序或应用退出后容器也就自动处于终止状态
守护态运行
docker run -d centos:6.8 /bin/bash -c "while true; do echo hell; sleep 1; done"
-d 让容器以守护进程的方式运行
docker ps 查看正在运行的容器信息
docker logs 容器ID 查看正在运行的容器的输出信息
终止容器
docker stop 容器ID 终止一个正在运行的容器
docker restart 容器ID 重启正在运行的容器
进入容器
当容器再后台运行时,如果想进入容器进行操作,可使用docker attach、docker exec、nsenter工具等
docker attach 容器ID 进入一个正在运行的容器
当多窗口使用attach进入同一个容器时,所有窗口都同步显示,有时并不方便
docker exec -ti 容器ID /bin/bash 进入一个正在运行的容器,并启动一个bash
删除容器
docker rm 容器ID 删除处于终止状态的容器
-f 强制终止并删除运行中的容器
-l 删除容器的连接,但保留容器
-v 删除容器挂载的数据卷
导入和导出容器
docker export 容器ID >文件名.tar 将容器(无论运行与否)导成文件
cat 容器文件.tar |docker import - 镜像名:标签 将容器文件导成镜像
4、仓库
仓库是集中存放镜像的地方,注册服务器是存放仓库的具体服务器。如d1.dockerpool.com/ubuntu,d1.dockerpool.com是注册
服务器地址,ubuntu是仓库名。
创建私有仓库
docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
通过官方提供的registry镜像来简单搭建一套本地私有仓库
-v 将容器中的目录映射到宿主机指定目录上,真机目录:容器目录
5、数据管理
用户在使用Docker的过程中往往需要能查看容器内应用产生的数据,或者把容器内的数据备份,甚至多个容器之间进行数据共享
容器中管理数据的方法有两个:1、数据卷;2、数据卷容器。
数据卷
数据卷是一个可供容器使用的特殊目录,可以在容器之间共享,对数据卷的修改会马上生效,对数据卷的更新不会影响镜像
在使用docker run命令时使用-v可以在容器内创建一个数据卷
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py 默认是rw权限,此时ro
也可以指定文件挂载到容器中,这样可以记载容器中该文件所记载的内容
docker run --rm -it -v ~/.bash_history:~/.bash_history ubuntu /bin/bash
数据卷容器
如果用户需要在容器之间共享一些数据,最简单的方法是使用数据卷容器
1、创建一个数据卷容器dbdata,并在其中创建也给数据卷挂载到/dbdata
docker run -it -v /dbdata --name dbdata centos:6.8
2、在其他容器中使用--volumes-from来挂载dbdata中的数据卷
docker run -it --volumes-from dbdata --name db1 centos:6.8
这时这两个容器中共用/dbdata目录
利用数据卷容器迁移数据
docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos:6.8 tar cvf /backup/back.tar /dbdata
使用centos:6.8镜像创建一个worker容器,使用--volumes-from从dbdata容器挂载数据卷,使用-v参数来讲本地当前目录
挂载到worker容器的/backup目录,然后使用tar命令打包数据卷/dbdata内的内容到/backup目录下,即将数据备份到了本地
当前目录下
恢复数据
docker run -v /dbdata --name dbdata2 centos:6.8 /bin/bash
首先创建一个有数据卷的容器dbdata2
docker run --volumes-from dbdata2 -v $(pwd):/backup centos:6.8 tar xvf /backup/back.tar
创建另一个容器,挂载dbdata2的容器,并解压备份文件到所挂载的数据卷中
6、网络配置
docker自身有四种网络模式,还有一些自定义模式,安装docker时会自动创建三个网络模式:bridge(创建容器默认连接到此网络)、 none 、host
在创建容器时(docker run)可使用如下参数指定网络模式
host模式:使用 --net=host 指定。
none模式:使用 --net=none 指定。
bridge模式:使用 --net=bridge 指定,默认设置。
container模式:使用 --net=container:NAME_or_ID 指定。
Host模式:相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址,使用宿主机的IP和端口。
Container模式:新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。
None模式:该模式将容器放置在它自己的网络栈中,但是并不进行任何配置,相当于关闭网络功能。
Bridge模式:相当于Vmware中的Nat模式,通过docker0网桥以及Iptables nat表配置与宿主机通信。
端口映射
docker run -d -P training/webapp python app.py
-P Docker会随机映射一个49000~49900的端口到容器内的开放端口
docker run -d -p 5000:5000 training/webapp python app.py
-p Docker使用指的的端口映射到容器内的指定端口,还可以指定ip地址或者协议
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
容器互联实现容器间通信
docker run -d --name db training/postgres
先创建一个数据库容器
docker run -d -P --name web --link db:db_link training/webapp python app.py
--link 格式为--link name:alias,name为要链接的容器名,alias为这个链接的别名