Docker基础
- 一、Docker是什么?
- 二、相关网址
- 三、安装
- 四、Docker镜像
- 4.1 父镜像
- 4.2 基础镜像
- 4.3 利用 Dockerfile 来创建镜像
- 4.4、镜像的实现原理
- 五、docker常用命令
- 5.1、docker服务命令
- 5.1.1、启动docker服务
- 5.1.2、重启docker服务
- 5.2、镜像操作命令
- 5.2.1、从仓库获取所需要的镜像
- 5.2.2、查看所有镜像
- 5.2.3、使用下载的镜像启动容器
- 5.2.4、修改已有镜像
- 5.2.5、用 docker tag 命令来修改镜像的标签。
- 5.2.6、 从本地文件系统导入
- 5.2.7、上传镜像到镜像仓库,实现镜像共享
- 5.2.8、将指定镜像保存成 tar 归档文件
- 5.2.9、docker load载入镜像
- 5.3、容器命令
- 5.3.1、新建并启动容器-docker run
- 5.3.2、启动已终止容器
- 5.3.3、守护态运行-后台运行
- 5.3.4、查看容器进程-docker ps
- 5.3.5、进入容器
- 5.3.6、终止或删除容器和镜像
- (5.1)删除所有镜像
- (5.2)移除所有的容器和镜像
- (5.3)清理所有(处于终止状态)的容器
- (5.4)删除所有的容器(未终止状态的容器)
- 5.3.7、显示 Docker 系统信息,包括镜像和容器数
- 5.3.8、查看容器日志
- 5.4、数据卷volumes
- 5.4.1、 创建一个数据卷
- 5.4.2、挂载一个主机目录作为数据卷
一、Docker是什么?
docker是一个开源的软件部署解决方案
docker也是轻量级的应用容器框架
docker可以打包、发布、运行任何的应用
二、相关网址
docker官网.
中文社区.
中文手册.
三、安装
这里使用的是虚拟机上安装centos系统,在centos系统上体验安装docker:
先安装虚拟机,在虚拟机上安装64位linux环境.
再安装docker:.
四、Docker镜像
Docker镜像(Image)类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读 模板,包含了文件系统。
例如:一个镜像可以只包含一个完整的Ubuntu操作系统环境,可以把它称为一个 Ubimtu镜像。镜像也可以安装了 Apache应用程序(或用户需要的其他软件),可以把它称为 一个Apache镜像。
- 基础镜像
在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。
由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不 可写,所以镜像是无状态的。
4.1 父镜像
镜像层次
每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。我们有时说,下层那个 镜像是上层镜像的父镜像。
4.2 基础镜像
一个没有任何父镜像的镜像,谓之基础镜像。
- 获取镜像
可以使用 docker pull 命令来从仓库获取所需要的镜像。
下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像。
[root@localhost ~]# sudo docker pull ubuntu:12.04
12.04: Pulling from library/ubuntu
d8868e50ac4c: Pull complete
83251ac64627: Pull complete
589bba2f1b36: Pull complete
d62ecaceda39: Pull complete
6d93b41cfc6b: Pull complete
Digest: sha256:18305429afa14ea462f810146ba44d4363ae76e4c8dfc38288cf73aa07485005
Status: Downloaded newer image for ubuntu:12.04
docker.io/library/ubuntu:12.04
- 列出本地镜像
使用 docker images 显示本地已有的镜像。
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
chaosbladeio/chaosblade-demo latest 1ef4d7419cfb 2 years ago 247MB
ubuntu 12.04 5b117edd0b76 4 years ago 104MB
在列出信息中,可以看到几个字段信息
来自于哪个仓库,比如 ubuntu
镜像的标记,比如 14.04
它的 ID 号(镜像的 ID 唯一标识了镜像)
创建时间
镜像大小
4.3 利用 Dockerfile 来创建镜像
使用 docker commit 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 docker build来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。
Dockerfile 基本的语法是
- 使用#来注释
- FROM 指令告诉 Docker 使用哪个镜像作为基础
- 接着是维护者的信息
- RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使 用 apt-get 来安装了一些软件
新建一个目录和一个 Dockerfile
$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile
Dockerfile 中每一条指令都创建镜像的一层,例如:
# This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee <newbee@docker.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra
编写完成 Dockerfile 后可以使用 docker build 来生成镜像。
sudo docker build -t="ouruser/sinatra:v2" .
其中 -t 标记来添加 tag,指定新的镜像的用户信息。
“.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。
4.4、镜像的实现原理
Docker 镜像是怎么实现增量的修改和维护的? 每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去。
通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下,另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起,Live CD 正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作。 Docker 在 AUFS 上构建的容器也是利用了类似的原理。
五、docker常用命令
5.1、docker服务命令
5.1.1、启动docker服务
service docker start
5.1.2、重启docker服务
systemctl daemon-reload
service docker restart
5.2、镜像操作命令
5.2.1、从仓库获取所需要的镜像
sudo docker pull <image>
5.2.2、查看所有镜像
docker images
5.2.3、使用下载的镜像启动容器
[root@localhost ~]# sudo docker run -ti ubuntu:12.04 /bin/bash
root@b2e1e15e1782:/# ll
total 8
drwxr-xr-x. 1 root root 6 Jan 23 06:09 ./
drwxr-xr-x. 1 root root 6 Jan 23 06:09 ../
-rwxr-xr-x. 1 root root 0 Jan 23 06:09 .dockerenv*
drwxr-xr-x. 2 root root 4096 Mar 31 2017 bin/
drwxr-xr-x. 2 root root 6 Apr 19 2012 boot/
drwxr-xr-x. 5 root root 360 Jan 23 06:09 dev/
drwxr-xr-x. 1 root root 66 Jan 23 06:09 etc/
drwxr-xr-x. 2 root root 6 Apr 19 2012 home/
drwxr-xr-x. 11 root root 4096 Mar 31 2017 lib/
drwxr-xr-x. 2 root root 34 Mar 31 2017 lib64/
drwxr-xr-x. 2 root root 6 Mar 31 2017 media/
drwxr-xr-x. 2 root root 6 Apr 19 2012 mnt/
drwxr-xr-x. 2 root root 6 Mar 31 2017 opt/
dr-xr-xr-x. 122 root root 0 Jan 23 06:09 proc/
drwx------. 2 root root 37 Mar 31 2017 root/
drwxr-xr-x. 1 root root 21 Apr 12 2017 run/
drwxr-xr-x. 1 root root 44 Apr 12 2017 sbin/
drwxr-xr-x. 2 root root 6 Mar 5 2012 selinux/
drwxr-xr-x. 2 root root 6 Mar 31 2017 srv/
dr-xr-xr-x. 13 root root 0 Jan 23 05:41 sys/
drwxrwxrwt. 2 root root 6 Mar 31 2017 tmp/
drwxr-xr-x. 1 root root 18 Apr 12 2017 usr/
drwxr-xr-x. 1 root root 17 Apr 12 2017 var/
root@b2e1e15e1782:/#
5.2.4、修改已有镜像
[root@localhost ~]# sudo docker commit -m "Added nodejs" -a "Docker Newbee" b2e1e15e1782 ubuntu:12.04-v2
sha256:57d1eed7de41bc68a2e9876f1f3593245d8807207177dfca3c4aa10e6cc2fa6f
5.2.5、用 docker tag 命令来修改镜像的标签。
$ sudo docker tag 5db5f8471261 ouruser/sinatra:devel
5.2.6、 从本地文件系统导入
要从本地文件系统导入一个镜像,可以使用 openvz(容器虚拟化的先锋技术)的模板来创建: openvz 的模板下载地址为 templates 。
比如,先下载了一个 ubuntu-14.04 的镜像,之后使用以下命令导入:
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
5.2.7、上传镜像到镜像仓库,实现镜像共享
sudo docker push <image>
5.2.8、将指定镜像保存成 tar 归档文件
docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS 说明:
-o :输出到的文件。
-----------------------------------------------------------
举例:
将镜像 ubuntu:v3 生成 my_ubuntu_v3.tar 文档
runoob@runoob:~$ docker save -o my_ubuntu_v3.tar ubuntu:v3
runoob@runoob:~$ ll my_ubuntu_v3.tar
-rw------- 1 runoob runoob 142102016 Jul 11 01:37 my_ubuntu_v3.tar
可以看到已经把打包的镜像存放在bin路径下了,如果其他环境需要加载这个镜像,可以通过scp命令拷贝过去,然后使用下面的load方法加载镜像
5.2.9、docker load载入镜像
在镜像所在目录下执行
语法
docker load [OPTIONS]
OPTIONS 说明:
-i :指定导出的文件。
-q :精简输出信息。
-----------------------------------------------------------
导入镜像(举例):
docker load -i ubuntu.tar 【ubuntu.tar是镜像名】
docker load < ubuntu.tar
5.3、容器命令
5.3.1、新建并启动容器-docker run
[root@localhost centosdemo]# docker run ubuntu:12.04 /bin/echo "hello"
hello
当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个 ip 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
5.3.2、启动已终止容器
docker start <CONTAINER ID>
5.3.3、守护态运行-后台运行
让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加 -d 参数来实现。
例如下面的命令会在后台运行容器。
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
5.3.4、查看容器进程-docker ps
docker ps -a
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2e1e15e1782 ubuntu:12.04 "/bin/bash" 7 minutes ago Up 7 minutes great_khorana
5748908b2d4a chaosbladeio/chaosblade-demo "/bin/bash /root/ini…" 6 days ago Exited (137) 6 days ago nifty_matsumoto
docker ps [OPTIONS]
OPTIONS说明:
-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
-----------------------------------------------------------
举例:
* 列出所有在运行的容器信息:
docker ps
* 列出最近创建的5个容器信息:
docker ps -n 5
* 列出所有创建的容器ID:
docker ps -a -q
5.3.5、进入容器
docker exec -ti <CONTAINER ID> bash
5.3.6、终止或删除容器和镜像
(5.1)删除所有镜像
docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)
(5.2)移除所有的容器和镜像
docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)
(5.3)清理所有(处于终止状态)的容器
删除所有容器:
docker rm $(docker ps -a -q)
停止、杀死一个容器:
docker stop <容器名orID>
docker kill <容器名orID>
(5.4)删除所有的容器(未终止状态的容器)
docker kill $(docker ps -q) ; docker rm $(docker ps -a -q)
5.3.7、显示 Docker 系统信息,包括镜像和容器数
docker info [OPTIONS]
5.3.8、查看容器日志
docker logs <CONTAINER ID>
5.4、数据卷volumes
1、数据卷
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 卷会一直存在,直到没有容器使用
- 数据卷的使用,类似于 Linux 下对目录或文件进行 mount。
5.4.1、 创建一个数据卷
在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。
下面创建一个 web 容器,并加载一个数据卷到容器的 /webapp 目录。
sudo docker run -d -P --name web -v /webapp training/webapp python app.py
*注意:也可以在 Dockerfile 中使用 VOLUME 来添加一个或者多个新的卷到由该镜像创建的任意容器。
5.4.2、挂载一个主机目录作为数据卷
使用 -v 标记也可以指定挂载一个本地主机的目录到容器中去。
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
上面的命令加载主机的 /src/webapp 目录到容器的 /opt/webapp 目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建。
- 注意:Dockerfile 中不支持这种用法,这是因为 Dockerfile 是为了移植和分享用的。然而,不同操作系统的路径格式不一样,所以目前还不能支持。
Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
training/webapp python app.py
加了 :ro 之后,就挂载为只读了。