一、Docker简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
一个完整的Docker有以下几个部分组成:
- dockerClient客户端
- Docker Image镜像
- DockerContainer容器
- Docker Daemon守护进程
-
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
-
Docker与虚拟机
首先,需要明白一点,Docker不是不是虚拟机,Docker与虚拟机有着不同的应用场景,Docker常常用于隔离不同应用,提供不同应用运行环境。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。
1. 客户端
-
安装
这里只简单的介绍在Ubuntu下的安装,Docker要求Ubuntu系统的内核版本高于3.10,使用uname -r 可以查看当前内核版本。
现在的apt,apt-get已经比较强大了,使用
apt-get install docker.io
即可安装。 -
常用命令
docker -v #查看版本信息 docker #查看所有命令选项 docker 命令 --help #查看命令的详细信息
-
Hello World
docker run ubuntu:15.10 /bin/echo "Hello world" #可能会有点耗时,这是由于本地没有该镜像,需要下载 #ubuntu:15.10:指定镜像,如果本地没有则会自动从镜像仓库 Docker Hub 下载公共镜像。 #/bin/echo "Hello world":shell语句
2. 镜像(Images)
镜像类似于面向对象编程中的类,也和操作系统的镜像文件类似,是用来创建容器的模板。
-
镜像的使用
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。我们可以在网上(https://hub.docker.com/)查找镜像,也可以使用docker search … 来查找,然后使用docker pull … 来获取
-
管理和使用本地Docker镜像
docker images #列出本地镜像 #各个选项说明 # REPOSITORY:表示镜像的仓库源 # TAG:镜像的标签,表示镜像版本号,同一个镜像可以创建多个版本 # IMAGE ID:镜像ID # CREATED:镜像创建时间 # SIZE:镜像大小 docker pull 镜像名:版本号 #获取一个新的镜像
-
创建镜像
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
-
1.从已经创建的容器中更新镜像,并且提交这个镜像
docker run -t -i ubuntu:15.10 /bin/bash #运行镜像 apt-get update #更新 exit #退出 docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2 #说明:-m:提交的描述信息,-a:指定的镜像作者 #e218edb10161 runoob/ubuntu:v2分别是容器ID和要创建的镜像名和tag
-
2.使用 Dockerfile 指令来创建一个新的镜像
- 创建镜像生成文件
FROM centos:6.7 #版本,Base Image可以从本地拉取也可以从公共库拉取 MAINTAINER Fisher "[email protected]" #生成这个镜像的作者。 #以下是在创建之前在这镜像中执行的语句 RUN /bin/echo 'root:123456' |chpasswd RUN useradd runoob RUN /bin/echo 'runoob:123456' |chpasswd RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local EXPOSE 22 EXPOSE 80 CMD /usr/sbin/sshd -D
- 使用Dockerfile生成镜像
docker build -t runoob/centos:6.7 . #说明:-t :指定生成的镜像名和tag, . :后接镜像生成文件路径,也可以指定绝对路径
-
-
3. 容器(Container)
我的理解是一个运行中的镜像即为一个容器,一个镜像可以运行不同的应用,从而构成不同容器,容器不用像操作系统一样需要安装。
-
启动一个容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] [OPTIONS]:参数可选,可以指定后台运行,默认是不指定后台运行 IMAGE:指定运行容器的镜像文件 [COMMAND]:需要执行的任务 eg: #1. 直接运行不指定参数,结果会直接输出 docker run ubuntu:15.10 /bin/echo "Hello world" #2. 后台运行,-d:指定后台运行 docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done" #3.启动交互式容器,与远程登录了一台操作系统类似 docker run -i -t ubuntu:15.10 /bin/bash
4. 容器连接
一般采用端口映射,在创建时指定
docker run -d -p 5000:5000 ...
#说明:
-p:指定映射关系,如果不指定一般会随机映射,使用docker ps可以查看
例:0.0.0.0:32768->5000/tcp 将本机的容器的5000端口映射为主机的0.0.0.0:32768端口
完整格式为:
-p [ip:]port:port[/tcp/udp]
端口映射并不是唯一把 docker 连接到另一个容器的方法,docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。这里不再做介绍。
5. 常用命令
-
镜像管理
docker images #查看本地所有镜像 docker rmi [OPTIONS] IMAGE [IMAGE...] #删除一个或多个镜像 -f :强制删除; --no-prune :不移除该镜像的过程镜像,默认移除; docker build [OPTIONS] PATH | URL | - #用于使用 Dockerfile 创建镜像。 -t:创建的镜像名字及标签 -f:Dockerfile文件路径默认为当前路径 . :不明所以,必须有, docker pull [OPTIONS] NAME[:TAG|@DIGEST] #获取镜像 docker login -u ... -p ... #登录 docker push [OPTIONS] NAME[:TAG] #上传到镜像仓库,需要先登录 docker logout #退出登录 docker search [OPTIONS] TERM #查找
-
容器相关
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] #创建一个容器 -v $PWD/logs:/wwwlogs:文件映射,将主机中当前目录下的logs挂载到容器的/wwwlogs docker ps : 列出容器 docker start :启动一个或多个已经被停止的容器 docker stop :停止一个运行中的容器 docker restart :重启容器 docker kill [OPTIONS] CONTAINER [CONTAINER...] #杀死一个运行中的容器 docker logs [OPTIONS] CONTAINER
二、实例安装
1. 安装 Nginx
实例安装一遍即镜像的获取,可以使用pull获取也可以自定义创建,自定义创建这里不做介绍。
-
获取
docker pull nginx #获取 docker images nginx #查看
-
使用
docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs -d nginx 说明: -p 80:80:将容器的80端口映射到主机的80端口 --name mynginx:将容器命名为mynginx -v $PWD/www:/www:将主机中当前目录下的www挂载到容器的/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机中当前目录下的nginx.conf挂载到容器的/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs:将主机中当前目录下的logs挂载到容器的/wwwlogs
2. 安装其他实例
docker pull php #安装php
docker pull mysql #安装mysql
docker pull tomcat
docker pull python:3.5
...
使用总结:
–name:重命名
-p:端口映射
-v:文件映射