嗡汤圆的Docker自学笔记以及应用部署实例
该自学内容主要来源于视频列表:Docker Tutorials基础知识Docker特性Dock不是虚拟机!Dock不是虚拟机!Dock不是虚拟机!docker构建在操作系统上,利用操作系统的containerization技术,消耗资源小,轻量,可以瞬间启动完毕。我们可以启动一个装有Nginx的dockerdocker run -d nginx然后在分别在Docker和宿主机上运行p
该自学内容主要来源于视频列表:Docker Tutorials
基础知识
Docker特性
Dock不是虚拟机!Dock不是虚拟机!Dock不是虚拟机!
docker构建在操作系统上,利用操作系统的containerization技术,消耗资源小,轻量,可以瞬间启动完毕。
我们可以启动一个装有Nginx的docker
docker run -d nginx
然后在分别在Docker和宿主机上运行ps查看进程
ps -ef | grep nginx
可以看到Docker和宿主机上都能看到nginx进程
1-Docker中的进程
2-主机中的进程
nginx的进程实际上是在本机上的,这意味着,容器中程序的执行仍然是使用本机操作系统的,容器并不自己构建操作系统,而是以某种隔离的方式依赖本机操作系统工作。这就是Docker和虚拟机的本质区别。摘自:Docker简介与入门
Docker安装
网络上有很多教程,但是还是推荐去官方网站看看手册,也是手把手教的。
本博客以ubuntu为例
第一步:更新apt,安装必要工具
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates
第二步:新增GPG KEY,新增软件仓库
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
# 这个需要根据系统具体的发行版本确定
deb https://apt.dockerproject.org/repo ubuntu-trusty main
第三步:安装Docker引擎以及其他
sudo apt-get purge lxc-docker
apt-cache policy docker-engine
sudo apt-get install linux-image-extra-$(uname -r)
sudo apt-get install linux-image-generic-lts-trusty
第四步:重启系统并启动Docker服务
reboot
sudo service docker start
基本概念
镜像(Image)
镜像类似模板,它包含了容器启动所需的所有信息,包括运行程序和配置数据。每个自定义镜像均从基本镜像开始,层层添加内容而成。所以当使用docker pull
拉取自定义镜像是,可能看见若干个下载进程,就是各个不同的层。(这点很像版本控制,一层一层的分支)
运行命令docker images
可以查看当前本地存在的镜像
容器(Container)
是Docker程序运行的副本,每次从镜像启动一次Docker,都会创建一个新的容器。
产生的容器并且正在运行的容器,可以通过docker ps
查看,若容器已经停止运行, 则可以通过docker ps -a
查看。
第一列是Container Id用于唯一区别每个Container,可以通过docker rm [containerid]
来删除,也可以通过docker restart [containerid]
来重启。
基本命令
运行
# 交互方式运行docker(运行后会保存container)
docker run -it dockerimage
# 交互方式运行docker,运行结束后删除container
docker run -it --rm dockerimage
# 后台方式运行docker
docker run -d dockerimage
# 连入后台docker
docker attach containerid
# 启动,并执行命令
docker run dockerimage [command]
# 启动,暴露端口(本机端口port1映射为docker端口port2)
docker run dockerimage port1:port2
# 路径映射(本机路径path1映射为docker路径path2)
# 注意:这里要注意挂载的权限问题,必要时加上-u参数
docker run dockerimage -v path1:path2
进程查看
# 查看正在运行的docker
docker ps
# 历史运行docker
docker ps -a
# 删除container
docker rm containerid
# 重启container
docker restart containerid
# 停止一个container
docker stop containerid
镜像管理
# 列出镜像
docker images
# 列出所有镜像
docker images -a
# 删除镜像
docker rmi imageid
Dockerfile构建Docker
基本元素
Dockerfile记录了构建一个Docker镜像的所有步骤基本语法元素如下:
1. FROM
来源镜像,及制定一个基本的源镜像(必填)
2. MAINTAINER
维护者信息
3. RUN
运行build过程中执行脚本,一般用于必要软件升级,安装等
3. ADD
映射卷,将Dockerfile同目录下的某文件或目录添加到Docker环境中去
4. CMD
Docker在build完毕时执行的命令,只允许出现一次。若出现多个,会被最后一个覆盖,同时优先级低于docker run 后边添加的command命令。即,若在docker run命令后添加了command,则Dockerfile中的CMD被覆盖。
5. ENTRYPOINT
不可覆盖的执行命令,后边在加上CMD或者在docker run后边加上的command则会变为ENTRYPOINT的参数处理。
6. WORKDIR
docker 启动完成后所在的工作路径
7. ENV
设置docker中的环境变量
构建
所有和Dockerfile同目录的文件均会在build过程中被打包进镜像,所以避免在Dockerfile目录中防止太大的文件。
构建的命令为
docker build -t dockertag .
构建过程中,Dockerfile记录的每一步操作均会生成一个对应的image。
然后就能在docker images 中看到了
DockerHub使用
Dockerhub用起来很像github,主要有pull, push, commit命令。
首先注册用户名,密码就不用说了。
在终端中登陆dockerhub
docker login
# 1-提示输入用户名
# 2-提示输入密码
# 3-完成登陆
从dockerhub中搜索images并拉去到本地
# 如果知道image名称就可以省去这步
docker search
docker pull imgaename
# 或者直接docker run,若本地没有,就会自动拉取
提交自己的dockerimage
# 首先,若构建的docker本身名字符合username/dockerimagename这样的规范,就可以直接commit和push
# 若没有则使用docker tag
# username/dockerimagename:tag 全名,分别记录了用户名,镜像名,标签(可用于记录分支版本)
提交成功后,就可以在自己的docker hub 主页上看到了
应用部署
已wordpress+MySQL为例,用这个组合是因为均有官方的源。
mysql
wordpress
页面中均有说明文档
为了实现灵活配置,我们将文件系统(file)、数据库(db)、Web应用(web)分别部署在三个docker上。三个docker的关系如下:
file用于文件存储(包括mysql和web应用),mysql实例运行于db上,wordpress应用不属于web上,同时db和web均挂载file的目录。
file docker
# 1-建立file docker 挂载/var/lib/mysq和/var/www/html,基于源busybox
docker run -v /var/lib/mysq -v /var/www/html --name my_datastore -d busybox echo 'My Datastore'
db docker
# 2-建立db docker (mysql实例),基于源mysql
docker run --name my_mysql -e MYSQL_ROOT_PASSWORD=mypassword --volumes-from my_datastore -d mysql
web docker
# 3-建立web docker(wordpress)链接mysql数据库docker
docker run --link=my_mysql:mysql -p 80:80 -d wordpress
以上步骤完成之后,查看docker ps
正在运行的container
可以看到db、web两个docker正在运行,file已退出。但是其实我们仅需要file的volume即可。
现在用浏览器打开本地80端口即可看到wordpress的页面
工具应用 - Docker Compose
视频中的 fig 已被docker收购,现在更名为Docker Compose了。
Docker Compose是一个基于Docker的用于快速搭建开发环境的工具,通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景。
compose安装
# 1-下载文件
curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 在本机环境其实对应的就是Linux-x86_64
# 2-赋予执行权限
chmod +x /usr/local/bin/docker-compose
# 或者直接使用python-pip安装
sudo apt-get install python-pip
pip install docker-compose
# 若运行docker-compose --version能够正确显示版本号,则说明安装成功
构建例子
以上文构建wordpress+mysql的应用场景为例。首先尝试使用docker-compose建立原例子中的file docker。步骤如下:
- 创建应用一个目录
- 创建docker-compose.yml文件
mkdir wpservice
cd wpservice
touch docker-compose.yml
- 在文件docker-compose.yml文件中声明docker的构建描述
file:
image:busybox
volumes:
- "/var/lib/mysql"
- "/var/www/html"
执行构建并后台启动服务
docker-compose up -d
可以看到docker-compose成功创建container
同理我们补充剩下的db和web,为提高安全性,我们不允许空root密码,同时随机生成一个root密码。
web: image:wordpress:latest links: - db ports: - "80:80" environment: - WORDPRESS_DB_HOST=db:3306 - WORDPRESS_DB_PASSWORD=wordpresspassword - WORDPRESS_DB_USER=wordpress - WORDPRESS_DB_NAME=wordpress volumes_from: - file db: image:mysql:latest volumes_from: environments: - MYSQL_ALLOW_EMPTY_ROOT=no - MYSQL_RANDOM_ROOT_PASSWORD=yes - MYSQL_DATABASE=wordpress - MYSQL_USER=wordpress - MYSQL_PASSWORD=wordpresspassword file: image:busybox:latest volumes: - "/var/www/html" - "/var/lib/mysql"
执行构建并后台启动服务
# 若由于构建顺序原因出现错误,再执行一次即可 docker-compose up -d
可以看到应用已经成功启动了。同时通过docker ps
可以看到web应用映射了本地计算机的32769端口。
扩展web应用
当一个web应用不足以应付并发请求时,docker可以很方便的扩展 ,使用scale即可
docker-compose scale web=3
如上图可以看到通过scale添加了3个web应用,分别映射了32771,32772,32770端口。
更多推荐
所有评论(0)