附录B
最后更新于:2022-04-01 05:11:16
# 联合文件系统
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。
Docker 中使用的 AUFS(AnotherUnionFS)就是一种联合文件系统。 AUFS 支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS 里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。
附录A
最后更新于:2022-04-01 05:11:14
# Dockerfile
* __FROM:__ `镜像`
* __MAINTAINER:__ `镜像创建者`
* __RUN:__ `执行命令`
* __ENV:__ `设置环境变量`
* __USER:__ `使用哪个用户跑container`
* __EXPOSE:__ `container内部服务开启的端口`
* __COPY:__ `将文件<src>拷贝到container的文件系统对应的路径<dest>`
* __VOLUME:__ `可以将本地文件夹或者其他container的文件夹挂载到container中`
* __WORKDIR:__ `切换目录,同cd`
* __ONBUILD:__ `指定的命令在构建镜像时并不执行,而是在它的子镜像中执行`
* __CMD__
1. container启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.
2. CMD主要用于container时启动指定的服务,当docker run command的命令匹配到CMD command时,会替换CMD执行的命令
* __ENTRYPOINT__
1. container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条
2. ENTRYPOINT没有CMD的可替换特性
* __ADD__
1. 将文件<src>拷贝到container的文件系统对应的路径<dest>
2. 所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0
3. 如果文件是可识别的压缩格式,则docker会帮忙解压缩
4. 只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了
5. 可拷贝url路径的文件
镜像的备份与恢复
最后更新于:2022-04-01 05:11:11
# 镜像的备份与恢复
* `docker save`
> 导出镜像到本地文件
``` shell
# Usage
$ docker save [OPTIONS] IMAGE [IMAGE...]
# 导出golang镜像
$ sudo docker save --output golang.tar golang:1.2
```
* `docker load`
> 从本地文件导入文件到镜像库
``` shell
# Usage
$ docker load [OPTIONS]
# 导入golang镜像
$ sudo docker load --input golang.tar
```
* `docker export`
> 导出容器快照到本地文件
``` shell
# Usage
$ docker export [OPTIONS] CONTAINER
# 导出hello容器快照
$ sudo docker export --output hello.tar
```
* `docker import`
> 从容器快照文件中再导入为镜像
``` shell
# Usage
$ docker import [OPTIONS] URL|- [REPOSITORY[:TAG]]
# 导入hello快照,并制定镜像标签为hello:1.0
$ cat hello.tar | sudo docker import - hello:1.0
```
容器的连接
最后更新于:2022-04-01 05:11:09
# 容器的连接
> 提供容器之间的安全交互,在创建容器时通过指定--link参数即可实现容器之间的交互
* 创建基于`MongoDB`的容器(不指定映射端口)
``` shell
$ sudo docker run --name db2 -d mongo:3.1
```
* 查看`db2`容器内部的ip地址
``` shell
$ sudo docker exec -i db2 cat /etc/hosts
```
* 更改`web.tar.gz`中的配置文件,并创建`web:2.0`镜像
``` shell
$ sudo docker build -t web:2.0 .
```
* 创建基于`web:2.0`的`web2`容器,并连接到`db2`容器(`db2`容器必须处于运行状态)
``` shell
# --like name:alias
$ sudo docker run --name web2 --link db2:db2 -p 8080:5800 -d web:2.0
```
使用Docker简单部署基于MongoDB的Golang应用程序
最后更新于:2022-04-01 05:11:07
# 使用Docker简单部署基于MongoDB的Golang应用程序
* 将需要部署的程序clone到本地
``` shell
$ git clone https://git.oschina.net/lyric/docker-mgo-sample.git
```
* 创建并运行基于`MongoDB`的容器
``` shell
# -d 表示使容器在后台运行
# -p 表示指定当前宿主系统的27017端口映射到容器内部的27017端口
$ sudo docker run --name db -d -p 27017:27017 mongo:3.1
```
* 将当前备份的数据卷恢复到`db`容器
``` shell
$ sudo docker run --rm --volumes-from db -v $(pwd):/backup ubuntu:14.04 tar xvf /backup/backup.tar
```
* 使用`Dockerfile`创建`web:1.0`镜像
> 注意:按需要调整`web.tar.gz`中`conf.ini`配置文件
``` shell
$ sudo docker build -t web:1.0 .
```
* 创建并运行基于`web:1.0`的容器(开启web服务)
``` shell
$ sudo docker run --name web -d -p 80:5800 web:1.0
```
数据卷的使用
最后更新于:2022-04-01 05:11:05
# 数据卷的使用
> 数据卷是一个位于容器中的特殊目录, 其目的是绕过UFS文件系统提供持久化和数据共享(UFS的详细介绍请参考附录B).
* 数据卷可以在容器之间共享和重用数据
* 对数据卷的修改是直接的
* 更新镜像不会包含对数据卷的数据
* 数据卷一直存在, 直到不再有容器使用
## 添加数据卷
> 在创建容器时通过指定-v参数创建数据卷,可使用-v多次挂载多个数据卷
``` shell
# Usage
# 其中HOST_PATH表示宿主系统的文件系统路径,CONTAINER_PATH表示容器的文件系统路径
# 文件系统路径都为绝对路径
$ docker run -v [HOST_PATH]:[CONTAINER_PATH] IMAGE [COMMAND] [ARG...]
# 创建一个基于ubuntu:14.04的数据卷容器
$ sudo docker run --name mydata -d -v /data ubuntu:14.04 /bin/bash
```
## 挂载宿主系统目录作为数据卷
``` shell
# 创建一个基于golang:1.2的容器,并指定宿主系统/gopath路径为GOPATH路径
# 宿主系统中如果不存在该目录,Docker会自动创建
$ sudo docker run --name mygolang -d -v /gopath:/gopath golang:1.2 /bin/bash
```
## 挂载数据卷容器
> 挂载数据卷容器主要用于容器间数据共享
``` shell
# 在创建容器时通过指定--volumes-from参数挂载数据卷容器
# 将上面创建的mydata容器中/data数据卷,挂载到另外一个容器中
$ sudo docker --name db1 -d --volumes-from mydata ubuntu:14.04 /bin/bash
```
## 数据卷的备份与恢复
* 备份
``` shell
# 备份mydata容器中的数据卷/data,到当前目录下的backup.tar文件中
$ sudo docker run --rm --volumes-from mydata -v $(pwd):/backup ubuntu:14.04 tar cvf /backup/backup.tar /data
```
* 恢复
``` shell
# 恢复本地目录下的backup.tar文件到mydata容器下的/data数据卷
$ sudo docker run --rm --volumes-from mydata -v $(pwd):/backup ubuntu:14.04 tar xvf /backup/backup.tar
```
构建镜像
最后更新于:2022-04-01 05:11:02
# 构建镜像
> 构建Golang编译环境
## 使用容器创建镜像
* 创建并运行一个容器(基于ubuntu:14.04镜像)
``` shell
$ sudo docker run --name golang -it ubuntu:14.04 /bin/bash
```
* 安装Golang编译器
``` shell
$ apt-get update
$ apt-get install -y golang
# 清除apt缓存
$ rm -rf /var/lib/apt/lists/*
```
* 配置Golang编译环境
``` shell
$ mkdir /gopath && cd /gopath && mkdir bin src
$ export GOPATH=/gopath
$ export PATH=$PATH:$GOPATH/bin
```
* 构建Golang镜像
``` shell
# Usage docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
$ docker commit -m 'Golang compiler.' golang golang:test
```
## 使用Dockerfile构建镜像
> 以上述操作为例,介绍一些常用指令,具体了解可参考附录A
* Dockerfile指令
``` Dockerfile
# 基础镜像
# Usage: FROM image:tag
FROM ubuntu:14.04
# 指定维护者信息
# Usage: MAINTAINER name
MAINTAINER tiannianshou@gmail.com
# 在shell中运行命令
# Usage: RUN command
RUN apt-get update && \
apt-get install -y golang && \
rm -rf /var/lib/apt/lists/* && \
mkdir -p /gopath
# 指定环境变量
# Usage: ENV key value
ENV GOPATH /gopath
ENV PATH $GOPATH/bin:$PATH
# 工作目录
# Usage: WORKDIR /path
WORKDIR /gopath
# 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等
# Usage: VOLUMES
VOLUMES ["/gopath"]
# 容器暴漏给外侧的端口号
# Usage: EXPOSE port [port...]
EXPOSE 80
# 指定启动容器时执行的命令
# Usage: CMD ["executable","param1","param2"]
CMD ["/bin/bash"]
```
* 构建镜像
``` shell
# 使用指定的Dockerfile创建镜像
# Usage: docker build [OPTIONS] PATH | URL | -
# .表示当前目录
$ sudo docker build -t golang:1.2 .
```
简单的Docker练习
最后更新于:2022-04-01 05:11:00
# 简单的Docker练习
## 常用的docker命令
* `docker pull`
> 获取镜像
``` shell
# Usage
$ docker pull [OPTIONS] Name[:TAG]
# 获取ubuntu 14.04版本的镜像
$ docker pull ubuntu:14.04
```
* `docker images`
> 查看镜像列表
``` shell
# Usage
$ docker images [OPTIONS] [REPOSITORY]
```
* `docker rmi`
> 移除镜像(使用中的镜像不能被移除)
``` shell
# Usage
$ docker rmi [OPTIONS] IMAGE [IMAGE...]
# 强制移除ubuntu:14.04镜像
$ docker rmi -f ubuntu:14.04
```
* `docker run`
> 创建并运行一个新的容器
``` shell
# Usage
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 创建一个基于ubuntu:14.04的容器
$ docker run -it --name hello ubuntu:14.04 /bin/bash
# -t 表示返回一个 tty 终端,-i 表示打开容器的标准输入,使用这个命令可以得到一个容器的 shell 终端
# --name 表示容器的名称
```
* `docker ps`
> 查看容器列表(默认状态为运行中的容器)
``` shell
# Usage
$ docker ps [OPTIONS]
# 查看所有容器
$ docker ps -a
```
* `docker exec`
> 进入容器(运行中)
``` shell
# Usage
$ docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# 示例
$ docker exec -it hello /bin/bash
```
* `docker rm`
> 移除一个或多个容器(不能移除运行中的容器)
``` shell
# Usage
$ docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 强制移除容器
$ docker rm -f hello
```
## 配置nginx服务器
1.获取`nginx`镜像
``` shell
$ sudo docker pull nginx
```
2.在`$HOME/www`目录下创建一个`index.html`文件
``` shell
$ mkdir $HOME/www && cd $HOME/www
$ echo '欢迎使用docker' > index.html
```
3.使用`nginx`镜像创建一个`web`容器
``` shell
$ sudo docker run --name web -d -v $(pwd):/usr/share/nginx/html -p 80:80 nginx
# -d表示让容器在后台运行;-v表示指定当前目录为数据卷,提供nginx文件目录;-p表示映射主机80端口到容器80端口
```
基本概念介绍
最后更新于:2022-04-01 05:10:58
# 基本概念介绍
## 镜像
* Docker 镜像就是一个只读的模板。
* 镜像可以用来创建 Docker 容器。
* Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
## 容器
> 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
* Docker 利用容器来运行应用。
* 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
## 仓库
> 仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
* 仓库分为公开仓库(Public)和私有仓库(Private)两种形式
* 最大的公开仓库是 [Docker Hub](https://registry.hub.docker.com/),存放了数量庞大的镜像供用户下载
* 用户也可以在本地网络内创建一个私有仓库
安装Docker
最后更新于:2022-04-01 05:10:55
# 安装Docker
## 安装的条件
* Docker目前只能在64位CPU架构的计算机上运行(目前只能是x86_64 、amd64)
* Linux 3.8 或 更高版本的内核(Ubuntu 12.04 LTS 及之后的 64位版本)
* 内核必须支持并开启cgroup和命名空间(banespace)功能
## Ubuntu下安装Docker
### 通过Docker源安装最新版本
``` shell
$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install -y lxc-docker
```
### 使用官方提供的shell脚本安装
``` shell
$ sudo apt-get update
$ sudo apt-get install -y curl
# 如果已经安装curl工具可忽略以上两步
$ curl -s https://get.docker.com | sudo sh
```
### 启动Docker服务
``` shell
# 启动服务
$ sudo service docker start
# 停止服务
$ sudo service docker stop
# 重启服务
$ sudo service docker restart
```
Docker的应用场景
最后更新于:2022-04-01 05:10:53
# Docker的应用场景
## 历史介绍
> Docker是一个开源的轻量级容器技术,让开发者可以打包他们的应用以及应用运行的上下文环境到一个可移植的镜像中,然后发布到任何支持Docker的系统上运行。 通过容器技术,在几乎没有性能开销的情况下,Docker为应用提供了一个隔离运行环境。Docker是用Go语言实现的,并遵从Apache2.0协议开源。
## 应用场景
* 简化配置
* 代码流水线管理
* 提高开发效率
* 隔离应用
* 快速部署