一、虚拟化及Docker简介
1、左图为os层的虚拟化架构,右图为全虚拟化架构
2、全虚拟化架构的典型为:虚拟机,os层的典型案例:docker
注意:OS层虚拟化架构虚拟出来的系统要与底层操作系统共享系统内核
3、Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
4、集装箱化的优点:
- 灵活:即使是复杂的应用程序也可封装。
- 轻量级:容器利用并共享主机内核。
- 便携式:您可以在本地构建,部署到云上并在任何地方运行。
- 可扩展性:您可以增加和自动分发容器副本。
- 可堆叠:您可以垂直堆叠服务并及时并及时堆叠服务。
5、docker组成
- Docker Client客户端
- Docker Daemon守护进程
- Docker Image镜像
- Docker Container容器
6、docker架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
注意:Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
二、Docker环境的安装及操作
1、docker安装
yum install -y docker
2、启动docker
systemctl start docker
3、验证docker安装
docker run hello-world
4、查看docker命令使用方法
docker command --help
5、查找/下载镜像
docker search [镜像名]:[版本号]
docker pull [镜像名]:[版本号]
不填版本号默认最新版本(latest)
6、启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
- -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
- -d: 后台运行容器,并返回容器ID;
- -i: 以交互模式运行容器,通常与 -t 同时使用;
- -P: 随机端口映射,容器内部端口随机映射到主机的高端口
- -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
- -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- –name=“nginx-lb”: 为容器指定一个名称;
- –dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
- –dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
- -h “mars”: 指定容器的hostname;
- -e username=“ritchie”: 设置环境变量;
- –env-file=[]: 从指定文件读入环境变量;
- –cpuset=“0-2” or --cpuset=“0,1,2”: 绑定容器到指定CPU运行;
- -m 设置容器使用内存最大值;
- –link=[]: 添加链接到另一个容器;
- –expose=[]: 开放一个端口或一组端口;
- –volume , -v: 绑定一个卷(目录映射);
- –privileged=false: 指定容器是否为特权容器,特权容器拥有所有的capabilities;
- –net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
- bridge 使用docker daemon指定的网桥
- host //容器使用主机的网络
- container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
- none 容器使用自己的网络(类似–net=bridge),但是不进行配置
--restart="no"
指定容器停止后的重启策略;- no:容器退出时不重启
- on-failure:容器故障退出(返回值非零)时重启
- always:容器退出时总是重启
- –rm=false: 指定容器停止后自动删除容器(不支持以docker run -d启动的容器);
--sig-proxy=true
设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理;
命令解析器:
/etc/rc.local 把所有需要开机自的启动命令放在/etc/rc.local中,就可以达到多程序开机自启动了
/bin/bash 放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
实例:
docker run --name mynginx -dit -p 80:80 -v /data:/data nginx:latest /bin/bash
7、查看镜像
docker images
8、删除镜像
docker rmi [镜像名]:[版本号]/镜像ID
9、批量删除镜像
docker rmi `docker images -q` 或 docker rmi $(docker images -q)
强制删除镜像在rmi后面加上-f即可
10、删除所有镜像
docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)
11、查看启动中的容器
docker ps
12、查看关闭中的容器
docker ps -a
13、启动/关闭/重启容器
docker start [容器id/容器名]
docker stop [容器id/容器名]
docker restart [容器id/容器名]
14、删除容器
docker rm [容器id/容器名]
15、批量删除容器
docker rm `docker ps -a -q` 或 docker rm $(docker images -a -q)
16、查看容器中运行的进程
docker top [容器id/容器名]
17、移除所有的容器和镜像
docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)
18、进入容器
两种方式:
docker attach:此命令进入容器,容器退出,会导致容器的停止。
docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
exec语法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS说明:
- -d 分离模式: 在后台运行
- -i 即使没有附加也保持STDIN 打开
- -t 分配一个伪终端
实例:
在容器 mynginx 中以交互模式执行容器内 /root/runoob.sh 脚本:
docker exec -it mynginx /bin/sh /root/runoob.sh
在容器 mynginx 中开启一个交互模式的终端:
docker exec -it mynginx /bin/bash
19、从容器创建镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
- -a 提交的镜像作者;
- -c 使用Dockerfile指令来创建镜像;
- -m 提交时的说明文字;
- -p 在commit时,将容器暂停;
实例:
docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
20、为镜像添加一个新的标签
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
实例:
docker tag ubuntu:15.10 runoob/ubuntu:v3
21、 将指定镜像保存成 tar 归档文件
docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS 说明:
- -o 输出到的文件。
实例:
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
22、导出和导入容器
导出本地某个容器,可以使用 docker export 命令。
docker export [容器id] > ubuntu.tar
导入容器快照
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
三、DockerFile创建镜像
1、Dockerfile的基本结构
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
2、Dockerfile文件说明
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#
字符开头则被视为注释。可以在Docker文件中使用RUN
,CMD
,FROM
,EXPOSE
,ENV
等指令。
3、常用指令
- FROM:指定基础镜像,必须为第一个命令
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
示例:
FROM mysql:5.6
注:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
- MAINTAINER: 维护者信息
RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行
格式:
RUN <command>
exec执行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"]
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]
注:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
- ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
- COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
- CMD:构建容器后调用,也就是在容器启动时才进行调用。
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
注:
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
- ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
示例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
注:
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
- LABEL:用于为镜像添加元数据
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
- ENV:设置环境变量
格式:
ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat=fluffy
- EXPOSE:指定于外界交互的端口
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注:
EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
- VOLUME:用于指定持久化目录
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
卷可以容器间共享和重用
容器并不一定要和其它容器共享卷
修改卷后会立即生效
对卷的修改不会对镜像产生影响
卷会一直存在,直到没有任何容器在使用它
- WORKDIR:工作目录,类似于cd命令
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
注:
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
- USER: 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
注:
使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
- ARG:用于指定传递给构建运行时的变量
格式:
ARG <name>[=<default value>]
示例:
ARG site
ARG build_user=www
- ONBUILD:用于设置镜像触发器
格式:
ONBUILD [INSTRUCTION]
示例:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
实例:
# This my first nginx Dockerfile
# Version 1.0
# Base images 基础镜像
FROM centos
#MAINTAINER 维护者信息
MAINTAINER tianfeiyu
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
#RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm \
&& yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["nginx"]
4、使用 Dockerfile 创建镜像
docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
--build-arg=[]
设置镜像创建时的变量;--cpu-shares
设置 cpu 使用权重;--cpu-period
限制 CPU CFS周期;--cpu-quota
限制 CPU CFS配额;--cpuset-cpus
指定使用的CPU id;--cpuset-mems
指定使用的内存 id;--disable-content-trust
忽略校验,默认开启;-f
指定要使用的Dockerfile路径;--force-rm
设置镜像过程中删除中间容器;--isolation
使用容器隔离技术;--label=[]
设置镜像使用的元数据;-m
设置内存最大值;--memory-swap
设置Swap的最大值为内存+swap,"-1"表示不限swap;--no-cache
创建镜像的过程不使用缓存;--pull
尝试去更新镜像的新版本;--quiet, -q
安静模式,成功后只输出镜像 ID;--rm
设置镜像成功后删除中间容器;--shm-size
设置/dev/shm的大小,默认值是64M;--ulimit
Ulimit配置。--tag, -t
镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。--network
默认 default。在构建期间设置RUN指令的网络模式
实例:
docker build -t runoob/ubuntu:v1 .
tion :使用容器隔离技术;
--label=[]
设置镜像使用的元数据;-m
设置内存最大值;--memory-swap
设置Swap的最大值为内存+swap,"-1"表示不限swap;--no-cache
创建镜像的过程不使用缓存;--pull
尝试去更新镜像的新版本;--quiet, -q
安静模式,成功后只输出镜像 ID;--rm
设置镜像成功后删除中间容器;--shm-size
设置/dev/shm的大小,默认值是64M;--ulimit
Ulimit配置。--tag, -t
镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。--network
默认 default。在构建期间设置RUN指令的网络模式
实例:
docker build -t runoob/ubuntu:v1 .
注意:.
Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径