Docker介绍
官方:an open source project to pack,ship,and run any application as a lightweight container.
docker是一个可以将任何应用以轻量级容器的形式来打包,发布和运行的开源项目。
术语
English | 中文 |
host | 宿主机 |
image | 镜像 |
container | 容器 |
registry | 仓库 |
daemon | 守护程序 |
client | 客户端 |
Docker Linux安装
运行命令:
sudo wget -qO- https://get.docker.com | sh
// 给出用户名将用户添加到用户组
sudo usermod -aG docker your-user
// 查看docker信息
docker info
- sudo:用root的身份来执行命令
- wget:命令行的一个下载工具命令
- -qO-:精简输出(-q)并输出到标准输出而不是文件(O-)
- sh:下载shell脚本并交给shell执行
Docker架构介绍与实战
架构介绍
Docker daemon是核心程序,做各种各样的docker操作,如下载docker的镜像,运行容器等。通过客户端命令交给Docker daemon来做实际操作。
Dockerfile
通过编写简单的文件自创Docker镜像
输入命令
mkdir dockertest // 创建一个docker测试目录
cd dockertest // 进入docker测试目录
touch Dockerfile // 创建Dockerfile
vim Dockerfile // 对Dockerfile进行编辑
编辑内容如下:
然后保存退出。
继续输入命令:
// 创建images, -t:赋予标签名为hello_docker
docker build -t hello_docker .
// 查看是否成功生成images
docker images hello_docker
// 运行docker
docker run hello_docker
接下来尝试一下稍微复杂的Dockerfile
修改Dockerfile的内容:
同时使用touch index.html新建一个index.html文件,在里面随意写上一点内容。
接下来执行以下命令,显示index.html里的内容则为成功:
// -t:给出TAG jwing:用户名
docker build -t jwing/hello-nginx .
// -d:守护进程化 -p:端口映射
docker run -d -p 80:80 jwing/hello-nginx
// 访问测试
curl http://localhost
Dockerfile语法小结
命令 | 用途 |
FROM | base image |
RUN | 执行命令 |
ADD | 添加文件 |
COPY | 拷贝文件 |
CMD | 执行命令 |
EXPOSE | 暴露端口 |
WORKDIR | 指定路径 |
MAINTAINER | 维护者 |
ENV | 设定环境变量 |
ENTRYPOINT | 容器入口 |
USER | 指定用户 |
VOLUME | mount point |
Volume
Volume提供独立于容器之外的持久化存储
数据卷
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 卷会一直存在,直到没有容器使用,类似于 Linux 下对目录或文件进行 mount。
示例1:运行一个nginx容器,通过-v挂载一个卷
// --name nginx:赋予名字为nginx
docker run -d --name nginx -v /usr/share/nginx/html nginx
// 列出容器所有相关信息
docker inspect nginx
在信息中找到Mounts中的Source,复制其url执行下面的操作。
/*
// mac系统需要先执行(进入主机)
screen ~/Libray/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
*/
// 进入该路径
cd /var/lib/docker/volumes/e7c00d4f12fc19c93d8d641a96040c8c062413c138f8aac7ca33b9481233d77f/_data // 刚才复制的url
// 查看index.html
cat index.html
// 更改index.html
echo "it's index.html" > index.html
/*
// mac系统可通过该命令进入容器
docker exec -it nginx /bin/bash
cd /usr/share/nginx/html/
*/
// 查看index.html,内容被成功修改
cat index.html
示例2:将本地的一个目录挂载到容器的一个数据卷中
首先准备好一个html目录放在当前目录下并在目录中写好一个index.html
// 将当前目录下的html目录映射到容器中
docker run -p 80:80 -d -v $PWD/html:/usr/share/nginx/html nginx
// 测试访问
curl http://localhost
// 在本机host中修改index.html
vi html/index.html
// 测试访问
curl http://localhost
可以发现将本地开发的内容修改后,就可以自动的在容器中反应出来。
示例3:创建一个仅有数据的容器,并将这个容器当做一个volume挂载在其他容器里面去
仅有数据的容器可以被多个容器挂载,做到数据共享
// 创建data目录
mkdir data
// 将当前目录下的data目录创建为仅有数据的容器,目标目录为/var/mydata,名称定义为data_container。 ubuntu:容器的基础镜像
docker create -v $PWD/data:/var/mydata --name data_container ubuntu
// --volumes-from:从另外的容器挂载, /bin/bash:直接进入容器中
docker run -it --volumes-from data_container ubuntu /bin/bash
// 在mount列出的信息中可以找到自己放入的容器所属的目录mydata
mount
// 进入mydata文件夹
cd /var/mydata/
// 随意创建一个文件
touch whatever.txt
// 退出容器
exit
// 查看data目录的内容,可以看到刚才在容器中创建的文件
ls data
镜像仓库(Registry)
Registry实际上是一个saas的服务,提供注册并且存储镜像,使大家能够进行镜像的共享。
国内的一些仓库:
- daocloud
- 时速云
- aliyun
Registry交互命令
- docker search whalesay // 搜索镜像
- docker pull whalesay // 拉取镜像
- docker push myname/whalesay // 上传镜像
搜索镜像:
运行镜像:
上传镜像需要登录docker账号,执行docker push myname/whalesay进行上传。
多容器app(compose)
docker-compose安装:
- Mac/Windows: 自带
- Linux: curl -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose
若安装失败,可以先安装pip后进行安装(ubuntu安装方式,chentOS可使用yum命令安装):
apt-get update
// 安装python-pip
apt-get install python-pip
// 如果有老版的,先删除掉
pip uninstall docker-compose
// 安装docker-compose
pip install docker-compose
// 查看版本,是否成功安装
docker-compose --version
关于实例,网上有很多可以参考:《实战docker,构建nginx反向代理tomcat,学习link和docker-compose》
docker-compose.yml常用命令
命令 | 用途 |
build | 本地创建镜像 |
command | 覆盖缺省命令 |
depends_on | 连接容器 |
ports | 暴露端口 |
volumes | 卷 |
image | pull镜像 |
up | 启动服务 |
stop | 停止服务 |
rm | 删除服务中的各个容器 |
logs | 观察各个容器的日志 |
ps | 列出服务相关的容器 |
Docker命令小结
命令 | 用途 |
docker pull | 获取image |
docker build | 创建image |
docker images | 列出image |
docker run | 运行container |
docker ps | 列出container |
docker rm | 删除container |
docker rmi | 删除image |
docker cp | 在host和container之间拷贝文件 |
docker commit | 保存改动为新的image |