Docker
1.docker是操作系统级别的虚拟化,只能运行相同或相似内核的操作系统(类Unix系统),依赖于Linux的内核特性:Namespace和Cgroups,使用go语言编写2.Docker是C/S架构程序。
3.写时复制,在最顶层的可写层上有底层的镜像的拷贝,底层的镜像是只读的
4.查看docker版本(docker version)
5.#docker search tutorial 在Docker Hub中搜索镜像
# docker search tutorial
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
learn/tutorial 28
georgeyord/reactjs-tutorial This is the backend of the React comment b... 4
#docker pull learn/tutorial 从Docker Hub中拉取镜像
在拉取镜像的过程中会出现多个镜像,这也是docker镜像的层级机构的表现,每一级都是镜像都是在底层的镜像上创建增加的。
#docker run learn/tutorial echo "hello, world"
6.docker 安装、修改程序的每一步都是在最上层的可写层进行的操作
7.docker ps -l 查看当前的容器列表,docker -a 查看所有镜像
8.docker commit 容器ID号learn/ping(docker的镜像名字)
9.docker inpect 容器ID号 查看容器的详细信息(也可以查看镜像的详细信息:docker inspect 镜像ID)
10.docker images 查看创建的image镜像
11.docker push learn/tutorial 将镜像推送至仓库中
******************************************************************************
1.Docker的命名空间(NameSpace),为了实现轻量级的虚拟化需要对各容器资源环境的隔离,进而引入命名空间
PID(processID) 进程隔离
NET(Network) 管理网络接口
IPC(InterProcess Communication) 管理跨进程通信的访问
MNT(Mount) 管理挂载点
UTS(Unix TimesSharing System) 隔离内核和版本标识
2.Control groups控制组:
用来分配资源
来源于google
Linux kernel 2.6.24 @2007
Control groups 的作用
资源限制(如各容器的内存限制)
优先级设定
资源计量
资源控制
3.Docker容器的能力
文件系统隔离: 每个容器都有自己的root文件系统
进程隔离: 每个容器都运行在自己的进程环境中
网络隔离:容器间的虚拟网络接口和IP地址都是分开的
资源隔离和分组:使用cgrous将CPU和内存之类的资源独立的分配给每个docker容器
******************************************************************************
Docker的安装:略
********************************************************************************
1.ps -ef |grep docker查看docker的后台进程运行情况
2.docker后台进程的启动、关闭、重启
#systemctl start docker
#systemctl stop docker
#systemctl restart docker
3.docker启动配置文件
/lib/systemd/system/docker.service
*******************************************************************************
1.启动docker
#docker run ubuntu echo "hello,world" 命令执行完成后容器停止
#docker run -i -t IMAGE /bin/bash 交互式运行docker容器
2.查看docker容器
#docker ps -l查看最新启动的docker容器
#docker ps -a查看启动过的所有的容器
#docker inspect 容器的ID(可以不用是全称,只要与其他ID区分开即可) 查看容器的详细信息
#docker run --name=自定义的容器名 -i -t IMAGE /bin/bash 自定义容器名,方便以后查询方便(包括查看容器的详细信息 #docker inspect 容器名(容器ID))
#docker start -i 容器名(容器ID)以交互式的方法来启动容器
#docker rm 容器名(容器ID) 删除已经停止的docker容器
*******************************************************************************
docker 守护式容器:(适合运行应用程序和服务,适合长期运行)
1.#docker run -i -t IMAGE /bin/bash 启动的容器可以使用(CTRL + P 与 CTRL + q 来停止 )
2.#docker attach 容器名 进入已经在后台运行中的容器
3.#docker run -d --name=dc1ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
-d:选项只是在后台运行指令,指令运行完成后,容器自动退出,所以上面使用while循环来执行命令,方便查看attach后的效果
4.查看docker容器执行命令的内部输出#docker logs -t -f 容器名,使用-f选项可以使用CTRL + C 终止后台持续的输出,但不退出容器
-t 显示时间
--tail 10:可以显示最新输出的10条信息,数字设置为0 显示最新的输出信息
-f 持续输出命令的输出信息
5.#docker top 容器名 查看docker 容器内的进程
6.在运行的容器中启动新进程
#docker exec [-d] [-t] [-i] 容器名
#docker exec -i -t dc1 /bin/bash
#docker top dc1 查看dc1容器中新创建的进程
7.停止守护式容器:
#docker stop 容器名 速度较慢
#docker kill 容器名 速度较快
*********************************************************************************
docker部署静态网站
1.设置容器的端口映射
docker run [-P] [-p]
-P:为容器内的所有端口做映射
#docker run -P -i -t ubunt /bin/bash
-p:指定映射那些端口
-p,--publish=[]
1.containerPort
docker run -p 80 -i -t ubuntu /bin/bash 宿主机的端口是随机的,需要使用docker ps(docker port 容器名查看端口映射情况)
2.hostPort:containerPort
docker run -p 8080:80 -i -t ubuntu /bin/bash
3.ip:containerPort
docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash
4.ip:hostPort:containerPort
docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash
容器中部署nginx服务器
注:docker E: Unable to locate package ping 安装软件时出现此问题,可以使用apt-get update 来更新解决
使用docker ps 来查看端口之间的映射关系,也可以使用docker port 容器名来查看端口的映射关系
使用docker top 容器名 查看容器中运行的进程
1.apt-get install -y nginx
2.apt-get install -y vim
3.mkdir -p /var/www/html
cd /var/www/html
vim index.html
<html>
<head>
<title> Nginx in Docker</title>
</head>
<body>
<h1> hello, I'm website in Docker</h1>
</body>
4.使用curl http://127.0.0.1:32769 来验证,也可以使用容器内的IP(docker inspect 容器名来查看) curl http://容器内IP
***********************************************************************************************
查看和创建docker镜像和仓库
#docker info 查看容器的基础信息
#docker inspect 容器名(镜像名) 查看容器或是镜像的详细信息包括镜像的位置信息。"RootDir": "/var/lib/docker/overlay/aac2feb388e07c7a57497af46d94704bfcdc27d34adadc25e1e801e0383e85e3/root"
#docker images :
--no_trunc不截断容器ID
-a显示所有镜像(包括中间层镜像)
-q只显示容器的ID列表
docker rmi 镜像名(镜像ID) 删除镜像
-f 强制删除镜像
--no-prune=false 不删除未标签的父镜像
docker rmi $(docker images -q ubuntu)
************************************************************************************************
获取和推送镜像
1.docker search ubunt 查找Docker Hub中的ubuntu的镜像
2.docker search-s 3 ubuntu 查找3星及以上等级的ubunt镜像
3.docker pull 镜像名 拉取镜像
4.docker push 镜像名 推送镜像,只会提交修改的image部分
************************************************************************************************
构建镜像2种方式:
1.docker commit 容器名 通过容器构建
2.docker build 通过dockerfile构建
docker commit容器名
-a,--author
-m, --message
-p,--pause=true
Repository:本地镜像仓库
Registry:远端DockerHub镜像仓库
#docker commit-a 'zhangleivod' -m 'nginx' webnginx/commit_test
#docker run -d -p 80 --name nginx_web1 nginx/commit_test nginx -g "daemon off;"#指定nginx(-g "daemon off;")以前台的方式运行,否则nginx停止掉,容器也停止
#docker ps (docker port 容器名) 查看端口映射关系
创建第一个Dockerfile
#First Dockerfile
FROM ubuntu:14.04
MAINTAINER zhangleivod zhangleivod@163.com
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
步骤如下:
1.mkdir -p dockerfiel/df_test1
2.cd dockerfile/df_test1
3.vim Dockerfile
FROM ubuntu:14.04
MAINTAINER zhangleivod zhangleivod@163.com
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
4.docker build -t "nginx/nginx_test1" .
-t 指定创建之后的docker镜像名,. 指定当前Dockerfile所在的位置
*********************************************************************************************
Dockerfile 指令
指令格式
注释:使用#号注释
INSTRUCTION argument 指令名必须要大写
FROM ubuntu:14.04
MAINTAINER zhangleivod zhangleivod@163.com
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80 指定运行该镜像的容器使用的端口,dockerfile中只是告诉容器暴露的端口,但是出于安全的考虑,默认是不启动的,需要使用docker run -p 80 来打开端口
容器运行时运行的指令:
CMD指令
CMD ["executable", "pram1", "pram2" ] exec模式
CMD command pram1 pram2 shell 模式
CMD ["pram1", "pram2"](作为ENTERPOINT指令的默认参数)
FROM ubuntu:14.04
MAINTAINER zhangleivod zhangleivod@163.com
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
CMD ["/usr/sbin/nginx","g","daemon off;"]
#docker run -p 80 --name ngin/ngin_test3-d zhangeleivod/df_test3(因在Dockerfile中指出了cmd,所以docker run 命令中未给出命令: nginx -g "daemon off;" )
ENTERPOINT指令
ENTERPOINT指令:ENTERPOINT ["executable", "pram1", "pram2" ] exec模式
ENTERPOINT指令: ENTERPOINT pram1 pram2 shell 模式
注:RUN指令是在创建镜像构建过程中运行的,CMD指令是在容器运行时运行的,如果在容器中运行时(docker run)给出了命令,那么将会覆盖CMD中给出的指令,所以CMD指令是容器运行时的默认指令。
ENTERPINT指令默认不会被docker run中给出的指令所覆盖,但可以使用docker run --enterpoint覆盖。
在docker run 中执行的/bin/bash 也是指令
ADD指令
COPY指令
共同点:以上的ADD与COPY指令都是将宿主机上的文件复制到容器内中
区别:ADD包含类似于tar的解压功能,如果单纯复制文件,Docker推荐使用COPY。
VOLUMNE指令
可以存在一个和多个容器的目录中,可以绕过联合文件系统,可以提供共享数据和数据初始化的功能
WORKDIR指令
创建默认的容器的默认工作目录
ENV指令
创建环境变量在构建镜像中和容器运行中都有效
ENV <key><value>
ENV <key>=<value> ...
USER指令
USER ngin以nginx的用户运行容器
USER user
USER user:group
USER user:gid
USER uid
USER uid:gid
USER uid:group
未指定运行默认是root用户
ONBUIOLD
镜像触发器:当一个镜像被其他镜像作为基础镜像时执行
会在构建过程中插入指令
***************************************************************************************************
Dockerfile构建过程(会删除中间层创建层的ID,但不删除中间层镜像,可以通过运行中间层镜像来调试容器)
1.从基础镜像运行一个容器
2.执行一条指令,对容器做出修改
3.执行类似docker commit的操作,提交一个新的镜像层
4.再基于刚提交的镜像运行一个新容器
5.执行dockerfile中的吓一跳指令,直至所有指令执行完成
构建缓存,构建一次之后,再次构建时直接使用镜像缓存
对于想要更新构建过程中的镜像程序,则不使用镜像缓存,可以使用docker build --no-cache
查看镜像的构建过程
#docker history image
***************************************************************************************************
docker 容器网络互联
docker0:
Linux的虚拟网桥(网桥工作在数据链路层,网桥可以理解成一个交换机)
Linux虚拟网桥的特点:
可以设置IP地址,并且容器默认分配的IP地址都与该IP出于同一个网段
相当于拥有一个隐藏的虚拟网卡
网桥管理工具: #yum install bridge-utils
#brctl show 查看网桥信息
# brctl show
bridge name bridge id STP enabled interfaces
br-0a0659a5f7ff 8000.024284e959c5 no
br-6a2f2b4a6a4f 8000.0242937e41f6 no
docker0 8000.0242dac1b593 no veth25785ca
veth2792238
vethb0c441e
docker0(虚拟的网桥)后面有3个接口分别连接着3个容器的虚拟网卡
自定义docker0
#ifconfig docker0 192.168.200.1 netmask 255.255.255.0
修改完之后 重新启动docker服务器进程(systemctl restart docker)
也可以在启动的配置文件中添加 DOCKER_OPS 值-b=br0,前提是先要创建一个网桥,
#brctl addbr br0
#ifconfig br0 192.168.10.0 netmask 255.255.255.0
#vim /etc/default/docker
DOCKER_OPS="br0"
#重启docker守护进程(systemctl restart docker)
***************************************************************************************************
Docker容器的互联
用于测试Docker镜像DockerFile:
FROM ubuntu:14.04
RUN apt-get install -y ping
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y curl
EXPOSE 80
CMD /bin/bash
允许所有容器间的互联(在同一台主机下,所有的容器都是通过虚拟网桥来连接的,且都是可以互联的)
--icc=true 默认
--link选项 是为了使重启容器后IP地址经常变化带来的不便,可以使用--link选项为其添加别名,之后访问该容器只需要使用别名访问即可
如:docker run -it --name cct3 --link=cct1:webtest zhangleivod/cct
#ping webtest 即可
#env 查看环境变量的变化
#ci /etc/host 查看参数变化
总结:其实--link,冒号后面的参数就是为主机名与IP地址之间做的映射,之后就可以通过访问别名(主机名)可以访问变化IP的容器
拒绝所有容器间的互联:
--icc=false
允许特定容器间的连接
启动选项的配置:
--icc=false --iptables=true
--link
******************************************************************************************************
页:
[1]