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