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實戰准備
- 首先登陸OSChina Git
- 將docker-training項目Fork到自己的倉庫
- 使用自己熟悉的SSH工具連接到服務器
- 執行
git clone https://git.oschina.net/*YOURNAME*/docker-training.git
,將你的遠程倉庫clone到服務器
后續會構建4個docker鏡像,分別為:
centos7 (基礎鏡像)
php-fpm mysql(中間件鏡像)
worpdress(應用鏡像)
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
默認tag
是latest
在構建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實訓課程】
第一講視頻翻譯整理而成
培訓代碼 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
構建mysql docker鏡像
docker build -t csphere/mysql:5.5 .
###docker volume 保證刪除容器后,數據不被刪除
- 保存容器中的數據
- 數據共享
使用方法:
1.在Dockerfile中定義VOLUME["/data"]
2.通過docker run -d -v <host_dir>:<container_dir>
###案例:
- 創建mysql容器,不掛載docker volume,刪除后,數據是否存在
- 創建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實訓課程】
第一講視頻翻譯整理而成 培訓代碼 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