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

最后更新于:2022-04-01 05:13:55

#Docker实战之入门以及Dockerfile(三) [Docker实战之入门以及Dockerfile(一)](http://git.oschina.net/dockerf/docker-practice/blob/master/Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%B8%80%29.md?dir=0&filepath=Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%B8%80%29.md&oid=fd533b0b7665712fdafd3142a61e326ef416dbe1&sha=f11d77675b6ad637a21f26ece6bb11b9e4a66386) [Docker实战之入门以及Dockerfile(二)](http://git.oschina.net/dockerf/docker-practice/blob/master/Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%BA%8C%29.md?dir=0&filepath=Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%BA%8C%29.md&oid=76ce88d4a3af4e797873fac07f8f84c4ac72602a&sha=f11d77675b6ad637a21f26ece6bb11b9e4a66386) 文章内容,由【[Docker实训课程](https://csphere.cn/training)】 [第一讲视频](http://pan.baidu.com/s/1hq2COGc)翻译整理而成 [培训代码](https://github.com/nicescale/docker-training) https://github.com/nicescale/docker-training [虚拟机镜像](http://market.aliyun.com/products/56014007/jxsc000181.html) 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` ![](https://discuss.csphere.cn/uploads/default/optimized/2X/5/5e887120f584095151915ef2ddbc6c6f6d8e4885_1_422x500.png) ## 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=`参数,此方法多用来进行调试 ##更多精彩内容,访问:[cSphere-希云社区](https://discuss.csphere.cn) 说明,文章由[cSphere-希云](https://csphere.cn)所有,转载请整体转载,并保留原文链接,且不得修改原文! 转载,请联系"cSphere"微信公众号 ![](https://discuss.csphere.cn/uploads/default/original/2X/1/1f82a3e93d907fc9fb5acf552f2646b74f5706d5.jpg)
';

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

最后更新于:2022-04-01 05:13:53

#Docker实战之入门以及Dockerfile(二) 上一篇[Docker实战之入门以及Dockerfile(一)](http://git.oschina.net/dockerf/docker-practice/blob/master/Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%B8%80%29.md?dir=0&filepath=Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%B8%80%29.md&oid=fd533b0b7665712fdafd3142a61e326ef416dbe1&sha=f11d77675b6ad637a21f26ece6bb11b9e4a66386) 文章内容,由【[Docker实训课程](https://csphere.cn/training)】 [第一讲视频](http://pan.baidu.com/s/1hq2COGc)翻译整理而成 [培训代码](https://github.com/nicescale/docker-training) https://github.com/nicescale/docker-training [虚拟机镜像](http://market.aliyun.com/products/56014007/jxsc000181.html) 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` ![](https://discuss.csphere.cn/uploads/default/original/2X/c/c002db15d4ed47329927a97066d485bce874ccfb.png) 如何进入一个正在运行的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,以及设置数据库用户和密码,详情内容请自行阅读[脚本文件](http://git.oschina.net/dockerf/docker-training/blob/master/mysql/scripts/firstrun_maria?dir=0&filepath=mysql%2Fscripts%2Ffirstrun_maria&oid=788bfb61d8cc45a33b60cde5a0e98899ee08f808&sha=3a86a4767292c267af0794628efb76fe31e754e6) 构建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(三)](http://git.oschina.net/dockerf/docker-practice/blob/master/Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%B8%89%29.md?dir=0&filepath=Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%B8%89%29.md&oid=4b0000ad67c06e7f1a3c57edf69e215636b3dd2a&sha=f11d77675b6ad637a21f26ece6bb11b9e4a66386) *** 说明,文章由[cSphere-希云](https://csphere.cn)所有,转载请整体转载,并保留原文链接,且不得修改原文! 转载,请联系"cSphere"微信公众号 ![](https://discuss.csphere.cn/uploads/default/original/2X/1/1f82a3e93d907fc9fb5acf552f2646b74f5706d5.jpg)
';

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

最后更新于:2022-04-01 05:13:51

#Docker实战之入门以及Dockerfile(一) 文章内容,由【[Docker实训课程](https://csphere.cn/training)】 [第一讲视频](http://pan.baidu.com/s/1hq2COGc)翻译整理而成 [培训代码](https://github.com/nicescale/docker-training) https://github.com/nicescale/docker-training [虚拟机镜像](http://market.aliyun.com/products/56014007/jxsc000181.html) http://market.aliyun.com/products/56014007/ ###首先Docker是软件工业上的集装箱技术 ###回顾,在没有集装箱出现以前,传统运输行业中,会存在这些问题: - 在运输过程中,货物损坏 - 装卸、运输货物,效率低下 - 运输手续繁多及运输环节多 - 劳动强度大,及船舶周转慢 ###在集装箱出现后,完全改变了这种状况,是由于集装箱: - 规则标准化,大大减少了包装费用 - 大大提升了货物装卸效率、及运输效率 - 不同种运输工具之间转换更容易 ###所以,集装箱出现是传统行业中的一次重大变革 ###传统软件行业中存在的问题 - 软件更新发布低效 - 业务无法敏捷 - 环境一致性,难于保证 - 不同环境之间迁移成本太高 - 软件开发商,交付实施周期长---成本高 ###有了Docker,以上问题,有望或者说在很大程度上可以得到解决 ## 二、Docker的组成 #### Docker是一个C/S架构 ![](https://discuss.csphere.cn/uploads/default/optimized/2X/4/4ae4f9f4583f00766f8126e232d0d5e60042a363_1_666x500.jpg) - Docker Client: Docker的客户端 - Docker Server: Docker daemon的主要组成部分,接收用户通过Docker Client发送的请求,并按照相应的路由规则实现路由分发 - Docker Registry: Registry是Docker镜像的中央存储仓库(pull/push) > 通过docker pull命令可以把Registry上的docker镜像,下载到服务器本地 > 通过docker push命令可以把服务器本地的docker镜像,上传到Registry上 > **Registry在构建自动化平台,起着非常重要的作用!** ![](https://discuss.csphere.cn/uploads/default/optimized/2X/6/6643a54f646047a9dbf31cce424408b4d3fe5ee3_1_666x500.jpg) _提示:Docker镜像运行之后会成为Docker容器----通过 docker run命令_ ####Docker容器启动速度非常快,体现在2个方面; 1.磁盘占用空间小,因为docker镜像采用了分层技术,构建的镜像大小,只有自身的大小,不包含父镜像的大小 2.内存消耗少,docker容器共享的宿主机的内核,没有操作的进程消耗 ##Docker实战准备 1. 首先登陆[OSChina Git](http://git.oschina.net) 2. 将[docker-training](http://git.oschina.net/dockerf/docker-training)项目Fork到自己的仓库 3. 使用自己熟悉的SSH工具连接到服务器 4. 执行`git clone https://git.oschina.net/*YOURNAME*/docker-training.git`,将你的远程仓库clone到服务器 [Git 使用指南](http://git.oschina.net/progit/) 后续会构建4个docker镜像,分别为: > centos7 (基础镜像) > php-fpm mysql(中间件镜像) > worpdress(应用镜像) ####什么是Dockerfile? ![](https://discuss.csphere.cn/uploads/default/original/2X/8/8f12e062a5b2c17e8f502b01fc87948ee77453df.jpg) > 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`的指令都会生成一个镜像的layer`c57a5bac41c8` `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(二)](http://git.oschina.net/dockerf/docker-practice/blob/master/Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%BA%8C%29.md?dir=0&filepath=Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%BA%8C%29.md&oid=76ce88d4a3af4e797873fac07f8f84c4ac72602a&sha=f11d77675b6ad637a21f26ece6bb11b9e4a66386) *** 说明,文章由[cSphere-希云](https://csphere.cn)所有,转载请整体转载,并保留原文链接,且不得修改原文! 转载,请联系"cSphere"微信公众号 ![](https://discuss.csphere.cn/uploads/default/original/2X/1/1f82a3e93d907fc9fb5acf552f2646b74f5706d5.jpg)
';

内容

最后更新于:2022-04-01 05:13:49

';

cSphere Docker 实训课程 课程安排

最后更新于:2022-04-01 05:13:46

# cSphere Docker 实训课程 ## 课程安排 - 第一讲 Docker 实战之入门以及 Dockerfile - 第二讲 Docker 实战之 Registry 以及持续集成 - 第三讲 Docker 实战之监控管理以及日志管理 - 第四讲 Docker 实战之网络管理 - 第五讲 Docker 实战之持续部署以及弹性伸缩 - 第六讲 Docker 实战之存储 ##课程火热进行中,接地气的**开源免费**培训课程,并有礼品赠送。[报名地址](https://csphere.cn/training) ##第四讲 2015年7月15日 周二 晚21:00开课 [报名地址](https://csphere.cn/training) ###第一讲 ``` 本期课程: Docker实战之入门以及Dockerfile 如果你还没用使用过 Docker,此课程带你走进 Docker 世界,了解docker的基础概念、常用操作 如果你曾经用过 Docker,通过此课程,让你学会构建出可以在生产环境中良好运行的 Docker image 学会使用Docker快速构建、创建研发环境 学会打包应用程序Application到image中,并支持快速部署 讲述3-4个实际应用中的例子(绝对的干货) ``` [培训视频:](http://pan.baidu.com/s/1hq2COGc)http://pan.baidu.com/s/1hq2COGc 【配合视频,翻译的文章】 [Docker实战之入门以及Dockerfile(一)](http://git.oschina.net/dockerf/docker-practice/blob/master/Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%B8%80%29.md?dir=0&filepath=Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%B8%80%29.md&oid=63a62caaac5c4de2997b866d0da465a4cf016aea&sha=06f1a97af90c8d35713cacf8aac9fb86889de077) [Docker实战之入门以及Dockerfile(二)](http://git.oschina.net/dockerf/docker-practice/blob/master/Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%BA%8C%29.md?dir=0&filepath=Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%BA%8C%29.md&oid=9312c89d48d807b99ee2f0cb9f4ecd6011db273d&sha=06f1a97af90c8d35713cacf8aac9fb86889de077) [Docker实战之入门以及Dockerfile(三)](http://git.oschina.net/dockerf/docker-practice/blob/master/Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%B8%89%29.md?dir=0&filepath=Docker%E5%AE%9E%E6%88%98%E4%B9%8B%E5%85%A5%E9%97%A8%E4%BB%A5%E5%8F%8ADockerfile%28%E4%B8%89%29.md&oid=4e8ecdafe968fdd2294e4e0050293ff90b680e28&sha=06f1a97af90c8d35713cacf8aac9fb86889de077) [培训代码:](https://github.com/nicescale/docker-training)https://github.com/nicescale/docker-training [培训镜像:](http://market.aliyun.com/products/56014007/jxsc000181.html)http://market.aliyun.com/products/56014007/jxsc000181.html ###第二讲 ``` 本期课程: Docker实战之Registry以及持续集成 上一讲<视频>我们知道了Docker的基础知识,以及学会了Dockerfile,第二讲将结合一个实际的Java应用,演示如何通过Docker以及Registry 实现自动化的镜像构建、自动部署以及持续集成测试。 通过本次课程,你将会学会: 1、如何通过Git仓库,自动生成Docker镜像 2、如何自动将多个容器部署起来 3、容器部署好后,如何利用Jenkins自动做集成测试 ``` [培训视频:](http://pan.baidu.com/s/1bn4j9Ht)http://pan.baidu.com/s/1bn4j9Ht 【培训代码】 [OSC:](http://git.oschina.net/dockerf/second)http://git.oschina.net/dockerf/second [GitHub:](https://github.com/nicescale/docker-training)https://github.com/nicescale/docker-training [培训镜像:](http://market.qcloud.com/detail.php?productId=126)http://market.qcloud.com/detail.php?productId=126 ###第三讲 ``` 第三讲:Docker实战之监控报警以及日志管理 上一讲讲解了Docker和持续集成,主要面向开发以及测试人员。那么这一讲我们重点来看看生产环境里跑Docker最关心的话题:监控报警和日志管理。 本期内容将带你: 手把手教你如何搭建监控报警系统以及日志管理系统 运行一个应用,模拟业务并发访问,生成压力和日志 学习如何设置监控指标和报警策略 学习如何设置,来收集该应用生成的日志,并图表化展现 ``` [培训视频:](http://pan.baidu.com/s/1qW7hNTq)http://pan.baidu.com/s/1qW7hNTq 【培训代码】 [OSC:](http://git.oschina.net/dockerf/third-train)http://git.oschina.net/dockerf/third-train [GitHub:](https://github.com/nicescale/docker-training)https://github.com/nicescale/docker-training [培训镜像:](http://market.qcloud.com/detail.php?productId=140)http://market.qcloud.com/detail.php?productId=140 ###第四讲(未开课)
';

cSphere入群Docker基础

最后更新于:2022-04-01 05:13:44

#cSphere入群Docker基础: 这篇基础文章是方便用户在使用cSphere平台之前,需要了解的docker基础知识。 针对已经有一定的Linux基础知识的用户。 ##Docker是什么 Docker是一个改进的容器技术。具体的“改进”体现在,Docker为容器引入了镜像,使得容器可以从预先定义好的模版(images)创建出来,并且这个模版还是分层的。 ###Docker经常被提起的特点: - 轻量,体现在内存占用小,高密度 - 快速,毫秒启动 - 隔离,沙盒技术更像虚拟机 ###Docker技术的基础: - namespace,容器隔离的基础,保证A容器看不到B容器. 6个名空间:User,Mnt,Network,UTS,IPC,Pid - cgroups,容器资源统计和隔离。主要用到的cgroups子系统:cpu,blkio,device,freezer,memory - unionfs,典型:aufs/overlayfs,分层镜像实现的基础 ###Docker组件: - **docker Client**客户端------------>向docker服务器进程发起请求,如:创建、停止、销毁容器等操作 - **docker Server**服务器进程----->处理所有docker的请求,管理所有容器 - **docker Registry**镜像仓库------>镜像存放的中央仓库,可看作是存放二进制的scm ## Docker安装 ## Docker的安装非常简单,支持目前所有主流操作系统,从Mac到Windows到各种Linux发行版 具体参考: [docker安装](https://docs.docker.com/installation/) ## Docker常见命令 ## #### 容器相关操作 - docker create # 创建一个容器但是不启动它 - docker run # 创建并启动一个容器 - docker stop # 停止容器运行,发送信号SIGTERM - docker start # 启动一个停止状态的容器 - docker restart # 重启一个容器 - docker rm # 删除一个容器 - docker kill # 发送信号给容器,默认SIGKILL - docker attach # 连接(进入)到一个正在运行的容器 - docker wait # 阻塞到一个容器,直到容器停止运行 #### 获取容器相关信息 - docker ps # 显示状态为运行(Up)的容器 - docker ps -a # 显示所有容器,包括运行中(Up)的和退出的(Exited) - docker inspect # 深入容器内部获取容器所有信息 - docker logs # 查看容器的日志(stdout/stderr) - docker events # 得到docker服务器的实时的事件 - docker port # 显示容器的端口映射 - docker top # 显示容器的进程信息 - docker diff # 显示容器文件系统的前后变化 #### 导出容器 - docker cp # 从容器里向外拷贝文件或目录 - docker export # 将容器整个文件系统导出为一个tar包,不带layers、tag等信息 #### 执行 - docker exec # 在容器里执行一个命令,可以执行bash进入交互式 #### 镜像操作 - docker images # 显示本地所有的镜像列表 - docker import # 从一个tar包创建一个镜像,往往和export结合使用 - docker build # 使用Dockerfile创建镜像(推荐) - docker commit # 从容器创建镜像 - docker rmi # 删除一个镜像 - docker load # 从一个tar包创建一个镜像,和save配合使用 - docker save # 将一个镜像保存为一个tar包,带layers和tag信息 - docker history # 显示生成一个镜像的历史命令 - docker tag # 为镜像起一个别名 #### 镜像仓库(registry)操作 - docker login # 登录到一个registry - docker search # 从registry仓库搜索镜像 - docker pull # 从仓库下载镜像到本地 - docker push # 将一个镜像push到registry仓库中 #### 获取Container IP地址(Container状态必须是Up) docker inspect id | grep IPAddress | cut -d '"' -f 4 #### 获取端口映射 docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' id #### 获取环境变量 docker exec container_id env #### 杀掉所有正在运行的容器 docker kill $(docker ps -q) #### 删除老的(一周前创建)容器 docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm #### 删除已经停止的容器 docker rm `docker ps -a -q` #### 删除所有镜像,小心 docker rmi $(docker images -q) ## Dockerfile Dockerfile是docker构建镜像的基础,也是docker区别于其他容器的重要特征,正是有了Dockerfile,docker的自动化和可移植性才成为可能。 不论是开发还是运维,学会编写Dockerfile几乎是必备的,这有助于你理解整个容器的运行。 ####FROM <image name>, 从一个基础镜像构建新的镜像 FROM ubuntu #### MAINTAINER <author name>, 维护者信息 MAINTAINER William <wlj@nicescale.com> #### ENV <key> <value>, 设置环境变量 ENV TEST 1 #### RUN <command>, 非交互式运行shell命令 RUN apt-get -y update RUN apt-get -y install nginx #### ADD <src> <dst>, 将外部文件拷贝到镜像里,src可以为url ADD http://nicescale.com/ /data/nicescale.tgz #### WORKDIR /path/to/workdir, 设置工作目录 WORKDIR /var/www #### USER <uid>, 设置用户ID USER nginx #### VULUME <#dir>, 设置volume VOLUME [‘/data’] #### EXPOSE <port>, 暴露哪些端口 EXPOSE 80 443 #### ENTRYPOINT [‘executable’, ‘param1’,’param2’]执行命令 ENTRYPOINT ["/usr/sbin/nginx"] #### CMD [“param1","param2"] CMD ["start"] docker创建、启动container时执行的命令,如果设置了ENTRYPOINT,则CMD将作为参数</usr/sbin/nginx start> #### Dockerfile最佳实践 - 尽量将一些常用不变的指令放到前面 - CMD和ENTRYPOINT尽量使用json数组方式 #### 通过Dockerfile构建image docker build csphere/nginx:1.7 . ## 镜像仓库Registry 镜像从Dockerfile build生成后,需要将镜像推送(push)到镜像仓库。企业内部都需要构建一个私有docker registry,这个registry可以看作二进制的scm,CI/CD也需要围绕registry进行。 #### 部署registry mkdir /registry docker run -p 80:5000 -e STORAGE_PATH=/registry -v /registry:/registry registry:2.0 #### 推送镜像保存到仓库 假设192.168.1.2是registry仓库的地址: docker tag csphere/nginx:1.7 192.168.1.2/csphere/nginx:1.7 docker push 192.168.1.2/csphere/nginx:1.7 ##几个简单小例子 ###容器操作 1.创建并拉取busybox # docker run -it --name con01 busybox:latest / # ip addr #容器里执行 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever Segmentation fault (core dumped) / # ping www.csphere.cn PING www.csphere.cn (117.121.26.243): 56 data bytes 64 bytes from 117.121.26.243: seq=0 ttl=48 time=3.139 ms 64 bytes from 117.121.26.243: seq=1 ttl=48 time=3.027 ms ^C --- www.csphere.cn ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 3.027/3.083/3.139 ms exit #退出容器 2.创建测试容器 docker run -d --name con03 csphere/test:0.1 efc9bda4a2ff2f479b18e0fc4698e42c47c9583a24c93f5ce6b28a828a172709 3.登陆到con03中 # docker exec -it con03 /bin/bash [root@efc9bda4a2ff /]# exit 4.停止con03 # docker stop con03 con03 5.开启con03 # docker start con03 con03 6.删除con03 ``` # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES efc9bda4a2ff csphere/test:0.1 "/usr/local/bin/run 4 minutes ago Up 17 seconds con03 99aa6ee25adc busybox:latest "/bin/sh" 14 minutes ago Exited (0) 12 minutes ago con02 831c93de9b9f busybox:latest "/bin/sh" 2 hours ago Up 27 minutes con01 # docker rm con02 #容器停止的状态 # docker rm -f con03 #容器开启的状态 ``` ###镜像操作 1.从docker hub官方镜像仓库拉取镜像 # docker pull busybox:latest atest: Pulling from busybox cf2616975b4a: Pull complete 6ce2e90b0bc7: Pull complete 8c2e06607696: Already exists busybox:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. Digest: sha256:38a203e1986cf79639cfb9b2e1d6e773de84002feea2d4eb006b52004ee8502d Status: Downloaded newer image for busybox:latest 2.从本地上传镜像到镜像仓库 docker push 192.168.1.2/csphere/nginx:1.7 3.查找镜像仓库的某个镜像 # docker search centos/nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED johnnyzheng/centos-nginx-php-wordpress 1 [OK] sergeyzh/centos6-nginx 1 [OK] hzhang/centos-nginx 1 [OK] 4.查看本地镜像列表 # docker images TAG IMAGE ID CREATED VIRTUAL SIZE docker.io/csphere/csphere 0.10.3 604c03bf0c9e 3 days ago 62.72 MB docker.io/csphere/csphere latest 604c03bf0c9e 3 days ago 62.72 MB csphere/csphere 0.10.3 604c03bf0c9e 3 days ago 62.72 MB registry 2.0 2971b6ce766c 7 days ago 548.1 MB busybox latest 8c2e06607696 3 weeks ago 2.43 MB 5.删除镜像 docker rmi busybox:latest #没有容器使用此镜像创建,如果有容器在使用此镜像会报错:Error response from daemon: Conflict, cannot delete 8c2e06607696 because the running container 831c93de9b9f is using it, stop it and use -f to force FATA[0000] Error: failed to remove one or more images docker rmi -f busybox:latest #容器使用此镜像创建,此容器状态为Exited 6.查看构建镜像所用过的命令 # docker history busybox:latest IMAGE CREATED CREATED BY SIZE 8c2e06607696 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0 B 6ce2e90b0bc7 3 weeks ago /bin/sh -c #(nop) ADD file:8cf517d90fe79547c4 2.43 MB cf2616975b4a 3 weeks ago /bin/sh -c #(nop) MAINTAINER Jérôme Petazzo 0 B
';

版权

最后更新于:2022-04-01 05:13:42

版权:本文档的版权属于[cSphere](https://csphere.cn/) 整理:@[itfanr](https://github.com/itfanr) 参考: * https://csphere.cn/training * http://git.oschina.net/dockerf/docker-practice * https://github.com/nicescale/docker-training
';