前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dockerfile快速使用和docker命令扩展

Dockerfile快速使用和docker命令扩展

作者头像
陌无崖
发布2019-08-28 11:16:54
9490
发布2019-08-28 11:16:54
举报

作者 | 陌无崖

转载请联系授权

什么是Dockerfile

dockerfile是一个使用特定格式且有特定命令组成的构建容器的文件。

准则

1、Dockerfile的命名具有唯一性,统一为Dockerfile,一般放在项目的根目录,方便构建成镜像文件。 2、Dockerfile中的内容为一系列特定的指令 3、Dockerfile中每一个指令都会创建一个镜像层。这些层是堆叠的,每一个层都是前一个层的增量。

指令详解

FROM

FROM用于指定基础的镜像,语法为FROM <image>:<tag>,tag表示版本,省略时默认是最新版本,如:

代码语言:javascript
复制
FROM Golang:1.12.3

LABEL

LABEL可以为镜像添加自定义的标签,一个镜像可以包括一个或多个标签。因为每一条指令都会创建一个可读的层,为了避免太多层,我们经常合并成一个指令,如,

代码语言:javascript
复制
LABEL com.example.version="0.0.1-beta" com.example.release-date="2015-02-12"

RUN

RUN指令允许我们书写shell命令或者exec命令,且RUN指令创建的镜像层会被缓存。

代码语言:javascript
复制
# 创建一个文件夹
RUN mkdir /app
# 安装nginx
RUN apt-get install -y curl nginx
# 当然我们也可以进行合并
RUN mkdir /app && apt-get install -y curl nginx

COPY

copy为复制文件,语法为COPY <源路径>... <目标路径>,如:

代码语言:javascript
复制
# 将当前目录复制到app路径下。" . "代表当前目录。
COPY . /app
# 将当前work目录复制到app路径下。
COPY ./work /app

除了上面的使用方法,我们也可以利用通配符匹配文件,然后再复制到相应的路径下:

代码语言:javascript
复制
COPY app-* /app

常用的通配符如下

代码语言:javascript
复制
'*'         匹配任意序列的非分隔符字符。
'?'         匹配任何一个非分隔符字符

ADD

ADD 和COPY类似,一般推荐使用COPY,ADD对tar的提取和远程URL的支持不友好,因此我们不推荐使用以下的命令

代码语言:javascript
复制
ADD http://example.com/big.tar.xz /usr/src/things/

我们应该尽可能的使用RUN指令,使用shell命令获取

代码语言:javascript
复制
RUN mkdir -p /usr/src/things \
    && curl -SL http://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all

CMD

CMD主要用于执行我们的镜像中的五年。格式为CMD ["executable", "param1", "param2"...]如:

代码语言:javascript
复制
指定server这个文件
CMD ["./server"]

EXPOSE

当需要暴露我们的端口时,可以使用这个命令。代表当前容器将要监听的端口

代码语言:javascript
复制
EXPOSE 8900

ENV

这个指令经常被使用到,我们可以用它声明我们的环境变量,使用如下

代码语言:javascript
复制
ENV GOPATH /root/go

当我们使用的时候就可以像再shell命令中那样简单使用

代码语言:javascript
复制
RUN go run $GOPATH/program/main.go

WORKDIR

WORKDIR用于在容器内设置一个工作目录:通过WORKDIR设置工作目录后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行。如,使用WORKDIR设置工作目录:

代码语言:javascript
复制
WORKDIR /app

USER

USER 用于指定运行镜像所使用的用户

Docker命令

获取镜像

代码语言:javascript
复制
docker pull [imagename]
docker pull [imagename]:1.0.1//指定版本

由于默认的拉取仓库为国外仓库,无法访问外国网站,因此无法拉取 解决方法 将镜像源换成阿里云镜像 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

重启docker

实例化镜像

实例化镜像即是运行一个镜像,即容器,容器为独立运行的一个或者一组应用以及他们所需要的运行环境 创建一个容器 docker create [选项] 镜像 运行的程序 -i 让容器的输入保持打开状态 -t 让docker分配一个伪终端 例如

代码语言:javascript
复制
docker create -it docker.io/mysql /bin/bash

端口映射

-P 默认随机映射一个端口 -p 自定义端口

代码语言:javascript
复制
docker run -d -P httpd
docker run -d -p 12345:80 httpd

容器互联

--link name:别名

代码语言:javascript
复制
# 创建一个源容器
docker run -d -P --name web1 httpd
# 创建接收容器
docker run -d -P --name web2 --link web1:web1 httpd
# 测试容器互联进入容器
docker exec -it web2 /bin/bash
# 安装 ping 命令
apt-get update && apt install iputils-ping
# 测试
ping web1

创建数据卷 `-v`

供容器使用的特殊目录,位于容器中,可以将宿主机的目录挂载到数据卷如:

代码语言:javascript
复制
# 创建名字为web的容器并且拥有两个数据卷目录
docker run -d -v /data1 -v /data2 --name web httpd:centos
# 创建一个名字为web-1的容器,并将主机的/var/www目录挂载到数据卷目录 /data1上
# 实现宿主机与容器之间数据的迁移
docker run -d -v /var/www:/data1 --name web-1 mysql:5.6

数据卷容器 `-volumes-from `

在容器之间共享一些数据 例如:

代码语言:javascript
复制
# 在web03容器中的data1目录中的数据会共享到web容器中的data1目录
docker run -it --volumes-from web --name web03 httpd:centos

关注我试试回复以下关键词

go 微服务 ppt

大数据 书籍 资料

END

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang技术杂文 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是Dockerfile
  • 准则
  • 指令详解
    • FROM
      • LABEL
        • RUN
          • COPY
          • ADD
          • CMD
            • EXPOSE
              • ENV
                • WORKDIR
                  • USER
                  • Docker命令
                    • 获取镜像
                      • 实例化镜像
                        • 端口映射
                          • 容器互联
                            • 创建数据卷 `-v`
                              • 数据卷容器 `-volumes-from `
                              相关产品与服务
                              容器服务
                              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档