容器化运维之路-docker

一 docker

1 历史的进化



物理机应用安装比较麻烦:部署非常慢,成本高,资源浪费(比方说有的计算耗费cpu不占内存)难于

扩展和迁移

(windows系统向lunix迁移) 受限于硬件

虚拟机模拟资源实现跨平台(jvm) vmware:所谓虚拟化就是在一个主机上创建不同的系统,分配自

己独立的硬件资源,实现一个电脑上运行多个系统,多部署;资源池与资源隔离;很容易扩展缺点vm

需要安装操作系统(系统需要占用很多资源)

容器化技术:不需要安装操作系统,docker上直接创建容器,不需要安装操作系统,节省了资源

总结:容器化是软件层面的隔离,虚拟机是物理机层面的隔离

2 容器化的优点

1 开发和运维工作协调,统一协调工具

2 对于运维来说:实现统一的部署标准,一键发布

3 docker 实现了监控功能

3 运用场景

标准化的迁移方式

统一的参数配置

自动化配置

应用集群监控

开发与运维之间沟通桥梁

4 centos7 下安装docker

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

sudo yum-confifig-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-c

e.repo

sudo yum makecache fastsudo yum -y install docker-ce

sudo service docker start

docker version

docker pull hello-world

docker run hello-world

5 docker体系结构

docker提供了开发,打包,运行应用的平台;

5.1 docker总体架构


如上图docker引擎获取物理机上的资源然后创建并发布可以用的容器

5.2 docker引擎如下:



上图说明安装了docker 就会启动docker daemon 这个守护进程,所有dokcer都是尤其完成,server端

中间层restapi对外提供服务(和客户端通信时候有restapi完成)

6 容器和镜像

1 镜像就是文件,是只读的,提供了运行程序的完整的数据,是应用程序的集装箱

2 容器:镜像的运行的环境 迷你的“lunix操作系统” 由docker负责创建,容器之间互相隔离

7 docker执行流程


如上图:docker pull 镜像时候现在本机上找有没有redis镜像有的话直接放到集装箱中使用,没有去远

程镜像中找,在没有就报错

8 docker配置阿里云镜像

vim /etc/docker/daemon.json

{ "registry-mirrors": ["https://fcpq2phy.mirror.aliyuncs.com"]

}

systemctl daemon-reload

systemctl restart docker

9 docker安装案例

9.1 安装tomcat

docker pull tomcat

docker run -d -p 80:8080 -v /etc/localtime:/etc/localtime --restart=always tomcat

9.2 安装mysql

docker pull mysql:5.7

docker run -p 3306:3306 --name mysql -v /mydata/mysql/log:/var/log/mysql -v

/mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql -e

MYSQL_ROOT_PASSWORD=123456 -d --restart=always mysql:5.7

9.3 docker安装hadoop

首先关闭防火墙

systemctl stop firewalld.service #停止firewall

systemctl disable firewalld.service #禁止firewall开机启动

下载hadoop镜像

docker pull sequenceiq/hadoop-docker:2.6.0

查看镜像

docker images

运行hadoop

docker run -i -t -p 50070:50070 -p 9000:9000 -p 8088:8088 -p 8040:8040 -p

8042:8042 -p 49707:49707 -p 50010:50010 -p 50075:50075 -p 50090:50090

sequenceiq/hadoop-docker:2.6.0 /etc/bootstrap.sh -bash

测试是否安装成功

先进入hadoop容器

docker exec -it ${CONTAINER ID} /bin/bash

执行完成docker run 也就是上一步,该步骤可以省略

cd /usr/local/hadoop-2.6.0

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep

input output 'dfs[a-z.]+'

如果执行mapreduce程序说明安装成功

可以打开浏览器查看

宿主机IP:50070

docker安装完毕

为了正常使用还需安装以下东西

vi /etc/profile

10 利用dockerfifile构建自定义镜像

·10.1 DockerFile是image镜像的描述文件,用于构建自定义镜像

10.2 使用命令创建自定义镜像

在最底部加入下面内容

export HADOOP_HOME="/usr/local/hadoop-2.6.0"

export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

保存:wq

使得配置生效

source /etc/profile

查看命令行是否能用

hadoop version

docker命令行安装完毕

测试jar文件在hadoop中启动

上传一个jar到宿主机

我用hadoop-mapreduce-examples-2.6.0.jar(这个可以自己在网上下一个)

拷贝jar文件到容器

docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径

docker cp /root/hadoop-mapreduce-examples-2.6.0.jar

b7d7f88574fb:/usr/local/hadoop-2.6.0

查看是否成功

docker exec -it b7d7f88574fb /bin/bash

cd /usr/local/hadoop-2.6.0

ls

上传一个文件到hdfs

vi a.txt

输入下面内容

canglaoshi is mylove

xiaoze is mylove

wutenglan is mylove

保存

hadoop创建文件夹

hadoop fs -mkdir -p /wordcount/input

hadoop fs -put a.txt /wordcount/input

hadoop jar hadoop-mapreduce-examples-2.6.0.jar wordcount /wordcount/input

/wordcount/output

查看输出内容

hadoop fs -cat /wordcount/output/part-r-00000

#利用FROM命令设置基准镜像

FROM tomcat:latest

#cd /usr/local/tomcat/webapps

WORKDIR /usr/local/tomcat/webapps

#ADD用于复制本地文件到镜像中

ADD docker-web ./docker-webdocker build -t mytomcat /opt/docker

10.3 运行镜像

docker run -d -p 8080:8080 mytomcat

10.4 访问

http://at3:8080/docker-web/a.jsp

11 dockerfifile基础命令

from

from这个指令是基于基准镜像来设计的。什么叫基于基准镜像?顾名思义,我们在构建新镜像时候,你

要依托于哪个原有的镜像进行扩展。比方说在这里我书写

前面的from自然是Dockerfifile的命令,而后面的centos则是centos远程仓库的镜像。在制作的时候,自

然基于centos:lastest,也就是最新版本来进行扩展。 但是有一些特殊的场景,假设我们并不需要任何

系统,只希望从零开始构建一个镜像的话,这时在我们的文件第一行你可以书写

代表不依赖任何基准镜像,从零开始,这种情况是非常少见的。 而下面的这个事例更说明问题

冒号后面是一个版本,好,这又是什么意思呢?作为from tomcat都知道这是拿tomcat镜像,后面如果

增加了冒号以后,则指明我们要下载某个特定的版本。 在这里9.0.22-jdk8-openjdk就是远程仓库给我

们提供了对应版本。在前面的centos这个位置上,我们没有写冒号,它默认就会给我们下载lastest最新

版,这是Docker的默认规则。 对于from基准镜像来说,这里有一个建议,作为Docker来说,尽量开发

的时候,基于官方提供的Base image基准镜像来进行。 因为官方提供的我们可以认为它是安全的,如

果是由其他第三方所提供的,这里他做了什么手脚我们就不清楚了。

label

label就是说明信息,如果放在程序中就是注释了。label没有任何功能性,它的作用就是写Dockerfifile里

边用于说明.

比方说这里我写了三个label,第一个说明我们的作者是谁?第二个label代表了当前Dockerfifile的版本

号,而第三个说明了当前镜像的用途和描述。这就是label的作用。别小看label的作用,虽然它没有任

何功能,但是却为我们程序维护性提供了极大的便利。试想一下,你看到一年前你自己写的,

Dockerfifile还能想起来它的作用吗?如果此时有这些描述信息,那是多么的方便。

workdir

workdir设置工作目录,它和我们linux的cd命令非常的相似,就是用于设置当前的工作目录,

from centos

from scratch

from tomcat:9.0.22-jdk8-openjdk

label maintainer = "itlaoqi"

label version = "1.0"

label description = "ITLAOQI应用镜像"代表的我们将当前工作目录设置为usr/local,作为这个目录如果不存在的话,默认规则workdir会对其

进行创建。

workdir具备了创建目录的功能,在使用的时候我的建议是workdir虽然可以像cd一样来进行相对路径的

跳转,但我更加建议在使用时使用绝对路径,也就是所有路径都以斜杠开头,书写完整的地址。

add©

add©。这个是两个命令,我放在一块来说,它们功能非常的相似,主要用于复制文件。那么大多数情

况下这里出现ADD你也可以把它替换成copy。

这条语句的作用就是指将hello这个文件复制到我们linux的根路径下。

同样的ADD还有一个高级的功能,就是自动解压缩,如果我们指向的是一个test.tar.gz压缩包的话,后

面跟的路径,它会自动将这个文件解压缩以后放在这个目录中。

那么ADD除了复制功能以外,它比起copy还具备着去拉取远程文件的功能。这和我们在linux系统中使

用的curl或者wget命令非常的相似,可以说ADD它是我们平时构建镜像时非常常用的一个命令,帮助我

们将文件从物理机复制到镜像当中去。

env

ENV设置环境常量,什么是环境常量呢?其实非常好理解。以前我们都在做java,如果jdk要使用的话,

是不是要在系统中设置一个名为java_home的这么一个环境变量,那么在docker中也有类似的设置,这

里使用env再加上环境常量的名字,后面再增加具体的值就行了。

就拿这个例子,env Java_home后边加上这个路径说明java_home它指向了这个地址,也就是

java_home就指代了后面的路径。 那么在使用时可以使用run来运行某个linux的指令,只不过在这使用

${}加上我们环境常量来进行替代。它具体的作用就相当于执行了open jdk8 bin目录下的java应用,并

执行了test.jar。在这儿我们又涉及到了一个新的命令run,run用于执行linux的命令,不过现在我们先不

去讲它,下一节要对它进行详细的讲解。 作为env我们推荐优先去使用,因为它可以提高我们程序的维

护性。 假设在dockerfifile中出现了多处需要执行Java命令的地方,我们只需要设置java_home便可以进

行指代。 假设未来环境发生变化,jdk被放到了其他的位置上,没有关系,只需要改这一处,所有的应

用都会生效。

expose

workdir /usr/lcoal

workdir ./local

ADD hello / #复制到根路径

ADD test.tar.gz / #添加根目录并解压

ENV JAVA_HOME /usr/local/openjdk8

RUN ${JAVA_HOME}/bin/java -jar test.jarexpose暴露容器端口expose它的作用是将我们容器内部的端口对外暴露。书写办法也非常简单,就是

这个单词后边增加对应的端口号就行了。 作为expose,它的作用就是将容器内端口暴露给物理机。

来,我们看一下这张图,作为外侧的红的部分,可以认为这是我们的一台服务器物理机。而内侧我们启

动了一个tomcat容器。这里如果dokcerfifile中定义了expose 8080的话,就相当于在内侧的容器中对外

暴露了8080端口。 同时我们在创建容器的时候。


可以看到这里我做了一个-P8000:8080,它的作用是在物理机也就是外侧的地方,用8000映射到内侧

的8080端口。这样内侧的服务一旦启动,在外侧我们浏览器中输入localhost:8000的话,就可以访问到

内部的8080端口提供的web应用了。这便是expose的用法。 作为Dockerfifile,刚才我给大家演示了最

基础,也是最常见的几个指令,但是这并不能足够支撑我们构建一个镜像,因为在除了复制切换目录暴

露端口之外,还有大量的Linux的命令需要执行。

12 docker的分层


演示镜像分层

EXPOSE 8080

docker run -p 8000:8080 tomcat docker build -t layer /opt/docker-layer/

如上分成四层,每层堆叠

增加内容再次运行

结论:已经创建的镜像层利用缓存 ,没有的继续创建

13 Dockerfifile运行指令

Sending build context to Docker daemon 2.048kB

Step 1/4 : FROM centos

latest: Pulling from library/centos

6910e5a164f7: Pull complete

Digest: sha256:4062bbdd1bb0801b0aa38e0f83dece70fb7a5e9bce223423a68de2d8b784b43b

Status: Downloaded newer image for centos:latest

---> 831691599b88

Step 2/4 : RUN ["echo" , "好好学习"]

---> Running in 726aa64b5ba2

好好学习

Removing intermediate container 726aa64b5ba2

---> 9cd71311b9c7

Step 3/4 : RUN ["echo" , "天天向上"]

---> Running in 9e7d983ffd01

天天向上

Removing intermediate container 9e7d983ffd01

---> 3bb480b54705

Step 4/4 : RUN ["echo" , "文体两开花"]

---> Running in a24c48ee170b

文体两开花

Removing intermediate container a24c48ee170b

---> f087da4a2cf2

Successfully built f087da4a2cf2

Successfully tagged layer:latest

Sending build context to Docker daemon 2.048kB

Step 1/5 : FROM centos

---> 831691599b88

Step 2/5 : RUN ["echo" , "好好学习"]

---> Using cache

---> 9cd71311b9c7

Step 3/5 : RUN ["echo" , "天天向上"]

---> Using cache

---> 3bb480b54705

Step 4/5 : RUN ["echo" , "文体两开花"]

---> Using cache

---> f087da4a2cf2

Step 5/5 : RUN ["echo" , "人人"]

---> Running in 7f657f9e3b05

人人

Removing intermediate container 7f657f9e3b05

---> 2acf52472d87

Successfully built 2acf52472d87

Successfully tagged layer:latest13.1 run 命令

shell命令格式

run yum -y install -y vim

Exec

run ["yum","install","-y","vim"]

使用shell执行时候,当前shell是父进程,生成一个子shell 进程

在子shell执行脚本。脚本执行完后,退出子shell。回到当前的shell

使用exec方式会替换当前的shell进程,并且保持pid不变

指向完毕直接退出 不会到之前的shell环境

13.2 ENTRYPOIT命令

1 ENTRYPOINT(入口点)用于容器启动时候的执行名

2 Dockerfifile中只用最后一个ENTRYPOINT会被执行

3 ENTRYPOINT 推荐使用Exec的格式

13.3 CMD默认命令

1 CMD 用于设置默认执行的命令

2 Dockerfifile中出现多个CMD 只有最后一个会被执行

3 若容器启动时候增加附加的命令 CMD就会被忽略

4 CMD["ps","-ef"] 推荐使用Exec 命令

13.4 验证CMD和RUN命令

Dockerfifile如下 docker build -t runtest /opt/shell/run/

如上CMD中的内容不会被输出

docker run runtest 在容器运行时候CMD中的命令会被执行

容器启动

14 Dockerfifile安装mysql

执行命令创建容器

docker build -t mysqltest /opt/shell/mysql/

执行命令运行容器

docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d --restart=always

mysqltest

15 容器间的单向通信

容器创建后自动分配ip并且ip之间互通过,但是如果mysql换了后在用ip链接就会连不上

FROM centos

RUN echo "image building!!"

# ENTRYPOINT ["ps"]

CMD ["echo","容器启动"]

Sending build context to Docker daemon 2.048kB

Step 1/3 : FROM centos

---> 831691599b88

Step 2/3 : RUN echo "image building!!"

---> Running in 9692e538625d

image building!!

Removing intermediate container 9692e538625d

---> dd4dc8c44f8c

Step 3/3 : CMD ["echo","容器启动"]

---> Running in 8e1571ffa3dd

Removing intermediate container 8e1571ffa3dd

---> 3276d2487614

Successfully built 3276d2487614

Successfully tagged runtest:latest执行命令

docker run -d -p 9000:8080 --name weblink --link mysql12 mytomcat

进入容器

docker exec -it f9741ca9acf9 /bin/bash

测试

ping mysql2

16 Bridge网桥双向通信

把需要通信的容器放到一个网桥上,所有容器就可以互通互联了

1 展示docker中的网桥

docker network ls

2 创建网桥

docker network create -d bridge mybrige

3 查看就可以看到网桥

4把容器放到创建的网卡中去

docker network connect mybrige weblink

docker network connect mybrige lucid_mirzakhani

5测试容器之间的互通

17 容器存储数据共享

docker run -d -p 9876:8080 --name gongxiang -v /etc/profifile:/etc/profifile mytomcat

18 docker -Compose

1 单机多容器部署工具

2 通过yml文件定义多容器如何部署

3 mac默认提供doker compose,lunix需要安装

19 docker常用命令

systemctl restart docker : 重启docker

systemctl start docker : 启动docker

docker run -it 75835a67d134 以id启动 centos

docker run -it --name mycentos01 centos 启动给容器实例起别名

docker ps 列出所有正在运行的容器

docker ps -l 上次运行的

docker ps -lq 上次运行的id docker stop ea819607411f 温柔停止

docker rm -f mycentos02 强制删除 容器

docker rm -f $(docker ps -a -q) 删除所有的容器

docker rm $(docker ps -a -q) 删除已经停止的容器

docker pull tomcat:latest :latest 是 默认的 下载镜像

docker rmi tomcat 下载镜像

docker rmi -f hello-world 强制删除

docker rmi -f hello-world nginx 级联删除

docker run -it -p 6666:8080 tomcat 启动tomcat

docker run -it -P tomcat :随机访问tomcat 的端口 docker的端口随意

docker run -d -p 7777:8080 tomcat -d 后台启动tomat

docker inspect nginx (查看镜像) (副容器)

docker run -it --name centos2 --volumes-from centos1 centos(元镜像)地方hj

docker run -it --name centos5 --volumes-from centos4 centos

docker run -it -v /mydatavalue:/datavalue centos v 后面第一个是宿主机的目录 :/是容器里面的

docker ps -l 最近关闭的容器

docker start 40163807b5b 再次运行

docker attach 40163807b5bc 进入容器

docker rm $(docker ps -qf status=exited) 删除容器 已经停止

1 创建镜像 dockerfifile方式

docker build -f /mydocker/dockerfifile -t mydockert . (注意最后一定有一个点)

1 创建镜像

docker build -f /mydocker/dockerfifile -t mydockert . (注意最后一定有一个点)

docker exec -it 80dab0358349 /bin/bash 进入容器 查看错误日志

crtl +P+Q 退出容器

systemctl enable docker 开机启动

docker ps -qf status=exited //查找停止的容器

//容器内 vim 命令不可以使用的解决

1)进入容器后用命令apt-get update下源库

2)然后执行apt-get install vim命令

2.重新启动一个容器

[root@localhost ~]# docker start ovcer_the_container

ovcer_the_containerdocker run -it -w /opt/docker/tomcat -v /etc/localtime:/etc/localtime -d -p 80:8080 --

restart=always tomcat //带有重启泽洛的启动nginx

docker run -v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone -d -p 9095:8080 --

restart=always tomcat

前面是 宿主机 后面是容器内部

docker inspect -f "{{ .RestartCount }}" 17e398306157 //查看重启次数

docker run -d -p 9091:8080 -p 9096:8080 -p 9098:8080 --restart=always tomcat 一次启动多个端

你可能感兴趣的:(容器化运维之路-docker)