Docker简介
Docker 三大概念
镜像:可以用来创建 Docker 容器(container)。
容器:是镜像创建的运行实例。可以被启动,开始,停止,删除。每个容器相互隔离,保证安全。容器可以看成是简易版的 Linux 环境,并且镜像是只读的,容器可以创建一层可写层作为最上层。
仓库:是存放镜像文件的场所。仓库注册服务器包括多个仓库,每个仓库又包括了 多个镜像。仓库又分为公开仓库 和 私有仓库,最大的公开仓库是 Docker Hub。(可以理解成 github 这样的)
Docker 核心技术主要从以下几个方面实现
进程命名空间:通过进程命名空间,将 docker 进程和 宿主进程进行隔离
网络:docker 网络模式使用桥接的方式进行
文件隔离:通过加载虚拟挂载点,重设 root 目录等等,将文件系统进行隔离
物理资源的隔离:通过 CGroups(Control Groups),限制容器在 CPU,内存,磁盘IO、网络上的使用率,以此来隔离容器间的资源分配。
Docker 镜像的概念:Dockerfile 中的每条命令会形成一个 diff 层,每个 diff 层都是只读的,只有最上面的层是可写的。这个操作通过 UnionFS 实现。通过 AUFS(Advanced UnionFS),可以将未修改的镜像层进行联合挂载,从而提高读写效率。
CentOS 7.3 安装 Docker
准备环境
yum install -y yum-utils device-mapper-persistent-data lvm2
#设置稳定的存储库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --enable docker-ce-edge
开始安装
#ce社区版、ce社区版
yum -y install docker-ce
启动Docker并设置为开机自启
将Docker的源更换为阿里源
路径:/etc/systemd/system/multi-user.target.wants/docker.service
更改完成保存退出并执行:systemctl daemon-reload
如下图
Docker基本指令介绍
docker commond --help:查看docker的指令介绍
docker run 构建并运行一个容器
常用参数:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-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 :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
docker ps 用来查看正在运行中的容器
命令常用参数:
-a:查看虽有容器,包括已经停止运行的
-l :查看刚刚启动的容器
-q:只显示容器ID
docker stop :停止运行中的容器
docker start :重新启动已经停止的容器
docker restart :重启一个运行中的容器
操作实例
重启/停止示例
如何进入已启动的容器?
docker exec
在一个已存在的容器执行后台任务或交互式任务,打开一个交互式终端
OPTIONS说明:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
进入容器如下所示,退出容器用“exit”
#docker exec -it NAMES or CONTAINER ID /bin/bash
docker exec -it nginx_test /bin/bash
在宿主机执行容器中的脚本:docker exec -it /bin/sh /root/test.sh
查看容器信息
docker inspect <NAMES or CONTAINER ID>
Dockerfile简介
dockerfile是一个文本格式的配置文件,快速创建自定义的镜像;
dockerfile命名格式是固定的不可自定义,格式为:“dockerfile” or “Dockerfile”
Dockerfile参数介绍
FROM: 格式为 FROM 或 FROM : 。
第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM指令(每个镜像一次)。
MAINTAINER: 格式为 MAINTAINER ,指定维护者信息。
RUN: 格式为 RUN 或 RUN [“executable”, “param1”, “param2”] 。
前者将在 shell 终端中运行命令,即 /bin/sh -c ;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现,例如 RUN [“/bin/bash”, “-c”, “echo hello”] 。
每条 RUN 参数将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。
CMD: 支持三种格式
CMD [“executable”,”param1″,”param2″] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD [“param1″,”param2”] 提供给 ENTRYPOINT 的默认参数;
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
EXPOSE:格式为 EXPOSE […] 。
告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。
ENV: 格式为 ENV 。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
ADD: 格式为 ADD 。
该参数将复制指定的 到容器中的 ;其中 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个tar文件(自动解压为目录)。
COPY: 格式为 COPY 。
复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的 。
当使用本地目录为源目录时,推荐使用 COPY 。
ENTRYPOINT: 两种格式如下
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2 (shell中执行)。
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效。
VOLUME:格式为 VOLUME [“/data”] 。
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
USER: 格式为 USER daemon 。
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。
当服务不需要管理员权限时,可以通过该命令指定运行用户;并且可以在之前创建所需要的用户,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres 。要临时获取管理员权限可以使用 gosu,而不推荐 sudo。
WORKDIR:格式为 WORKDIR /path/to/workdir 。
为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。
可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径.
例:
WORKDIR /root
WORKDIR test
WORKDIR test2
RUN pwd
# 最终路径为 /root/test/test2 。
Dockerfile实例
名称:dockerfile
内容如下
FROM centos:6
RUN yum update -y
RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel
ADD http://nginx.org/download/nginx-1.8.0.tar.gz .
RUN tar zxvf nginx-1.8.0.tar.gz
RUN mkdir -p /usr/local/nginx
RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install
RUN rm -rf /usr/local/nginx/conf/nginx.conf
ADD http://www.apelearn.com/study_v2/.nginx_conf /usr/local/nginx/conf/nginx.conf
EXPOSE 80
运行dockerfile并查看结果
docker build -t nginx_test /root/test
docker images
Dockerfile执行实例
#通过上面dockerfile生成的镜像部署容器
docker run --name test_nginx -it -p 80:80 -d nginx_test
Dockerfile结果验证
部署后默认nginx是不启动的所以需要进入容器启动nginx
docker exec -it test_nginx /bin/bash
cd /usr/local/nginx/sbin
./nginx
#访问80端口,如下图访问成功
完成
到此结束;若想了解更多,请前往Docker官网:https://docs.docker-cn.com/get-started/