• 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
    
    
  • 相关阅读:
    PHP中单引号与双引号的区别分析
    utf8_unicode_ci与utf8_general_ci的区别
    [mysql-Ver5.6.23] windows版my.ini配置
    Gateway/Worker模型 数据库使用示例
    php 字符串 以 开头 以结尾 startWith endWith
    MySQL错误ERROR 2002 (HY000): Can't connect to local MySQL server
    vim变ide
    在Vue中使用样式
    Vue指令之`v-model`和`双向数据绑定
    Vue指令之事件修饰符
  • 原文地址:https://www.cnblogs.com/yc9064/p/15851265.html
Copyright © 2020-2023  润新知