Docker实战之入门以及Dockerfile

Docker实战之入门以及Dockerfile(一)

###第一讲

本期课程: Docker实战之入门以及Dockerfile

如果你还没用使用过 Docker,此课程带你走进 Docker 世界,了解docker的基础概念、常用操作
如果你曾经用过 Docker,通过此课程,让你学会构建出可以在生产环境中良好运行的 Docker image
学会使用Docker快速构建、创建研发环境
学会打包应用程序Application到image中,并支持快速部署
讲述3-4个实际应用中的例子(绝对的干货)


###第二讲

本期课程: Docker实战之Registry以及持续集成

上一讲<视频>我们知道了Docker的基础知识,以及学会了Dockerfile,第二讲将结合一个实际的Java应用,演示如何通过Docker以及Registry

实现自动化的镜像构建、自动部署以及持续集成测试。

通过本次课程,你将会学会:
1、如何通过Git仓库,自动生成Docker镜像
2、如何自动将多个容器部署起来
3、容器部署好后,如何利用Jenkins自动做集成测试



###第三讲

第三讲:Docker实战之监控报警以及日志管理

上一讲讲解了Docker和持续集成,主要面向开发以及测试人员。那么这一讲我们重点来看看生产环境里跑Docker最关心的话题:监控报警和日志管理。

本期内容将带你:
手把手教你如何搭建监控报警系统以及日志管理系统
运行一个应用,模拟业务并发访问,生成压力和日志
学习如何设置监控指标和报警策略
学习如何设置,来收集该应用生成的日志,并图表化展现

 

文章内容,由【Docker实训课程

第一讲视频翻译整理而成

培训代码 https://github.com/nicescale/docker-training

虚拟机镜像 http://market.aliyun.com/products/56014007/

一 首先Docker是软件工业上的集装箱技术

###回顾,在没有集装箱出现以前,传统运输行业中,会存在这些问题:

  • 在运输过程中,货物损坏
  • 装卸、运输货物,效率低下
  • 运输手续繁多及运输环节多
  • 劳动强度大,及船舶周转慢

###在集装箱出现后,完全改变了这种状况,是由于集装箱:

  • 规则标准化,大大减少了包装费用
  • 大大提升了货物装卸效率、及运输效率
  • 不同种运输工具之间转换更容易

###所以,集装箱出现是传统行业中的一次重大变革

###传统软件行业中存在的问题

  • 软件更新发布低效
  • 业务无法敏捷
  • 环境一致性,难于保证
  • 不同环境之间迁移成本太高
  • 软件开发商,交付实施周期长---成本高

###有了Docker,以上问题,有望或者说在很大程度上可以得到解决

二、Docker的组成

Docker是一个C/S架构

  • Docker Client: Docker的客户端
  • Docker Server: Docker daemon的主要组成部分,接收用户通过Docker Client发送的请求,并按照相应的路由规则实现路由分发
  • Docker Registry: Registry是Docker镜像的中央存储仓库(pull/push)

通过docker pull命令可以把Registry上的docker镜像,下载到服务器本地

通过docker push命令可以把服务器本地的docker镜像,上传到Registry上

Registry在构建自动化平台,起着非常重要的作用!

提示:Docker镜像运行之后会成为Docker容器----通过 docker run命令

####Docker容器启动速度非常快,体现在2个方面;

1.磁盘占用空间小,因为docker镜像采用了分层技术,构建的镜像大小,只有自身的大小,不包含父镜像的大小

2.内存消耗少,docker容器共享的宿主机的内核,没有操作的进程消耗

##Docker实战准备

  1. 首先登陆OSChina Git
  2. docker-training项目Fork到自己的仓库
  3. 使用自己熟悉的SSH工具连接到服务器
  4. 执行git clone https://git.oschina.net/*YOURNAME*/docker-training.git,将你的远程仓库clone到服务器

Git 使用指南

后续会构建4个docker镜像,分别为:

centos7 (基础镜像)

php-fpm mysql(中间件镜像)

worpdress(应用镜像)

####什么是Dockerfile? 

Dockerfile是自动构建docker镜像的配置文件,Dockerfile中的命令非常类似linux shell下的命令

Dockerfile,可以让用户自定义构建docker镜像,支持以 # 开头的注释行

一般,Dockerfile分为4部分

  • 基础镜像(父镜像)信息
  • 维护者信息
  • 镜像操作命令
  • 容器启动命令

####为何把Dockerfile存放到git仓库中,并为每个项目创建git仓库?

方便通过自动化平台,自动构建docker镜像

三、Dockerfile介绍

###基础镜像csphere/centos:7.1

#
# MAINTAINER        Carson,C.J.Zeong <zcy@nicescale.com>
# DOCKER-VERSION    1.6.2
#
# Dockerizing CentOS7: Dockerfile for building CentOS images
#
FROM       centos:centos7.1.1503
MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>

ENV TZ "Asia/Shanghai"
ENV TERM xterm

ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo
ADD aliyun-epel.repo /etc/yum.repos.d/epel.repo

RUN yum install -y curl wget tar bzip2 unzip vim-enhanced passwd sudo yum-utils hostname net-tools rsync man && \
    yum install -y gcc gcc-c++ git make automake cmake patch logrotate python-devel libpng-devel libjpeg-devel && \
    yum install -y --enablerepo=epel pwgen python-pip && \
    yum clean all

RUN pip install supervisor
ADD supervisord.conf /etc/supervisord.conf

RUN mkdir -p /etc/supervisor.conf.d && \
    mkdir -p /var/log/supervisor

EXPOSE 22

ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]

 

FROM centos:centos7.1.1503

基于父镜像构建其他docker镜像,父镜像:可以通过docker pull 命令获得,也可以自己制作

MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>

Dockerfile维护者

ENV TZ "Asia/Shanghai"

ENV(environment)设置环境变量,一个Dockerfile中可以写多个。以上例子是:设置docker容器的时区为Shanghai

######Dockerfile中有2条指令可以拷贝文件

ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo

拷贝本地文件到docker容器里,还可以拷贝URL链接地址下的文件,ADD还具有解压软件包的功能(支持gzip, bzip2 or xz)

COPY test /mydir

拷贝本地文件到docker容器

RUN yum install -y curl wget....

RUN命令,非常类似linux下的shell命令 (the command is run in a shell - /bin/sh -c - shell form)

在Dockerfile中每执行一条指令(ENV、ADD、RUN等命令),都会生成一个docker image layer

RUN pip install supervisor

supervisor进程管理系统,推荐使用

ADD supervisord.conf /etc/supervisord.conf

添加supervisor的主配置文件,到docker容器里

RUN mkdir -p /etc/supervisor.conf.d

创建存放启动其他服务"supervisor.conf"的目录,此目录下的所有以.conf结尾的文件,在启动docker容器的时候会被加载

EXPOSE 22

端口映射 EXPOSE <host_port>:<container_port>

推荐使用docker run -p <host_port>:<container_port> 来固化端口

ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]

一个Dockerfile中只有最后一条ENTRYPOINT生效,并且每次启动docker容器,都会执行ENTRYPOINT

######以上文件就是用来生成第一个docker镜像的Dockerfile,通过docker build指令来生成docker镜像

docker build -t csphere/centos:7.1 .

如果Dockerfile在当前目录下,输入点.就可以进行加载当前目录下的Dockerfile

如果不在当前目录下需要运行docker build -t csphere/centos:7.1 <Dockerfile_dir>加载相对路径下的Dockerfile

docker镜像的命名规则 registry_url/namespace/image_name:tag 默认taglatest

在构建Docker镜像时,如果有自己内部的yum源,替换成自己内部的yum源地址,可以加快构建速度。

如果第一次构建失败,会有部分镜像layer生成,第二次构建会基于第一次构建所生成的layer(use cache),继续构建

Step 10 : EXPOSE 22
 ---> Running in 0ed1c5479ebc
 ---> c57a5bac41c8
Removing intermediate container 0ed1c5479ebc
Step 11 : ENTRYPOINT /usr/bin/supervisord -n -c /etc/supervisord.conf
 ---> Running in e16c7ac2fd45
 ---> 185ef7b101a8
Removing intermediate container e16c7ac2fd45
Successfully built 185ef7b101a8

 

可以看到每执行一条Dockerfile的指令都会生成一个镜像的layerc57a5bac41c8 185ef7b101a8 

最后185ef7b101a8这个是docker镜像的ID,185ef7b101a8是由c57a5bac41c8 185ef7b101a8...layers叠加而成,体现了docker镜像是分层的

# docker images    查看当前主机本地有哪些docker镜像 
REPOSITORY                             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
csphere/centos                         7.1                 185ef7b101a8        40 minutes ago      451.9 MB

 

通过docker镜像生成一个docker容器

docker help run #查看docker run命令的使用方法

#####介绍日常工作中经常用到的参数:

docker run -it #启动docker容器在前端 docker run -d #启动docker容器在后台

docker run -p docker run -P

在Dockerfile中有一条指令是EXPOSE 22,如果使用-P,宿主机会随机选择一个没有被使用的端口和docker容器的22端口端口映射,如果docker主机或者容器重启后,宿主机又会随机选择一个没有被使用的端口和docker容器的22端口做端口映射,这样端口会发生变化

如果使用-p,比如2222:22,这样不管是docker主机或者容器重启后,2222:22端口都是这样来映射,不会发生改变

生成docker容器

docker run -d -p 2222:22 --name base csphere/centos:7.1

37ac69acf47d501ffc61d8883ae2ba362a132d11e46897212a92b1936e0a0593

 

参数说明:

  • -d 后台运行
  • -it 前台交互式运行
  • -P 22 将宿主机的一个未使用的随机端口映射到容器的22端口
  • -p 2222:22 将宿主机的2222端口映射到容器的22端口
  • --name base 给容器命名为base
  • csphere/centos:7.1 使用这个镜像镜像创建docker容器

查看Docker容器

docker ps

ps默认只会显示容器在“running”的状态的,容器列表

docker ps -a

ps -a 会查看到所有的容器列表

 

 

 

Docker实战之入门以及Dockerfile(二)

上一篇Docker实战之入门以及Dockerfile(一)

文章内容,由【Docker实训课程

第一讲视频翻译整理而成

培训代码 https://github.com/nicescale/docker-training

虚拟机镜像 http://market.aliyun.com/products/56014007/jxsc000181.html ##中间件镜像

培训代码 https://github.com/nicescale/docker-training

虚拟机镜像 http://market.aliyun.com/products/56014007/jxsc000181.html ##csphere/php-fpm:5.4

# cd docker-training/php-fpm/
# ls 
Dockerfile          nginx_nginx.conf  supervisor_nginx.conf
nginx_default.conf  php_www.conf      supervisor_php-fpm.conf

 

各文件解释:

nginx_nginx.conf 替换默认的nginx.conf文件

nginx_default.conf 替换默认的default.conf文件

php_www.conf 修改apache用户为nginx

supervisor_nginx.conf 添加启动nginx的supervisor文件

supervisor_php-fpm.conf 添加启动php-fpm的supervisor文件

# cat Dockerfile 
#
# MAINTAINER        Carson,C.J.Zeong <zcy@nicescale.com>
# DOCKER-VERSION    1.6.2
#
# Dockerizing php-fpm: Dockerfile for building php-fpm images
#
FROM       csphere/centos:7.1
MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>

# Set environment variable
ENV APP_DIR /app

RUN yum -y install nginx php-cli php-mysql php-pear php-ldap php-mbstring php-soap php-dom php-gd php-xmlrpc php-fpm php-mcrypt && \ 
    yum clean all

ADD nginx_nginx.conf /etc/nginx/nginx.conf
ADD nginx_default.conf /etc/nginx/conf.d/default.conf

ADD php_www.conf /etc/php-fpm.d/www.conf
RUN sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/php.ini

RUN mkdir -p /app && echo "<?php phpinfo(); ?>" > ${APP_DIR}/info.php

EXPOSE    80 443

ADD    supervisor_nginx.conf /etc/supervisor.conf.d/nginx.conf
ADD    supervisor_php-fpm.conf /etc/supervisor.conf.d/php-fpm.conf

ONBUILD ADD . /app
ONBUILD RUN chown -R nginx:nginx /app

 

命令解析:

ONBUILD ADD . /app

ONBUILD 在生成当前docker镜像的时候不生效,在子镜像生效;ONBUILD在产品发布时起着非常重要的作用!举例

A镜像中有ONBUILD指令,在构建A镜像时ONBUILD指令不执行;B镜像FROM A,在构建B镜像时ONBUILD指令开始执行;

如何给docker镜像命名:

  • registry-url: registry服务器的域名或者ip
  • namespace:
  • image-name: docker镜像的名字
  • tag: docker镜像的版本号,推荐使用应用服务的版本号来命名,如php-fpm:5.4

生成php-fpm镜像

docker build -t csphere/php-fpm:5.4 .

 

Step 12 : ONBUILD add . /app
 ---> Running in 9e21ede67350
 ---> 7541483a5a76
Removing intermediate container 9e21ede67350
Step 13 : ONBUILD run chown -R nginx:nginx /app
 ---> Running in ab55fc7a46a1
 ---> c61699e8c237
Removing intermediate container ab55fc7a46a1
Successfully built c61699e8c237

生成website容器:

docker run -d -p 8080:80 --name website csphere/php-fpm:5.4
da30b15d3518320f4150b20ef329e59432a65610968977277879578b5fd8f4f7

 

参数解释:

  • -d 后台运行
  • -p 8080:80 将宿主机的8080端口映射到容器的80端口
  • --name website 给容器命名为website
  • csphere/php-fpm:5.4 使用这个镜像镜像创建docker容器

使用浏览器访问:http://your_ip:8080/info.php

如何进入一个正在运行的docker容器?

docker exec -it website /bin/bash

# supervisorctl    查看当前容器中使用supervisor启动了哪些服务 
nginx                            RUNNING   pid 9, uptime 0:23:15
php-fpm                          RUNNING   pid 10, uptime 0:23:15

 

##csphere/mysql:5.5

cat Dockerfile 
#
# MAINTAINER        Carson,C.J.Zeong <zcy@nicescale.com>
# DOCKER-VERSION    1.6.2
#
# Dockerizing Mariadb: Dockerfile for building Mariadb images
#
FROM csphere/centos:7.1
MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>

ENV DATA_DIR /var/lib/mysql

# Install Mariadb
RUN yum install -y mariadb mariadb-server && \
    yum clean all

ADD mysqld_charset.cnf /etc/my.cnf.d/

COPY scripts /scripts
RUN chmod +x /scripts/start

EXPOSE 3306

VOLUME ["/var/lib/mysql"]

ENTRYPOINT ["/scripts/start"]

 

命令解析:

VOLUME ["/var/lib/mysql"]

VOLUME指令,宿主机文件目录和docker容器文件目录做映射

ENTRYPOINT ["/scripts/start"]

ENTRYPOINT在每次启动docker容器时都会被执行,此例,是运行了一个shell脚本"/scripts/start"

每次启动都会运行/scripts/start脚本,脚本内容如下:

# cat start 
#!/bin/bash

set -e

#
# When Startup Container script
#

if [[ -e /scripts/firstrun ]]; then
    # config mariadb
    /scripts/firstrun_maria
        rm /scripts/firstrun
else
    # Cleanup previous mariadb sockets
    if [[ -e ${DATA_DIR}/mysql.sock ]]; then
        rm -f ${DATA_DIR}/mysql.sock
    fi
fi

exec /usr/bin/mysqld_safe

 

脚本解析:

  • set -e 脚本中只要有一行有错误,就会中断脚本执行

  • 如果firstrun文件存在,执行firstrun_maria脚本,如果不存在,删除mysql.sock文件,并启动Mariadb

firstrun_maira脚本是初始化Mariadb,以及设置数据库用户和密码,详情内容请自行阅读脚本文件

#!/bin/bash

DB_USER=${DB_USER:-admin}
DB_PASS=${DB_PASS:-csphere2015}

MARIADB_NEW=true

#
#  MariaDB setup
#
firstrun_maria() {

    # First install mariadb
    if [[ ! -d ${DATA_DIR}/mysql ]]; then
        echo "===> MariaDB not install..."

        echo "===> Initializing maria database... "
           mysql_install_db --user=mysql --ldata=${DATA_DIR}
        echo "===> System databases initialized..."

           # Start mariadb
        /usr/bin/mysqld_safe --user mysql > /dev/null 2>&1 &

        echo "===> Waiting for MariaDB to start..."

        STA=1
        while [[ STA -ne 0 ]]; do
            printf "."
            sleep 5
            mysql -uroot -e "status" > /dev/null 2>&1
            STA=$?
        done
        echo "===> Start OK..."

        # 1. Create a localhost-only admin account
        mysql -u root -e "CREATE USER '$DB_USER'@'%' IDENTIFIED BY '$DB_PASS'"
        mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS'"
        mysql -u root -e "CREATE USER '$DB_USER'@'127.0.0.1' IDENTIFIED BY '$DB_PASS'"
        mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO '$DB_USER'@'%' WITH GRANT OPTION"
        echo "===> Create localhost completed..."

        # shutdown mariadb to wait for supervisor
        mysqladmin -u root shutdown

    else
        if [[ -e ${DATA_DIR}/mysql.sock ]]; then
            rm -f ${DATA_DIR}/mysql.sock
        fi

        MARIADB_NEW=false

           echo "===> Using an existing volume of MariaDB"
    fi
}

firstrun_maria
firstrun_maria

 

构建mysql docker镜像

docker build -t csphere/mysql:5.5 .

 

###docker volume 保证删除容器后,数据不被删除

  • 保存容器中的数据
  • 数据共享

使用方法:

1.在Dockerfile中定义VOLUME["/data"]

2.通过docker run -d -v <host_dir>:<container_dir>

###案例:

  1. 创建mysql容器,不挂载docker volume,删除后,数据是否存在
  2. 创建mysql容器,挂载docker volume,删除后,数据是否存在

运行不挂载docker volume的mysql容器

# docker run -d -p 3306:3306 --name dbserver csphere/mysql:5.5
0a3092395c1e6a84f0ecd5383799f210519c5aefc82cbb7ee2ed1a471fc463f5

 

删除docker容器,容器里面的数据都会随着容器被删除而删除

# docker rm dbserver
Error response from daemon: Cannot destroy container dbserver: Conflict,
 You cannot remove a running container. Stop the container before attempting removal or use -f
Error: failed to remove containers: [dbserver]

 

参数解释:

  • docker rm 删除状态为“Exited”的docker容器
  • docker rm -f 强制删除docker容器

运行挂载docker volume的mysql容器

docker run -d -p 3306:3306 -v /var/lib/docker/vfs/dir/mydata:/var/lib/mysql csphere/mysql:5.5

f49165d5e081b8bd8af9cb9c0bbbeb6545d45f857c1a852646c105 docker exec -it f49 /bin/bash

 

登陆数据库创建mydb数据库

# mysql
# show databases;
# create database mydb;
Query OK, 1 row affected (0.00 sec)
# show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)
# exit
exit

 

 

查看主机文件目录下,是否已生成mydb数据库目录文件
#
ls /var/lib/docker/vfs/dir/mydata/ aria_log.00000001 ibdata1 ib_logfile1 mysql performance_schema aria_log_control ib_logfile0 mydb mysql.sock test 停止docker容器 # docker stop f49165d5e081 f49165d5e081 删除docker容器,查看`mydb`目录是否被删除 # docker rm f49165d5e081 f49165d5e081 # ls /var/lib/docker/vfs/dir/mydata/ #验证,挂载docker volume后,容器被删除掉,数据还在
aria_log.00000001 ibdata1 ib_logfile1 mysql performance_schema aria_log_control ib_logfile0 mydb mysql.sock test 新创建一个容器,挂载到刚才的数据目录下,是否可以把之前的数据库加载回来 docker run -d -p 3306:3306 --name newdb -v /var/lib/docker/vfs/dir/mydata:/var/lib/mysql csphere/mysql:5.5
29418b93d4d4a00a86169c568b6f952e71d25b155d7f6b8012d953022691b2b8 docker
exec -it newdb /bin/bash # mysql MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec)

 

验证结果: 只要保证数据在,重新创建一个容器挂载回之前的数据目录,业务即可恢复(容器可随意删除、创建)

 

 

Docker实战之入门以及Dockerfile(三) 

Docker实战之入门以及Dockerfile(一)

Docker实战之入门以及Dockerfile(二)

文章内容,由【Docker实训课程

第一讲视频翻译整理而成 培训代码 https://github.com/nicescale/docker-training 虚拟机镜像http://market.aliyun.com/products/56014007/ ##应用镜像

##csphere/wordpress:4.2

# cd docker-training/wordpress/
# ls -a
.              license.txt           wp-config-sample.php  wp-login.php
..             readme.html           wp-content            wp-mail.php
Dockerfile     wp-activate.php       wp-cron.php           wp-settings.php
.dockerignore  wp-admin              wp-includes           wp-signup.php
index.php      wp-blog-header.php    wp-links-opml.php     wp-trackback.php
init.sh        wp-comments-post.php  wp-load.php           xmlrpc.php

/docker-training/wordpress# cat Dockerfile 
from csphere/php-fpm:5.4

add init.sh /init.sh

entrypoint ["/init.sh", "/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]

 

使用docker后,在项目代码目录下,写Dockerfile文件,非常方便把项目代码直接打包到docker镜像中,如有哪些文件不想被打包进去,可以在.dockerignore文件中定义

Dockerfile解析:

  • wordpress镜像是基于csphere/php-fpm:5.4来进行构建
  • ONBUILD指令生效,把代码文件拷贝到网站根目录下
  • init.sh脚本对WordPress连接mysql数据库进行配置,固运行wordpress镜像后,只需要进行配置WordPress即可,数据库已准备就绪!

生成WordPress镜像

docker build -t csphere/wordpress:4.2 .

查看当前主机本地都有哪些docker镜像

docker images

创建WordPress准备

查看主机ip地址

ifconfig eth0 192.168.1.20

创建WordPress容器:

docker run -d -p 80:80 --name wordpress -e WORDPRESS_DB_HOST=192.168.1.20 -e WORDPRESS_DB_USER=admin 
-e WORDPRESS_DB_PASSWORD=csphere2015 csphere/wordpress:4.2 49d0cddb4e6998a43285fe09165030ba80485065867b9cb8fae9fbdb97cd077f 参数解析: -d 后台运行 -p 80:80 将宿主机的80端口映射到容器的80端口 --name wordpress 给容器命名为wordpress -e WORDPRESS_DB_HOST=192.168.1.20 数据库主机的ip地址(或者域名) -e WORDPRESS_DB_USER=admin 数据库的用户,默认是admin -e WORDPRESS_DB_PASSWORD=csphere2015 登陆数据的密码,默认是csphere2015 csphere/wordpress:4.2使用此镜像创建WordPress容器 访问http://your_ip,选择语言,并进行设置wordpress

 

ENTRYPOINT和CMD的区别

ENTRYPOINT解析

定义:

An ENTRYPOINT allows you to configure a container that will run as an executable

运行一个Docker容器像运行一个程序一样

ENTRYPOINT的使用方法:

1.ENTRYPOINT ["executable", "param1", "param2"] (the preferred exec form)

推荐使用1方法,启动起来后,pid为1

2.ENTRYPOINT command param1 param2 (shell form) 

启动起来后,pid号为shell命令执行完的pid号

CMD解析

CMD的使用方法:

1.CMD ["executable","param1","param2"] (exec form, this is the preferred form)

运行一个可执行的文件并提供参数

2.CMD ["param1","param2"] (as default parameters to ENTRYPOINT) 

为ENTRYPOINT指定参数

3.CMD command param1 param2 (shell form) 

是以”/bin/sh -c”的方法执行的命令

 

实战测试CMD

vim Dockerfile
FROM centos:centos7.1.1503

CMD ["/bin/echo", "This is test cmd"]
生成cmd镜像 docker build -t csphere/cmd:0.1 . 生成cmd容器,

进行测试docker run -it --rm csphere/cmd:0.1 This is test cmd 测试是否可以替换cmd的命令

docker run -it csphere/cmd:0.1 /bin/bash

[root@c1963a366319 /]#
测试结果,在Dockerfile中定义的CMD命令,在执行docker run的时候,CMD命令可以被替换。

实战测试ENTRYPOINT

FROM centos:centos7.1.1503

ENTRYPOINT ["/bin/echo", "This is test entrypoint"]
生成ent(entrypoint)镜像 docker build -t csphere/ent:0.1 .

生成ent容器,进行测试

docker run -it csphere/ent:0.1

This is test entrypoint
测试是否可以替换entrypoint的命令

docker run -it csphere/ent:0.1 /bin/bash

This is test entrypoint /bin/bash
测试结果,在Dockerfile定义的ENTRYPOINT命令,通过以上方式不能被替换

实战再次测试ENTRYPOINT

docker run -it --entrypoint=/bin/bash csphere/ent:0.1 
测试结果,ENTRYPOINT命令也可以被替换,需要在执行docker run时添加--entrypoint=参数,此方法多用来进行调试

 

https://github.com/nicescale/docker-training

posted on 2018-04-02 23:15  flyoss  阅读(1563)  评论(0编辑  收藏  举报

导航