Docker


参考:
https://www.cnblogs.com/reasonzzy/p/11127296.html

Docker 三大组件

  • Images(镜像):

    Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统

  • Containers(容器):

    镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

  • Repository(仓库):

    仓库可看成一个代码控制中心,用来保存镜像。

安装

通过whereis docker查看docker的安装目录

官网

  1. 按照官网步骤安装
    注意国内需要使用阿里云的docker镜像否则安装docker非常慢
    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    如果出现无法安装
    yum clean all && yum makecache

  2. 如果无法运行

    docker run hello-world
    

    配置镜像加速

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

    systemctl restart docker //重启
    systemctl start docker  //启动
    
  4. 验证

    docker run hello-world     
    
  5. 设置开机自启

    systemctl enable docker
    

镜像命令

https://www.runoob.com/docker/docker-tutorial.html

镜像下载位置

usr/local/docker

  • docker --help

  • docker -v
    显示版本

  • docker info
    查看docker 具体信息

  • docker images

    列出本地镜像

  • docker search [IMAGENAME]
    搜索dockerHub上的资源

  • docker pull [IMAGENAME]:[TAG]
    默认拉取最新的,如果需要指定版本,例如docker pull mysql:5.7

  • docker rmi (-f) [IMAGENAME]:[latest]
    删除镜像
    -f 强制删除
    使用docker rmi -f $(docker images -qa) 删除所有镜像,$()复合命令

容器命令

容器其实就是一个精简的linux系统

容器重启后不会保留数据,如需要保留数据使用容器卷

如果返回container id,表示操作成功

如果没用和容器交互docker会自动关闭容器,可以通过ctrl+p+q挂起当前容器

  • docker run [option] IMAGE:[TAG]
    运行容器
    -it :容器终端交互
    docker run -it centos /bin/bash (/bin/bash可以省略)
    -d :以守护线程的模式运行
    --name: 给运行的容器起一个别名
    -p:指定外部端口对应容器中的端口

    -v: 挂载容器卷

  • docker attach CONTAINERID
    进入容器内部, 如果以这种方式退出容器,容器就会自动关闭

  • docker exec -it CONTAINERID /bin/bash

    docker exec -it redis /bin/bash redis-cli容器运行成功后,容器运行redis-cli命令

    推荐使用

    进入容器内部,如果以这种方式退出容器,容器不会自动关闭

  • docker ps [option]
    查看正在运行的容器
    -a: 列出所有正在运行的和历史上运行过的
    -l: 显示最近运行的容器
    -n :显示最近n个运行过的容器
    -q :静默模式,只显示正在运行的容器编号

    docker ps CONTAINERID查看具体的容器

  • docker start CONTAINERID
    启动container

  • docker restart CONTAINERID
    重启container

  • docker stop CONTAINERID
    正常停止container

  • docker kill CONTAINERID
    强制停止container

  • docker rm [option] CONTAINERID
    删除停止运行的container
    -f :强制删除

    docker rm -f $(docker ps -q) 删除所有运行的container

    docker rm -f $(docker ps -qa) 删除所有container

  • docker logs [option] CONTAINERID
    查看docker日志
    -t :加入时间戳
    -f :跟随最新的日志打印,不停追加日志
    --tail: 显示最后多少条
    docker logs -tf --tail 3 1b69245f0f61 不停追加显示倒数三行日志

  • docker inspect CONTAINERID
    查看容器内部细节(json串显示)

    注意新版的镜像挂载点的映射在Mounts中

  • docker cp [OPTIONS] container:src_path dest_path
    docker cp [OPTIONS] dest_path container:src_path

    容器与宿主机之间文件拷贝

    将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
    docker cp /www/runoob 96f7f14e99ab:/www/
    
    将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
    docker cp /www/runoob 96f7f14e99ab:/www
    
    将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。
    docker cp  96f7f14e99ab:/www /tmp/
    
  • docker history CONTAINTERID

    查看镜像变更记录

自定义镜像commit

注意容器不能退出,否则容器会还原,需要使用ctrl+p+q挂起容器

  • docker commit -m"" -a"" CONTAINERID [name]:[version]
    提交修改过的docker image到本地仓库
    -m :消息message
    -a :作者author
    name: 自定义新容器的image名字
    version: 自定义新容器的version

运行自定义的镜像要指定版本

数据容器卷

数据卷

将容器中的指定文件挂载到宿主机

容器与宿主机数据共享,容器重启后,宿主机中的数据同样会与容器共享

docker run -it -v [HOST PATH]:[COTAINER PATH]  [CONTAINERID]
-v volume 创建数据容器卷
docker run -it -v /mydata:/data:ro [CONTAINERID]表示容器内的文件只允许read

通过docekr inspect CONTAINERID查看是否挂载

容器卷

docker run -it --volumes-form [parentcontainerid] --name [alis]

只要是同一个镜像创建的容器通过--volumes-form, 容器之间数据共享,类似于Maven的组合

只要容器没有关闭完,即使一个容器退出,并不影响容器间数据共享

DockFile

参考:

https://www.cnblogs.com/edisonchou/p/dockerfile_inside_introduction.html

在当前目录下创建一个名为Dockerfile的文件,并写入

#基于centos镜像
FROM centos

#维护人的信息
MAINTAINER The CentOS Project <303323496@qq.com>

#安装httpd软件包
RUN yum -y update
RUN yum -y install httpd

#开启80端口
EXPOSE 80

#复制网站首页文件至镜像中web站点下
ADD index.html /var/www/html/index.html

#复制该脚本至镜像中,并修改其权限
ADD run.sh /run.sh
RUN chmod 775 /run.sh

#当启动容器时执行的脚本文件
CMD ["/run.sh"]

通过Docker创建一个本地的镜像

docker build -t [IMAGENAME] PATH
-t 指定Dockfile生成镜像的名字
-f 默认Dockerfile
PATH Dockerfile所在位置

​ As Follow

docekr -t [tom:hiton] .

通过当前目录下名为Dockerfile的配置文件,创建一个名为tom,版本为hiton的镜像

Dockefile常用命令

  • FORM

    指明构建的新镜像是来自于哪个基础镜像,例如:

    FROM centos
    
  • LABEL

    LABEL maintainer指定镜像作者

    LABEL maintainer="edisonzhou.cn"
    
  • RUN

    构建镜像时容器中运行的Shell命令,例如

    RUN ["yum", "install", "httpd"]
    RUN yum install httpd
    

    又如,我们在使用微软官方ASP.NET Core Runtime镜像时往往会加上以下RUN命令,弥补无法在默认镜像下使用Drawing相关接口的缺憾:

    FROM microsoft/dotnet:2.2.1-aspnetcore-runtime
    #并列的RUN可以化简为&&
    RUN apt-get update
    	&& apt-get install -y libgdiplus
    	&& apt-get install -y libc6-dev
    	&& ln -s /usr/lib/libgdiplus.so /lib/x86_64-linux-gnu/libgdiplus.so
    
  • CMD

    启动容器时执行宿主机Shell命令,一般采用 CMD /bin/bash, 这样通过docker run 就不需要添加/bin/bash命令

    CMD ["-D", "/usr/sbin/sshd"] 
    CMD ["/usr/sbin/sshd", "-D"] 
    CMD /usr/sbin/sshd -D
    CMD ["curl","-s","http://ip.cn"]
    

    如果有多个CMD只会运行最后一个CMD,且会被命令行覆盖例如:

    FROM tomcat
    ...
    CMD ["catalina.sh","run"]
    --------
    $ docker run -it tomcat ls -l
    

    docker run命令行中的ls -l覆盖了Dockerfile中最后一个CMD命令

  • ENTRYPOINT

    启动容器时执行的Shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定指定的程序,例如:

    ENTRYPOINT ["/bin/bash", "-C", "/start.sh"]
    ENTRYPOINT /bin/bash -C '/start.sh'
    
    FROM centos
    RUM yum install -y curl
    ENTRYPOINT ["curl", "-s", "http://ip.cn"]
    --------
    $docker run -it tomcat -i #会将参数拼接 ["curl","-si","http://ip.cn"]
    

CMD和ENTYPOINT会在docker ps中显示

  • EXPOSE

    声明容器运行的服务端口,例如:

    EXPOSE 8080
    
  • ADD

    拷贝文件或目录到镜像中,例如:

    如果是URL或压缩包,会自动下载或自动解压。

    ADD <src>...<dest>
    ADD html.tar.gz /var/www/html
    ADD https://xxx.com/html.tar.gz /var/www/html
    
  • COPY

    拷贝文件或目录到镜像中,用法同ADD,只是不支持自动下载和解压,例如:

    COPY ./start.sh /start.sh
    
  • VOLUME

    指定容器挂载点到宿主机(自动生成的目录,通过docker inspect 查看)或其他容器,例如:

    VOLUME ["/var/lib/mysql"] #容器内的路径
    
  • ENV

    设置环境内环境变量,例如:

    在Dockerfile中可以使用定义变量

    ENV MYSQL_ROOT_PASSWORD 123456
    ENV JAVA_HOME /usr/local/jdk1.8.0_45
    ENV <key1>=<value1> <key2>=<value2>...
    WORKDIR $JAVA_HOME #$表示引用变量
    

    As Follow

    ENV NODE_VERSION 7.2.0
    #可以在引号内使用
    RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
      && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
    
  • WORKDIR

    为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录, 进入容器后的目录

    WORKDIR /data
    
  • ONBUILD

    用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

    格式:

    #father
    FROM tomcat
    ...
    ONBUILD echo "hello world" 
    $docker buidl -t father .
    -------
    #son 
    FROM father #使用父容器
    ...
    $docker build -t son #创建镜像时会触发父容器的ONBUILD
    
posted @ 2020-08-19 10:17  CyberPelican  阅读(224)  评论(0编辑  收藏  举报