Docker学习(第三章)

Build from Dockerfile

$ more Dockerfile
FROM ununtu:14.04   // 选择基础的image
LABEL maintainer="Peng Xiao <xiaoquwl@gmail.com>"  // 基本的标识
RUN apt-get update && apt-get install -y redis-server
EXPOSE 6379   // 暴露的端口
ENTRYPOINT ["/usr/bin/redis-server"]  // 程序的入口
docker build -t xiaopeng163/redis:latest   // -t 是image的名字
image1.png
image2.png

比如:

docker pull ubuntu:14.04

构建自己的docker镜像

FROM centos   // base image
RUN yum install -y vim   // 安装vim

sudo docker build -t haitaoc/centos-vim-new . // . 表示基于当前目录的Dockerfile来build新的image

生成一个临时的docker container来安装vim,安装完之后会删除临时container

Dockerfile 语法梳理及最佳实践

FROM scratch   # 制作 base image
FROM centos   #  使用base image
FROM ubuntu:14.04

FROM: 尽量使用官方的base image

LABEL maintainer = "xiaoquwl@gmail.com"
LABEL version="1.0"
LABEL description = "This is description"

LABEL: 定义了image的metadata, 不可少

RUN yum update && yum install -y vim \
        python-dev    # 反斜线换行
RUN apt-get update && apt-get install -y perl \
       pwgen --no-install-recommends %% rm -rf \
      /var/lib/apt/lists/*  #注意清理cache
RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'

RUN: 为了美观,复杂的RUN请用反斜线换行!避免无用分层,合并多条命令成一行

WORKDIR /root
WORKDIR /test   # 如果没有会自动创建test目录
WORKDIR demo
RUN pwd            # 输出结果应该是/test/demo

WORDIR: 用WORKDIR, 不要用RUN cd! 尽量使用绝对目录!

ADD hello /    # 把当前目录里的可执行文件hello, 添加到了根目录里去
ADD test.tar.gz / # 添加到根目录并解压

WORKDIR /root
ADD hello test/   # /root/test/hello

WORKDIR /root 
COPY hello test/

ADD or COPY: 大部分情况,COPY由于ADD! ADD除了COPY还有额外功能(解压)!添加远程文件/目录请使用curl或者wget!

ENV MYSQL_VERSION 5.6  # 设置常量
RUN apt-get install -y mysql-server = "${MYSQL_VERSION}" \ 
        && rm -rf /var/lib/apt/lists/* # 引用常量

ENV: 尽量使用ENV增加可维护性

RUN vs CMD vs ENTRYPOINT

RUN : 执行命令并创建新的Image Layer
CMD : 设置容器启动后默认执行的命令和参数
ENTRYPOINT :设置容器启动时运行的命令

Shell 格式和Exec格式

  • Shell格式
RUN apt-get install -y vim 
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"
  • Exec 格式
RUN ["apt-get","install","-y","vim"]
CMD ["/bin/echo","hello docker"]
ENTRYPOINT ["/bin/echo","hello docker"]
  • Dockerfile 1
FROM cenos
ENV name Docker
ENTRYPOINT echo "hello $name"   # hello Docker
  • Dockerfile 2
FROM cenos
ENV name Docker
ENTRYPOINT ["/bin/echo", "hello $name"]  # hello $name, 并不会把$name替换成ENV里的常量

可改为 ENTRYPOINT ["/bin/bash","-c","echo hello $name"] # hello Docker

CMD

  • 容器启动时默认执行的命令
  • 如果docker run 指定了其他命令,CMD命令被忽略
  • 如果定义了多个CMD,只有最后一个会执行
FROM centos
ENV name Docker
CMD echo "hello $name"

ENTRYPOINT

  • 让容器以应用程序或者服务的形式运行
  • 不会被忽略,一定会执行
  • 最佳实践:写一个shell脚本作为entry point
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 27017
CMD["mongod"]

docker rmi [IMAGE ID]: 删除对应ID的image
sudo docker rm $(sudo docker ps -qa): 删除所有已退出的container

Dockerfile最佳实践

安装一个flask的web应用

  1. 从一个装有python 2.7的base image 开始
FROM python:2.7 
LABEL maintainer="haitaoc"
RUN pip install flask
COPY app.py /app/    # 将app.py拷贝到/app文件夹目录下!
WORKDIR /app
EXPOSE 5000       # 暴露端口
CMD ["python","app.py"]

sudo docker build -t haitaoc/flask-hello-world .
docker run -d haitaoc/flask-hello-world // 启动container

启动之后发现在centos中执行curl 127.0.0.1:5000访问不了,但是进入容器中,通过交互式的命令时可以访问的,因为docker和本地网络不同,可以通过--net="host"解决
启动容器时的命令改为sudo docker run -d --net="host" -p 127.0.0.1:5000:5000 --name=demo haitaoc/flask-hello-world即可

小问题:

  1. centos7中build时出现ipv fordwarding disabled 告警,解决方案:
    https://blog.csdn.net/yelllowcong/article/details/78295600
  2. flask 下载时报错,因为DNS没有配置好,配置DNS步骤如下:
修改/etc/resolv.conf,
找到nameserver项修改成下面的,没有的话添加下面的
nameserver 8.8.8.8
nameserver 8.8.4.4
  1. vmware中centos网络配置,选择NAT模式,在centos中
cd /etc/sysconfig/network-scripts
sudo vim ifcfg-ens33
将 ONBOOT=no 改为ONBOOT=yes
#重启服务,让配置生效
systemctl restart network

容器的操作

  • 进入到容器中进行交互式操作
    docker exec -it CONTAINERID /bin/bash
  • 指定名字
    sudo docker run -d --name=demo haitaoc/flask-hello-world
  • 查看所有运行过的容器
    sudo docker ps -a
  • 删除所有已经退出的容器
    sudo docker rm $(sudo docker ps -qa)
  • 启动一个容器
    sudo docker start demo
  • 停止一个容器
    sudo docker stop demo
  • 查看容器
    sudo docker inspect CONTAINERID
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容