美文网首页
Docker知识手册

Docker知识手册

作者: 渡边Hok | 来源:发表于2020-04-05 19:26 被阅读0次

    Docker

    docker文件系统层

    容器


    启动docker:docker start

    查看docker运行状态:docker stats    //查看CPU,IO,PID等信息

    停止docker:docker stop


    创建容器:docker run -it -d 镜像名 -c "echo hello word"

    -i:保证容器中STDIN开启

    -t:为创建的容器创造一个伪tty终端,这样可以提供一个交互式Shell

    --name:为容器命名,未指定由docker自行创建

    -d:以后台方式运行

    -c:启动后在容器中运行命令 

    -p:控制容器在运行时公开哪些端口给宿主机,如-p 8080:80将容器的80端口绑定到宿主机的8080端口

    -P:该命令会将容器的80端口对本地宿主机公开,并绑定到宿主机的一个随机端口,用该命令会将Dockerfile的EXPOSE指令的其他端口也一起公开

    -w:运行时覆盖工作目录

    -e:运行时环境变量,只会在运行时有效

    -u:指定容器以哪个用户身份运行

    -h:设置容器主机名,默认将容器主机名设置为容器ID。

    -v:将宿主机的目录作为卷,挂载到容器里。当提交或创建镜像时,卷不被包含在镜像里。

    --link:连接其他容器。该标志需要两个参数,一个是连接的容器名字,另一个是别名。如redis:db

    --privileged:启动docker的特权模式,这种模式允许我们以其宿主机具有的所有能力来运行容器,包括一些内核特性和设备的访问。

    --volumes-from:复用其他容器挂载的卷

    --rm:该标志会在进程运行完后自动删除容器


    查看容器内部日志:docker logs -t  --tail 0 -f 容器名/容器ID

    -t:加入时间戳

    ---tail 0 -f :跟踪最新日志而不去读取整个日志文件


    重新启动已经停止的容器:docker start 容器名/容器ID

    启动后进入容器:docker attach 容器名/容器ID

    停止容器:docker stop 容器名/容器ID

    自动重启容器:docker run --restart=always 容器名/容器ID

        always:无论容器退出代码是什么都自动重启该容器

        on-failure:当容器退出代码为非0值时才会自动重启

        on-failure:5:设置自动重启次数


    查看容器内的进程:docker top 容器名/容器ID

    查看容器详细信息:docker inspect 容器名/容器ID //可查看名次,命令,网络配置等


    在容器中运行后台任务:docker exec -d 容器名/容器ID touch /home/new_file

    进入容器内部运行交互命令:docker exec -it 容器名/容器ID /bin/bash


    删除容器:docker rm 容器名/容器ID

    一次性删除所有容器:docker rm $(docker ps -aq ) //-a (ALL) 查看所有容器,-q只返回ID

    镜像


    列出所有镜像:docker images    

    拉取镜像:docker run 命令启动一个容器时,Docker会先从docker hub上下载,如果没有指定标签,则自动下载latest标签的镜像。

    拉取指定镜像:docker pull redis:3.0.0     //拉取带标签的镜像

    查找镜像:docker search 镜像名

        NAME:仓库名     DESCRIPTION:描述    STARS:受欢迎程度  OFFICIAL:是否官方        AUTOMATED:自动构建,表示这个镜像是由github自动构建流程创建的。


    Dockerfile构建容器镜像

    示例

        Dockerfile由一系列指令和参数组成,指令必须大写后面要跟一个参数,Dockerfile中的指令会按顺序从上到下执行,每条指令都会创建一个新的镜像层并对镜像层进行提交。 

    构建流程

            构建镜像指令:docker build -t="镜像名:镜像标签"  //构建镜像时会将之前的镜像进行缓存,如不需要构建时进行缓存可以使用--no-cache标识。

            查看镜像构建过程指令:docker history 容器ID    

            删除镜像:docker rmi 镜像名:镜像标签/镜像ID

            删除所有镜像:docker rmi $(docker images -aq)


        Dockerfile指令介绍:

        FROM:指定一个已经存在的镜像,后续指令都基于该镜像进行,这个镜像称为基础镜像。

        MAINTAINER:告诉docker镜像作者是谁以及邮箱地址等。

        RUN:RUN指令会在当前镜像中运行指定的命令,每条RUN指令都会创建一个新的镜像层,如果该指令执行成功,就会将该镜像层提交,执行后续指令。默认情况下RUN指令会在shell里使用命令包装器/bin/sh -c来执行,如果平台不支持shell可以使用exec指令。如下:

    exec格式的RUN指令

        CMD:容器启动时要运行的命令,类似于RUN,只是RUN是指定镜像被构建时运行的指令,CMD是容器启动时运行的命令。注意:Dockerfile只能有一条CMD命令,如设置多条也只会运行最后一条。另外docker run 命令可以覆盖CMD命令

        ENTRYPOINT:与CMD指令很类似,区别在于该命令会接收docker run所指定的所有参数,不容易在启动时被覆盖。如   EXTRYPOINT ["/usr/sbin/nginx"],执行docker run xxx -g "deamon off",这个参数会传递给ENTRYPOINT指定的命令,在这里命令为/usr/sbin/nginx -g "deamon of"。

        EXPOSE:告诉docker将会使用容器的哪些端口,出于安全原因,指定后也不会自动打开该端口,需要在docker run -p运行容器时指定需要打开哪些端口。

        ENV:设置环境变量。 新的环境变量可以在后续的任何RUN指令中使用

        WORKDIR:在容器内部设置一个工作目录,ENRRYPOINT,CMD或/指定的程序会在这个目录下执行。(可设置多个用来切换不同的工作目录)

    在其他指令中使用环境变量

        USER:基于该镜像启动的容器会以指定的用户身份运行,我们可以指定用户名,UID以及组或GID,甚至两者组合:USER user | USER user:group |USER uid |USER uid:gid...,可以在docker run -u选项覆盖该值,如果不指定USER默认以root运行。

        VOLUME:用来向基于镜像创建的容器添加卷,一个卷可以可以存在于一个或者多个容器内的指定的目录,并提供以下共享数据或者对数据进行持久化的功能

        1:卷可以在容器间共享和重用    

        2:对卷的修改是立即生效的

        3:对卷的修改不会对更新镜像产生影响

        4:卷会一直存在直到没有任何容器使用它

       例子:VOLUME ["/opt/project",'/data'],这条指令会为基于该镜像创建的任何容器创建指定的两个挂载点

        ADD:将构建环境下的文件或目录复制到镜像中,不能对构建上下文外的文件进行ADD操作,另外也可以使用URL作为文件源,另外如果文件以gzip,bzip2,xz结尾,Docker还会进行自动解压

        例子:ADD latest.tar.gz /var/www/wordpress,将归档文件解压到/var/www/wordpress目录下,如果目的位置下已经存在同名文件或目录,那么目的位置的文件或目录不会被覆盖,如果目的位置不存在的话docker会自动创建,包括路径中的任何目录,文件模式为0755,并且UID和GID都是0。

        COPY:类似于ADD,不同的是只复制,不做提取和解压

        ONBUILD:为镜像添加触发器,当镜像被其他镜像作为基础镜像时,该触发器将会被执行。触发器是紧跟在FROM后指定的,触发器可以是任何构建指令。

        例子:ONBUILD ADD . /app/src     

                    ONBUILD RUN cd /app/src && make   

        可以通过docker inspect 查看镜像中的ONBUILD指令,注意:FROM,MAINTAINER和ONBUILD本身不能再ONBUILD指令中使用。


    Docker Registry

        有时我们可能希望构建和存储包含不想被公开的信息或数据镜像。可以有以下两个选择:

        1利用Docker Hub上的私有仓库

        2防火墙后面运行自己的Registry

    从容器中运行Registry

        docker run -p 5000:5000 registry

    将自己的镜像打标签

        docker tag 镜像ID 主机名:5000/仓库名/镜像名 

    将镜像推送至新Registry

        docker push 主机名:5000/仓库名/镜像名

     注意:   可能会出现无法push镜像到私有仓库的问题。提示

    这是因为我们启动的registry服务不是安全可信赖的。这时需要修改客户端docker的配置文件/etc/docker/daemon.json,添加下面的内容(registry服务地址)

    {"registry-mirrors": [ "https://pee6w651.mirror.aliyuncs.com"],"insecure-registries": ["主机名:5000"]},修改好之后需要重启Docker服务才能生效,执行命令:systemctl restart docker ,再push即可。


    Docker构建静态网站步骤

    1 创建一个目录用于存放Dockerfile文件,创建一个子目录放置静态资源文件。

    2.编写nginx配置文件(一个nginx.conf,一个global.conf)    

    global.conf nginx.conf

    在nginx.conf配置文件里,deamon off选项阻止Nginx进入后台,强制在前台运行。这是因为想要保证docker容器的活跃状态,需要其中的进程不能中断,默认情况下,nginx会以守护进程方式启动,这会导致容器只是短暂执行,在守护进程被fork启动后,发起守护进程的原始进程就会退出,这时容器就停止运行了。

    3.编写Dockerfile

    Dockerfile

    Dockerfile内容包括以下几项:1.安装nginx    2.在容器创建/var/www/html用于放置静态资源文件    

                                                     3.将nginx配置文件添加到镜像中    4.公开镜像的80端口

    4.执行docker build -t 镜像名 .  

    5.使用镜像构建容器docker run -d -p 8080:80 --name 容器名 -v 宿主机资源目录:容器目录 镜像名


     docker内部网络

        在安装Docker时,会创建一个新的网络接口,名字是docker0。每个docker容器都会在这个接口上分配一个ip地址。

    docker0网络接口

    docker0接口的范围是172.16~172.30。接口本身的地址172.17.42.1是这个docker网络的网关地址,也是所有容器的网关地址。docker默认会使用172.17.x.x作为子网地址,除非有人占用了这个子网,如果有人占用了这个子网,docker将会在172.16~172.30这个范围内尝试创建子网。

    容器内部的eth0接口

        docker每创建一个容器就会创建一组互联的网络接口。这组接口就像管道的两端。这组接口其中一端作为容器的eth0接口,而另一端统一命名为类似vethec6a这种名字,作为宿主机的一个端口,可以认为veth接口是虚拟网线的一端,这个虚拟网线一端插在名为docker0的网桥上,另一端插到容器里,通过把每个veth*接口绑定到docker网桥,docker创建了一个虚拟子网,这个子网由宿主机和所有docker容器共享。

        可以看到,Docker给容器分配了IP地址172.17.0.29作为宿主虚拟接口的另一端,这样就能让宿主网络和容器相互通讯了。

    查看容器的ip地址

        在拿到容器的ip地址后,可以不用映射到宿主机,直接使用该ip地址就可以连接到容器了。

        注意:docker默认会把公开的端口绑定到所有的网络接口上。因此,也可以通过localhost或者127.0.0.1来访问容器

        这个互联方案存在两个问题。第一:要在应用程序里对容器的ip地址做硬编码。第二:重启容器时docker会改变容器的ip地址。为解决这个问题,docker提供了连接(Link)功能,这个功能可以把一个或者多个容器连接起来,让其相互通信。


    docker容器互连

    连接redis容器

        docker run 的--link标志创建了两个容器间的父子连接。该标志需要两个参数,一个是要连接容器的名字,一个是连接后容器的别名。别名让我们可以访问公开信息,无需关注底层容器的名字,连接让父容器有能力访问子容器,并把子容器的一些连接细节分享给父容器。采用连接方式容器可以不暴露端口,减少应用暴露的网络,提高安全性。

        注意:被相连的容器必须运行在同一个docker宿主机上,不同宿主机上运行的容器无法连接。

        最后,让容器启动时加载shell,而不是服务守护进程,这样可以查看容器是如何连接在一起的。docker在父容器里的以下两个地方写入了连接信息:

        1:/etc/hosts文件中 (cat /etc/hosts)        2:包含连接信息的环境变量中(env)

        


     

        

    相关文章

      网友评论

          本文标题:Docker知识手册

          本文链接:https://www.haomeiwen.com/subject/ljoephtx.html