一、Docker简介
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker组成 Docker Client 和 Docker Server
Docker组件 镜像(Image) 容器(Container) 仓库(Repository)
二、Docker应用场景
1. 简化配置
2. 代码流水线(Code Pipeline)管理
3. 提高开发效率
4. 隔离应用
5. 整合服务器
6. 调试能力Docker
7. 多租户环境
8. 快速部署
三、Docker安装
请更新自已的yum源,避免安装超时
http://mirrors.aliyun.com/help/centos
http://mirrors.163.com/.help/centos.html
> yum install docker-engine
或者如下(老式写法)
> yum install docker-io
> yum install docker.io
添加开机启动
> chkconfig docker on
> chkconfig --list docker
启动docker
> systemctl start docker.service
停止docker
> systemctl stop docker.service
四、Docker镜像
查看版本号
> docker version
查看docker层面信息,images,containers数等
> docker info
搜索centos镜像
> docker search centos
下载镜像
> docker pull centos
如果下载时出现超时,请换如下,详细请看http://get.daocloud.io/
> docker pull daocloud.io/library/centos:latest
查看镜像
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
daocloud.io/library/centos latest 67591570dd29 4 weeks ago 191.8 MB
删除镜像
> docker rmi 镜像ID
五、Docker容器
创建一个容器,并运行/bin/echo程序
> docker run daocloud.io/library/centos /bin/echo "hello world"
查看所有容器
> docker ps -a
--name给容器起个名称
-i开启输入终端,-t表示使用终端
该命令通过centos镜像来创建一个mydocker容器,然后运行指定的一个程序,程序退出那容器也退出。
> docker run --name mydocker -it daocloud.io/library/centos /bin/bash
退出容器
> exit
重新启动原有容器,98c6f96292c1表示容器ID
> docker restart 98c6f96292c1
让容器在后台运行,如果镜像没有下载,会自动帮我们下载nginx镜像
> docker run -d --name mynginx daocloud.io/library/nginx:1.7.1 nginx
删除容器
> docker rm 容器ID
停止容器
> docker stop 容器ID
进入容器(不建议)
> docker attach 容器ID
获取容器的PID
> docker inspect --format "{{.State.Pid}}" 容器名称
通过容器PID进入容器
> nsenter --target 容器PID --mount --uts --ipc --net --pid
如果nsenter没有需要安装
> yum install -y util-linux
六、Docker网络
查看主机网桥信息
> brctl show
如果提示没有此命令请安装
> yum install bridge-utils
在容器中查看路由表
> ip ro li
随机映射(把容器中的端口随机映射到主机端口)
> docker run -d -P --name mynginx2 daocloud.io/library/nginx:1.7.1 nginx
把容器80端口映射到主机88端口
> docker run -d -p 88:80 --name mynginx2 daocloud.io/library/nginx:1.7.1 nginx
映射端口的方式:
-p 主机端口:容器端口
-p ip:主机端口:容器端口
-p ip::容器端口
-p 主机端口:容器端口 -p 主机端口:容器端口
七、Docker数据管理
1、数据卷
主机创建数据卷并挂载到容器/data下
> docker run -it --name 111 -v /data daocloud.io/library/centos
把主机的/data挂载到容器的/data2下
> docker run -it --name 222 -v /data:/data2 daocloud.io/library/centos
如果发现容器中/data2无法写入文件,请关闭selinux。
只读
> docker run -it --name 333 -v /data:/data2:ro daocloud.io/library/centos
查看数据卷创建在哪了
> docker inspect -f {{.Mounts}} 容器名
> docker inspect -f {{.Config.Volumes}} 容器名
以下写法是老式写法
> docker inspect -f {{.Volumes}} 容器名
2、数据卷容器
把一个容器当作数据容器来挂载
> docker run -it --name 444 --volumes-from 容器名 daocloud.io/library/centos
八、手动构建Docker镜像
我们如何自已创建一个nginx镜像?
首先创建一个centos空容器
> docker run -it --name mynginx daocloud.io/library/centos
安装一些必要的库
> yum install wget gcc gcc-c++ make openssl-devel
下载pcre和nginx源码
> wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz
> wget http://mirrors.sohu.com/nginx/nginx-1.10.3.tar.gz
把源码移动到/usr/local/src下并解压
> mv *.gz /usr/local/src
> tar xf pcre-8.39.tar.gz
> tar xf nginx-1.10.3.tar.gz
创建用户
> useradd -s /sbin/nologin -M nginx
进入nginx目录
> ./configure --prefix=/usr/local/nginx \
--with-pcre=/usr/local/src/pcre-8.39 \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_stub_status_module
> make && make install
让nginx在前台运行(不能让nginx在后台运行)
> vi /usr/local/nginx/conf/nginx.conf
daemon off;
提交我们自已创建的镜像
> docker commit -m "my nginx" 容器ID lackone/mynginx:1
我们来使用我们创建的镜像
> docker run -d -p 99:80 --name 666 lackone/mynginx:1 /usr/local/nginx/sbin/nginx
然后我们通过主机IP:99就可以访问容器内的nginx服务器了。
九、Docker的Dockerfile
1.基础镜像信息
2.维护者信息
3.镜像操作指令
4.容器启动时执行指令
创建一个目录
> mkdir /data/dockerfile
> cd /data/dockerfile
创建一个Dockerfile文件,首字母大写
> vi Dockerfile
#This is Dockerfile
#Version 1.0
#Author: lackone #基础镜像
FROM daocloud.io/library/centos #维护者信息
MAINTAINER lackone #COPY文件,如果是压缩包会自动解压
#注意压缩包必须与Dockerfile同目录
ADD pcre-8.39.tar.gz /usr/local/src
ADD nginx-1.10.3.tar.gz /usr/local/src #执行命令
RUN yum install wget gcc gcc-c++ make openssl-devel
RUN useradd -s /sbin/nologin -M nginx #当前工作目录
WORKDIR /usr/local/src/nginx-1.10.3 #执行命令
RUN ./configure --prefix=/usr/local/nginx \
--with-pcre=/usr/local/src/pcre-8.39 \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_stub_status_module
RUN make && make install
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf #目录挂载
#VOLUME #端口
EXPOSE 80 #声明环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#运行nginx,进程要一直运行下去
CMD ["nginx"]
构建镜像
> docker build -t 名称:标识 /data/dockerfile/
十、Docker资源隔离和限制(cgroup)
首先我们创建一个压力测试镜像
> mkdir /data/stress
> wget http://mirrors.aliyun.com/repo/Centos-7.repo
> wget http://people.seas.harvard.edu/~apw/stress/stress-1.0.4.tar.gz
> vi Dockerfile
FROM daocloud.io/library/centos
ADD Centos-7.repo /etc/yum.repos.d/CentOS-Base.repo
ADD stress-1.0.4.tar.gz /usr/local/src
RUN yum makecache
RUN yum install -y make automake autoconf gcc gcc-c++
WORKDIR /usr/local/src/stress-1.0.4
RUN ./configure --prefix=/usr/local/stress
RUN make && make install
ENV PATH /usr/local/stress/bin:$PATH
#CMD与ENTRYPOINT的区别在于执行docker run时参数传递的方式不同
ENTRYPOINT ["stress"]
#构建stress镜像
> docker build -t stress:1 .
创建容器并测试
--rm表示容器退出自动删除
> docker run -it --rm --name test stress:1 --cpu 1
-c是docker限制的cpu使用份额
--cpu是传递给stress的参数
> docker run -it --rm -c 512 --name test stress:1 --cpu 1
--cpuset-cpus=0表示第一颗CPU
> docker run -it --rm --cpuset-cpus=0 --name test stress:1 --cpu 1
-m 128m表示docker限制的内存大小
--vm-bytes表示stress测试使用的内存大小
> docker run -it --rm -m 128m --name test stress:1 --vm-bytes 128m --vm-hang 0
十一、Docker网络
1、桥接模式
默认docker网络使用的是桥接模式
当docker启动时会创建一个docker0的虚拟网桥,创建容器时会创建一个网桥接口,通过网桥转发。
> brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242c41e7d80 no vethaa35584
vethbd1676b
2、host模式
容器与主机共用一个Network Namespace,共享主机网络信息。
3、container复用方式
与另一个容器共用一个Network Namespace,而不是和宿主机共享。
4、none方式
容器拥有自已的Network Namespace,但不进行任何网络配置,没有网卡,IP,路由信息。
十二、Docker的Registry
把Registry下载下来
> docker pull daocloud.io/library/registry:0.5.9
创建容器并运行,启动了一个私有的仓库,主机监听6666端口
> docker run -d -p 6666:5000 daocloud.io/library/registry:0.5.9
首先创建一个tag,指定仓库的IP、端口、目录和容器名
> docker tag 镜像ID 192.168.1.233:6666/test/mynginx:1
查看镜像
> docker images
push镜像到本地仓库
> docker push 192.168.1.233:6666/test/mynginx:1
如果无法push成功请修改下面配置,因为要走https
> vi /etc/sysconfig/docker
去掉下面的#号,并修改如下,改成自已的IP和端口
INSECURE_REGISTRY='--insecure-registry 192.168.1.233:6666'
然后重启服务
> systemctl restart docker.service
现在我们就可以把我们push的镜像下载下来了
> docker pull 192.168.1.233:6666/test/mynginx:1
十三、Docker的WEB管理工具
Shipyard
> curl -s https://shipyard-project.com/deploy | bash -s
Shipyard默认访问端口是8080,默认用户名和密码是admin和shipyard