docker 的实际运用(一) | 学习笔记

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 快速学习docker 的实际运用(一)

开发者学堂课程【4天 Docker 实战-1024程序员节创造营公益课:docker 的实际运用 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/892/detail/14273


docker 的实际运用


目录:

一、docker 基础命令

二、Docker 案例一:创建 busybox

三、docker 案例二:创建 centos

四、dockerfile 概述

五、dockerfile 规则

六、dockerfile 指令

七、dockerfile 操作步骤

八、dockerfile 案例一:启动 apache

九、dockerfile 案例二:启动 nginx

十、docker 镜像命令和容器命令

十一、数据持久化场景

十二、数据持久化类型方式

十三、Harbor 仓库概述,作用,安装及使用

十四、微服务概念,特点,性值及总结


一、docker 基础命令

#从天池基础镜像中获取

pythondocker pull天池镜像:标签;

#docker 构建镜像

docker build -t

registry.cn-shanghai.aliyuncs.com/target:myversion 

#docker 构建镜像并指定 DockerFile

docker build -f ./dockerfile -t

registry.cn-shanghai.aliyuncs.com/target:myversion

#设置默认工作目录

add . /目录名称

#镜像启动后-----执行

sh run.sh,我们目前使用cmd [“sh”,“run.sh”]

#查看镜像或容器的详细信息:

docker inspect[容器 ID /镜像名: tag ]

#给镜像添加一个软链接并改名和标签:

docker tag [oldname:tag]

[newname:tag]

#删除镜像:

docker  rmi 镜像: tag /镜像 ID

#容器和宿主机之间文件复制

docker cp [文件目录 容器 ID :内部路径]

docker cp [容器 ID :内部路径 文件目录]

 

二、案例一:

1. 搜索 busybox 的镜像,并确保为官方镜像

为什么选择使用 busybox

--busybox 镜像非常小,做一些案例测试下载比较快

2:docker 下载该镜像 busybox 的镜像。

3:给镜像创建一个软链接并改名 box:v1。

4:再创建一个软链接改名为 box:v2。

5:删除 box:v2 镜像。

*操作流程*

(1)启动虚拟机,检查防火墙和 Slinux 是否关闭

[root@docker ~] systemctl status firewalld

[root@docker ~] getenforce 0

(2) 检查 docker 是否启动

[root@docker ~] systemctl status docker

(3) 查看 busybox 镜像

[root@docker ~] docker search busybox

(4) 下载 busybox 镜像并检查是否成功

[root@docker ~] docker pull busybox

[root@docker ~] docker images

(5) 给镜像创建一个软链接并改名 box:v1 并检查是否成功

[root@docker ~] docker images

[root@docker ~] docker tag busybox:latest box:v1

查看 ImageID ,如果一样则软连接成功

(6) 再创建一个软链接改名为 box:v2。

[root@docker ~] docker tag busybox:latest box:v2

(7) 删除 box:v2 镜像

[root@docker ~] docker rmi box:v2

至此,第一个案例就此完成


三、案例二:

[root@docker ~]

(没有文件自行创建)

1:下载 centos:7 镜像。并用该镜像启动容器,命名为 centostest ,暴露6446宿主机端口,映射容器内999端口

2:将宿主机 /root/magegood.txt 复制到容器内 /usr/local/

3:再从该容器内的 /root/magestudy.txt 文件复制到宿主机 /tmp

4:删除该容器。

*操作流程*

(1)用该镜像启动容器,命名为 centostest ,暴露6446宿主机端口,映射容器内999端口

[root@docker ~] docker run -itd -p 6449:999 --name centostest centos:7

参数解释:

-itd :固定写法

-p: 暴露的端口号

--name: 修改名字

(3) 查看容器是否启动成功

[root@docker ~] docker ps

(4)将宿主机 /root/magegood.txt 复制到容器内 /usr/local/

[root@docker ~] touch docker.txt

[root@docker ~] docker cp docker.txt 96f7e0d:/usr/local

验证

[root@docker ~]  docker exec -it 96f7e0d /bin/bash

[root@docker ~] ls /usr/local

(5)再从该容器内的 /root/magestudy.txt 文件复制到宿主机 /tmp

[root@docker tmp] ls /tmp

[root@docker tmp] docker cp  96f7e0d :/root/docker.txt /tmp

(6) 删除该容器并检查

删除前需要停掉

[root@docker ~] docker stop 96f7e0d

[root@docker ~]  docker rmi 96f7e0d

[root@docker ~] docker ps  

注意:使用 search 搜索 centos:7 是找不到官方版本的

[root@docker ~] docker search centos:7

[root@docker ~] docker search centos tag 即可搜索官方的

至此,该案例完成


四、Dockerfile

1.概述

dockerfile 可以理解为一个制作镜像的脚本,但远没有脚本复杂。他根据某种格式自定义内容,就可以快速创建出需求的镜像。

docker 容器启动的时候在最上层挂载了一个可写层,比如说我在容器里面创建一个文件,这个文件是存放在可写层的,这时候容器要是销毁了,那么我们对容器的一些写入操作也就没了,我这个文件也会随着容器销毁而销毁了,我们要是想要保存我们对容器的一些写入操作的话,可以使用 commit 命令然后将容器制作成一个镜像,这样下次run起来该镜像的时候,我们之前的写入操作就还存在了。

除了使用 commit 方式制作镜像,还有一种方式就是编写 Dockerfile 然后使用 build 命令来制作镜像了。

2. Dockerfile 的规则

格式:

#是注释
指令建议要大写,内容小写

执行顺序:

docker 是按照 Dockerfile 指令顺序依次执行的,也就是说从上到下

3. 指令

(1)FROM :底层镜像(如系统)

这个 FROM 指令是 dockerfile 的第一个指令,然后指定了基础镜像,后面的所有指令都是运行在该基础镜像环境上的 MAINTAINER 该指令是描述的维护者信息。

底层的系统镜像用的是什么,使用 from 指定,绝大部分情况都用的底层有个系统或者基础的环境用的是什么,对 docker 不熟练使用 centos 镜像即可

(2)RUN:构建时容器内运行的命令。

RUN指令用于在容器中执行命令。我们常用来安装基础软件

镜像安装软件依赖包都可以放在 run 中

(3)COPY:复制 docker 目录中的文件到镜像中。

COPY 指令类似 ADD 指令,但是 ADD 指令范围更广些,ADD 能够自动解压文件,能够访问网络资源,而 COPY 指令做不到。

非目录需要重新指定,放在目录中非常便利,属于好的一种习惯,值得推荐使用目录。

(4)ADD:复制 docker 目录中的文件到镜像中。(过程可以解压)

ADD 指令是用来将宿主机某个文件或目录放到(复制)容器某个目录下面

官方不推荐 ADD ,高级复制功能,需求不精准,推荐使用 COPY

(5)EXPOSE:声明开放端口。

EXPOSE 指令用于暴露容器里的端口,我们在3.5里面演示过了,nginx 暴露的端口是80,但是启动容器的时候需要指定宿主机端口来映射你暴露的端口。需要暴露多个端口的话可以使用多个 EXPOSE ,也可以一个 EXPOSE 指令后面跟多个端口,端口之间用空格隔开

声明不是变更,变更使用 -p 构建容器时候使用

(6)ENV:设置环境变量。

ENV 指令是用于设置环境变量的

底层环境变量需要需提前设置

(7)CMD:容器启动时执行的命令,最多只能执行一条。

CMD 指令是你在容器启动的时候帮你运行的命令,而 RUN 这个指令是构建镜像的时候帮你运行的命令

容器启动时执行命令,最多执行一条

(8)WORKDIR:声明工作目录。类似 cd。

WORKDIR 是指下面的指令都在 WORKDIR 指定目录下面工作,这个与 linux 里面的 cd 差不多

切换目录使用 WORKDIR

做容器轻量级最好,比较小就很好,使用一条命令就不要使用两天命令

3.Dockerfile 步骤

1、创建 dockerfile 目录,名字可以自定义。

在大目录里面创建各种小目录和文档,比较有层次

2、在该目录中编辑 dockerfile。

3、用 COPY 或 ADD ,需要把被 COPY 文件提前放到 dockerfile 目录中。

4、官方推荐用 COPY ,如果需要过程中解压,用 ADD。

5、CMD 字段,需要用[“命令”,”选项1”]这种格式书写。

强制格式写法,必须使用[“命令”,”选项1”],类似于 python 的数组

6、CMD 字段只能写一条命令,且这条命令尽量是前台执行的命令。如果是后台命令,这条命令结束,docker 就会自动关闭。

区别:前台执行命令和后台执行命令

(1)后台命令:

当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。当在后台执行命令时,可以继续使用你的终端做其他事情。适合在后台运行的命令有 find、费时的打印作业、费时的排序及一些 shell 脚本。在后台运行作业时要当心:需要用户交互的命令不要放在后台执行

注意:经常操作的 shell 命令都属于后台命令

(2)前台命令:

top 属于前台命令没有特殊操作会一致出现

为什么字段只能写一条命令?

Pid 为1 的进程持续运行才能执行不断

若 pid 为1的进程挂掉了,docker 会自动关闭

cd /tmp 是一个进程,一旦执行这个命令,shell 就会替换掉 pid 为1的就结束了,整个 docker 就断掉了

 

五、Dockerfile 操作测试

1.用 dockerfile 构建镜像:

docker build -t(设置要构建镜像的名字,最后要加.)

创建基础镜像

Docker 提供了两种方法来创建基础镜像

一种是通过引入 tar 包的形式,

另外一种是通过一个空白的镜像来一步一步构建

scratch 是 Docker 保留镜像,镜像仓库中的任何镜像都不能使用这个名字,使用 FROM scratch 表明我们要构建镜像中的第一个文件层。

如果我们有一个 Linux 下可执行的二进制文件,可以构建一个简单的镜像,仅执行这个二进制。

构建的过程很简单,执行如下命令。

$ docker build -t chello:0.1 .

通过 docker images 命令可以本地的镜像。
$ docker images

2.再运行镜像:

docker run -itd -p 8800:80 [image:tag]

Docker 中的容器运行在操作系统中,共享了操作系统的内核。对于在 Mac、Windows 平台下,则是基于 Linux 虚拟机的内核。

而 Linux 内核仅提供了进程管理、内存管理、文件系统管理等一些基础的管理模块。除此之外,我们还需要一些 Linux 下的管理工具,包括 ls、cp、mv、tar 以及应用程序运行依赖的一些包。

因此我们就需要首先构建一个 Minimal 的操作系统镜像,在此基础上构建 Python 环境,再构建应用镜像。这样就实现了镜像文件分层,今后如果我们需要更新 Python 版本,那么只需要对这一层进行更新就可以。

3.查看镜像:

docker ps -a  确认是启动状态

Docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是上文说到的 UnionFS 。在 Docker 镜像的最底层是 bootfs 。这一层与我们典型的 Linux/Unix 系统是一样的,包含 boot 加载器和内核。

当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs 。

Docker 在 bootfs 之上的一层是 rootfs(根文件系统)。rootfs 就是各种不同的操作系统发行版,比如 Ubuntu,Centos 等等。Docker 核心技术与实现原理 这篇文章,作者阅读了 rootfs 的规范,指出构建 rootfs 一些必须的文件夹。

4.测试:

宿主机用浏览器访问 IP+port 看是否启动成功。


六、dockerfile 案例1

用 dockerfile 创建并启动一个 centos 的 apache 镜像。指定自定义内容。

FROM centos:7

RUN yum -y install httpd

EXPOSE 80

COPY index.html /usr/share/httpd/noindex/index.html

CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

*操作流程*

(1)用 dockerfile 创建并启动一个 centos 的 apache 镜像。指定自定义内容。

[root@docker ~] mkdir dockerfile

[root@docker ~] cd dockerfile

[root@docker dockerfile] ls dockerfile

进去以后是空的,创建很多镜像

[root@docker dockerfile] mkdir apache

在这个目录中创建 dockerfile

[root@docker dockerfile] cd apache

进入 Apache 目录,创建所需 dockerfile

安装 Apache

[root@docker ~] yum -y install httpd

[root@docker ~] systemctl start httpd

自定义网页文件,在指定目录中改

[root@docker ~]Cd /usr/share/httpd/noindex

[root@docker ~]Vim index.html#修改这个文件可自定义页面

[root@docker apache] vim index.html

true

[root@docker apache] vim dockerfile

添加你内容:

FROM centos:7

#现在系统内操作,再写 run

RUN yum -y install httpd

#指定网页文件

EXPOSE 80

#宿主机放到容器,直接写入路径

COPY index.html /usr/share/httpd/noindex/index.html

先把格式写出,再添加东西

Apache 前台启动和后台启动

CMD [“/usr/sbin/httpd”,”-D ”,”FOREGROUND”]

:wq保存退出

(2)构建镜像

[root@docker ~] docker  build -t apache :v1

后台会打印步骤,集东侧客人 file 中写的流程,等待时间较长

看到 successfully 即安装成功

(3)验证

[root@docker ~] docker run -itd -p 345:80 apache:v1

[root@docker ~] docker ps

通过访问宿主机的 ip+ 端口,查看 true 是否能出现,注意防火墙一定要关闭

创建 apache:centos 镜像
使用 docker build 命令创建 apache:centos 镜像,注意命令最后的"."。
[root@docker1 apache_centos]# docker build -t apache:centos .
......
Successfully built ......表示创建镜像成功
此时镜像已经创建成功了。下面,查看本地已有的镜像列表,可见新增的 apache:centos 镜像:

[root@docker1 apache_centos]# docker images
REPOSITORY TAG IMAGE ID CREATEDSIZEapache centos         fe364d4ee9ec 5 minutes ago419.1 MB
......

[root@docker1 apache_centos]# docker run -d -P apache:centos
0fadd02039d6b16ae308faada8497f3ab9d72de73d5dd36a655e188eee9f1859

[root@docker1 apache_centos]# docker psCONTAINER ID IMAGECOMMANDCREATEDSTATUSPORTSNAMES0fadd02039d6 apache:centos"/usr/local/sbin/run."   4 secondsago

Up 3 seconds 0.0.0.0:32769->22/tcp,

0.0.0.0:32768->80/tcp happy_jones

[root@docker1 apache_centos]# curl 127.0.0.1:32768

<html><body><h1>It works!</h1></body></html>

Docker 创建的镜像具有继承性

[root@docker1 apache_centos]# docker port 0fadd02039d6
22/tcp -> 0.0.0.0:32769
80/tcp -> 0.0.0.0:32768
[root@docker1 apache_centos]# vim run.sh
#!/bin/bash
/usr/sbin/sshd &
/usr/local/apache2/bin/httpd -D FOREGROUND
默认会同时启动 SSH 和 Apache 服务。

至此,dockerfile 案例一就此完成!!

 

七、dockerfile 案例2

用 dockerfile 创建并启动一个 centos7 的 nginx 镜像。

Nginx 是一个高性能的Web和反向代理服务器,它具有很多非常优越的特性:

● 作为 Web 服务器:相比 Apache ,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。一个 Nginx 实例能够轻松支持高达50000个并发连接数的响应。
● 作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP ,也可以支持作为 HTTP 代理服务器对外进行服务。Nginx 用 C 编写,不论是系统资源开销还是 CPU 使用效率都比 Perbal 要好得多。
● 作为邮件代理服务器:Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
● Nginx 安装非常方便,配置文件非常简洁(还能够支持 Perl 语法),Bug 非常少。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下进行软件版本的升级。

FROM centos:7

RUN rpm -Uvh  http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

RUN yum -y install nginx

EXPOSE 80

CMD ["nginx","-g","daemon off;"] 

*操作流程*

(1)用 dockerfile 创建并启动一个 centos7 的 nginx 镜像。

直接再系统内安装 nginx 是不行的,自带的版本库不存在

[root@docker~]rpm Uvh

http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

#创建 nginx 项目

[root@docker dockerfile] mkdir nginx

#进入 nginx 目录

[root@docker dockerfile] cd nginx

#创建测试案例

[root@docker dockerfile] vim index.html

Nginx

[root@docker dockerfile] vim dockerfile

#添加如下内容:

#指定镜像

FROM:centos:7

#下载源

RUN

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm &&yum -y install nginx

#声明端口

EXPOSE 80

COPY index.html /usr/share/nginx/html

CMD [“nginx”,”-g”,”daemon off;”]

:wq保存退出

(3)创建

[root@docker nginx]docker bulid -t nginx:v1 .

(4) 创建容器

[root@docker dockerfile] docker run -itd -p 456:80

(5) 验证

通过访问宿主机的 ip+ 端口,查看 Nginx 是否能出现在网页,注意防火墙一定要关闭

 

八、Docker 常见的命令

1、镜像命令

docker images

列出本地所有镜像

docker images -a

列出所有本地镜像,且包含中间层,比如你 pull 了一个 tomcat 镜像,实际上还会 pull 例如 centos 镜像等很多中间层的镜像

docker images -q:

只列出镜像 ID

docker search tomcat:

从 docker hub 上查询镜像

docker pull tomcat:

拉取镜像

docker rmi tomcat:

删除本地镜像

docker rmi -f tomcat nginx centos:

强制删除多个本地镜像

docker rmi -f $(docker images -q):

类似于 linux 的管道,删除 $ 表达式里的东西,也就是删除所有本地镜像

2、容器命令 

docker run [OPTION] image [COMMAND] [ARGS]

docker run -it --name mycentos centos:

启动容器,-i 的意思是以交互模式运行容器,-t 的意思是为容器重新分配一个终端,-i、-t 常常同时使用

docker ps:

列出所有正在运行的容器

docker ps -a:列出曾经和正在运行的容器

exit:

容器停止并退出(如果你是以-it的方式启动容器并进入容器自己建的终端的话)

ctrl+P+Q:

容器不停止并退出

docker start 容器 ID:

启动曾经运行过的容器

docker kill(或 stop 或 restart ) 容器 ID:

kill 是强制关闭容器,等于断电,stop 也是关闭容器,不过相当于正常关机

docker rm 容器 ID:

删除容器

docker rm -f 容器 ID:

强制删除

dokcer rm -f $(docker ps -a -q):

全部删除

docker ps -a -q | xargs docker rm:

全部删除

docker run -d centos:

后台启动容器,注意,后台启动容器的话必须有一个前台进程,不然容器会直接自动关闭,也就是说如果只运行 docker run -d centos 的话容器会自己停止,因为 centos 镜像启动后没有一个前台进程,我们可以添加 docker run -d centos /bin/sh -c "while true;do echo hello world;sleep 2;done",这样会有一个前台进程循环输出 helloworld ,容器就不会自动停止了。

docker logs -f -t --tail 容器 ID:

查看 docker 日志,-t 是在日志里跟入时间戳,-f 是跟随日志更新而更新,-- tail+ 数字是显示最后数字行的日志。

docker top 容器 ID:

查看容器内进程

docker inspect 容器 ID:

查看容器细节

docker attach 容器 ID:

重新进入正在运行的容器

docker exec -t 容器 ID ls -l  /temp:

进入容器并执行 ls -l /temp 命令

docker cp 容器 id:/tmp/test.txt /root:

把容器内 /tmp/test.txt 复制到宿主机的 /root 下

docker run -p 宿主机端口:容器内端口:

将容器内端口映射到宿主机的指定端口上

docker run -d /mnt/mfs/data:/tmp/data:

添加容器数据卷,简单的说,就是将宿主机的 /mnt/mfs/data 和容器内的 /tmp/data 路径下的文件、文件夹同步

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
NoSQL 应用服务中间件 Redis
docker学习笔记(四)
docker学习笔记(四)
97 0
|
4月前
|
Kubernetes Ubuntu Linux
docker学习笔记
docker学习笔记
53 0
|
7月前
|
关系型数据库 应用服务中间件 nginx
Docker学习笔记
Docker学习笔记
109 3
Docker学习笔记
|
Java 应用服务中间件 Linux
docker学习笔记(一)
docker学习笔记(一)
269 1
|
关系型数据库 MySQL Linux
docker学习笔记(二)
docker学习笔记(二)
94 0
|
运维 Java 应用服务中间件
docker学习笔记(三)
docker学习笔记(三)
93 0
|
NoSQL 关系型数据库 MySQL
Docker 学习笔记
Docker学习笔记
|
运维 NoSQL 数据可视化
|
运维 持续交付 虚拟化
Docker 是什么 | 学习笔记
快速学习 Docker 是什么
Docker 是什么 | 学习笔记
|
运维 Ubuntu Devops
Docker 能干什么 | 学习笔记
快速学习 Docker 能干什么
Docker 能干什么 | 学习笔记