Docker入门

目录

Docker的作用

Docker的核心概念

Docker安装

镜像命令

        镜像下载

        查看镜像

        搜索镜像

        删除镜像

容器命令

        创建容器

        列出容器

        新建并启动容器(最常使用)

        守护态运行

        启动容器

        终止容器

        重启容器

        进入容器

attach命令

exec命令(最常使用)

        退出容器

        删除容器

 重点:各种参数的作用

核心命令

        日志命令

        查看容器里面的进程

        从容器拷贝文件到主机上

Docker数据管理

        什么是数据卷

        配置数据卷

        数据卷容器

DockerFile

        构建镜像

        常见的13种指令

        CMD和MAINTAINER的区别 

公有云

        发布镜像到DockerHub

        发布镜像到阿里云


 

部分图片来自百战程序员  

Docker的作用

Docker只能在Linux中运行 

开发者需要能方便高效构建应用,并且任何时间任何地点都可以获取。

Docker在开发和运维中的优势

对开发和运维( DevOps)人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任意环境、任意时间让应用正常地运行。而Docker恰恰是可以实现这一终极目标的瑞士军刀。

优势:

  • 更快速的交付和部署
  • 更高效的资源利用
  • 更轻松的迁移和扩展
  • 更简单的更新管理

Docker与虚拟机比较

作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势。

特性

容器

虚拟机

启动速度

秒级

分钟级

磁盘使用

一般为MB

一般为GB

性能

接近原生

弱于

系统支持量

单机支持上千个容器

一般几十个

隔离性

完全隔离

完全隔离

 

Docker的核心概念

  • 镜像(Image)
  • 容器 (Container)
  • 仓库 (Repository)

Docker 镜像 (Image) 类似于虚拟机镜像,可以将它理解为个面向 Docker引擎的模板,包含了文件系统。

镜像从何而来

  • 从Docker Hub下载 原理相当于maven-> 中央仓库
  • 通过Docker file自己创建出来

Docker容器

Docker容器(Container)类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。

注意:

容器和镜像一样,也是若干层的叠加,唯一区别是所有只读层的最上面一层,是一层可读可写层,可以记住这个简单的公式:容器 = 容器镜像 + 可读可写层

 

Docker仓库

Docker仓库(Repository)类似于代码仓库,是Docker集中存放镜像文件的场所。目前,最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供稳定的国内访问。

注意:

Docker利用仓库管理镜像的设计理念与Maven非常相似。

 

咱们再来理解docker的两句口号就更好理解了

  • 「Build, Ship and Run (搭建,发送给同事,同事即可运行)」
  • 「Buildonce,Runanywhere (搭建一次,运行到任何地方)」

 

Docker安装

系统环境

序号

软件

版本

1

Centos

7.5

2

Linux内核

3.8之上

关闭防火墙

systemctl stop firewalld

关闭selinux

vim /etc/selinux/config

SELINUX=disabled

安装docker引擎

yum install -y  docker

启动docker

systemctl start docker

设置docker自启动

systemctl enable docker

测试docker是否安装成功

docker run hello-world

镜像命令

        镜像下载

Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

镜像下载

镜像是Docker运行容器的前提。

 

语法格式:

docker pull 镜像名字:[tag]

注意:

如果不指定tag,则下载Docker Hub公共注册服务器中仓库的最新版本。

 例:下载mysql5.7

我这里已经下载过了,所以没有提示下载信息 

 

 

        查看镜像

列出本地主机上已有的镜像。

[root@docker ~]# docker images

REPOSITORY  TAG    IMAGE ID  CREATED  SIZE

参数:

  • 来自于哪个仓库,比如 ubuntu仓库。镜像的标签信息,比如14.04。
  • 镜像的ID号(唯一)。
  • 创建时间。
  • 镜像大小。

镜像的ID信息十分重要,它唯一标识了镜像。

 

        搜索镜像

搜索远端仓库中共享的镜像,默认搜索Docker Hub官方仓库中的镜像。

docker serach  [镜像名字]

参数:

可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级 (表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。

例子:搜索镜像mysql:5.7 

 

        删除镜像

使用镜像的标签删除镜像

docker rmi 源名字

docker rmi image idimage id可以只写前两位)

 

容器命令

        创建容器

Docker的容器十分轻量级,用户可以随时创建或者删除容器。

语法格式

docker create -it 镜像名字

注意:

使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。

 

        列出容器

docker ps

参数:

  • -a: 显示未启动容器
  • -q:返回容器id号

 

        新建并启动容器(最常使用)

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态( stopped)的容器重新启动。所需要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。

语法格式:

docker run 镜像名字 /bin/echo 

Docker在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
  • 利用镜像创建并启动一个容器。
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
  • 从地址池配置一个IP地址给容器。
  • 执行用户指定的应用程序。
  • 执行完毕后容器被终止。

 

下面命令则启动一个bash端,运行用户交互

docker run -t -i 镜像名字  /bin/bash

参数:

其中,-t选项让Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。

exit命令退出。

 

 例子:创建tomcat容器并启动后台运行 

        守护态运行

更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。用户可以通过添加-d参数来实现。

语法格式(run后面加-d即可称为守护态运行)

docker run -d 镜像名字 /bin/bash -c  "while true; do echo hello world ;sleep 1 ;done"

例子:创建tomcat容器并启动后台运行 

        启动容器

处于终止状态的容器,可以通过docker start命令来重新启动:

语法:

docker start 容器id

 

        终止容器

docker restart命令会将一个运行态的容器终止,然后再重新启动

语法:

docker restart 容器id

        重启容器

docker restart命令会将一个运行态的容器终止,然后再重新启动

语法:

docker restart 容器id

 

        进入容器

在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息。某些时候如果需要进入容器进行操作,有多种方法,包括使用docker attach命令、docker exec命令,以及nsenter工具等。

attach命令

语法格式:

docker attach 容器id

注意:

1、但是使用attach命令有时候并不方便。当多个窗口同时attach 到同一个容器的时候,所有窗口都       

会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

2、使用attach命令进入容器过后,使用exit退出,那么容器也会终止

 

exec命令(最常使用)

Docke自1.3版本起,提供了一个更加方便的工具exec,可以直接在容器内运行命令。例如进入到刚创建的容器中,并启动一个bash:

docker exec -it 容器id  /bin/bash

注意:使用了exec命令进入容器,exit退出容器时不会终止容器

 

例子:进入mytomcat5,输出文件列表

 

        退出容器

#如果docker容器在启动的时候没有加 -d 参数

exit # 会直接停止容器并退出

Ctrt + p + q # 容器不停止 并退出

 

        删除容器

语法格式:

docker rm 容器id

参数:

  • -f, --force=false强行终止并删除一个运行中的容器。
  • -l, --link=false删除容器的连接,但保留容器。
  • -V,--volumes=false删除容器挂载的数据卷。

 例子:强制终止并删除mytomcat5容器

 

 重点:各种参数的作用

一、选项说明

官方文档:https://docs.docker.com/engine/reference/commandline/run/

  • -p 映射端口 宿主机端口号:容器内应用端口
  • -P 随机端口
  • --name容器的名字

 

核心命令

        日志命令

语法格式:

docker logs 容器id

参数:

  • -f, --follow 跟踪实时日志
  • --since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
  • --tail string 从日志末尾显示多少行日志, 默认是all
  • -t, --timestamps 显示时间戳
  • --until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

        查看容器里面的进程

语法格式:

docker top 容器id

        从容器拷贝文件到主机上

语法格式:

docker cp 容器id:容器内路径   目录路径

Docker数据管理

        什么是数据卷

什么是容器数据卷

Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)

思考

  • Docker容器删除后,在容器中产生的数据还在吗?

  • Docker容器和外部机器可以直接交换文件吗?

  • 容器之间能进行数据交互?

数据卷概念

  • 数据卷是宿主机中的一个目录或文件。
  • 当容器目录和数据卷目录绑定后,对方修改会立即同步。
  • 一个数据卷可以同时被多个容器同时挂载。
  • 一个容器也可以被挂载多个数据卷。

数据卷作用

  • 容器数据持久化。
  • 外部机器和容器间接通信。
  • 容器之间数据交换。

 

一句话:

卷技术就是为了实现数据的持久化和同步操作,容器间也是数据共享。

 

        配置数据卷

docker run  -v 宿主机目录(文件):容器内目录(文件)

注意事项

  1. 目录必须是绝对路径
  2. 如果目录不存在则会自动创建
  3. 可以挂载多个数据卷

示例

给Tomcat服务器挂载/opt/webapps路径。

docker run -d --name mytomcat -p 8080:8080 -v /opt/webapps:/usr/local/tomcat/webapps tomcat

 

        数据卷容器

 

Volume基本使用

参数:

 create # 创建数据卷 

inspect #查看数据卷元数据 

ls #查看数据卷列表

 prune #删除所有未使用的卷

 rm #删除数据卷

 

 

创建一个自定义容器

docker volume create 容器数据卷名

查看所有容器卷

docker volume ls

查看指定容器卷详情信息

docker volume inspect 容器数据卷名

删除数据卷

docker volume rm 容器数据卷名

使用指定卷容器

有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以tomcat为例:

docker run -d -it --name=容器数据卷名 -p 8080:8080 -v 容器数据卷名:/usr/local/tomcat/webapps tomcat

注意:

-v代表挂载数据卷,这里使用自定数据卷edc-tomcat-vol,并且将数据卷挂载到/usr/local/tomcat/webapps 。如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。

 

DockerFile

        构建镜像

简单示例

在一个空白的文本文件, 命名必须为Dockerfile

vim  Dockerfile

示例1

Dockerfile文件内容:

#基础镜像

FROM centos

#维护者

MAINTAINER baizhan<baizhan@163.com>

#运行命令

RUN "yum install wget"

#启动容器运行命令

CMD echo "hello Dockerfile"

示例2

Dockerfile文件内容:

FROM java:8

MAINTAINER WCC

CMD java -version

构建镜像命令

docker build -t 镜像名字:版本 .

注意

. 代表Dockerfile文件在当前路径

 

        常见的13种指令

 

FROM

指定基础镜像,必须为第一个命令。

指令格式:

FROM <image>

FROM <image>:<tag>

注意:

tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

 

MAINTAINER

维护者信息

指令格式:

MAINTAINER <name>

示例

 MAINTAINER Jasper Xu   MAINTAINER sorex@163.com 

WORKDIR

工作目录,类似于cd命令

指令格式:

WORKDIR /usr/workdir

示例

WORKDIR /a  (这时工作目录为/a)

WORKDIR b  (这时工作目录为/a/b)

WORKDIR c  (这时工作目录为/a/b/c)

示例

WORKDIR /OPT

RUN mkdir docker

WORKDIR /usr/local

RUN echo "test" > a.info

注意: 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

 

RUN

构建镜像时执行的命令

指令语法:

# 1. shell执行

格式 RUN<command>

# 2. exec执行

格式 RUN["executable", "param1", "param2"]

示例

WORKDIR /OPT

RUN mkdir docker

WORKDIR /usr/local

RUN echo "test" > a.info

注意:

RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

 

ADD

将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。

指令格式:

 ADD <src>... <dest> 

 ADD ["<src>",... "<dest>"] 用于支持包含空格的路径示例: 

示例

添加所有以"hom"开头的文件

ADD hom* /mydir/

? 替代一个单字符,例如:"home.txt"

ADD hom?.txt /mydir/  

添加 "test" 到 WORKDIR/relativeDir/

ADD test relativeDir

添加 "test" 到 /absoluteDir/

ADD test /absoluteDir/

 

COPY

功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。

语法格式:

COPY <源路径>  <目标路径>

示例

COPY ./start.sh /start.sh

 

CMD

构建容器后调用,也就是在容器启动时才进行调用。指定这个容器启动的时候要运行的命令只有最后一个会生效可被替换。

指令格式:

CMD指令与RUN指令相似,也具有两种格式:

1. shell格式:CMD <命令>

2. exec格式: CMD ["可执行文件", "参数1", "参数2", …]

示例

CMD echo "This is a test." | wc -

CMD ["/usr/bin/wc","--help"]

注意: CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

 

ENTRYPOINT

配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

指定容器启动的要运行的命令,可以追加命令

指令格式:

ENTRYPOINT ["executable", "param1", "param2"]

ENTRYPOINT command param1 param2 (shell内部命令)

示例

ENTRYPOINT ["top", "-b"]

注意:

ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

 

ENV

这个指令非常简单,就是用于设置环境变量而已,无论是接下来的指令,还是在容器中运行的程序,都可以使用这里定义的环境变量。

指令格式:

ENV <key>=<value>

示例

ENV JAVA_HOME=/usr/local/jdk1.7.0_79

ENV PATH=$JAVA_HOME/bin:$PATH

 

EXPOSE

指定于外界交互的端口

指令格式:

EXPOSE

示例

EXPOSE 80

注意:

EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。

 

VOLUME

用于指定持久化目录

指令格式:

VOLUME ["/path/to/dir"]

示例

VOLUME ["/data"]

VOLUME ["/var/www", "/var/log/apache2"]

注意:

一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

1 卷可以容器间共享和重用

2 容器并不一定要和其它容器共享卷

3 修改卷后会立即生效

4 对卷的修改不会对镜像产生影响

5 卷会一直存在,直到没有任何容器在使用它

 

USER

USER指令用于将会用以什么样的用户去运行

指令格式:

USER user

USER user:group

注意:

使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

 

ONBUILD

帮助别人定制而准备的

指令格式:

ONBUILD[INSTRUCTION]

示例

FROM centos

WORKDIR /data

ONBUILD RUN mkdir test

FROM test:02

 

        CMD和MAINTAINER的区别 

区别:

  • CMD #指定这个容器启动的时候要运行的命令,可被替换
  • ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令

 

例子

Dockerfile文件

#基础镜像

from centos

#启动容器运行命令

CMD ["ls" ,"-a"]

构建镜像

docker build -t test:v1 .

此时如果运行一下命令则会报错

docker run test:v1 -l

但是如果把CMD换成ENTRYPOINT则可运行,因为CMD是将["ls" ,"-a"]替换为-l,而ENTRYPOINT是在["ls" ,"-a"]后面追加-l

 

公有云

        发布镜像到DockerHub

创建仓库

设置仓库信息

注意:

DockerHub  Docker Hub

 

发布基本命令

注册docker账号

docker login --username=kalista

注意:

填写注册Docker Hub的密码。

 

把容器提交到docker hub上

docker commit -m "镜像描述" -a "作者" 容器id/容器名字 远程库的名字:上传到docker hub上的名字

注意:

  • -m 镜像描述
  • -a 作者

 

将镜像,容器,远程库进行标识

docker tag 镜像id 远程库的名字:上传到docker hub上的名字

将于远程库有标识关系的库提交

docker push 远程库的名字:上传到docker hub上的名字

 

        发布镜像到阿里云

创建仓库

创建镜像仓库

设置命名空间和仓库名字

登录阿里云Docker Registry

docker login --username=1858778****@163.com registry.cn-hangzhou.aliyuncs.com

注意:

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。您可以在访问凭证页面修改凭证密码。

 

将镜像推送到Registry

docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/kalista/mytomcat:[镜像版本号]$

 

将镜像,容器,远程库进行标识

docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/kalista/mytomcat:[镜像版本号]

 

将于远程库有标识关系的库提交

docker push registry.cn-hangzhou.aliyuncs.com/kalista/mytomcat:[镜像版本号]

 

从Registry中拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/kalista/mytomcat:[镜像版本号]

代码都是在阿里云对应仓库中有对应的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值