• Docker学习笔记


    Docker

    概述

    Docker 是一个开源的、轻量级的容器引擎,主要运行于 Linux 和 Windows,用于创建、管理和编排容器。

    和 VMware 虚拟机相比,Docker 使用容器承载应用程序,而不使用操作系统,所以它的开销很少,性能很高。但是,Docker 对应用程序的隔离不如虚拟机彻底,所以它并不能完全取代 VMware。

    组成

    镜像

    docker镜像 相当于一个模板, 通过这个模板来创建容器服务,可以创建多个容器

    联合文件系统

    下载B镜像时,如果已下载镜像A有部分内容重复,那么这部分内容将复用,复用的部分称为镜像的镜像层,而下载的部分为容器层

    容器

    docker利用容器技术,独立运行一组应用

    启动 停止 删除 基本命令

    理解为一个简易的linux系统

    仓库

    公有仓库和私有仓库 docker hub(默认是国外的)

    阿里云 有容器服务器(镜像加速)

    存放镜像!

    安装

    卸载旧的

    yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    

    在linux上安装docker

    软件包

    sudo yum install -y yum-utils
    //设置镜像仓库 阿里云 默认是国外的
    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    

    更新软件包索引

    yum makecache fast
    

    安装docker

    sudo yum install docker-ce docker-ce-cli containerd.io
    

    命令

    启动

    systemctl start dockers
    systemctl start docker.service
    

    查看版本

    docker version
    

    运行hello-world镜像

    docker run centeros /bin/echo "Hello world"
    # Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
    

    查看镜像

    docker images
    

    卸载

    sudo yum remove docker-ce docker-ce-cli containerd.io
    
    sudo rm -rf /var/lib/docker
    
    sudo rm -rf /var/lib/containerd
    
    

    帮助命令

    帮助文档 https://docs.docker.com/reference/

    docker version  # 显示docker版本信息
    docker info  # docker系统信息 包括镜像和容器数量 
    docker 命令 --help #帮助命令
    

    镜像命令

    docker images 查看所有本地主机上的镜像

    #解释
    REPOSITORY 镜像的仓库源
    TAG   镜像的标签
    IMAGE ID 镜像id
    CREATED  镜像的创建时间
    SIZE  镜像大小
    # 可选项
    -a --all # 列出所有镜像
    -q --quiet # 只显示id
    

    docker serach 搜索镜像名(如mysql)

    --filter=STARS=3000 搜素出来的镜像starts大于3000的
    例子 docker search mysql --filter=stars=5000
    

    docker pull 下载镜像

    docker pull 镜像名:版本
    docker pull mysql等价于
    docker pull mysql docker.io/libray/mysql:latest
    

    docker rmi 删除镜像

    docker rmi -f 镜像id                    删除容器
    docker rmi -f 镜像id 镜像id 镜像id   删除多个容器
    docker rmi -f $(docker images -aq)  删除全部容器
    

    容器命令

    有了镜像后 才能创建容器

    下一个centeros

    docker pull centos
    

    新建容器并启动 ,操作对象是镜像, 进入后可修改镜像内的文件

    docker run [可选参数] image
    
    #参数
    -t  在新容器内指定一个伪终端或终端。
    -i  允许你对容器内的标准输入 (STDIN) 进行交互。
    --name="Name" 容器名字
    -d 以后台方式运行 nohup
    -it 使用交互方式运行
    -p 指定容器的端口 -p 8080:8080
    -P 随机指定端口
    --restart alway  # always容器退出时重启  on-failure:容器故障退出(返回值非零)时重启 no:容器退出时不重启
     -v 宿主机目录:容器目录  #
      30                   [OK]
    # 启动并进入容器
    docker run -it centos /bin/bash
    exit 会退出并停止容器运行
    

    列出所有运行的容器

    docker ps

    docker ps #当前正在运行的
    -a        #加上历史运行过的
    -n=?      #显示最近运行过的
    -q        #只显示容器id 
    

    退出容器 启动容器

    exit # 停止并退出
    Ctrl + P + Q #不停止退出
    docker stop 容器id # 退出后 停止运行容器
    docker start 容器id
    docker restart 容器id
    docker kill 容器id #强制..
    

    删除容器

    docker rm 容器id               #删除指定容器
    docker rm -f $(docker ps -aq) #删除所有容器 
    

    启动容器和停止容器

    docker start 容器id
    docker restart 容器id
    docker stop 容器id 
    docker kill 容器id
    

    进入正在运行的容器

    #退出当前容器
    exit 
    # 进入容器 并新起命令行 
    docker exec  -it 容器id bash
    #进入正在运行的命令行
    docker attach 容器id bash 
    

    docker run 和docker exec的区别

    • docker run 根据镜像创建一个容器,然后操作镜像
    • docker exec 是进入一个正在运行的容器

    根据容器创建一个新镜像

    docker run -it -p xxx  #启动容器
    修改容器内的内容
    
    新开一个窗口
    docker commit -m="一次提交的信息"  [要修改的容器id] 新的镜像名  #提交镜像
    docker commit -a='yc9064' -m='docker新镜像提交测试' 96dd74b37e87 mynginx:v1
    
    docker images #查看重新打好的镜像
    
    docker run -d -p 8080:80 --name mynginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html  mynginx:v1
    
    • -a :提交的镜像作者;
    • -c :使用Dockerfile指令来创建镜像;
    • -m :提交时的说明文字;
    • -p :在commit时,将容器暂停。

    常用其他命令

    后台启动

    docker run -d centos 
    #发现问题
    docker ps 发现停止了
    后台运行 必要有一个前台进程  docker发现没有应用会自动停止
    

    常看日志

    #执行循环脚本
    docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;donre"
    
    #查看容器id
    docker ps
    
    #查看输出的日志
    docker logs -tf --tail 100 容器id
    

    查看容器中进程信息

    docker top 容器id
    

    3.查看容器的元数据

    docker inspect 容器id
    

    从容器内拷贝文件到主机

    docker cp 容器id:容器内文件路径  目的主机的路径
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xxSBlhvO-1640666584521)(.\img\1.png)]

    阿里云镜像加速

    登录阿里云找到容器镜像服务

    找到镜像加速地址

    sudo mkdir -p /etc/docker
    
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {   
      "registry-mirrors": ["https://5gw6wzma.mirror.aliyuncs.com"]
    }
    EOF
    
    sudo systemctl daemon-reload
    
    sudo systemctl restart docker
    

    使用镜像

    安装nginx

    docker pull nginx
    #查看开放的端口号
    firewall-cmd --list-ports 
    #开放8080端口
    firewall-cmd --zone=public --add-port=8080/tcp --permanent 
    #重启
    firewall-cmd --reload 
    #-p暴露端口(容器的) -d 后台运行 -name 给容器取名
    #运行 nginx容器, 名字为nginx01 使用机器的8080端口映射到容器的80端口 
    # --restart always重启docker后启动容器
    [root@masterServr ~]# docker run -d -p 8080:80 --name nginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html  nginx
    WARNING: IPv4 forwarding is disabled. Networking will not work.
    b435252b28d1b6a6bf944d470102371658744e10f948b6632249d3e59a0b9311
    
    [root@masterServr ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
    b435252b28d1   nginx     "/docker-entrypoint.…"   15 seconds ago   Up 14 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
    f67252424cc0   centos    "/bin/bash"              18 hours ago     Up 18 hours                                             silly_zhukovsky
    
    
    

    安装tomcat

    # --rm     停止就删除 用来测试
    docker run -it --rm tomcat:9.0
    
    开放端口号
    docker pull tomcat:9.0
    
    docker runn -d -p ...
    

    访问url,得到tomcat 404页面

    进入容器中的webapp目录 发现为空

    说明tomcat镜像被缩减

    原因:默认是最小镜像,所有不必要的东西都剔除

    容器数据卷

    问题:如果数据存在容器中,那么我们删除容器,数据也一并被删除了.

    需求: 数据可以持久化.

    将容器内的目录挂载到主机上即可

    总结: 为了容器的持久化和同步操作,容器间目录也可以共享

    命令 -v 主机目录:容器目录

    例:

    docker run -d -p 8080:80 --name nginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html  nginx
    

    具名和匿名挂载

    docker  run ...  -v  [容器内目录] ... # 匿名
    
    docker  run ...  -v  [取个名字]:[容器内目录]:[文件权限 ro/rw] ... # 具名  ro是容器文件只读权限,要改变文本需要走宿主机
    docker volume ls # 查看所有挂载
    docker inspect [volumeName]
    

    容器间文件同步

    容器间信息的传递, 比如mysq容器的l数据同步

    docker run -it --name docker01 xxx:1.0
    #把dcoker02 绑定到docker01  数据同步
    docker run -it --name docker02 --volumes-from dcoker01 xxx:1.0
    
    
    docker run -it --name docker01 mycentos:v1 bash
    docker run -it --name docker02 --volumes-from docker01 mycentos:v1 bash
    
    

    DockerFile

    用来构建docker镜像的构建文件,一段命令脚本

    所以 我们不仅可以通过修改容器并commit构建新的镜像到本地 ,也可以通过 docker build [dockerfile文件] 的方式来构建镜像

    DockerFile构建过程

    我们以后发布项目 ,做镜像 就要编写dockerfile

    基础知识:

    1.每个保留关键字(指令)必须大写

    2.从上到下执行

    3.#表示注释

    4.每一个指令都会创建提交一个新的镜像层,并提交

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RPCpp8pD-1640666584523)(.\img\2.jpg)]

    Dockerfile指令详解

    • FROM

      基础镜像, FROM centos

    • MAINTAINER

      标注作者和邮箱 FROM liuyinchuan yc906478@163.com

    • RUN

      此操作会影响镜像

      • RUN [command]

        shell中使用/bin/sh运行command 比如 RUN echo '这个容器的镜像是通过dockerfile构建的' > readMe.txt

      • RUN ['指定程序','参数1','参数2']

        RUN["/bin/bash","-c","echo hello"]

    • CMD

      CMD用于指定容器启动时执行的命令,每个Dockerfile只能有一个CMD命令,

      构建镜像后,若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令

      CMD ['指定程序','参数1','参数2']

    • ENTRYPOINT

      与CMD类似

      构建镜像后,若容器启动时指定了运行的命令,则会在原来的指令中追加

    • EXPOSE

      暴露端口配置 也可 run的时候加上 -p 【端口号】

    • ADD

      加入文件到镜像内 如果是压缩包 会解压缩

      ADD [源文件路径] [镜像内路径]

    • COPY

      与ADD类似 不会解压文件

    • ENV

      设置容器环境变量

      ENV JAVA_HOME=/usr/local/jdk_1.8.201/

    • WORKDIR

      为后续的RUN CMD ENTRYPOINT指定配置工作目录,可以使用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。

      WORKDIR /path

    FROM		#基础镜像,一切从这里开始构建
    MAINTAINER	#镜像是谁写的,姓名+邮箱
    RUN			#镜像构建的时候需要运行的命令
    ADD			#步骤,tomcat镜像,这个tomcat的压缩包!添加内容
    WORKDIR		#镜像的工作目录	
    VOLUME		#匿名挂载的目录
    EXPOSE		#暴露端口配置  也可 run的时候加上 -p 【端口号】
    CMD			#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
    ENTRYPOINT	#指定这个容器启动的时候要运行的命令,可以追加命令
    ONBUILD		#当构建一个被继承 Dockerfile 这个时候就会运行ONBUILD 的指令
    COPY 		#类似ADD,将我们文件拷贝到镜像中
    
    

    例:

    新建一个dockerfile1

    上传 jdk-8u281-linux-x64.tar.gz

    vim dockerfile1

    FROM centos                        # 使用centos作为基础镜像
    MAINTAINER OBy yc906478@163.com
    
    ENV MYPATH=/usr/local
    WORKDIR $MYPATH
    
    VOLUME ["volume01","volume02","volume03"]   #匿名挂载目录 
    
    RUN yum -y install vim
    RUN yum -y install net-tools
    
    EXPOSE 80
    CMD echo
    CMD echo "---end---"
    CMD /bin/bash
    
    docker build -f dockerfile1 -t mycentos:v1 . #使用当前目录的dockerfile构建v1版的mycentos
    docker run -it my
    

    构建镜像

    编写好dockerfile后, 可构建镜像到本地

    docker build -t nginx:v3 .
    docker build -f dockerfileName -t /filepath .
    

    上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

    实战

    Centos

    创建名为Dockerfile的文件,这样不输入文件名build的时候会 找到这个文件

    FROM centos:7                       
    MAINTAINER OBy yc906478@163.com
    
    ENV MYPATH=/usr/local
    WORKDIR $MYPATH
    
    VOLUME ["volume01","volume02","volume03"]
    
    RUN yum -y install vim
    RUN yum -y install net-tools
    
    EXPOSE 80
    CMD echo "---end---"
    CMD /bin/bash
    

    构建:

    docker build -f mydockerfile-centeros -t mycentos:0.1 
    

    Tomcat

    Dockfile

    FROM centos
    #作者
    MAINTAINER yc 906478612@qq.com
    #拷贝tomcat jdk 到镜像并解压
    ADD apache-tomcat-8.5.73.tar.gz /usr/local/tomcat
    ADD jdk-8u281-linux-x64.tar.gz /usr/local/jdk
    
    RUN yum -y install vim
    #定义交互时登录路径
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    #配置jdk 和tomcat环境变量
    ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_281
    ENV CATALINA_HOME /usr/local/tomcat/apache-tomcat-8.5.73
    ENV CATALINA_BASE /usr/local/tomcat/apache-tomcat-8.5.73
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    #设置暴露的端口
    EXPOSE 8080
    #运行tomcat
    CMD /usr/local/tomcat/apache-tomcat-8.5.73/bin/startup.sh && tail -f /usr/local/tomcat/apache-tomcat-8.5.73/logs/catalina.out
    
    
    docker run -d -p 8080:8080 --name mytomcat -v /usr/local/tomcat/logs:/usr/local/tomcat/apache-tomcat-8.5.73/logs/ -v /usr/local/tomcat/webapps:/usr/local/tomcat/apache-tomcat-8.5.73/webapps/ diytomcat
    
    
  • 相关阅读:
    6. Flask请求和响应
    5. Flask模板
    FW:Software Testing
    What is the difference between modified duration, effective duration and duration?
    How to push master to QA branch in GIT
    FTPS Firewall
    Query performance optimization of Vertica
    (Forward)5 Public Speaking Tips That'll Prepare You for Any Interview
    (转)The remote certificate is invalid according to the validation procedure
    Change
  • 原文地址:https://www.cnblogs.com/yc9064/p/15851265.html
Copyright © 2020-2023  润新知