Docker简介:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
dockerClient客户端;
Docker Daemon守护进程;
Docker Image镜像;
DockerContainer容器。
Docker 架构:
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器;
Docker 容器通过 Docker 镜像来创建;
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。
Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。
客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
Docker安装:
###镜像里面默认是没有Docker的软件包的,需要联网yum安装###
[root@docker ~]# yum -y install docker #安装docker容器
[root@docker ~]# systemctl enabled docker #配置开机自启
[root@docker ~]# systemctl start docker #启动docker服务
[root@docker ~]# docker version #查看版本
*docker镜像操作:
[root@docker ~]# docker search [dhcp] #搜索镜像
[root@docker ~]# docker pull [docker.io/networkboot/dhcpd] #下载镜像
[root@docker ~]# docker images [?] #查看已有的仓库
[root@docker ~]# docker inspect [镜像ID号] #获取镜像的详细信息
[root@docker ~]# docker tag [镜像] [新名称] #添加新的标签
[root@docker ~]# docker rmi [标签]/[仓库] #删除镜像或仓库
[root@docker ~]# docker save -o [本地路径] [镜像名] #存出镜像到本地
#以下操作需要到官网注册账号#
[root@docker ~]# docker load --input [本地存储的镜像] #载入公共镜像到库
[root@docker ~]# docker push [本地镜像] #上传镜像到公共库(需联网)
*docker容器操作:
[root@docker ~]# docker create [选项] 镜像运行的程序 /bin/bash #创建新容器
【选项】:
-it:让容器的输入保持打开,让Docker分配一个伪终端
[root@docker ~]# docker ps -a #查看容器的运行状态
-a:可以显示最近一次启动的容器
[root@docker ~]# docker start [容器ID] #运行该容器
[root@docker ~]# docker run [镜像] /bin/bash #创建并运行该容器
[root@docker ~]# docker stop [容器ID] #停止该容器
[root@docker ~]# docker exec -it [容器ID] /bin/bash #进入该容器
[root@docker ~]# docker export [容器ID]>[文件名] #将该容器导出到该文件中
[root@docker ~]# cat [文件名] | docker import - [标签名] #将文件保存的容器导入到新容器
[root@docker ~]# docker rm [容器ID] #删除该容器
*docker容器资源控制:
1.—CPU—
[root@docker ~]# echo 20000 >/sys/fs/cgroup/cpu/sstem.slice/docker-[容器ID].scope/cpu.cfs_quota_us #限制cpu使用率为20%
[root@docker ~]# docker run -tid--cpu-shares 1024 [镜像A] #此为创建加运行
[root@docker ~]# docker run -tid--cpu-shares 2048 [镜像B]
#容器A,B占CPU比例为1:2
[root@docker ~]# docker run -tid--cpuset-cpus 0,1,2,3,4 [镜像名] #限制CPU内核的使用
2.—内存—
[root@docker ~]# docker run -tid -m 512MB [镜像名] #创建运行内存为512MB的容器并运行
3.—限制磁盘写入速度—
[root@docker ~]# docker run -tid--device-write-bps /dev/sda:1MB [镜像名]
*docker镜像的创建方法:
1.—基于已有的镜像创建—
[root@docker ~]# docker commit -m "newdhcp" -a "benet" 9c8959e4f0d1 docker:mydhcp
docker commit [选项] [容器ID] [仓库名称]:[标签]
选项:
-m:说明信息
-a:作者
-p:生成过程中停止容器的运行
2.—基于本地模板创建—
#模板可在“httpd://openvz.org/Fownload/template/precreated”下载
[root@docker ~]# wget httpd://.........tar.gz
[root@docker ~]# cat .....tar.gz | docker import -daoke:new
3.—基于Dockerfile创建—
###首先你要下载好基础镜像centos,可以用之前的命令查找镜像下载镜像###
[root@docker ~]# vim Dockerfile
#第一行指明基于的基础镜像
From centos
#维护该镜像的用户信息
MAINTAINER The CentOS Project <cloud-ops@centos.org>
#镜像操作指令
RUN yum -y install update
RUN yum -y install openssh-server
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#开启22号端口
EXPOSE 22
#启动容器时执行指令
CMD ["/usr/sbin/sshd","-D"]
Dockerfile操作指令:
-FROM 镜像 ---指定新镜像所基于的镜像,第一条指令必须为FROM指令(必须写的)
-MAINTAINER 名字 ---说明镜像维护人信息
-RUN 命令 ---在所基于的镜像上执行命令,并提交到新的镜像
-CMD["要运行的程序","参数1","参数2"] ---指令启动容器时要运行的命令或者脚本,Dockerfile中只能有一条CMD命令
-EXPOSE 端口号 ---指定新镜像加载到Docker时要开启的端口
-ENV 环境变量变量值 ---设置一个环境变量的值,会被后面的RUN用到
-ADD 源文件/目标文件/目录 ---将源文件复制到目标文件,源文件要与Dockerfile在相同的目录
-COPY 源文件/目录目标文件/目录 ---将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录
-VOLUME["目录"] ---在容器中创建一个挂载点
-USER 用户名/UID ---指定运行容器时的用户
-WORKDIR 路径 ---为后续的RUN,CMD,ENTRYPOINT指定工作目录
-ONBUILD 命令 ---指定所在生成的镜像作为一个基础镜像时所需要运行的命令
案例:
构建Nginx容器
[root@docker ~]# docker search centos #先查找基础镜像centos
[root@docker ~]# docker pull docker.io/centos #下载centos镜像
[root@docker ~]# mdkir nginx #创建工作目录
[root@docker nginx]# cd nginx
[root@docker nginx]# docker pull centos #下载centos镜像
[root@docker nginx]# vim Dockerfile #创建Dockerfile文件
#设置基础镜像centos
From centos
#维护该镜像的用户信息
MAINTAINER The CentOS Project <cloud-ops@centos.org>
#安装相关依赖包
RUN yum -y install wget proc-devel net-tools gcc zlib zlib-devel make openssl-devel
RUN wget http://nginx.org/download/nginx-1.9.7.tar.gz
RUN tar -zxvf nginx-1.9.7.tar.gz
#编译安装Nginx
WORKDIR nginx-1.9.7
RUN ./configure --prefix=/usr/local/nginx && make && make install
#开启80和443号端口
EXPOSE 80
EXPOSE 443
#修改Nginx配置文件,以非daemon方式启动
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
#将执行的脚本复制到镜像中,并赋予权限
WORKDIR /root/nginx
ADD run.sh /run.sh
RUN chmod 775 /run.sh
#启动容器时执行指令
CMD ["/run.sh"]
:wq!
[root@docker nginx]# vim run.sh #创建run.sh执行脚本文件
#!/bin/bash
/usr/local/nginx/sbin/nginx
:wq!
[root@docker nginx]# docker build -t nginx:wyjx . #生成镜像
[root@docker nginx]# docker run -d -P nginx:wyjx #启动容器
-P:为指定容器端口映射到宿主机上的随机端口
-p:为指定容器端口映射到宿主机上的指定端口(宿主机端口号在前,容器端口号在后)
例如: -p 80:8080
[root@docker ~]# docker ps -a #查看运行状态
#用网页访问本机的32769端口