Docker学习

Docker入门

  我们用的传统虚拟机如VMwareVisualBox之类的需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用。每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。

  而容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。

  容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。

特性容器虚拟机
启动 秒级 分钟级
硬盘使用 一般为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命令查看所有镜像,如果存在 REPOSITORYnginxTAGv1 的信息,就表示构建成功。

  启动容器: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

安装ES

 下载: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接口

 

原文地址:https://www.cnblogs.com/hucheng1997/p/11552547.html