1. 前言
“相见恨晚”用来形容我对docker的热爱再合适不过了,自从用了docker,开发环境也不安装了,系统想换就换了,部署更是一键部署,再也不用担心在这台机器上跑的好好的,其它机器有问题了...
写这篇文章,也是为docker的发展尽自己一点绵薄之力。
适合人群:您使用docker不久;正打算使用docker;还没有使用过docker。
2. docker是什么
docker是容器(引擎)。
容器用来做什么? 装东西
装什么?装你的应用,例如你的博客网站就是一个应用。
3. 为什么要用docker
3.1 对开发者来说
1 启动速度快,传统虚拟机需要数分钟的启动时间,docker秒秒钟启动。
2 一致的运行环境,用了docker,再也不会出现,为什么在我的电脑运行的好好的,在你的电脑上却有问题!!
3.2 对运维人员来说
1 持续交付和部署。开发者只需要push代码到版本管理(git)即可,接下来的自动测试,自动构建,自动部署都交给docker吧
2 更轻松的扩展。什么?需要增加机器满足日益增长的pv需求,有docker-compose 一键部署就够了。
3.3 与传统虚拟机的比较
4. 如何学习(使用)docker
从现在开始,删除掉你本机上的所有开发环境,包括虚拟机, Vagrant
官方文档 当然是不二之选
当然,也照顾习惯看中文的朋友:
Docker — 从入门到实践
5. docker常用命令
1 service docker start |stop |restart 启动 停止 重启
2 docker run 镜像名称:标签 运行容器 docker -i 交互式操作 docker -t terminal操作
--rm 退出就删除容器
--name 指定容器名称举例:docker run -it --rm ubuntu:14.04 bash
3 docker images 列出已经下载下来的镜像portcommit
-f dangling= true 显示 虚悬镜像(dangling image) 根据仓库名列出镜像 docker images '仓库名' 列出特定的某个镜像,也就是说指定仓库名和标签 docker images '仓库名:标签名' -f在..之前 docker images -f since=mongo:3.2 -f参数 docker images -f label=com.example.version=0.1 只显示id docker images -q 自定义表格格式 docker images --format "{{.ID}}: {{.Repository}}" 或者 docker images --format "table {{.ID}}\t{{.Repository}}\t{{.T-pag}}"
4 docker pull 获取镜像
docker pull ubuntu:14.04
5 docker exec 进入容器
docker exec -it webserver bash
6 docker build [选项] 生成的文件名 上下文(context) 构建镜像
例如 : docker build -t nginx:v3 .
7 -p <宿主端口>:<容器端口>
8 docker rmi [选项] <镜像1> [<镜像2> ...]
注意 docker rm 命令是删除容器,不要混淆。
9 docker rm 删除容器
docker rm $(docker ps -a -q) 删除所有容器
6. docker常见问题
1 由于墙的问题导致docker安装失败或者各种问题
Docker CE 镜像源站
2 pull镜像太慢
Docker 镜像加速器
3 docker mysql设置初始密码(docker mysql启动马上就自动退出)
docker run 加上环境变量参数 -e MYSQL_ROOT_PASSWORD=password1
4 docker redis 设置初始密码
Dockerfile CMD: 'redis-server --requirepass "password1"'
5 docker cron没有执行
Dockerfile CMD: service cron start
6 docker cron 执行的时候时区不对
RUN echo "Asia/Shanghai" > /etc/timezone
或者
同步主机时区
docker run -v /etc/localtime:/etc/localtime <IMAGE:TAG>
以上两种是网上搜索到的,我都没有成功,我目前的解决方案是将crontab -e配置中的时区都往前推8个小时。例如:你本来是要1,9点运行的,设置为1,17
7 docker corn 获取不了环境变量
原因:corn的bash环境变量和docker容器的环境变量不是同一个。
解决:
printenv |grep -v "==" | grep -v " " | sed 's/^\(.*\)$/export \1/g' > /project_env.sh \
&& chmod +x /project_env.sh \
&& service cron start \
&& bash
两个grep -v 是为了反正docker-compose link的时候变量变量污染