Docker简单入门

容器

容器是一个大包了应用和服务的环境,是一个轻量级的虚拟机。每一个容器都由一组特定的应用和必要的依赖库组成。

创建容器

  • docker create命令
  • docker run命令

docker create创建的容器处于停止状态,docker run不仅创建了容器而且启动了容器(相当于docker create & docker run)。

代码示例:

docker ps -a
docker run hello-world
docker ps -a

以上代码中的docker ps -a表示查看所有的容器。

容器的类型:

  • 交互型容器:运行在前台,通常会指定有交互的控制台,可以给容器输入,也可以得到容器的输出。创建该容器的终端被关闭,在容器内部使用exit命令或者调用了docker stopdocker kill命令后,容器会变成停止状态。
  • 后台型容器:运行在后台,创建启动之后就与终端无关。即便终端关闭了,该后台也依然存在,只有调用了docker stop或者docker kill命令才能使容器编程停止状态。

创建交互型容器命令:docker run -i -t --name=XXX image名称 -i表示用于打开容器的标准输入,-t告诉Docker为容器建立一个命令行终端

创建后台型容器命令:docker run --name=XXX -d image名称 -d参数用于创建后台型容器

docker_run命令的内部流程.png

查看容器

docker ps -a命令可以查看当前的所有的容器。

该命令运行后出现了以下各列:

  • CONTAINER ID:唯一标识容器的ID
  • IMAGE:创建容器时所使用的的镜像
  • COMMAND:容器最后运行的命令
  • CREATED:创建容器的时间
  • STATUS:容器的状态
  • PORTS:对外开放的端口
  • NAMES:容器名

启动容器

使用docker start来启动之前已经停止了的容器。

–restart会让容器在退出后能够自动重启。–restart=always表示不管容器返回的是什么,都会重启容器;–restart=on-failure:5表示当容器返回非0时,Docker重启容器,最多尝试重启5次。

终止容器

交互型容器可以输入exit或者ctrl+d组合键来使其退出。

docker stop命令的默认行为会导致容器退出。docker kill可以强制退出容器。

删除容器

使用命令docker rm删除容器。

在删除容器的时候,必须先停止然后才能删除

其他常用命令

  • docker attach依附命令,通常用在start或restart启动的交互型容器中。
  • docker logs命令,查看容器日志
  • docker top命令,查看容器进程
  • docker inspect命令,用于查看容器的配置
  • docker exec命令,用于在容器中运行新的任务(后台型任务和交互型任务)
  • docker export命令,导出容器
  • docker import命令,导入容器

镜像

镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上。

镜像是容器的运行基础,容器是镜像运行后的形态。

镜像的系统结构

Docker镜像的系统结构.png

镜像的本质是磁盘上一系列文件的集合。创建新的镜像其实也就是对已有镜像文件进行增、删、改操作。

镜像的写时复制机制

通过docker run命令运行镜像创建一个容器时,实际上是在该镜像之上创建一个空的可读写文件系统层级。可以将这个文件系统当成一个新的临时镜像,而命令里所指定的镜像称为父镜像。父镜像的内容都是以只读方式挂载进来的,容器会读取共享父镜像的内容。不过一旦需要修改父镜像文件,便会触发Docker从父镜像中复制这个文件到临时镜像中来,所有的修改均发生在你的文件系统中,而不会对父镜像造成任何影响,这就是Docker镜像的写时复制机制。

管理本地镜像

查看

列出本机上的所有镜像: docker images

查看镜像的详细信息:docker inspect 镜像名

下载

可以使用docker run命令,安装的时候下载,也可以使用docker pull命令预先下载镜像。

删除

使用命令docker rmi

有的时候出现镜像删除不掉的情况,遇到这种情况的很大一部分原因是由于这个镜像被容器所依赖。可以使用-f参数进行强制删除;或者先将依赖它的镜像和容器移除,然后再删除。

创建本地镜像

第一种方式:使用导入tar包的方式

要求是该tar包是由镜像导出的。

第二种方式:使用commit命令创建本地镜像

通过实例来说明怎么操作的:

docker run -t -i ubuntu
apt-get update
apt-get install sqlite3
echo “test docker commit” >> hellodocker
exit

docker commit -m=”Message” –author=”HingKwan” xxxxxxxx(容器的ID) hingkwan/sqlite3:v1

docker images

docker run -t -i hingkwan/sqlite3:v1

第三种方式:使用Dockerfile创建镜像

这种方法是将需要对镜像进行的操作全部写到一个文件中,然后使用docker build命令从这个文件中创建镜像。

首先创建如下文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# version:1.0.0
# 指定待扩展的父级镜像
FROM ubuntu:latest
# 用来声明创建的镜像的作者信息
MAINTAINER xxx "xxx@xxx.com"
# 设置root用户为后续命令的执行者
USER root
# 执行操作
RUN apt-get update
RUN ["apt-get","update"]
RUN apt-get install -y nginx
# 使用&&拼接命令
RUN touch test.txt && echo "abc" >> abc.txt
# 对外暴露接口
EXPOSE 80 8080 1038
# 添加文件
ADD abc.txt /opt/
# 添加文件夹
ADD /webapp /opt/webapp
# 添加网络文件
ADD http://xxx.com/img/aaa.png /opt/
# 设置环境变量
ENV WEBAPP_PORT=9090
# 设置工作目录
WORKDIR /opt/
# 设置启动目录
ENTRYPOINT ["ls"]
# 设置启动参数
CMD ["-a","-l"]
# 设置卷
VOLUME["/data","/var/www"]
# 设置子镜像的触发操作
ONBUILD ADD . /app/src
ONBUILD RUN echo "on build excuted" >> onbuild.txt

执行命令:docker build -t hingkwan/test:v1 .

或者把Dockerfile保存到git上,然后执行:docker build -t hingkwan/test:v1 git的地址

数据卷

创建数据卷

可以通过两种方法创建数据卷:

  • 在Dockerfile中,使用VOLUME指令。
  • 在命令行中使用docker run时,使用-v参数来创建数据卷并将其挂载到容器中。

挂载主机目录和文件作为数据卷

我们可以指定宿主主机上的某个目录或者文件作为数据卷。

使用命令示例如:

docker run -d -P –name webapp -v pwd :/webapp training/webapp python app.py

Dockerfile并不支持挂载本地目录到数据卷,这主要是因为不同操作系统的目录格式不尽系统。为了保证Dockerfile的移植性,所以不支持挂载本地目录到数据卷。

数据卷容器

数据卷容器是指一个专门用于挂载数据卷的容器,以供其他容器引用和使用。它主要用在多个容器需要从一处获得数据时。

使用示例:

docker run -d -v /dbdata –name dbdata training/postgres # 这行代码的意思是建立一个数据容器,名为dbdata;并为该容器新建数据卷/dbdata
docker run -d –volumns-from=dbdata –name db1 training/postgres # 创建容器db1,它引用dbdata的数据卷

数据卷一旦声明,它的生命周期和声明它的那个容器就没有关系了。声明它的容器停止了,数据卷依然存在。一个容器引用一个数据卷容器时,并不要求数据卷容器是运行的。

数据的北方与恢复

利用数据卷容器,还可以进行数据的备份和恢复等。

备份

利用数据卷容器,我们可以备份一个数据卷容器的数据。

docker run -d -v /dbdata –name dbdata training/postgres # 创建一个数据卷容器
docker run –volumns-from dbdata -v $(pwd):/backup ubuntu tar cvf # 将/dbdata中的数据备份到本地,备份后的数据为backup.tar

恢复

docker run -v /dbdata –name dbdata2 ubuntu /bin/bash # 声明一个需要恢复的数据容器。创建了数据卷/dbdata & 名为dbdata2的容器
docker run –volumns-from dbdata2 -v $(pwd):/backup busybox tar xvf # 利用另一个引用它的容器来关联到本地目录,并将本地的数据解压进数据卷中

容器连接

容器连接包括源容器和目标容器:源容器是提供服务的一方,对外提供指定服务;目标容器连接到源容器后,就可以使用其所提供的服务。

连接的格式为--link name:alias

docker run -d –name dbdata training/postgres
docker run -d -P –name web –link dbdata:db training/webapp python app.py

使用代理连接,可以解耦两个原本直接相连的容器的耦合性。