docker基础总结
概念
镜像、容器、仓库三大概念
Docker 方便开发者同时打包应用和相应的依赖环境到一个container中,方便迁移
docker的设计大量参考了git
docker命令全流程
![image-20201216131402718](/Users/yanglujian/Library/Application Support/typora-user-images/image-20201216131402718.png)
docker 命令
历史
对比以前的VMWARE整机虚拟化技术,更轻。
统一了开发,测试,运维环境。
开发人员打包好自己开发的软件 和 软件依赖的环境(基础数据,依赖软件等),打包成一个镜像发给测试使用即可
docker的实现是依靠UnionFS(Union File System), 该文件系统使用了分层的思想。将基础的服务进行分层共享。如同搭建积木一样,不同的发行版基础的bootFS(系统启动相关)是一样的,而rootFS(文件系统/root /etc /ops等等)大致一样,所以这些层可以共享,其余的镜像只要添加自己需要的层即可,
基本组成
client操作docker daemon, 从Registry拉取Image,运行容器和管理容器
镜像下载下来后是readonly, 当run成容器后,就在上面铺了一层writable层,
铺完后可以在打包成一个镜像
安装环境
## 内核要求
uname -r 系统内核版本 3.10以上
## 系统版本
cat /etc/os-release
工作路径
/var/lib/docker
配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://cmh3y065.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
容器cpu监控
docker stats
可视化管理工具
-
portainer
docker run -d -p 8088:9000 \ > --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
镜像
Docker 运行容器前需要本地存在对应的镜像,如果不存在,会从默认镜像仓库下载(默认从Docker Hub),可以配置使用自定义的镜像仓库, 查询镜像版本号可以去docker-hub中查找
runoob@runoob:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# REPOSITORY: 镜像仓库源
# TAG:镜像标签(版本), 同一个仓库源可以有个TAG,代表仓库源的不同版本
pull 镜像拉取
##TAG 是镜像的标签,往往是版本号,默认是latest, 版本需要在网页版上查找
docker pull IMAGE:TAG
docker pull mysql:5.7 ## 5.7版本是存在的
##指定仓库地址
docker pull [仓库地址] IMAGE:TAG
e.g 网易蜂巢
docker pull hub.c.163.com/public/ubuntu:18.04
inspect 镜像查看
##列出镜像
docker images
docker image ls
##查看详细信息。 制作者,各层数字摘要
docker inspect centos:7
search 镜像搜寻
##搜索官方提供带nginx的镜像,默认docker-hub中查找
docker search --filter=is-official=true nginx
##搜索收藏数超过4的
docker search --filter=stars=4 tensorflow
其他参数
tag 镜像标签
## 给镜像打标签
docker tag [image_id] 镜像名:版本标签
## 删除镜像标签
docker rmi [image]:tag
rm & prune 镜像删除清理
## 使用标签删除镜像,只删除指定标签
docker rmi centos:7
## 使用镜像ID删除,先删除image对应的tag,然后删除镜像,无法删除有对应运行容器的image
## 因为同一个镜像会对应不同的标签,所以需要先删除标签
docker rmi 标签
docker rmi [镜像ID]
docker rmi -f 镜像 ## -f强制删除,不管依赖
## 有对应容器的镜像删除
docker rmi 容器ID
## 清理镜像,清理临时的遗留镜像文件层
docker image prune -f
## 获取所有的image ID, docker images -q
## 删除所有的image
docker rmi 'docker images -q'
commit镜像
## 思路和git一致,
## pull镜像后,在可读镜像上面铺了一层writable层,即做了修改,commit后保存到本地仓库
docker commit -m="Comment" -a="author" 容器id 目标镜像:[TAG]
镜像存储载入 save load
- 可以将镜像打包到文件,磁盘介质拷贝
- 使用docker save --help 查看命令详情
容器
容器是镜像的运行实例,镜像是静态只读文件,容器有可写文件层。
inspect 容器参数
## 查看容器运行配置参数,网络,数据卷等
docker inspect 容器名
ps 容器查看
## 查看docker正在运行的所有容器以及运行结束的容器
docker ps -a
## 查看正在运行的容器,不显示stop状态的容器
docker ps
run 容器创建运行
## 立即进入
-i 容器标准输入保持打开,交互模式interaction
-t 开启tty伪终端对接标准输入 terminal
--name 给容器起名
-P 容器随机绑定宿主机的空闲端口
-p 主机端口:容器端口
docker run -itd --name=[自定义名] [镜像版本] [进入容器的初始化指令]
e.g docker run -itd --name=cli centos:7 /bin/bash
exit命令退出后,容器停止
## 后台运行 -d deamon容器以后台进程形式运行,此时不需要加/bin/bash,手动进入
docker run -id --name=cli2 centos:7
## 进入容器
docker exec -it cli2 /bin/bash
exit命令退出后,容器继续运行,若使用docker attach命令进入容器,退出后容器停止运行
## 启动容器常见的坑
docker run -d centos 命令执行后发现docker ps 没有看到对应的容器运行
因为容器运行必须要有一个前台进程,如/bin/bash, 当容器发现没有进程运行时候就会自动停止运行
## 用完即删的容器 -rm
docker run -it --rm tomcat:9.0
start stop restart 容器停止启动
docker stop cli2
docker start cli2
docker restart cli2
rm -f 删除容器
## running状态的容器不能被删除
## 获取所有容器的运行id
docker ps -aq
## 删除所有的容器
docker rm `docker ps -aq`
## 删除指定容器
docker rm 容器ID
import/export导入导出快照
## 导出快照到文件
docker export [containerId] > file.tar
## 导入为镜像
cat file.tar | docker import - ImageRepostory(镜像)
docker cp 文件复制
## 常用于将容器内的文件拷贝到宿主机上
docker cp a2ebd63f6e44:/Hello-docker.java ./
## 宿主机往容器内cp,往往用卷
提交容器到镜像
## 容器提交成为镜像
docker commit mycentos7 test_image:v1
查看容器日志
## 容器绑定宿主机端口后,查看端口对应应用产生的日志
docker logs -f [容器id]
查看容器信息
docker inspect [容器id]
Docker Volumn
数据卷(Data Volumes):容器内数据映射到本地主机环境,类似linux的mount操作
- 容器之间共享数据,解耦数据和应用
- 数据持久化,不依赖容器(防灾)
配置数据卷
## 1.绝对路径 2.目录自动创建if not exist 3.一个容器可以挂载多个目录
docker run... -v 宿主机目录/文件:容器内目录/文件 -v.. -v..
e.g
docker run -it --name=cli -v /root/data:/root/data_container centos:7 /bin/bash
## 2.mysql容器
docker run -d -p 3306:3306
-v /home/mysql/conf:/etc/mysql/conf.d
-v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
数据卷容器
-
概念
通过--volumn-from参数,继承父容器的全部的数据卷,从而不用-v参数来一个一个映射
-
优点
多个容器共享一份数据卷
容器C3创建了数据卷,C1和C2 使用--volumn-from绑定C3, 那么也绑定了数据卷,此时C3奔溃数据卷的绑定关系依旧存在。 方便每次使用-v依次挂载
## 自动分配的数据卷查看: docker inspect c3 ==> mounts节点
docker run -it --name=c3 -v /volumn centos:7
## 创建c1, c2的数据卷指向c3
docker run -it --volumes-from [容器id或name] --name c1 ylj/centos /bin/bash
docker run -it --volumes-from [容器id或name] --name c2 ylj/centos /bin/bash
具名挂载和匿名挂载数据卷
-
所有容器的数据卷在-v没有指定宿主机的映射地址的前提下 默认都在下面这个路径中创建
/var/lib/docker/volumes/卷名/
-
匿名挂载(数据卷不命名)
docker run -d -P --name nginx01 -v /etc/nginx nginx ## 匿名挂载 查看挂载的卷 [root@VM-0-11-centos _data] docker volume ls DRIVER VOLUME NAME local 905e238d2ee583ac26c87ccb135c9e42c4ec6f7f7bb92cf0f8e4332b4064fa78
-
具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx ## 匿名挂载 查看挂载的卷 [root@VM-0-11-centos _data]# docker volume ls DRIVER VOLUME NAME local juming-nginx
-
几种挂载方式区别
-v 路径 ## 直接带路径表示是容器内的路径 -v 卷名:容器内路径 ## 具名挂载,数据卷在/var/lib/docker/volumes/卷名/ -v /宿主机路径:容器内路径 ## 指定路径挂载 前面带的是绝对路径
-
卷的权限设置(ro , rw)
## 挂载卷,同时设定卷只读属性(ro), 则在容器内部就不能修改数据卷内容 ## 挂载只读权限的数据卷,只能在宿主机中对数据卷进行修改 docker run -it --name nginx02 -P -v juming02:/etc/nginx:ro nginx
Docker Network
- 详情见独立章节
DockerFile
DockFile 是用来构建docker镜像的构建文件。docker daemen程序会读取构建文件,按照构建文件的描述组长一个docker镜像文件
-
构建步骤
- docker build 将dockerFile构建成为一个镜像
- docker run 运行镜像
- docker push 发布进行 ---》 (DockerHub 或 阿里云镜像仓库)
-
基础知识
-
表示注释
- 指令都是大写
- 目前市场已经把jar包和war包交付 --> docker镜像交付
-
-
基本指令
FROM # 基础镜像 centos MAINTAINER # 镜像维护者,姓名+邮箱 RUN # 镜像构建时 需要执行的命令 ADD # 构建tomcat镜像的话需要添加tomcat压缩包 WORKDIR # 设置当前的工作目录 VOLUME # 设置卷 EXPOSE # 对外端口 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以多个追加 ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行ONBUILD的指令 COPY # 类似ADD,将文件拷贝到镜像汇总 ENV # 构建时设置环境变量
-
实例
FROM centos ## 指定基础镜像 MAINTAINER yanglujian<aboutlistener@163.com> ENV MYPATH /usr/local ## 设置环境变量 WORKDIR $MYPATH ## 设置工作目录,创建容器后默认进入 RUN yum -y install vim ## 安装vim RUN yum -y install net-tools ## 安装网路工具 ifconfig EXPOSE 80 CMD echo $MYPATH CMD echo "----end----" CMD /bin/bash
-
构建
## 使用当前目录(最后的点)的dockerfile 构架镜像 docker build -f mycentos.dockerfile -t mycentos:0.1 . ## 构建镜像时若Dockerfile存在于当前目录下,不需要-f指定文件 docker build -t mycentos:0.1 .
-
研究一个镜像的构建历史
docker history [镜像id]
-
-
CMD作用
## dockerfile文件内容 FROM centos ## 基础镜像 CMD ["ls","-a"] ## 创建容器时自动执行 ## 构建镜像 docker build -f docker-cmd-test.dockerfile -t cmdtest . ## 运行镜像,若有多个cmd,只有最后一个cmd会生效, docker run cmdtest(镜像名或镜像id) ## 这里run容器 后面不加命令会执行上面的CMD命令 ## 情况1: docker run cmdtest -l ## 解析: 镜像中的CMD不会执行,而是会被-l替换掉 ## 修改: docker run cmdtest ls -al 则会正常执行
-
ENTRYPOINT(注意和CMD命令区分)
## dockerfile文件内容 FROM centos ENTRYPOINT ["ls","-a"] ## 构建镜像 docker build -f docker-entrypoint-test.dockerfile -t entrypoint-test . ## 情况1: docker run entrypoint-test -l ## 解析: 此时 -l 会追加在ls -a命令后面,最终执行ls -a -l命令
-
构建自定义tomcat镜像的dockerFile文件
FROM centos ## 基础镜像 MAINTAINER yanglujian<aboutlistener@163.com> ## 该文件维护人员 COPY readme.txt /usr/local/readme.txt ## 拷贝文件到镜像 ADD jdk-8u201-linux-x64.tar.gz /usr/local/ ## 解压文件到指定目录 ADD apache-tomcat-8.5.42.tar.gz /usr/local/ RUN yum -y install vim ## 安装vim ENV MYPATH /usr/local WORKDIR $MYPATH ## 指定工作目录 ENV JAVA_HOME /usr/local/jdk1.8.0_201 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.42 ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.42 ## 指定环境变量PATH ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin ## 暴露8080端口 EXPOSE 8080 ## 启动容器自动运行 CMD /usr/local/apache-tomcat-8.5.42/bin/startup.sh && tail -f /url/local/apache-tomcat-8.5.42/bin/logs/catalina.out
运行
## -d 后台运行 -p 端口映射 --name 重命名 ## -v 目录映射 1.webapps(方便发布包) 2.日志目录(方便查询日志) [root@VM-0-11-centos ~]# docker run -d -p 9090:8080 --name yljtomcat -v /home/ylj/build/tomcat/test:/usr/local/apache-tomcat-8.5.42/webapps/test\ > -v /home/ylj/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-8.5.42/logs diytomcat:0.1
DockerHub
-
查看是否登录
vim ~/.docker/config.json ## 阿里云镜像仓库登录 sudo docker login --username=ylj_2019 registry.cn-hangzhou.aliyuncs.com
-
基本概念
- 命名空间(一个大项目有多个镜像构成,项目名为一个命名空间)
- 仓库(存放镜像),1个仓库隶属于一个命名空间
日志
## 查看容器指定行数10行的日志 -t timestamp -f follower-output
docker logs -tf --tail 10 [容器id]
容器进程
## 查看容器内部的进程信息
docker top [容器id]