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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM