Docker常用管理命令以及DockerFile撰写

Docker镜像搜索:

简介:
    当我们下载一个镜像的时候可以提前搜索一下,查看哪个好用,然后下载哪个
语法:
    docker search CONTAINERNAME
例子:
    docker search centos             #搜索名为centos的镜像源,排在第一的一般都是下载量最高的

Docker镜像下载:

简介:
    所有的Docker镜像都储存在Docker Hub上,因为我们配置了阿里云加速,所以最终是在阿里云上下载的,下载的镜像默认为星级最高的
语法:
    docker pull CONTAINERNAME
例子:
    docker pull centos                #下载名为centos的镜像源
    docker pull tomcat                #下载名位tomcat的镜像源
    docker pull hello-world           #下载名为hello-world的镜像源

Docker镜像查看:

简介:
    当我们下载了镜像到本地时,使用此命令查看
命令:
    docker images
    docker image ls

Docker容器的启动以及停止:

简介:
    灵活控制容器的运行状态
语法:
    docker [OPTIONS] CONTAINERNAME
        start: 启动一个状态为终止的容器
        stop: 停止一个状态为运行中的容器
        restart: 重启一个状态为终止或运行中的容器
        kill: 直接将一个状态为运行的容器杀死

Docker启动容器:

docker run OPTIONS说明(常用): 有些是一个-,有些是两个-
        --name="容器名称" :当启动一个新的容器时,如果不指定名称的话会随机分配一个名称
        -d: 后台运行容器,并返回容器ID,也即启动守护式容器
        -i: 以交互模式运行容器,通常与"-t"结合使用
        -t: 分配给容器一个伪终端,通常与"-i"结合使用
        -P: 随机端口映射
        -p: 指定端口映射,有以下四种格式
            ip:HostPort:containerPort
            ip::containerPort
            HostPort:containerPort
            containerPort
例子:
    docker run -it --name mytomcat -p 8888:8080 tomcat

Docker进入容器:

docker exec [OPTIONS]说明(常用):
    简介:
        exec 是在容器中开启一个新的终端
    语法:
        docker exec [OPTIONS] containername COMMAND
            -i: 以交互模式运行容器,通常与"-t"结合使用
            -t: 分配给容器一个伪终端,通常与"-i"结合使用
    例子:
        docker exec -it --name mycentos centos /bin/bash
        docker exec mycentos ls -l /tmp      #查看容器中/tmp目录下有哪些文件

docker attach containername
    简介:
        attach 是返回上次在容器中的目录位置或操作
    例子:
        docker attach mycentos                #进入到名为mycentos的容器中,并且处于的位置是在上次退出的位置

Docker退出容器:

简介:
    当你已经进入到容器内后,想要退出的话有两种方法,一种是临时退出,一种是终止容器并退出
        exit            #终止容器并且退出
        CTRL+P+Q        #临时退出容器,不会影响容器的正常工作

Docker查看容器日志:

简介:
    当容器突然宕机,或者怀疑容器被人搞得时候,可以使用此命令进行查看
语法:
    docker logs [OPTIONS] CONTAINERNAME
        -t: 查看容器中每一条日志的时间
        -f: 实时跟踪容器中的日志,如果容器中运行了类似tomcat这类应用,此选项比较好用

Docker查看当前运行的容器:

    简介:
        在运维过程中,我们难免要查看当前运行的容器有哪些,了解后才得以管理
    语法:
        docker [OPTIONS] CONTAINERNAME
            ps: 查看当前系统上状态为start的容器
                -a: 查看当前系统上所有容器,忽略状态
                -q: 仅查看当前系统上状态为start的容器的CONTAINER ID
                -qa: 查看当前系统上所有容器的CONTAINER ID
    查看容器的详细信息:
        docker inspect CONTAINERNAME
    例子:
        docker inspect mytomcat

Dokcer删除容器或镜像:

    简介: 
        当有不用的容器或镜像时,不想让它们占用一点点磁盘空间确保没用的话就可以删除了
    语法:
        删除单个容器或镜像
            docker [OPTIONS] CONTAINERNAME
                rm: 删除一个容器,前提是此容器状态为停止
                    -f: 强制删除容器,不管容器是否在运行
                rmi: 删除一个镜像
        删除多个容器或镜像
            docker [OPTIONS] CONTAINERNAME....
        删除所有的容器或镜像
            docker [OPTIONS] $(docker ps -qa)

Docker不进入容器管理:

docker cp CONTAINERNAME:容器内数据的绝对路径 本地的绝对路径   #将容器中某个文件或目录拷贝到本地
docker top CONTAINERNAME                                #查看容器中当前运行的进程

生成新的Docker镜像:

简介:
    当拉取的镜像自己做了一系列修改了并想重新生成一个镜像的时候使用此命令,新生成的镜像使用docker images可以查到
语法:
    docker commit [OPTIONS] CONTAINERNAME NEW_CONTAINERNAME:TAG
        -a: 添加发布者名称
        -m: 添加新发布镜像的描述
例子:
    docker commit -a "K-free" -m "del tomcat doc" mytomcat k-free/mytomcat:1.01

Docker容器数据卷:

简介:
    当我们想保存容器中产生的数据时,需要用此项技术,如果没有指定数据卷,那么我们停止docker容器的时候,产生的数据也会随之消失,为实现持久化,而用此技能
命令:
    docker run -it -v /宿主机绝对路径:/容器中绝对路径 CONTAINERNAME
权限:
    docker run -it -v /宿主机绝对路径:/容器中绝对路径:ro CONTAINERNAME
Note:
    成功关联后,在容器上或在宿主机上指定的路径下创建或删除文件的话,另一方都会同步,就算容器停止了,数据还是会同步
例子:
    (1) docker run -it -v /mydata:/containerdata  mytomcat      #当-v后指定的目录不存时,docker会自动创建指定的目录
        "Mounts": [                                             #使用docker inspect可以查看到以下信息,与下方信息对比不同就能发现
        {
            "Type": "bind",
            "Source": "/app/data",
            "Destination": "/containerdata",
            "Mode": "",
            "RW": true,
            "Propagation": "rprivate"
        }
    ],
    (2) docker run -it -v /mydata2:/containerdata2:ro mytomcat  #容器内的containerdata2目录只读不可写
        "Mounts": [                                             #使用docker inspect可以查看到以下信息
        {
            "Type": "bind",
            "Source": "/app/data",
            "Destination": "/containerdata",
            "Mode": "ro",
            "RW": false,
            "Propagation": "rprivate"
        }
    ],
DockerFile添加数据卷:
    例子:
        [root@bogon ~]# mkdir /app/mydocker -pv
        [root@bogon ~]# vim /app/mydocker/Dockerfile
            #volume test
            FROM centos
            VOLUME ["/datavolumecontainer1","/datavolumecontainer2"]
            CMD echo "finshed......successd!"
            CMPD /bin/bash
        [root@bogon ~]# docker build -f /app/mydocker/Dockerfile -t k-free/centos
        [root@bogon ~]# docker images
            k-free/centos       latest              5c5f9d0ebb21        10 minutes ago      200MB
        [root@bogon ~]# docker run -it --name mycentos4 k-free/centos
        [root@bogon ~]# docker inspect mycentos4
            "Mounts": [
        {
            "Type": "volume",
            "Name": "87135b8713b59e8b2efca56ed1bb95bf91a6587445fae11d831862ac491edb46",
            "Source": "/var/lib/docker/volumes/87135b8713b59e8b2efca56ed1bb95bf91a6587445fae11d831862ac491edb46/_data",
            "Destination": "/datavolumecontainer2",
            "Driver": "local",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        },
        {
            "Type": "volume",
            "Name": "ce9a7171c56e646d053576ac219318f202d41f4145d478f6405380cdca224dee",
            "Source": "/var/lib/docker/volumes/ce9a7171c56e646d053576ac219318f202d41f4145d478f6405380cdca224dee/_data",
            "Destination": "/datavolumecontainer1",
            "Driver": "local",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        }
    ],
Note: 由于Dockerfile文件中没有指定宿主机目录,所以docker就会自动挂载到一个地方
容器间传递共享:
    简介:
        其他容器继承父容器
    例子:
        (1) docker run -it --name dc01 k-free/centos
            # touch dc01.txt /datavolumecontainer2
            ctrl+p+q
        (2) docker run -it --name dc02 --volumes-from dc01 k-free/centos
            # touch dc02.txt /datavolumecontainer2
            ctrl+p+q
        (3) docker run -it --name dc03 --volumes-from dc01 k-free/centos
            # touch dc03.txt /datavolumecontainer2
            ctrl+p+q
    Note:
        当上述操作全部完成后,分别进入各个容器内都会查到之前创建的文件,即使dc01被删除了,不会影响dc02和dc03的数据;

DockerFile解析:

简介:
    构建三步骤:
        (1) vim dockerfile
        (2) docker build
        (3) docker run
实际就是Docker镜像的构建文件

Dockerfile体系结构:
    FROM: 基础镜像,当前新镜像是基于哪个镜像的
    MAINTAINER: 镜像维护者的姓名和邮箱地址
    RUN: 容器构建时需要运行的命令
    EXPOSE: 指定该镜像启动后服务的端口号
    WORKDIR: 指定在创建容器后,登录到容器内的落脚点
    ENV: 用来在构建镜像过程中设置环境变量
    ADD: 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
    COPY: 类似ADD,拷贝文件和目录到镜像中
          将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
    VOLUME: 容器数据卷,用于数据保存和持久化工作
    CMD: 指定一个容器启动时要运行的命令
         Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
    ENTRYPOINT: 指定一个容器启动时要运行的命令
                ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
    ONBUILD: 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

Dokcerfile案例:
    [root@bogon ~]# vim /app/mydocker/Dockerfile2
        FROM centos
        MAINTAINER k-free<admin@example>
        EXP MYPATH /tmp
        WORKDIR $MYPATH
        RUN yum -y install vim && yum -y install net-tools
        EXPOSE 80
        CMD echo $MYPATH
        CMD echo "success------ok!"
        CMD /bin/bash
    [root@bogon ~]# docker build -f /app/mydocker/Dockerfile2 -t k-free/centos:1.02 .
    [root@bogon ~]# docker images
        k-free/centos       1.02                b5db8a389530        14 seconds ago      349MB
    [root@bogon ~]# docker run -it --name mycentos5 k-free/centos:1.02       #会发现进入此容器后位置在/tmp下,因为WORKDIR指定的是/tmp

CMD/ENTRYPOINT镜像案例:
    CMD: 无论前面写了多少CMD的定义,生效的却只有最后一条
    ENTRYPOINT: docker run之后的参数会被当做参数传递给ENTRYPOINT,之后形成新的命令组合
CMD例子:
    [root@bogon ~]# vim /app/mydocker/Dockerfile3
        FROM centos
        MAINTAINER k-free<admin@example>
        RUN yum -y install curl
        CMD ["curl","-s","http://ip.cn"]
    [root@bogon ~]# docker build -f /app/mydocker/Dockerfile3 -t myip .
    [root@bogon ~]# docker run myip

Note:
    执行上面一系列命令后,会查看到当前所使用的公网IP,但如果还想查到访问网站返回的状态码就要加上"-i"选项,但此时加上"-i"就等CMD -i是没有结果的,为什么?请看上方CMD的概念
如果我又想查看到当前使用的公网IP又想查看网站返回状态码就要使用ENTRYPOINT,如下

ENTRYPOINT例子:
    [root@bogon ~]# vim /app/mydocker/Dockerfile4
        FROM centos
        MAINTAINER k-free<admin@example>
        RUN yum -y install curl
        ENTRYPOINT ["curl","-s","http://ip.cn"]
    [root@bogon ~]# docker build -f /app/mydocker/Dockerfile4 -t myip_2 .
    [root@bogon ~]# docker run myip_2 -i        #这样就可以实现要求功能

ONBUILD例子:
    [root@bogon ~]# vim /app/mydocker/Dockefile4
        FROM centos
        MAINTAINER k-free<admin@example>
        RUN yum -y install curl
        ENTRYPOINT ["curl","-s","http://ip.cn"]
        ONBUILD RUN echo "father images onbuild....886"
    [root@bogon ~]# docker build -f /app/mydocker/Dockefile4 -t myip_father .
    [root@bogon ~]# vim /app/mydocker/Dockefile5
        FROM myip_father
        MAINTAINER k-free<admin@example>
        RUN yum -y install curl
        CMD ["curl","-s","http://ip.cn"]
    [root@bogon ~]# docker build -f /app/mydocker/Dockefile5 -t myip_son .
        Sending build context to Docker daemon  6.144kB
        Step 1/3 : FROM myip_father
        # Executing 1 build trigger                                #注意看此处显示执行了一个触发器
         ---> Running in b347fe91bce3
        father images onbuild------886                             #在Dockerfile4中定义的如果有人引用我,那么就显示此行信息
        Removing intermediate container b347fe91bce3
         ---> 7b88a08cc5f4
        Step 2/3 : RUN yum -y install curl
         ---> Running in fe9bb809fa37
        Loaded plugins: fastestmirror, ovl
        Loading mirror speeds from cached hostfile
         base: mirrors.aliyun.com
         extras: mirrors.163.com
         updates: mirrors.huaweicloud.com
        Package curl-7.29.0-46.el7.x86_64 already installed and latest version
        Nothing to do
        Removing intermediate container fe9bb809fa37
         ---> f9c6f046aaac
        Step 3/3 : CMD ["curl","-s","http://ip.cn"]
         ---> Running in 1d304ec8914b
        Removing intermediate container 1d304ec8914b
         ---> d883121a3b8c
        Successfully built d883121a3b8c
        Successfully tagged myip_son:latest

自定义镜像Tomcat9:

(1) mkdir -p /app/mydocker/tomcat9
(2) touch c.txt
(3) 上传jdk以及tomcat9到/app/mydocker/tomcat9目录下
    [root@bogon ~]# mkdir /app/mydocker/tomcat9
    [root@bogon tomcat9]# touch c.txt
    [root@bogon tomcat9]# vim Dockerfile
        FROM centos
        MAINTAINER k-free<admin@example>
        COPY c.txt /usr/local/cincontainer.txt
        ADD jdk-8u181-linux-x64.tar.gz /usr/local/
        ADD apache-tomcat-9.0.11.tar.gz /usr/local/
        RUN yum -y install vim
        ENV MYPATH /usr/local/
        WORKDIR $MYPATH
        ENV JAVA_HOME=/usr/local/jdk1.8.0_181
        ENV CLASS_PATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
        ENV CATALINA_HOME=/usr/local/apache-tomcat-9.0.11
        ENV CATALINA_BASE=/usr/local/apache-tomcat-9.0.11
        ENV PATH=$JAVA_HOME/bin:$CATALINA_BASE/lib:$CATALINA_BASE/bin:$PATH
        EXPOSE 8080
        CMD /usr/local/apache-tomcat-9.0.11/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.11/logs/catalina.out
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值