Docker知识手册

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)

    


 

    

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • docker基本概念 1. Image Definition 镜像 Image 就是一堆只读层 read-only...
    慢清尘阅读 8,744评论 1 21
  • 在前面两节我们学习了如何安装以及简单的运行管理docker容器,在本节我们将会更多的探讨关于docker镜像的知识...
    井底蛙蛙呱呱呱阅读 4,093评论 0 5
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,748评论 0 7
  • 0x01 核心概念 Docker镜像类似于虚拟机镜像,可以理解为一个面向Docker引擎的只读模板,包含了文件系统...
    闲云逸心阅读 4,714评论 0 9
  • 滴水之恩,当涌泉相报! 客随主便,却反客为主! 友滴答滴答me,爱哗啦哗啦you!
    魔都一诺阅读 85评论 0 0