嗡汤圆的Docker自学笔记以及应用部署实例


该自学内容主要来源于视频列表:Docker Tutorials


基础知识

Docker特性

Dock不是虚拟机!Dock不是虚拟机!Dock不是虚拟机!
docker构建在操作系统上,利用操作系统的containerization技术,消耗资源小,轻量,可以瞬间启动完毕。

我们可以启动一个装有Nginx的docker

docker run -d nginx

然后在分别在Docker和宿主机上运行ps查看进程

ps -ef | grep nginx

可以看到Docker和宿主机上都能看到nginx进程
1-Docker中的进程
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 可以查看当前本地存在的镜像
DockerImages

容器(Container)

是Docker程序运行的副本,每次从镜像启动一次Docker,都会创建一个新的容器。
产生的容器并且正在运行的容器,可以通过docker ps 查看,若容器已经停止运行, 则可以通过docker ps -a 查看。
DockerContainers
第一列是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。
dockerbuild

然后就能在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 主页上看到了
dockerhubimages

应用部署

已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'

buildbusybox

db docker

# 2-建立db docker (mysql实例),基于源mysql
docker run --name my_mysql -e MYSQL_ROOT_PASSWORD=mypassword --volumes-from my_datastore -d mysql

buildmysql

web docker

# 3-建立web docker(wordpress)链接mysql数据库docker
docker run --link=my_mysql:mysql -p 80:80 -d wordpress

buildweb

以上步骤完成之后,查看docker ps 正在运行的container
ps
可以看到db、web两个docker正在运行,file已退出。但是其实我们仅需要file的volume即可。

现在用浏览器打开本地80端口即可看到wordpress的页面

phpinstall

工具应用 - 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
    fileexample

  • 同理我们补充剩下的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

    dockercomposeall

可以看到应用已经成功启动了。同时通过docker ps 可以看到web应用映射了本地计算机的32769端口。

扩展web应用

当一个web应用不足以应付并发请求时,docker可以很方便的扩展 ,使用scale即可

docker-compose scale web=3

docker-compose-scale

如上图可以看到通过scale添加了3个web应用,分别映射了32771,32772,32770端口。

猜你喜欢

转载自blog.csdn.net/tzdwsy/article/details/52020477