- Docker 是什么?
- Docker 的三个概念
- 镜像的基本操作
- 运行一个hello world
- 运行一个后台任务
- 将宿主机的 /host/src 目录挂载到 /opt/webapp
- 同上,不过是只读挂载
- 随机分配端口
- 指定端口
- 指定绑定ip地址和端口
- 指定udp映射
- attach命令
- 使用attach命令有时候并不方便,当多个窗口同时使用attach命令链接到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法进行操作
- exec命令(推荐方式)
- nsenter工具
- 先安装 nsenter工具
- 为了使nsenter链接到容器,还需要找到容器的pid
- 通过这个pid就可以连接到这个容器
- 通常情况,可以把工具写成一个脚本更为方便
- !/bin/bash
Docker 是什么?
- Docker 是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中
- Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样
- 总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样
Docker 的三个概念
- 镜像(image):是一个只读的模板,类似于安装系统用到的那个 iso 文件,任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境。我们通过镜像来完成各种应用的部署。镜像可以用来创建 Docker 容器
- 容器(Container):容器类似于虚拟机本身。它可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。可以把容器看做是一个简易版的 linux 环境(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。注意:镜像本身是只读的,容器从镜像启动时,Docker 在镜像的上层创建一个可写层,镜像本身不变
仓库(Repository):类似于代码仓库,这里是镜像仓库,是 Docker 用来集中存放镜像文件的地方。仓库分为公开仓库和私有仓库。 最大的公开仓库是 Docker hub(hub.docker.com),国内公开仓库(dockerpool.com)。一般每个仓库存放一类镜像,每个镜像利用 tag 进行区分,比如 Ubuntu 仓库存放有多个版本(12.04、14.04等)的 Ubuntu 镜像。
镜像的基本操作
Build(构建镜像):镜像就像是集装箱包括文件以及运行环境等等资源
- Ship(运输镜像):主机和仓库间运输,这里的仓库就像是超级码头一样
Run (运行镜像):运行的镜像就是一个容器,容器就是运行程序的地方
编写 Dockerfile 文件
Dockerfile 是为了快速构建镜像,Dockerfile 由一行行命令语句组成,并且支持以#开头的注释行。Dockerfile 分为4个部分:基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令,例如:
# 第一行必须制定基本的基础镜像FROM centos# 维护者信息MAINTAINER docker_user docker_user@email.com# 镜像的操作指令RUN echo "hello world"RUN yum update && yun install -y net-toolsRUN yum install -y nginx# 容器启动时执行指令CMD /usr/sbin/nginx
命令解释:
FROM:指定所创建镜像的基础镜像,如果本地不存在,则默认会去 Docker Hub 下载指定镜像
- MAINTAINER:指定维护者信息,该信息会写入生成镜像的Author属性域中
- RUN:运行指定命令
- CMD:用来指定启动容器时默认执行的命令
- EXPOSE:声明镜像内服务所监听的端口
- ENV:指定一个环境变量,会被后续 RUN 指令使用,在镜像启动的容器中也会存在
- ADD:将本地的一个文件或目录拷贝到容器的某个目录里
使用 Dockerfile 创建镜像
Dockerfile 可以理解为一种配置文件,用来告诉 docker build 命令应该执行哪些操作。编写完 Dockerfile 之后,可以通过 docker build 命令来创建镜像
语法:docker build [选项] 内容路径
该命令将读取指定路径下的 Dockerfile,并将该路径下的所有内容发送给 Docker 服务端,由服务端来创建镜像。因此除非生成镜像需要,否则一般建议放置 Dockerfile 的目录为空目录
可以使用 -f 选项来指定其路径,可以使用-t选项来指定生成镜像的标签信息# 其中-t用来指定新镜像的用户信息、tag等。最后的点表示在当前目录寻找Dockerfiledocker build -t="test/base-image" .
获取镜像
语法:docker pull NAME[:TAG]
其中,NAME 是镜像仓库的名称(用来区分镜像),TAG 是镜像的标签(用来表示版本信息)# 拉取镜像docker pull centos:6.7
查看镜像
语法:docker images
其它常用命令
```dockerfile运行一个hello world
docker run -it centos:6.7 /bin/echo hello world
运行一个后台任务
docker run -ti -d centos:6.7 /bin/bash -C “ while true ;do echo helloworld;sleep 1;done”
将宿主机的 /host/src 目录挂载到 /opt/webapp
docker run -ti -v /host/src:/opt/webapp centos:6.7 /bin/bash
同上,不过是只读挂载
docker run -ti -v /host/src:/opt/webapp:ro centos:6.7 /bin/bash
随机分配端口
docker run -d -P wordpress
指定端口
docker run -d -p 8080:8080 wordpress
指定绑定ip地址和端口
docker run -d -p 127.0.0.1:8080:8080 wordpress
指定udp映射
dpcker run -d -p 8080:8080/udp wordpress
<a name="abdBa"></a>## 容器的基本操作<a name="X1dyD"></a>### 创建容器当使用 docker run 来创建并启动容器时,Docker 在后台运行的标准操作:1. 检查本地是否存在指定的镜像centos,不存在就从公有仓库下载2. 利用镜像创建并启动一个容器3. 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层4. 从宿主主机配置的桥接网络接口中桥接一个虚拟接口到容器中去5. 从地址池配置一个IP地址给容器6. 执行用户指定的应用程序7. 执行完毕后,容器被终止```dockerfile# 创建容器# docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它docker create -it {image_name}# 启动容器docker start {container_id}# 新建并启动容器# 用下载到的镜像开启容器,-i表示让容器的标准输入打开,-t表示分配一个伪终端,要放到镜像名字前面docker run -t -i centos /bin/bash# 守护态运行容器docker run -itd centos /bin/bash
终止容器
语法:docker stoop [container]
可以使用 docker stop 来终止一个运行中的容器
进入容器
进入容器有以下3种方法:
- attach 命令
- exec 命令(推荐方式)
- nsenter工具
```dockerfile
attach命令
使用attach命令有时候并不方便,当多个窗口同时使用attach命令链接到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法进行操作
docker attach mynginx
exec命令(推荐方式)
docker exec -it mynginx /bin/bash
nsenter工具
先安装 nsenter工具
yum install -y util-linux
为了使nsenter链接到容器,还需要找到容器的pid
PID=$(docker inspect —format “{{.State.Pid}}” <container>)
通过这个pid就可以连接到这个容器
nsenter -t $PID -u -i -n -p
通常情况,可以把工具写成一个脚本更为方便
[root@localhost ~]# cat ns.sh
!/bin/bash
PID=docker inspect --format "{{.State.Pid}}" $1
nsenter -t $PID -u -i -n -p
[root@localhost ~]# ./ns.sh mynginx
```
Docker 官方文档:https://docs.docker.com/
