1、什么是容器
a)一种虚拟化的方案
b)操作系统级别的虚拟化
c)只能运行相同或相似内核的操作系统
d)依赖于Linux内核特性:Namespace和Cgroups(Control Group)
e)docker是有go语言开发的
2、Docker的目标:
a)提供简单轻量的建模方式
b)职责的逻辑分离
c)快速高效的开发生命周期
d)鼓励使用面向服务的架构
3、Docker的使用场景
a)使用docker容器开发,测试,部署服务
b)创建隔离的运行环境
c)搭建测试环境
d)构建多用户的平台服务(PaaS)基础设施
e)提供软件即服务(SaaS)应用程序
f)高性能、超大规模的宿主机部署
4、Docker Image镜像
a)容器的基石
b)层叠的只读文件系统
c)联合加载(union mount)
5、Docker Contrainer容器
a)通过镜像启动
b)启动和执行阶段
c)写时复制
6、Docker Registry仓库
a)公有,私有
b)Docker Hub
7、Namespaces命名空间
a)PID(Process ID) 进程隔离
b)NET(Network) 管理网络接口
c)IPC 管理跨进程通信的访问
d)MNT 管理挂载点
e)UTS 隔离内核和版本标识
8、Control groups控制组
a)资源限制
b)优先级设置
c)资源计量
d)资源控制
9、Docker 容器的能力
a)文件系统隔离:每个容器都有自己的root文件系统
b)进程隔离:每个容器都运行在自己的进程环境中
c)网络隔离:容器间的虚拟网络接口和IP地址都是分开的
d)资源隔离和分组:使用cgroups将CPU和内存之类的资源独立分配给每个Docker
10、容器的基本操作
a)启动容器:
1、docker run IMAGE [COMMAND] [ARG...]
run 在新容器中执行
2、启动交互式容器
docker run -i -t IMAGE /bin/bash
-i --interactive=true|false 默认是false # 为容器始终打开标准输入
-t --tty=true|false 默认是false # 为容器分配伪tty终端
3、查看容器:
查看启动的容器:docker ps [-l]
查看所有的容器:docker ps -a
查看容器详细信息:docker inspect 容器名称/容器ID
4、自定义容器名;
docker run --name=自定义名 -i -t IMAGE /bin/bash
5、重新启动停止的容器:
docker start [-i] 容器名称/容器ID
6、删除停止的容器
docker rm 容器名/ID # 只能删除暂停中的容器
11、守护式容器
a)docker run -i -t IMAGE /bin/bash
Ctrl+p Ctrl+Q 操作
b)附加到运行中的容器
docker attach 容器名
c)启动守护式容器
docker run -d 镜像名 [COMMAND] [ARG...]
d)查看容器日志
docker logs [-f][-t][--tail] 容器名 # 不指定参数返回所有的日志
-f --follows=true|false 默认为false # 一直跟踪日志的变化,并返回结果
-t --timestamps=true|false默认为false # 在返回的结果上加上时间戳
--tail="all" # 返回结尾数多少数量的日志
e)在运行中的容器内启动新进场
docker top 容器名
f)docker exec [-d][-i][-t] 容器名 [COMMAND] [ARG...]
h)停止守护式容器
docker stop 容器名 # 发送信号,等待停止
docker kill 容器名 # 直接停止
12、在容器中部署静态网站
a)设置容器的端口映射
-p, --pushlish=[] # 指定端口
1、containerPort # 容器端口
docker run -p 80 -i -t ubuntu /bin/bash
2、hostPort:containerPort # 主机端口:容器端口
docker run -p 8080:80 -i -t ubuntu /bin/bash
3、ip:containerPort # ip:容器端口
docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash
4、ip:hostPort:containerPort # 主机ip:主机端口:容器端口
docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash
13、查看删除镜像
a)docker images [OPTIONS] [REPOSITORY]
-a,--all=false
-f,--filter=[] # 显示时的过滤条件
--no-trunc=false # 不截断镜像ID
-q,--quiet=false # 只显示镜像ID
b)查看镜像:docker inspect [OPTIONS] CONTAINER|IMAGE
-f,--format=""
c)删除镜像:docker rmi [OPTIONS] IMAGE [IMAGE...]
-f,--force=false # Force removal of the image
--no-prune=false # Do not delete untagged parents
14、获取和推送镜像
a)Docker Hub
https://registry.hub.docker.com
b)docker search [OPTIONS] TERM
--automated=false # Only show automated builds
--no-trunc=false # Don‘t truncate output
-s,--stars=0 # Only displays with at least x stars
# 最多返回25个结果
c)拉取镜像:docker pull [OPTIONS] NAME[:TAG]
d)加速pull,push镜像
1、使用--registry-mirror选项
修改:/etc/default/docker
添加:DOCKER_OPTS = "--registry-mirror=http://MIRROR-ADDR"
15、构建镜像
a)docker commit # 通过容器构建
1、docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a,--author="" # Author
-m,--message="" # Commit message
-p,--pause=true # Pause container during commit
b)docker bulid # 通过Dockerfile文件构建
1、创建Dockerfile
2、使用docker build命令
docker build [OPTIONS] PATH | URL | -
--force-rm=false
--no-cache=false
-q,--quiet=false
--rm=true
-t,--tag=""
16、Docker的远程访问
a)需要第二台安装Docker的服务器
b)修改Docker守护进程启动选项,区别服务器
c)保证Client API与Server API版本一致
d)修改服务器端(客户端)配置
1、修改Docker守护进程启动选项
-H tcp://host:port
unix:///path/to/socket
fd://* or fd://socketfd
2、守护进程默认配置:
-H unix:///var/run/docker.sock
3、使用环境变量DOCKER_HOST
export DOCKER_HOST="tcp://10.211.55.5:2375"
17、Docketfile指令
a)FROM
格式:
FROM <image>
FROM <image>:<tag>
注意:
已存在的镜像
基础镜像
必须是第一条非注释指令
b)MAINTAINER<name>
指定镜像的作者信息,包含镜像的所有者和联系信息
c)RUN
格式:
RUN <command> (shell模式)
RUN ["executable","param1","param2"] (exec模式)
d)EXPOSE <port> [<port>...]
e)CMD
格式:
CMD ["executable","param1","param2"] (exec模式)
CMD command param1 param2 (shell模式)
CMD [‘param1‘,‘param2‘] (作为ENTRYPOINT指令的默认参数)
f)ENTRYPOINT
格式:
ENTRYPOINT [‘executable‘,‘param1‘,‘param2‘] (exec模式)
ENTRYPOINT command param1 param2 (shell模式)
注意:
可以使用docker run --entrypoint 覆盖
h)ADD <src>...<dest>
ADD ["<src>"..."<dest>"] (使用于文件路径中有空格的情况)
i)COPY <src>...<src>
COPY ["<src>"..."<dest>"] (适用于文件路径中有空格的情况)
j)ADD vs COPY
ADD包含类似tar的解压功能
如果单纯复制文件,Docker推荐使用COPY
k)VOLUME ["/data"]
l)WORKDIR /path/to/workdir
m)ENV <key> <value>
ENV <key>=<value>...
n)USER daemon
USER nginx
o)ONBUILD [INSTRUCTION]
# 镜像触发器
# 当一个镜像被其他镜像作为基础镜像时执行
例1:
FROM centos MAINTAINER liugp<2920992033@qq.com> #把宿主机当前的上下文的c.txt拷贝到容器的/usr/local路径下 COPY c.txt /usr/local/cincontainer.txt #把java与tomcat添加到容器中 ADD jdk-10.0.2_linux-x64_bin.tar.gz /usr/local/ ADD apache-tomcat-9.0.11.tar.gz /usr/local/ #安装vim编辑器 RUN yum -y install vim #设置工作访问的时候的WORKDIR,登录落脚点 ENV MYPATH /usr/local WORKDIR $MYPATH #配置java与tomcat环境变量 ENV JAVA_HOME /usr/local/jdk-10.0.2 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINE_HOME /usr/local/apache-tomcat-9.0.11 ENV CATALINE_BASE /usr/local/apache-tomcat-9.0.11 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINE_HOME/lib:$CATALINE_HOME/bin #容器运行时监听的端口 EXPOSE 8080 #启动时运行tomcat # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.11/bin/startup.sh"] # CMD ["/usr/local/apache-tomcat-9.0.11/bin/startup.sh","run"] CMD /usr/local/apache-tomcat-9.0.11/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.11/bin/logs/catalina.out # docker build -t liugptomcat9 . # docker run -d -p 9080:8080 --name myt9 -v /Users/liugp/mydocker/tomcat9/test:/usr/local/apache-tomcat-9.0.11/webapps/test -v /Users/liugp/mydocker/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.11/webapps/logs --privileged=true liugptomcat9 #mysql docker run -p 12345:3306 --name mysql -v /Users/liugp/mydocker/mysql/conf:/etc/mysql/conf.d -v /Users/liugp/mydocker/mysql/logs:/logs -v /Users/liugp/mydocker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 #redis docker run -p 6379:6379 -v /Users/liugp/mydocker/myredis/data:/data -v /Users/liugp/mydocker/myredis/conf/redis.conf:/usr/local/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
例2:
FROM centos MAINTAINER liugp<2920992033@qq.com> #把宿主机当前的上下文的c.txt拷贝到容器的/usr/local路径下 COPY c.txt /usr/local/cincontainer.txt #把java与tomcat添加到容器中 ADD jdk-10.0.2_linux-x64_bin.tar.gz /usr/local/ ADD apache-tomcat-9.0.11.tar.gz /usr/local/ #安装vim编辑器 RUN yum -y install vim #设置工作访问的时候的WORKDIR,登录落脚点 ENV MYPATH /usr/local WORKDIR $MYPATH #配置java与tomcat环境变量 ENV JAVA_HOME /usr/local/jdk-10.0.2 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINE_HOME /usr/local/apache-tomcat-9.0.11 ENV CATALINE_BASE /usr/local/apache-tomcat-9.0.11 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINE_HOME/lib:$CATALINE_HOME/bin #容器运行时监听的端口 EXPOSE 8080 #启动时运行tomcat # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.11/bin/startup.sh"] # CMD ["/usr/local/apache-tomcat-9.0.11/bin/startup.sh","run"] CMD /usr/local/apache-tomcat-9.0.11/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.11/bin/logs/catalina.out # docker build -t liugptomcat9 . # docker run -d -p 9080:8080 --name myt9 -v /Users/liugp/mydocker/tomcat9/test:/usr/local/apache-tomcat-9.0.11/webapps/test -v /Users/liugp/mydocker/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.11/webapps/logs --privileged=true liugptomcat9 #mysql docker run -p 12345:3306 --name mysql -v /Users/liugp/mydocker/mysql/conf:/etc/mysql/conf.d -v /Users/liugp/mydocker/mysql/logs:/logs -v /Users/liugp/mydocker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 #redis docker run -p 6379:6379 -v /Users/liugp/mydocker/myredis/data:/data -v /Users/liugp/mydocker/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes #阿里云镜像下载docker 官网:yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 阿里云:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1、Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。 但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。
2、Docker exec
关于-i、-t参数
1、可以看出只用-i时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令 返回值都可以正确获取。
例:docker exec -i bb2 /bin/sh
2、使用-it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致 整个容器退出。 这种方式可以替代ssh或者 nsenter、nsinit方式,在容器内进行操作。
18、Docker容器的网络连接
a)Docker容器的网络基础
1、Linux虚拟网桥的特点:
可以设置IP地址
相当于拥有一个隐藏的虚拟网卡
2、docker0的地址划分:
IP: 172.17.42.1 子网掩码:255.255.0.0
MAC:02:42:ac:11:00:00 到 02:42:ac:11:ff:ff
总共提供了65534个地址
3、修改docker0地址:
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0
4、更改docker守护进程的启动配置:
/etc/default/docker 中添加DOCKER_OPS
-b=br0
b)Docker容器的互联
1、允许所有容器互联
2、拒绝容器间互联
3、允许特定容器的链接
4、Docker守护进程的启动选项
--icc=false
5、允许特定容器间的连接
Docker守护进程的启动选项
--icc=false --iptables=true
--link
c)Docker容器与外部网络的连接
1、ip_forward
--ip-forward=true
2、iptables
filter表中包含的链:
INPUT,FORWARD,OUTPUT
3、允许端口映射访问
4、限制ip访问容器
19、Docker容器的数据管理
a)Docker容器的数据卷
1、数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或多个容器提供访问
2、数据卷设计的目的,在于数据的永久化,它完全独立于容器的生命周期,因此,Docker不会在容器删除时删除挂载的数据卷,也不会存在类似的垃圾回收机制,对容器引用的数据卷进行处理
3、数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中。
4、数据卷可以在容器之间共享和重用
5、可以对数据卷里的内容直接进行修改
6、数据卷的变化不会影响镜像的更新
7、卷会一直存在,即使挂载数据卷的容器已经被删除
b)Docker的数据卷容器
1、为容器添加数据卷
sudo docker run -V ~/datavolume:/data -it ubuntu /bin/bash
2、sudo docker run -V ~/datavolume:/data:ro -it ubuntu /bin/bash
3、使用Dockerfile构建包含数据卷的镜像
Dockerfile指令:VOLUME ["/data"]
4、挂载数据卷容器的方法
docker run --volumes-from [CONTAINER NAME]
c)Docker数据卷的备份和还原
20、Docker容器的跨主机连接
a)使用网桥实现跨主机容器连接
优点:
配置简单,不依赖第三方软件
缺点:
与主机在同网段,需要小心划分IP地址
需要有网段控制权,在生成环境中不易实现
不容易管理
兼容性不佳
b)使用Open vSwitch实现跨主机容器连接
c)使用weave实现跨主机容器连接
21、Container的核心技术
a)CGroups 限制容器的资源使用
1、Linux内核提供的限制,记录和隔离进程组所使用的资源,由Google的工程师提出,后来被整合到kernel
2、通过不同的子系统(blkio,cpu,cpuacct等)来实现对不同资源使用的控制和记录
b)Namespace机制,实现容器间的隔离
1、pid,容器有自己的进程表和1号进程
2、net,容器有自己独立的network info
3、ipc,在ipc通信时候,需要加入额外信息来标识进程
4、mnt,每个容器有自己唯一的目录挂载
5、utc,每个容器有独立的hostname和domain
c)chroot,文件系统的隔离
原文:https://www.cnblogs.com/liugp/p/11178888.html