阿里内部资料4天实战轻松玩转docker03
我们不是标题党,我们致力于"反卷",打造良好的互联网环境,让更多的人能远离"某些机构"的忽悠;在阿里规章制度允许的条件下,将更多的内部文档、资料、视频分享给大家,希望大家多多关注,持续为大家分享
docker 的实际运用
一、docker 基础命令(下)
这是 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:内部路径 文件目录]
二、dockerfile 1、案例一
1)搜索 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 至此,第一个案例就此完成。
2、案例二
[root@docker ~] (没有文件自行创建)
1)下载 centos:7 镜像。并用该镜像启动容器,命名为 centostest,暴露 6446 宿主机端口,映 射容器内 999 端口。
2)将宿主机/root/docker.txt 复制到容器内/user/local/。
3)再从该容器内的/root/docker.txt 文件复制到宿主机/tmp。
4)删除该容器。
*操作流程*
[root@docker ~] docker run -itd -p 6449:999 --name centostest centos:7 参数解释:
-itd:固定写法
-p:暴露的端口号
--name:修改名字
1)用该镜像启动容器,命名为 centostest,暴露 6446 宿主机端口,映射容器内 999 端口
3)查看容器是否启动成功
[root@docker ~] docker ps
4)将宿主机/root/magegood.txt 复制到容器内/usr/local/
[root@docker ~] touch docker.txt
[root@docker ~] docker cp docker.txt 96f7e0daf062:/usr/local 验证
[root@docker ~] docker exec -it 96f7e0daf062 /bin/bash [root@docker ~] ls /usr/local
5)再从该容器内的/root/docker.txt 文件复制到宿主机/tmp
[root@docker tmp] ls /tmp
[root@docker tmp] docker cp 96f7e0daf062 :/root/docker.txt /tmp
6)删除该容器并检查
删除前需要停掉
[root@docker ~] docker stop 96f7e0daf062
[root@docker ~] docker rmi 96f7e0daf062
[root@docker ~] docker ps
注意:使用 search 搜索 centos:7 是找不到官方版本的 [root@docker ~] docker search centos:7
[root@docker ~] docker search centos tag 即可搜索官方的
三、dockerfile 是否可以被替代?
1、概述
dockerfile 可以理解为一个制作镜像的脚本,但远没有脚本复杂。他根据某种格式自定义内容, 就可以快速创建出需求的镜像。
docker 的实际运用 < 40
docker 容器启动的时候在最上层挂载了一个可写层,比如说我在容器里面创建一个文件,这个 文件是存放在可写层的,这时候容器要是销毁了,那么我们对容器的一些写入操作也就没了, 我这个文件也会随着容器销毁而销毁了,我们要是想要保存我们对容器的一些写入操作的话, 可以使用 commit 命令然后将容器制作成一个镜像,这样下次 run 起来该镜像的时候,我们之 前的写入操作就还存在了。
除了使用 commit 方式制作镜像,还有一种方式就是编写 dockerfile ,然后使用 build 命令来 制作镜像了。2、dockerfile 的规则格式: 是注释 指令建议要大写,内容小写。
执行顺序:
docker 是按照 dockerfile 指令顺序依次执行的,也就是说从上到下。3、指令
这个 FROM 指令是 dockerfile 的第一个指令,指定了基础镜像,后面的所有指令都是运行在该 基础镜像环境上的 MAINTAINER,该指令是描述的维护者信息。 底层的系统镜像用的是什么,使用 from 指定,绝大部分情况都用的底层有个系统或者基础的环 境用的是什么,对 docker 不熟练使用 centos 镜像即可。
1)FROM:底层镜像(如系统)
2)RUN:构建时容器内运行的命令
RUN 指令用于在容器中执行命令。我们常用来安装基础软件。 镜像安装软件依赖包都可以放在 RUN 中。
3)COPY:复制 docker 目录中的文件到镜像中
4)ADD:复制 docker 目录中的文件到镜像中。(过程可以解压)
ADD 指令是用来将宿主机某个文件或目录放到(复制)容器某个目录下面。 官方不推荐 ADD,高级复制功能,需求不精准,推荐使用 COPY。
5)EXPOSE:声明开放端口
EXPOSE 指令用于暴露容器里的端口,我们在 3.5 里面演示过了,nginx 暴露的端口是 80,但 是启动容器的时候需要指定宿主机端口来映射暴露的端口。需要暴露多个端口的话可以使用多 个 EXPOSE,也可以一个 EXPOSE 指令后面跟多个端口,端口之间用空格隔开。 声明不是变更,变更使用-p 构建容器时候使用。
6)ENV:设置环境变量
ENV 指令是用于设置环境变量的。 底层环境变量需要需提前设置。
7)CMD:容器启动时执行的命令,最多只能执行一条
CMD 指令是你在容器启动的时候帮你运行的命令,而 RUN 这个指令是构建镜像的时候帮你运 行的命令。
容器启动时执行命令,最多执行一条。
WORKDIR 是指下面的指令都在 WORKDIR 指定目录下面工作,这个与 linux 里面的 cd 差不 多。
切换目录使用 WORKDIR。 做容器轻量级最好,比较小就很好,使用一条命令就不要使用两条命令4、dockerfile 步骤
1)创建 dockerfile 目录,名字可以自定义。 在大目录里面创建各种小目录和文档,比较有层次。 2)在该目录中编辑 dockerfile。
3)用 COPY 或 ADD,需要把被 COPY 文件提前放到 dockerfile 目录中。 4)官方推荐用 COPY,如果需要过程中解压,用 ADD。
5)CMD 字段,需要用["命令","选项 1"]这种格式书写。 强制格式写法,必须使用["命令","选项 1"],类似于 python 的数组。
6)CMD 字段只能写一条命令,且这条命令尽量是前台执行的命令。如果是后台命令,这条命 令结束,docker 就会自动关闭。区别:前台执行命令和后台执行命
1)后台命令:
当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以 使用命令把作业放到后台执行。当在后台执行命令时,可以继续使用你的终端做其他事情。比 如 cd/tmp 作为主进程,fork 出来 shell 进程,一旦执行这条后台命令,会顶掉 PID 为 1 的进程, 整个 docker 就挂掉了。
注意:经常操作的 shell 命令都属于后台命令
2)前台命令:
CMD 属于前台命令没有特殊操作会一致出现。
四、docker 的前世今生
1、dockerfile 操作测试
1)用 dockerfile 构建镜像:
docker build -t(设置要构建镜像的名字,最后要加.) 创建基础镜像
docker 提供了两种方法来创建基础镜像
一种是通过引入 tar 包的形式,
另外一种是通过一个空白的镜像来一步一步构建
scratch 是 docker 保留镜像,镜像仓库中的任何镜像都不能使用这个名字,使用 FROM scratc h 表明我们要构建镜像中的第一个文件层。
如果我们有一个 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 看是否启动成功。
2、dockerfile 案例 1
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"]
2)构建镜像
[root@docker apache]# docker build -t apache :v1 .
看到 successfully 即安装成功。
3)验证
[root@docker apache] docker run -itd -p 345:80 apache:v1 [root@docker apache] docker ps
通过访问宿主机 ip 端口,查看 true,防火墙关闭。
3、dockerfile 案例 2
1)用 dockerfile 创建并启动一个 centos7 的 nginx 镜像。
FROM centos:7 RUNrpm-Uvhhttp://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el 7.ngx.noarch.rpm
RUN yum -y install nginx
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
2)创建
[root@docker nginx]#docker bulid -t nginx:v1 .
3)创建容器
[root@dockernginx]# docker run -itd -p 456:80
4)验证
通过访问宿主机的 ip+端口,查看 nginx,防火墙关闭。