一、基础
1、泛谈
(1)概念:基于 Go语言的容器虚拟化技术,打造构建、运输、处处运行三部曲
(2)对比虚拟机
- docker软件就如同 pc的虚拟机软件比如vmware(逻辑上,技术实现上则不是),镜像就如vmware装系统的时候的iso文件,容器就如每个配置的虚拟计算机,同一个iso我们可以创建多个虚拟机,就跟docker镜像可以启动多个容器一样,然后在每个虚拟计算机里我们可以装各种需要的软件,docker容器也一样,可以装各种软件。
- docker 直接用的物理机硬件资源和操作系统,比传统虚拟机效率更高,并且镜像更小。
(2)优势
- 启动快
- 资源占用少
- 体积小
(3)核心架构
- 镜像Images:镜像是容器的模板,类似面向对象的类
- 容器Container:独立运行的应用,基于镜像创建,类似面向对象中的对象
- 仓库Registry:保存镜像的地方,类似github
二、镜像
1、原理
- 联合文件系统 unionFS:底层是 bootfs内核,上面是 rootfs标准目录文件。
- 分层:分层是为了共享底层,而不用每个镜像都需要下载所有层。
三、DockerFile
1、简介:docker镜像的构建文件,包含了一堆命令和参数的脚本
2、使用:①写好 dockerfile文件,②docker build,③docker run
3、常用指令
- FROM:基础镜像,当前新镜像是基于哪个镜像的
- MAINTAINER:镜像维护者的姓名和邮箱地址
- RUN:容器构建时需要运行的命令
- EXPOSE:当前容器对外暴露出的端口
- WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
- ENV:用来在构建镜像过程中设置环境变量
- ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
- COPY:类似ADD,拷贝文件和目录到镜像中,将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
- VOLUME:容器数据卷,用于数据保存和持久化工作
- CMD:指定一个容器启动时要运行的命令,可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
- ENTRYPOINT :指定一个容器启动时要运行的命令,ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数
- ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
4、例子
FROM centos
MAINTAINER zzyy<zzyybs@126.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
四、常用命令
0、docker
- 看docker信息:docker info
- 查看帮助:docker --help(类似 linux中的 man)
1、镜像
- 查找仓库镜像:docker search <image>
- 拉取仓库镜像:docker pull <image>(默认是latest,有时中间卡住,取消重来就好)
- 查看本地镜像:docker images
- 删除本地镜像:docker rmi <image>:latest (有容器会删除不了,可-f强制删除,但容器还会在)
- 给镜像打新标签:docker tag <image>:<tag> <newimage>:<newtag>
- 把容器打成镜像:docker commit -a <author> <contain> <image>:<tag>
- 查看镜像变更历史:docker history <image>
2、容器
- 退出不停止容器:Ctrl+P+Q(exit 会停止容器)
- 查询容器:docker ps -ef|grep <name>(ps -a 查看所有实例,ps 只看运行中实例)
- 运行容器:docker run -d id(-d是后台运行,-v <main_location>:<contain_location> 是映射主机和容器文件夹,-p <m_p>:<c_p> 是映射主机和容器端口)
- 停止容器:docker stop id(kill 是强制)
- 启动容器:docker start id
- 删除容器:docker rm id
- 日志:docker logs id
- 复制数据:docker cp id:containsrc mainsrc 如(docker cp 13a2c8bfa9e6:/logs /mnt/20200111),反之则调换一下位置即可
- 查看容器内部运行进程:docker top id
- 查看容器详细配置:docker inspect id
- 容器内查看系统版本:cat /etc/issue
3、容器连接
- 进入容器:docker attach id (使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作)
- 进入容器第二个方式:docker exec -it id /bin/bash (docker1.3后)
五、centos安装docker
1、安装(要求centos7以上,64位,内核3.10以上)
系统工具(可忽略):sudo yum install -y yum-utils device-mapper-persistent-data lvm2
安装:sudo yum install docker
启动服务:sudo systemctl start docker
注:启动时可能遇到失败,有可能是因为Selinux的影响,关闭它(setenforce 0),如果还失败,则可能是linux 内核不支持,先删除docker(yum remove docker-*),最好重启一下机器,更新内核(yum update),管理员身份安装docker(sudo yum install docker),再次启动(systemctl start docker),查看状态是否正常(systemctl status docker)
2、修改加速器为国内
官方:https://hub.docker.com
中国官方:http://registry.docker-cn.com/
国内网易:http://hub-mirror.c.163.com
编辑文件:vi /etc/docker/daemon.json (如果没有该文件则创建一个)
添加内容:{"registry-mirrors": ["http://registry.docker-cn.com","http://hub-mirror.c.163.com"]}
让其生效:sudo systemctl daemon-reload
重启docker:sudo systemctl restart docker
查看docker配置:docker info
六、docker-compose
1、用途:解决同时管理多个容器的工具
2、docker-compose常用命令
- build:构建服务
- ps:查询容器
- kill:停止容器
- logs:查看日志
- port:查看绑定的端口,
- pull:拉取镜像
- run :服务执行命令
- rm:删除容器
- start:启动容器
- stop:停止容器
- up:构建、重新创建、启动连接服务的容器,启动所有连接的服务
- scale:设置服务运行容器的个数
- help:查看命令帮助文档
3、docker-compose.yml 常用指令
- image:指定镜像,如果本地没有会自动pull
- build:指定Dockerfile文件的路径,一个路径或者对象
- command:覆盖容器启动后执行的命令
- ports:对外端口
- expose:暴露端口给服务
- links
- external_links
- volumes:mainsrc:containsrc(主机路径:容器路径),可以绝对路径或者相对路径
- volumes_from
- environment
- env_file
- extends
- net
- dns
- dns_search
4、例子
- 增加docker-compose.yml文件,以我的一个项目,所在目录是project,结构如下
- 编写docker-compose.yml,前面的project可自定义
project:
build: ./project
ports:
- "8080:8080"
expose:
- 8080
- cd到docker-compose.yml 所在目录,执行指令
docker-compose up
- 看到成功构建,并运行,本地镜像库也看到多了一个刚构建的镜像
5、安装 docker-compose
// 下载安装到 /usr/local/bin/,并添加权限,完成后查看版本(docker-compose --version)
curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
// 安装自动补全工具
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose