安装docker
本文使用的是centOS7,然后su切换到root用户运行docker。
使用脚本安装docker,执行这个脚本会添加 docker.repo 源并安装 Docker,这个大概需要几分钟。
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
启动docker进程,下载一个测试的镜像验证 docker 是否安装成功。
$ sudo systemctl start docker
$ sudo docker run hello-world
$ docker images
因为网络问题,可以镜像加速,打开配置文件,没有该文件的话,可以创建一个,这个是用网易的镜像地址:
vi /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
镜像的使用
查看本机镜像
$ docker images
REPOSITORY:镜像的仓库名
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
因为仓库原较多,我们使用 REPOSITORY:TAG 来定义不同的镜像,使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
$ docker run -it ubuntu:15.10 /bin/bash
-it:这是两个参数,一个是-i:允许你对容器内的标准输入 (STDIN) 进行交互,-t:在新容器内指定一个伪终端或终端,bash是获得一个可操作的 Shell,然后我们就进入容器的终端了,run是运行,如果没有就进行下载。
现在进入一个 ubuntu15.10系统的容器,可以ls查看里面的文件等信息,然后使用exit命令或者CTRL+D来退出。
还可以使用这个下载最新的Ubuntu,因为没有指定版本,默认最新的(latest)
$ docker run ubuntu
列出所有镜像
$ docker images
根据仓库名列出镜像
$ docker images ubuntu
根据仓库名和标签列出镜像
$ docker images ubuntu:15.10
查看所有镜像,包括停止的镜像
$ docker images -a
查看镜像,容器,数据卷所占用的空间
$ docker system df
第一行代表的是images,TOTAL有三个,ACTIVE是有三个运行数量
第二行代表容器,总共有六个,没有运行的。
第三行数据卷,是空的。
查看所有容器,包括停止的容器,status的确没有运行的
$ docker ps -a
删除容器docker rm CONTAINER ID ,也可以使用仓库名:标签。
$ docker rm 45df3ba63d84
删除镜像docker rmi CONTAINER ID ,也可以使用仓库名:标签。注意:如果容器和镜像关联了,可以先删除容器,在删除镜像。
$ docker rmi a2a15febcdf3
容器的常用操作
docker start [OPTIONS] CONTAINER [CONTAINER…]
docker stop [OPTIONS] CONTAINER [CONTAINER…]
docker restart [OPTIONS] CONTAINER [CONTAINER…]
列如对容器hello进行操作
$ docker start hello #启动容器
$ docker stop hello #停止容器
$ docker restart hello #重启容器
$ docker exec -it hello bash #进入容器
$ docker rm hello #删除容器
$ docker rm -f $(docker ps -q -a) #删除所有容器
commit镜像构成
下载一个nginx容器,命名为webnginx,-d表示在后台运行,-p是指定端口映射,映射到80端口,然后使用docker ps查看正在运行的容器。
$ docker run --name webserver -d -p 80:80 nginx
$ docker ps
打开web,我这边使用的是虚拟机centos的地址,根据情况使用你自己的虚拟机、本机、云服务器等地址,如果因为防火墙问题, centos7可使用:
firewall-cmd --state #查看默认防火墙状态(关闭后是notrunning,开启后是running)
systemctl start firewalld.service #开启防火墙
systemctl stop firewalld.service #关闭防火墙
systemctl disable firewalld.service #禁止开机启动。
进入webserver,更改里面的内容, bash 命令是获得一个可操作的 Shell
[root@bogon ~]# docker exec -it webserver bash
root@1f68c945c81f:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@1f68c945c81f:/# exit
因为修改了文件,也就是修改了容器的存储层,可以使用diff查看webserver容器的改动
$ docker diff webserver
使用commit将容器保存为镜像,docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
$ docker commit --author "<xxxxx@163.com>" --message "8.21修改了默认网页" webserver webserver:v1
-a :提交的镜像作者( --author)
-c :使用Dockerfile指令来创建镜像
-m :提交时的说明文字( --message)
-p :在commit时,将容器暂停
然后使用docker images进行查看
使用docker history 具体查看镜像内的历史记录
$ docker history webserver:v1
上面commit已经生成了本地镜像,如果想提交到docker hub仓库,需要docker hub账号,然后使用docker push [OPTIONS] NAME[:TAG]
$ docker login #首先需要登录
$ docker push 账号名/镜像名称:标签 #进行上传
$ docker pull 账号名/镜像名称:标签 #进行下载
数据卷
数据卷是存储数据的,可以在多个容器之间进行数据共享,这里使用的是volumes ,
volumes里面的数据默认都存储在/var/lib/docker/volumes。
docker volume 子命令:
create 创建数据卷
inspect 显示数据卷的详细信息
ls 列出所有的数据卷
prune 删除所有未使用的 volumes
rm 删除一个或多个未使用的 volumes
使用volumes创建数据卷容器dbdata,挂载到/dbdata 目录
$ docker run -itd -v /dbdata --name dbdata ubuntu
在其他容器中使用–volumes-from来挂载dbdata容器中的数据卷
$ docker run -itd --volumes-from dbdata --name db1 ubuntu
$ docker run -itd --volumes-from dbdata --name db2 ubuntu
使用docker ps 查看已运行的容器,然后使用下面的命令进入容器,把a1aced6711c5替换成你的CONTAINER ID
$ docker exec -it a1aced6711c5 bash
在里面/dbdata 目录下创建一个test目录,然后在其他两个容器里面的dbdata下面也会有test目录,然后exit退出,在/var/lib/docker/volumes/随机名/_data这个目录下面就是你的dbdata里面的内容。
1.备份
使用下面的命令来备份dbdata数据卷容器内的数据卷:
$ docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
首先利用ubuntu镜像创建了一个容器worker。使用–volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷(即dbdata数据卷),使用-v $(pwd):/backup参数来挂载本地的当前目录到worker容器的/backup目录。worker容器启动后,使用了tar cvf /backup/backup.tar /dbdata命令来将/dbdata下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar。
参考资料:https://yeasy.gitbooks.io/docker_practice/image/commit.html
参考资料:https://www.cnblogs.com/wade-luffy/p/6542539.html
参考资料:https://docs.docker.com/storage/