Docker学习笔记和实践

一、Docker的安装与卸载

安装
  1. 官方文档地址:https://docs.docker.com/engine/install/centos/

  2. 删除docker,如果没有安装过可以不执行

    # 删除老版本  ,没有安装过可以不执行
    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  3. 安装

    # 安装一些工具包
    sudo yum install -y yum-utils
    
  4. 添加阿里云镜像仓库

    sudo yum-config-manager \
        --add-repo \
        http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  5. 安装

    sudo yum install docker-ce docker-ce-cli containerd.io
    
  6. 也可以配置专属的加速地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
    在这里插入图片描述

  7. 启动/停用/状态

    #重启 docker
    systemctl restart docker
    # 启动docker
    systemctl start docker
    # 查看状态
    systemctl status docker
    # 停止 docker 
    systemctl stop docker
    
  8. 测试是否安装成功

    #  虽然没有该镜像,但是会自动从阿里镜像仓库获取
    docker run hello-world
    
卸载
systemctl stop docker 
yum -y remove docker-ce
rm -rf /var/lib/docker        #删除相关库

二、Docker常用命令

  1. 查看镜像各个版本地址:https://hub.docker.com/search?q=&type=image

  2. 查看docker的信息

    # 查看docker的版本信息
    docker version
    # 查看docker的详细信息
    docker info
    
  3. docker的【常用重要命令】

    # 查看docker的命令文档
    docker --help
    
  4. 查看docker的镜像信息

    #查看docker的镜像列表
    [root@localhost ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    tomcat       latest    bd431ca8553c   3 days ago     667MB
    centos       latest    300e315adb2f   4 months ago   209MB
    
    docker images --help      #帮助列表
    docker images -a          #列表出本地的所有镜像
    docker images -q          #只查看镜像的ID
    docker images -qa         #列表
    docker images --digests   #查看镜像的摘要信息
    docker images --no-trunc  #显示完整的镜像信息
    
  5. 查询镜像:docker search

    docker search --help  # 查看nginx命令
    docker serch nginx    # 查看nginx的镜像列表【选择OFFICIAL(官方)为OK的,START星星最多的】
    docker search centos  # 查看centos的镜像列表
    docker search nginx --limit 2   # 查询前两条列表
    docker search nginx --no-trunc  # 不缩略展示摘要,展示详细信息
    
  6. 拉取镜像:docker pull

    docker pull tomcat   #拉取最新的tomcat,等价于[docker pull tomcat:latest]
    docker pull tomcat:8.7   #拉取指定版本的tomcat,可以在上上面网址进行查看版本列表
    docker pull tomcat:8.7 nginx:latest  #同时拉取多个镜像,拉取tomcat8.7版本和最新版的nginx
    
  7. 删除镜像

    [root@localhost ~]# docker --help
      rm          Remove one or more containers   #删除一个或多个容器
      rmi         Remove one or more images       #是你出一个或多个镜像
    ------------------------------------------------------------------
    docker pull hello-world    #先下载一个最新的镜像
    docker run hello-world
    docker rmi hello-world:latest    #删除hello-world镜像,此时hello-world正在使用,删除步成功,需要强制删除
    docker remi -f hello-world:latest  # 强制删除镜像
    docker rmi -f $(docker images -qa) # 强制删除所有的镜像
    
  8. 运行容器相关命令参数说明

    [root@localhost ~]# docker run --help    #常用几个注解
      docker run [OPTIONS] IMAGE [COMMAND]
      --name="容器的名字": 为容器指定一个新的名称
      -d: 后台以守护进程的方式运行
      -i: 以交互模式运行,表示我要与你建立连接,通常与-t同时使用
      -t: 为容器分配一个伪终端,也就是连接成功后的命令面板,与-i同时使用
      -P: 随机端口映射
      -p: 指定端口映射
         ip:hostPort:containerPort
         ip::containerPort
         hostPort:containerPort
         containerPort
    
  9. 运行容器 并建立连接

    [root@localhost ~]# docker run -it centos    # 运行镜像centos,自定义生成容器名字
    [root@a7d26339f9e3 /]# ls   #进入到容器内部
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@localhost ~]# docker ps  #另外一个终端连接服务器,查看正在运行的容易,可以查看到名字为pedantic_maxwell
    CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
    a7d26339f9e3   centos    "/bin/bash"   14 seconds ago   Up 12 seconds             pedantic_maxwell
    ----------------------#指定容器名字的方式运行 -------------------------------
    [root@localhost ~]# docker run -it --name myFirstCentos  centos /bin/bash
    [root@d93f6a45e650 /]# ls
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
    d93f6a45e650   centos    "/bin/bash"   9 seconds ago   Up 9 seconds             myFirstCentos
    
    -------------------------------备注--------------------------------------------
    /bin/bash  为容器的默认运行的进程,可加可不加
        docker中必须保持一个默认的进程在运行,这个进程就是bash进程,如果不运行,容器就会运行结束退出
    
  10. 进入容器后退出容器内部面板

方法 区别
输入exit后回车 退出后容器停止运行
crtl+P+Q 退出后容易没有停止运行,再次连接docker attach 容器名字/容器ID
  1. 后台运行的方式运行容器【docker容易后台运行,必然有一个前台程序与之交互】
备注: docker机制【后台运行必须有一个前台程序,否则容器在运行完后就结束了,所以使用docker ps 查看正在运行的容器为空】
[root@localhost ~]# docker run -d tomcat   # -d 后台运行,但是由于
f980daf7a8d142d600712b9ec4d88964ec1c1d7aed466397500bfc8a5acb7839
所以运行时需要采用下面两种方式:-p 指定映射端口  -P随机生成端口【可以通过docker ps查看端口映射情况】
[root@localhost ~]# docker run -d -p 8089:8080 tomcat   
[root@localhost ~]# docker run -d -P tomcat   #后台运行可以使用后面的docker logs命令查看日志
  1. 查看正在运行的容器的【ID】或者【名字】
docker ps      #查看正在运行的容器
docker ps -a   #查看历史所有运行的容器
docker ps -a   #查看历史运行的所有容易的 ID
docker ps -n   #查看几个
  1. 查看容器的日志
docker logs --help  # 日志命令的帮助文档
docker logs -f myFirstCentos/8625b8c2a39f   #查看容器id是多少或者容器名字[docker ps获取] 的日志
docker logs -n 5 myFirstCentos    # 查看容器名字为myFirstCentos的五行日志
  1. 停掉容器
docker kill 容器名字/容器ID     #强制停止,相当于 kill -9 
docker stop 容器名字/容器ID     #会先发送停止信号,然后慢慢停止
  1. 再次连接上容器

    # 直接进入容器命令终端,不会开启新的进程    #crtl+p+q退出后
    docker attach 容器名字/容器ID   
    docker exec -t 容器名字/容器ID /bin/bash    #进入容器
    
    # 在容器打开新的终端,会启用新的进程, 以下命令相当于:在容器内部的tmp目录下执行命令[ls -l]
    docker exec -t 容器名字/容器ID ls -l /tmp/ 
    
  2. 查看容器的详细细节

    docker inspect 容器名字/容器ID   #查看容器的细节
    
  3. 拷贝宿主机文件到容器和拷贝容器文件到宿主机

    docker cp 容器名字/容器ID:/tmp/yum.log  /root/   #将容器的log文件拷贝到主机的root下
    docker cp /root/tempFile/ 容器名字/容器ID:/tmp/  #拷贝文件夹到容器内部
    
  4. 提交容器使之成为一个新的副本[使用阿里镜像最新版本的tomcat]

    docker pull tomcat  #拉取tomcat
    docker run -it -p 8888:8080 tomcat  # 运行tomcat
    #tomcat 运行成功,但是会发现浏览器访问:localhost:8080无法访问,进入tomcat容器内发现webapps文件内
    #容为空,所以修改webapps名字为webapps-temp,修改文件webapps.dist名字为:webapps
    #将上述修改后的tomcat重新提交为一个镜像,重新打开一个终端界面
    [root@localhost ~]# docker commit -a="我是作者" -m="我是描述信息" dbd29ce1824e test/mytomcat:1.2
    sha256:1d468ef2bb3d8487b6a157e3eac3d2ea69bfbccffcc86791a45aae1e4424ab73
    [root@localhost ~]# docker images  
    REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
    test/mytomcat   1.2       1d468ef2bb3d   8 seconds ago   672MB
    [root@localhost ~]# docker run -d -p 8090:8080 test/mytomcat:1.2
    # localhost:8090 访问正常
    
  5. 查看以前运行过的容器然后重新运行

    docker ps  -a   #查看之前运行过的容器 ID
    docker start 容器ID    #启动容器
    docker run -it 容器ID /bin/bash  #进入容器的控制台
    
  6. Docker的容器数据卷,作用【让宿主机和容器内指定文件夹的数据实时同步,以及容器停后,宿主机修改文件下的内容,容器再次启动后宿主机修改内容自动同步到容器内】使用centos做测试

    #docker run -it -v  /宿主机绝对路径目录:/容器内目录  镜像名字
    [root@localhost ~]docker run -it -v /myDataVolume:/dataVolumeContainer centos  #文件夹不用创建自动生成
    docker inspect  容器ID     #查看  详情是否绑定成功
    ​```
    "HostConfig": {
                "Binds": [
                    "/myDataVolume:/dataVolumeContainer"
                ],
    
    ​```
    # 在上面两个文件 夹创建文件并写入内容都会实时同步
    [root@localhost ~]docker run -it -v /myDataVolume2:/dataVolumeContainer2:ro centos  
    # ro[read Only] 这样容器内只能读文件不能写文件,宿主机可读可写
    
    
  7. 初识dockerFile【命令底层实现】,通过dockerFile构建对象

    #创建并编辑dockerFile文件夹,dockerFile无法指定宿主机,但是可以可以通过docker inpect ID,查看默认对应的宿主机文件目录
    [root@localhost mydocker]# vim dockerFile
    FROM centos             #来自centos镜像
    VOLUME ["/dataVolumecontainer1","/dataVolumeContainer2"]    # 创建两个数据卷
    CMD echo "finish, --------success"       #
    CMD /bin/bash
    [root@localhost mydocker]docker build -f  /home/mydocker/dockerFile -t test/mtCentos .
    #根据dockerFile构建镜像,-f后面跟dockerFile的路径,-t后跟构建名字为test/mtCentos的镜像,docker images查看,注意后面的点【.】表示指定镜像构建过程 中的上下文环境目录
    Sending build context to Docker daemon  2.048kB
    Step 1/4 : FROM centos
     ---> 300e315adb2f
    Step 2/4 : VOLUME ["/dataVolumecontainer1","/dataVolumeContainer2"]
     ---> Running in c95a4622436e
    Removing intermediate container c95a4622436e
     ---> 6d48a0a29080
    Step 3/4 : CMD echo "finish, --------success"
     ---> Running in 7fbb1faa44b3
    Removing intermediate container 7fbb1faa44b3
     ---> a38830222357
    Step 4/4 : CMD /bin/bash
     ---> Running in 6936262fc2fa
    Removing intermediate container 6936262fc2fa
     ---> 5a1160571f7e
    Successfully built 5a1160571f7e
    Successfully tagged test/mycentos:latest
    [root@localhost mydocker]docker attach 5a1160571f7e
    
    

在这里插入图片描述

  1. docker容器数据卷继承

    docker run -it --name demo1 test/mycentos    #运行上面创建镜像,并命名为demo1 
    docker run -it --name demo2 --volumes demo1 test/mycentos    #启动demo2并继承容器数据卷demo1
    docker run -it --name demo3 --volumes demo1 test/mycentos    #启动demo3并继承容器数据卷demo1
    # 在三个容器中分别添加文件,修改文件后 数据都能够被 彼此实时共享
    # 即使 domo1 被停掉删除后,对demo2 demo3数据共享也没有影响
    # 只要没有死绝就不会有影响
    

三、dockerFile相关概念

  1. 执行顺序

    1. 手动编写一个dockerFile,要符合dockerFile的编写规范

    2. 有了这个文件后,直接docker build执行文件,获取一个自定义的镜像

    3. run

  2. 基础知识

    1. 每条保留字段指令都必须为大写字母且后面至少要跟一个参数
    2. 指令从上到下,依次执行
    3. #表示注释
    4. 每条指令都会创建一个新的镜像层,并对镜像进行提交
  3. DockerFile、Docker镜像、Docker容器

    DockerFile:DockeFile为了进程准备一切需要的东西,包括文件、环境变量等
    Docker镜像:通过docker Build产生一个镜像,当运行该镜像时,才真正开始提供服务【相当于java的类】
    Docker容器:容器是直接提供服务的【相当于Java中类的实例】
    

四、DockerFile保留字指令语义

  1. FROM --基础镜像,当前要编写的镜像是基于哪个镜像的

    FROM scratch   #所有镜像的基础镜像
    FROM centos   #如果是基于centos做镜像,则FROM centos
    
  2. MAINTAINER --【维修者维护者的意思】镜像维护者

    MAINTAINER    test<XXXXXXXX@qq.com>  #镜像维护者的信息,随便写,或者url地址
    
  3. RUN --容器构建的时候需要运行的命令[例如指定用户]

    RUN mkdir -p /test1/test2  #RUN 后面跟linux命令
    
  4. EXPORT --当前容器对外暴露出的端口号

    EXPORT   80  #暴漏端口为80
    
  5. WORKDIR --指定在创建容器后,终端默认登录进来的工作目录,一个落脚点

    WORKDIR /usr/local #如果使用docker run -it XXX,进入容器后默认所在路径为/usr/local
    
  6. ENV --用来在构建过程中设置环境变量

    ENV MY_PATH /usr/local     #设置环境变量
    WORKDIR $MY_PATH    #引用环境变量,默认进入/usr/local
    
  7. ADD – 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

    ADD jdk-8u171-linux-x64.tar.gz /usr/local/  #将jdk拷贝进/usr/local/并解压
    
  8. COPY – 拷贝文件到目录镜像中 copy 源文件路径 目标文件路径

    COPY c.txt /usr/b.txt     #将文件拷贝到容器的/usr下并命名为b.txt
    
  9. VOLUME --容器数据卷,用于数据保存和持久化工作

    VOLUME ["/dataVolumecontainer1","/dataVolumeContainer2"]  #添加两个容器卷对象,查看宿主机中默认对应的文件路径命令:docker inspect XXXX
    
  10. CMD --指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD命令,但只有最后一个生效,CMD会被docker run的最后一个参数替换

    CMD /bin/bash
    CMD echo "sucess  .....  ok " #如果上述两条语句是在同一个dockerFile文件中,只有后面一个CMD命令生效
    ----------CMD会被docker run的最后一个参数替换--------------
    docker -it -p 8090:8080 tomcat ls -l  #就相当于tomcat的dockerFile最后两条语句为: 
    CMD ["catalina.sh",run] 
    CMD ls -l      #该命令会生效,CMD ["catalina.sh",run]没有效果,所有docker -it -p 8090:8080 tomcat ls -l 会运行失败
    
  11. ENTRYPOINT – 指定一个容器启动时要运行的命令

    跟CMD命令的区别,ENTRYPOINT是追加命令,都会执行
    
  12. ONBUILD --当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

    ONBUILD RUN echo "father onbuild ....."  父镜像test-father的dockerFile文件中的语句
    --------------------子镜像中的dockerFile-------------------
    FROM test-father  #子镜像依赖于父镜像test-father
    .........
    #当build 该子镜像时,onbuild被触发
    

五、dockerFile使用案例

  1. 运行拉取的centos并进入容器内部,进入的默认工作路径为根目录/,不支持vim a.txt, 不支持ifconfig【解决原有的问题,创建一个新镜像】

    [root@localhost mydocker]#vim dockerFile
     #基于centos做一个新的镜像
    FROM centos           
     #声明变量 mypath,值为/usr/local
    ENV mypath /usr/local   
     #默认进入:/usr/local目录
    WORKDIR $mypath         
     #安装VIM
    RUN yum -y install vim   
     #安装net-tools[ifconfig]
    RUN yum -y install net-tools   
     #对外暴露端口为80
    EXPOSE 80               
    CMD echo "success --------------- ok"
    CMD /bin/bash
    [root@localhost mydocker]# docker build -f /home/mydocker/dockerFile -t mycentos:1.3 .
    [root@localhost mydocker]# docker run -it a81a5df1118c  #进入后默认路径为 /usr/local,可以使用vim,可以使用ipconfig
    [root@localhost mydocker]# docker history 镜像ID   #查看镜像ID的变更历史
    
  2. 自定义tomcat9

    [root@localhost mydocker]#mkdir -p /zzyyuse/mydockerfile/tomcat9
    [root@localhost mydocker]#vim dockerFile
    FROM         centos
    MAINTAINER    test<XXXXXXXX@qq.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
    [root@localhost mydocker]#docker build -t newtomacat9 . #如果dockerFile是在当前路径下,可以不需要-f 指定路径
    [root@localhost mydocker]#docker images  #查看newtomcat9是否安装成功
    # 运行镜像
    [root@localhost mydocker]#docker run -d -p 8090:8080 --name mynewtomcat9 -v /zzyyuse/mydockerfile/tomcat9/webapps/:/usr/local/apache-tomcat-9.0.8/webapps/ -v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs/  --privileged=true newtomcat9
    # 运行新创建的镜像newtomcat9,并挂载两个容器卷,一个用于发布项目,一个用于查看日志
    
    # 自行写一个简单的html文件,添加到webapps下,通过:localhost:8090/xxx.html访问
    # 以及查看日志文件
    
    

六、镜像提交到阿里仓库

  1. https://cr.console.aliyun.com/cn-hangzhou/instances 注册账号后进入

  2. 实例列表 -》 点击个人版 -》创建镜像仓库 -》点击创建号的镜仓库详情 -》基本信息 -》操作指南

  3. 复制将镜像推送到Registry的命令,并执行

    $ sudo docker login --username=自己用户名字 registry.cn-hangzhou.aliyuncs.com  #需要数据密码
    $ sudo docker tag [镜像的ID] registry.cn-hangzhou.aliyuncs.com/XXXX/mycentos:[镜像版本号]
    $ sudo docker push registry.cn-hangzhou.aliyuncs.com/XXXX/mycentos:[镜像版本号]
    
  4. 查看镜像版本是否推送成功

七、docker安装镜像

  1. docker安装mysql

    [root@localhost ~]# docker pull mysql:5.7
    # 运行mysql
    [root@localhost ~]# docker run -p 3306:3306 --name mysql -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/logs:/logs -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=980621 -d mysql:5.7
    #导出所有的数据库到目录/home/mysql/下
    [root@localhost ~]# docker exec 2031bedcba56 sh -c 'exec mysqldump --all-databases -uroot -p"980621"' >/home/mysql/all-databses.sql  
    
  2. docker安装redis

    [root@localhost ~]# docker serarch redis
    [root@localhost ~]# docker serarch redis:3.2
    [root@localhost ~]# docker run -p 6379:6379 -v /home/redis/data:/data -v /home/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf  -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
    #  连接redis,并进行操作
    [root@localhost redis]# docker exec -it 9de95ef6e1fc redis-cli
    127.0.0.1:6379> set faf "dfdf"
    OK
    127.0.0.1:6379> get faf
    "dfdf"
    

版权声明:本文为weixin_42377288原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>