开发者学堂课程【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
CREATED
SIZE
apache
centos
fe364d4ee9ec
5 minutes ago
419.1 MB
......
[root@docker1 apache_centos]# docker run -d -P apache:centos
0fadd02039d6b16ae308faada8497f3ab9d72de73d5dd36a655e188eee9f1859
[root@docker1 apache_centos]# docker ps
CONTAINER ID
IMAGE
COMMAND
CREATED
STATUS
PORTS
NAMES
0fadd02039d6
apache:centos
"/usr/local/sbin/run." 4 seconds
ago
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 路径下的文件、文件夹同步