我们用的传统虚拟机如VMware
,VisualBox
之类的需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用。每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。
而容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。
容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般是几十个 |
Docker中包括三个基本的概念
Image (镜像) | Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。 |
---|---|
Container (容器) |
容器 (container) 的定义和镜像 (image) 几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。 |
Repository (仓库) |
Docker 仓库是集中存放镜像文件的场所。仓库又可以分为两种形式:public(公有仓库)、private(私有仓库) |
docker常用命令
拉取镜像:docker pull image_name
拉取某个版本的镜像:docker pull centos:latest
查看镜像:docker images
查看运行中的启动:docker ps
启动容器:docker start container_name/container_id
重启容器:docker restart container_name/container_id
关闭容器:docker stop container_name/container_id
进入容器:docker run container_name/container_id
删除镜像:docker rmi image_name
Dockerfile
Dockerfile
是自动构建docker
镜像的配置文件, 用户可以使用Dockerfile
快速创建自定义的镜像。
Dockerfile
是由一行行命令语句组成,并且支持已 #
开头的注释行。
一般来说,我们可以将 Dockerfile
分为四个部分:
-
基础镜像(父镜像)信息指令FROM
-
维护者信息指令MAINTAINER
-
镜像操作指令RUN、EVN、ADD和WORKDIR等
-
容器启动指令CMD、ENTRYPOINT和USER等
多少多少
Dockerfile常用指令
FROM
FROM是用于指定基础的images,一般格式为FROM <image> or FROM <image>:<tag>
,所有的Dockerfile都用该以FROM开头,FROM命令指明Dockerfile所创建的镜像文件以什么镜像为基础,FROM后面的所有指令都会在FROM的基础上进行创建镜像。可以在同一Dockerfile中多次使用FROM命令创建多个镜像。比如我们要指定python2.7的基础镜像,如:FROM python:2.7
;
MAINTAINER
MAINTAINER是用于指定镜像创建者和联系方式,一般格式为MAINTAINER<name>
。如:MAINTAINER HC<hc@mi.com>
COPY
COPY是用于复制本地主机的<src>
(为Dockerfile所占的相对路径)到容器中的<dest>
。
当使用本地目录为源目录时,推荐使用COPY。一般格式为COPY <src><dest>
。例如我们要拷贝当前目录到容器的/app目录下,命令为COPY . /app
WORKDIR
WORKDIR用于配合RUN、CMD、ENTRYPOINT命令设置当前工作路径。可以设置多次,如果是相对路径,则相对当前工作路径。可以设置多次,如果是相对路径,则相对前一个WORKDIR命令。默认路径为/。一般格式为WLRKDIR /path/to/work/dir
。例如我们设置/app路径,命令为WORKDIR /app
RUN
RUN用于容器内部执行命令。每个RUN命令相当于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。一般格式为RUN <command>
。例如我们要安装python依赖包,命令为RUN pip install -r requirements.txt
EXPOSE
EXPOSE命令用来指定对外开放的端口。一般格式为EXPOSE <port> [<port>...]
,例如EXPOSE 5000
ENTRYPOINT
ENTRYPOINT可以让你的容器变得像一个可执行程序一样。一个Dockerfile中只能有一个ENTRYPOINT,如果有多个,则最后一个生效。
ENTRYPOINT命令也有两种格式:
1、ENTRYPOINT["executable","param1","param2"]
:推荐使用的exex形式
2、ENTRYPOINT command param1 param2
:shell形式
例如,我们要讲python镜像变成可执行的程序,命令为:ENTRYPOINT ["python"]
CMD
CMD命令用于启动容器时默认执行的命令,CMD命令可以包含可执行文件,也可以不包含可执行程序,不包含可执行文件的情况下就要用ENTRYPOINT指定一个,然后CMD命令的参数就会作为ENRTYPOINT的参数。
CMD命令有三种格式:
1、CMD ["executable","param1","param2"]:推荐使用的exec形式
2、CMD ["param1","param2"]:无可执行程序形式
3、CMD command param1 param2:shell形式
一个Dockerfile中只能有一个CMD,如果有多个,则最后一个生效。而CMD的shell形式默认调用/bin/sh -c执行命令。CMD命令会被Docker命令行传入的参数覆盖:docker run busybox /bin/echo Hello Docker会把CMD里的命令覆盖。例如我们要启动/app,我们可以用如下命令实现:CMD ["app.py"]
构建Dockerfile
mkdir static_web cd static_web touch Dockerfile vim Dockerfile ------ FROM nginx MAINTAINER Angel_Kitty <angelkitty6698@gmail.com> RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html ------
在Dockerfile文件所在目录执行:docker build -t angelkitty/nginx_web:v1 .
; -t是为新镜像设置仓库和名称,其中angelkitty为仓库名,nginx_web为镜像名,:v1为标签(不添加为默认latest)。
构建完成后,使用docker images命令查看所有镜像,如果存在 REPOSITORY
为 nginx
和 TAG
是 v1
的信息,就表示构建成功。
启动容器:docker run --name nginx_web -d -p 8080:80 angelkitty/nginx_web:v1
,访问localhost:8080,页面返回Hello Docker!即成功。
安装相关
安装docker
安装一些必要的系统工具:sudo yum install -y yum-utils device-mapper-persistent-data lvm2 添加软件源信息:sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 更新 yum 缓存:sudo yum makecache fast 安装 Docker-ce:sudo yum -y install docker-ce 启动 Docker 后台服务:sudo systemctl start docker
安装mysql
下载:docker pull mysql:5.6 启动mysql并指定root用户的密码:docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 -d mysql:5.6
安装redis
下载:docker pull redis:3.2 启动:docker run -p 6379:6379 -v $PWD/data:/data -d redis:3.2 redis-server --appendonly yes 查看redis运行的id:docker ps 启动redis客户端:docker exec -it 1bab7f78eccc redis-cli
下载:docker pull elasticsearch:2.4.4 启动:docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch elasticsearch:2.4.4 9300是tcp通讯端口,集群间和TCPClient都走的它,9200是http协议的RESTful接口