docker基础总结

概念

镜像、容器、仓库三大概念

Docker 方便开发者同时打包应用和相应的依赖环境到一个container中,方便迁移

docker的设计大量参考了git

image-20200319073008584

docker命令全流程

![image-20201216131402718](/Users/yanglujian/Library/Application Support/typora-user-images/image-20201216131402718.png)

docker 命令

image-20201216131735418

历史

对比以前的VMWARE整机虚拟化技术,更轻。

统一了开发,测试,运维环境。

开发人员打包好自己开发的软件 和 软件依赖的环境(基础数据,依赖软件等),打包成一个镜像发给测试使用即可

docker的实现是依靠UnionFS(Union File System), 该文件系统使用了分层的思想。将基础的服务进行分层共享。如同搭建积木一样,不同的发行版基础的bootFS(系统启动相关)是一样的,而rootFS(文件系统/root /etc /ops等等)大致一样,所以这些层可以共享,其余的镜像只要添加自己需要的层即可,

image-20201211232319804

基本组成

image-20201209170222443

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

其他参数

image-20200318153609715

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参数来一个一个映射

  • 优点

    多个容器共享一份数据卷

image-20200319101805628

容器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镜像文件

  • 构建步骤

    1. docker build 将dockerFile构建成为一个镜像
    2. docker run 运行镜像
    3. docker push 发布进行 ---》 (DockerHub 或 阿里云镜像仓库)
  • 基础知识

    1. 表示注释

    2. 指令都是大写
    3. 目前市场已经把jar包和war包交付 --> docker镜像交付
  • 基本指令
    image-20201214222134096

    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
    
    1. 构建

      ## 使用当前目录(最后的点)的dockerfile 构架镜像
      docker build -f mycentos.dockerfile -t mycentos:0.1 .
      
      ## 构建镜像时若Dockerfile存在于当前目录下,不需要-f指定文件
      docker build -t mycentos:0.1 .
      
    2. 研究一个镜像的构建历史

      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. 命名空间(一个大项目有多个镜像构成,项目名为一个命名空间)
    2. 仓库(存放镜像),1个仓库隶属于一个命名空间

日志

## 查看容器指定行数10行的日志 -t timestamp   -f follower-output
docker logs -tf --tail 10 [容器id]

容器进程

## 查看容器内部的进程信息
docker top [容器id]
posted @ 2020-12-16 21:27  ylj-2021  阅读(107)  评论(0编辑  收藏  举报