一、docker架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
二、docker镜像
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。下面我们来学习:
- 1、管理和使用本地 Docker 主机镜像
- 2、创建镜像
1、列出镜像列表:docker images
2、查找镜像:docker search 镜像名
3、下载镜像:docker pull 镜像名
4、删除镜像:docker rmi hello-world(镜像删除使用 docker rmi 命令,比如我们删除 hello-world 镜像)
5、创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 1、从已经创建的容器中更新镜像,并且提交这个镜像
- 2、使用 Dockerfile 指令来创建一个新的镜像
(1)更新镜像之前,我们需要使用镜像来创建一个容器:
runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash
root@e218edb10161:/#
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。
runoob@runoob:~$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8
各个参数说明:
-
-m: 提交的描述信息
-
-a: 指定镜像作者
-
e218edb10161:容器 ID
-
runoob/ubuntu:v2: 指定要创建的目标镜像名
使用我们的新镜像 runoob/ubuntu:v2 来启动一个容器
runoob@runoob:~$ docker run -t -i runoob/ubuntu:v2 /bin/bash
root@1a9fbdeb5da3:/#
(2)构建镜像
我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
(3)设置镜像标签
docker tag 860c279d2fec runoob/centos:dev
docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。
可以看到多了 dev 的tag名
6、运行nginx,后台运行,把本地端口号8080映射到docker的80端口
-p:映射端口
-d:后台运行并打印容器id
docker run -d -p 8080:80 nginx
7、建一个cpu优先级为100,内存限制512MB,主机名为test1,名为docker_test 后台运行的bash的容器
-t:分配一个伪终端
-i:以交互式模式运行容器,通常与-t同时运行,可以直接写成-it
-c:限制cpu优先级
-m:限制内存大小
-h:设置主机名称
docker run -t -i -c 100 -m 512MB -h test1 -d --name="docker_test" ubuntu /bin/bash
三、容器使用
1、列出容器
docker ps #查看正在运行的容器
docker ps -a #查看所有容器
2、启动容器
(1)以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:docker run -it ubuntu /bin/bash
参数说明:
- -i: 交互式操作。
- -t: 终端。
- -d:后台运行模式
- ubuntu: ubuntu 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit:
注意:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec。
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
// 方式1:如果从这个容器退出,不会导致容器的停止,这就是为什么推荐大家使用 docker exec 的原因。
docker exec -it 243c32535da7 /bin/bash
// 方式2: 如果从这个容器退出,会导致容器的停止,所以不推荐
docker attach 1e560fca3906
(2)使用 docker start 启动一个已停止的容器:docker start b750bbbcfd88
(3)停止容器:docker stop <容器 ID>
(4)重启:docker restart <容器 ID>
(5)暂停:docker pause container_id
(6)继续:docker unpause container_id
3、删除容器
删除容器使用 docker rm 命令:docker rm -f 1e560fca3906
// 拷贝文件到容器中(在本地执行,而不是在容器中执行,容器中没有docker)
docker cp 本地路径 容器names:/路径
// 容器中文件拷贝到本地
docker cp 容器names:/路径 本地路径
四、容器连接
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。
两种方式的区别是:
- -P :是容器内部端口随机映射到主机的高端口。
- -p : 是容器内部端口绑定到指定的主机端口。
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
// 这样我们就可以通过访问 127.0.0.1:5001 来访问容器的 5000 端口
docker port adoring_stonebraker 5000
// 查看容器5000端口绑定情况
五、dockerfile文件
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
上下文路径:下面指令最后一个 . 是上下文路径,那么什么是上下文路径呢?
docker build -t nginx:test .
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。